Merge "Add support for Balinese"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 10 Jun 2016 06:13:52 +0000 (06:13 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 10 Jun 2016 06:13:52 +0000 (06:13 +0000)
50 files changed:
RELEASE-NOTES-1.27
autoload.php
includes/DefaultSettings.php
includes/MediaWiki.php
includes/ServiceWiring.php
includes/api/ApiFeedContributions.php
includes/api/ApiStashEdit.php
includes/api/i18n/en.json
includes/api/i18n/gl.json
includes/api/i18n/it.json
includes/api/i18n/qqq.json
includes/api/i18n/zh-hans.json
includes/auth/ConfirmLinkSecondaryAuthenticationProvider.php
includes/installer/Installer.php
includes/installer/InstallerOverrides.php [new file with mode: 0644]
includes/installer/i18n/es.json
includes/installer/i18n/fr.json
includes/installer/i18n/it.json
includes/jobqueue/jobs/RefreshLinksJob.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/site/DBSiteStore.php
includes/site/FileBasedSiteLookup.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialUserLogin.php
includes/specials/pagers/ContribsPager.php
includes/user/User.php
includes/widget/SearchInputWidget.php [changed mode: 0755->0644]
languages/i18n/ba.json
languages/i18n/dty.json
languages/i18n/en.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/inh.json
languages/i18n/pnb.json
languages/i18n/qqq.json
languages/i18n/wuu.json
languages/i18n/zh-hans.json
maintenance/generateLocalAutoload.php
mw-config/overrides.php [deleted file]
mw-config/overrides/README [new file with mode: 0644]
resources/Resources.php
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki/mediawiki.checkboxtoggle.js
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/auth/ConfirmLinkSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/site/DBSiteStoreTest.php
tests/phpunit/includes/site/FileBasedSiteLookupTest.php

index e644ae4..3aa5d7c 100644 (file)
@@ -536,6 +536,8 @@ changes to languages because of Phabricator reports.
 * User::isPasswordReminderThrottled() was deprecated.
 * Bot-oriented parameters to Special:UserLogin (wpCookieCheck, wpSkipCookieCheck)
   were removed.
+* Installer can now be customized without patching MediaWiki code, see
+  mw-config/overrides/README for details.
 
 == Compatibility ==
 
index 27da2ca..f40cc89 100644 (file)
@@ -603,7 +603,7 @@ $wgAutoloadLocalClasses = [
        'InitSiteStats' => __DIR__ . '/maintenance/initSiteStats.php',
        'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
        'Installer' => __DIR__ . '/includes/installer/Installer.php',
-       'InstallerOverrides' => __DIR__ . '/mw-config/overrides.php',
+       'InstallerOverrides' => __DIR__ . '/includes/installer/InstallerOverrides.php',
        'InstallerSessionProvider' => __DIR__ . '/includes/installer/InstallerSessionProvider.php',
        'Interwiki' => __DIR__ . '/includes/interwiki/Interwiki.php',
        'InvalidPassword' => __DIR__ . '/includes/password/InvalidPassword.php',
@@ -936,7 +936,6 @@ $wgAutoloadLocalClasses = [
        'MutableConfig' => __DIR__ . '/includes/config/MutableConfig.php',
        'MutableContext' => __DIR__ . '/includes/context/MutableContext.php',
        'MwSql' => __DIR__ . '/maintenance/sql.php',
-       'MyLocalSettingsGenerator' => __DIR__ . '/mw-config/overrides.php',
        'MySQLField' => __DIR__ . '/includes/db/DatabaseMysqlBase.php',
        'MySQLMasterPos' => __DIR__ . '/includes/db/DatabaseMysqlBase.php',
        'MySqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php',
index dc0b60c..80e199a 100644 (file)
@@ -5982,6 +5982,12 @@ $wgTrxProfilerLimits = [
                'writes' => 0,
                'readQueryTime' => 5
        ],
+       // Deferred updates that run after HTTP response is sent
+       'PostSend' => [
+               'readQueryTime' => 5,
+               'writeQueryTime' => 1,
+               'maxAffected' => 500
+       ],
        // Background job runner
        'JobRunner' => [
                'readQueryTime' => 30,
index ee03f02..21857b9 100644 (file)
@@ -764,9 +764,13 @@ class MediaWiki {
                // Assure deferred updates are not in the main transaction
                wfGetLBFactory()->commitMasterChanges( __METHOD__ );
 
-               // Ignore things like master queries/connections on GET requests
-               // as long as they are in deferred updates (which catch errors).
-               Profiler::instance()->getTransactionProfiler()->resetExpectations();
+               // Loosen DB query expectations since the HTTP client is unblocked
+               $trxProfiler = Profiler::instance()->getTransactionProfiler();
+               $trxProfiler->resetExpectations();
+               $trxProfiler->setExpectations(
+                       $this->config->get( 'TrxProfilerLimits' )['PostSend'],
+                       __METHOD__
+               );
 
                // Do any deferred jobs
                DeferredUpdates::doUpdates( 'enqueue' );
index 338f306..b076d07 100644 (file)
@@ -61,9 +61,6 @@ return [
 
        'SiteStore' => function( MediaWikiServices $services ) {
                $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() );
-               $rawSiteStore->setLanguageCodeMapping(
-                       $services->getMainConfig()->get( 'DummyLanguageCodes' ) ?: []
-               );
 
                // TODO: replace wfGetCache with a CacheFactory service.
                // TODO: replace wfIsHHVM with a capabilities service.
index e28b068..c7dc303 100644 (file)
@@ -79,6 +79,7 @@ class ApiFeedContributions extends ApiBase {
                        'deletedOnly' => $params['deletedonly'],
                        'topOnly' => $params['toponly'],
                        'newOnly' => $params['newonly'],
+                       'hideMinor' => $params['hideminor'],
                        'showSizeDiff' => $params['showsizediff'],
                ] );
 
@@ -208,6 +209,7 @@ class ApiFeedContributions extends ApiBase {
                        'deletedonly' => false,
                        'toponly' => false,
                        'newonly' => false,
+                       'hideminor' => false,
                        'showsizediff' => [
                                ApiBase::PARAM_DFLT => false,
                        ],
index 51da606..dd911d0 100644 (file)
@@ -41,6 +41,7 @@ class ApiStashEdit extends ApiBase {
        const ERROR_UNCACHEABLE = 'uncacheable';
 
        const PRESUME_FRESH_TTL_SEC = 30;
+       const MAX_CACHE_TTL = 300; // 5 minutes
 
        public function execute() {
                $user = $this->getUser();
@@ -153,7 +154,7 @@ class ApiStashEdit extends ApiBase {
                        // Let extensions add ParserOutput metadata or warm other caches
                        Hooks::run( 'ParserOutputStashForEdit', [ $page, $content, $editInfo->output ] );
 
-                       list( $stashInfo, $ttl ) = self::buildStashValue(
+                       list( $stashInfo, $ttl, $code ) = self::buildStashValue(
                                $editInfo->pstContent,
                                $editInfo->output,
                                $editInfo->timestamp,
@@ -170,7 +171,7 @@ class ApiStashEdit extends ApiBase {
                                        return self::ERROR_CACHE;
                                }
                        } else {
-                               $logger->info( "Uncacheable parser output for key '$key' ('$title')." );
+                               $logger->info( "Uncacheable parser output for key '$key' ('$title') [$code]." );
                                return self::ERROR_UNCACHEABLE;
                        }
                }
@@ -319,64 +320,10 @@ class ApiStashEdit extends ApiBase {
                        return $editInfo;
                }
 
-               $dbr = wfGetDB( DB_SLAVE );
+               $stats->increment( 'editstash.cache_misses.proven_stale' );
+               $logger->info( "Stale cache for key '$key'; old key with outside edits. (age: $age sec)" );
 
-               $templates = []; // conditions to find changes/creations
-               $templateUses = 0; // expected existing templates
-               foreach ( $editInfo->output->getTemplateIds() as $ns => $stuff ) {
-                       foreach ( $stuff as $dbkey => $revId ) {
-                               $templates[(string)$ns][$dbkey] = (int)$revId;
-                               ++$templateUses;
-                       }
-               }
-               // Check that no templates used in the output changed...
-               if ( count( $templates ) ) {
-                       $res = $dbr->select(
-                               'page',
-                               [ 'ns' => 'page_namespace', 'dbk' => 'page_title', 'page_latest' ],
-                               $dbr->makeWhereFrom2d( $templates, 'page_namespace', 'page_title' ),
-                               __METHOD__
-                       );
-                       $changed = false;
-                       foreach ( $res as $row ) {
-                               $changed = $changed || ( $row->page_latest != $templates[$row->ns][$row->dbk] );
-                       }
-
-                       if ( $changed || $res->numRows() != $templateUses ) {
-                               $stats->increment( 'editstash.cache_misses.proven_stale' );
-                               $logger->info( "Stale cache for key '$key'; template changed. (age: $age sec)" );
-                               return false;
-                       }
-               }
-
-               $files = []; // conditions to find changes/creations
-               foreach ( $editInfo->output->getFileSearchOptions() as $name => $options ) {
-                       $files[$name] = (string)$options['sha1'];
-               }
-               // Check that no files used in the output changed...
-               if ( count( $files ) ) {
-                       $res = $dbr->select(
-                               'image',
-                               [ 'name' => 'img_name', 'img_sha1' ],
-                               [ 'img_name' => array_keys( $files ) ],
-                               __METHOD__
-                       );
-                       $changed = false;
-                       foreach ( $res as $row ) {
-                               $changed = $changed || ( $row->img_sha1 != $files[$row->name] );
-                       }
-
-                       if ( $changed || $res->numRows() != count( $files ) ) {
-                               $stats->increment( 'editstash.cache_misses.proven_stale' );
-                               $logger->info( "Stale cache for key '$key'; file changed. (age: $age sec)" );
-                               return false;
-                       }
-               }
-
-               $stats->increment( 'editstash.cache_hits.proven_fresh' );
-               $logger->debug( "Verified cache hit for key '$key' (age: $age sec)." );
-
-               return $editInfo;
+               return false;
        }
 
        /**
@@ -429,7 +376,7 @@ class ApiStashEdit extends ApiBase {
         * @param ParserOutput $parserOutput
         * @param string $timestamp TS_MW
         * @param User $user
-        * @return array (stash info array, TTL in seconds) or (null, 0)
+        * @return array (stash info array, TTL in seconds, info code) or (null, 0, info code)
         */
        private static function buildStashValue(
                Content $pstContent, ParserOutput $parserOutput, $timestamp, User $user
@@ -437,20 +384,22 @@ class ApiStashEdit extends ApiBase {
                // If an item is renewed, mind the cache TTL determined by config and parser functions.
                // Put an upper limit on the TTL for sanity to avoid extreme template/file staleness.
                $since = time() - wfTimestamp( TS_UNIX, $parserOutput->getTimestamp() );
-               $ttl = min( $parserOutput->getCacheExpiry() - $since, 5 * 60 );
-
-               if ( $ttl > 0 && !$parserOutput->getFlag( 'vary-revision' ) ) {
-                       // Only store what is actually needed
-                       $stashInfo = (object)[
-                               'pstContent' => $pstContent,
-                               'output'     => $parserOutput,
-                               'timestamp'  => $timestamp,
-                               'edits'      => $user->getEditCount()
-                       ];
-                       return [ $stashInfo, $ttl ];
+               $ttl = min( $parserOutput->getCacheExpiry() - $since, self::MAX_CACHE_TTL );
+               if ( $ttl <= 0 ) {
+                       return [ null, 0, 'no_ttl' ];
+               } elseif ( $parserOutput->getFlag( 'vary-revision' ) ) {
+                       return [ null, 0, 'vary_revision' ];
                }
 
-               return [ null, 0 ];
+               // Only store what is actually needed
+               $stashInfo = (object)[
+                       'pstContent' => $pstContent,
+                       'output'     => $parserOutput,
+                       'timestamp'  => $timestamp,
+                       'edits'      => $user->getEditCount()
+               ];
+
+               return [ $stashInfo, $ttl, 'ok' ];
        }
 
        public function getAllowedParams() {
index e4a2c2e..82a8349 100644 (file)
        "apihelp-feedcontributions-param-deletedonly": "Show only deleted contributions.",
        "apihelp-feedcontributions-param-toponly": "Only show edits that are latest revisions.",
        "apihelp-feedcontributions-param-newonly": "Only show edits that are page creations.",
+       "apihelp-feedcontributions-param-hideminor": "Hide minor edits.",
        "apihelp-feedcontributions-param-showsizediff": "Show the size difference between revisions.",
        "apihelp-feedcontributions-example-simple": "Return contributions for user <kbd>Example</kbd>.",
 
index 65b5c95..a7ecabd 100644 (file)
@@ -50,6 +50,7 @@
        "apihelp-clearhasmsg-example-1": "Limpar a bandeira <code>hasmsg</code> para o usuario actual",
        "apihelp-clientlogin-description": "Conectarse á wiki usando o fluxo interactivo.",
        "apihelp-clientlogin-example-login": "Comezar o proceso de conexión á wiki como o usuario <kbd>Exemplo</kbd> con contrasinal <kbd>ExemploContrasinal</kbd>.",
+       "apihelp-clientlogin-example-login2": "Continuar a conexión despois dunha resposta de <samp>UI</samp> para unha autenticación de dous factores, proporcionando un <var>OATHToken</var> con valor <kbd>987654</kbd>.",
        "apihelp-compare-description": "Obter as diferencias entre dúas páxinas.\n\nDebe indicar un número de revisión, un título de páxina, ou un ID de páxina tanto para \"from\" como para \"to\".",
        "apihelp-compare-param-fromtitle": "Primeiro título para comparar.",
        "apihelp-compare-param-fromid": "Identificador da primeira páxina a comparar.",
        "apihelp-linkaccount-description": "Vincular unha conta dun provedor externo ó usuario actual.",
        "apihelp-linkaccount-example-link": "Comezar o proceso de vincular a unha conta de <kbd>Exemplo</kbd>.",
        "apihelp-login-description": "No caso dunha conexión correcta, as cookies necesarias incluiranse nas cabeceiras HTTP de resposta. No caso dunha conexión fallida, os intentos posteriores poden ser reducidos para limitar ataques automaticos de roubo de contrasinais.",
+       "apihelp-login-description-nobotpasswords": "Conectarse e obter as cookies de autenticación. \n\nEsta acción está obsoleta e pode fallar sen avisar. Para conectarse sen problema use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nonauthmanager": "Conectarse e obter as cookies de autenticación. \n\nNo caso dunha conexión correcta, as cookies necesarias incluiranse nas cabeceiras HTTP de resposta. No caso dunha conexión fallida, os intentos posteriores poden ser reducidos para limitar ataques automaticos de roubo de contrasinais.",
        "apihelp-login-param-name": "Nome de usuario.",
        "apihelp-login-param-password": "Contrasinal",
        "apihelp-login-param-domain": "Dominio (opcional).",
        "apihelp-removeauthenticationdata-description": "Elimina os datos de autenticación do usuario actual.",
        "apihelp-removeauthenticationdata-example-simple": "Intenta eliminar os datos de usuario actual para <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Envía un correo de inicialización de contrasinal a un usuario.",
+       "apihelp-resetpassword-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> para usar este módulo.",
        "apihelp-resetpassword-param-user": "Usuario sendo reinicializado.",
        "apihelp-resetpassword-param-email": "Está reinicializándose o enderezo de correo electrónico do usuario.",
        "apihelp-resetpassword-param-capture": "Devolve os contrasinais temporais que se enviaron. Require o dereito de usuario <code>passwordreset</code> .",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Concedida a|Concedidas a}}: $2",
        "api-help-right-apihighlimits": "Usar os valores superiores das consultas da API (consultas lentas: $1; consultas rápidas: $2). Os límites para as consultas lentas tamén se aplican ós parámetros multivaluados.",
        "api-help-open-in-apisandbox": "<small>[abrir en zona de probas]</small>",
+       "api-help-authmanagerhelper-requests": "Só usar estas peticións de autenticación, co <samp>id</samp> devolto por <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> ou dunha resposta previa deste módulo.",
+       "api-help-authmanagerhelper-request": "Usar esta petición de autenticación, co <samp>id</samp> devolto por <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd>.",
        "api-help-authmanagerhelper-messageformat": "Formato a usar para devolver as mensaxes.",
        "api-help-authmanagerhelper-mergerequestfields": "Fusionar os campos de información para todas as peticións de autenticación nunha táboa.",
        "api-help-authmanagerhelper-preservestate": "Conservar o estado dun intento previo de conexión fallida, se é posible.",
+       "api-help-authmanagerhelper-continue": "Esta petición é unha continucación despois dun resposta precedente <samp>UI</samp> ou <samp>REDIRECT</samp>. Esta ou <var>$1returnurl</var> é requirida.",
        "api-credits-header": "Créditos",
        "api-credits": "Desenvolvedores da API:\n* Roan Kattouw (desenvolvedor principal, set. 2007-2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creador e desenvolvedor principal, set. 2006-sep. 2007)\n* Brad Jorsch (desenvolvedor principal, 2013-actualidade)\n\nEnvía comentarios, suxerencias e preguntas a mediawiki-api@lists.wikimedia.org\nou informa dun erro en https://phabricator.wikimedia.org/."
 }
index f876b1f..54373a4 100644 (file)
        "apihelp-query+prefixsearch-param-search": "Stringa di ricerca.",
        "apihelp-query+prefixsearch-param-limit": "Numero massimo di risultati da restituire.",
        "apihelp-query+prefixsearch-param-offset": "Numero di risultati da saltare",
+       "apihelp-query+prefixsearch-param-profile": "Profilo di ricerca da utilizzare.",
        "apihelp-query+protectedtitles-description": "Elenca tutti i titoli protetti dalla creazione.",
        "apihelp-query+protectedtitles-param-namespace": "Elenca solo i titoli in questi namespace.",
        "apihelp-query+protectedtitles-param-level": "Elenca solo i titoli con questi livelli di protezione.",
        "api-help-authmanagerhelper-messageformat": "Formato da utilizzare per per la restituzione dei messaggi.",
        "api-help-authmanagerhelper-preservestate": "Conserva lo stato da un precedente tentativo di accesso non riuscito, se possibile.",
        "api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito <var>$1continue</var>.\n\nAlla ricezione di una risposta <samp>REDIRECT</samp>, in genere si apre un browser o una vista web all'URL specificato <samp>redirecttarget</samp> per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request <var>$1continue</var> a questo modulo API.",
+       "api-help-authmanagerhelper-continue": "Questa richiesta è una continuazione dopo una precedente risposta <samp>UI</samp> o <samp>REDIRECT</samp>. E' necessario fornire questo oppure <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
        "api-credits-header": "Crediti"
 }
index 362a473..11efd46 100644 (file)
        "apihelp-feedcontributions-param-deletedonly": "{{doc-apihelp-param|feedcontributions|deletedonly}}",
        "apihelp-feedcontributions-param-toponly": "{{doc-apihelp-param|feedcontributions|toponly}}",
        "apihelp-feedcontributions-param-newonly": "{{doc-apihelp-param|feedcontributions|newonly}}",
+       "apihelp-feedcontributions-param-hideminor": "{{doc-apihelp-param|feedcontributions|hideminor}}",
        "apihelp-feedcontributions-param-showsizediff": "{{doc-apihelp-param|feedcontributions|showsizediff}}",
        "apihelp-feedcontributions-example-simple": "{{doc-apihelp-example|feedcontributions}}",
        "apihelp-feedrecentchanges-description": "{{doc-apihelp-description|feedrecentchanges}}",
index 8e42964..46e5c85 100644 (file)
@@ -68,6 +68,7 @@
        "apihelp-compare-param-torev": "要比较的第二个修订版本。",
        "apihelp-compare-example-1": "在版本1和2中创建差异。",
        "apihelp-createaccount-description": "创建一个新用户账户。",
+       "apihelp-createaccount-param-preservestate": "如果<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>返回用于<samp>hasprimarypreservedstate</samp>的真值,标记为<samp>primary-required</samp>的请求应被忽略。如果它返回用于<samp>preservedusername</samp>的非空值,用户名必须用于<var>username</var>参数。",
        "apihelp-createaccount-example-create": "开始创建用户<kbd>Example</kbd>和密码<kbd>ExamplePassword</kbd>的过程。",
        "apihelp-createaccount-param-name": "用户名。",
        "apihelp-createaccount-param-password": "密码(如果设置<var>$1mailpassword</var>则忽略)。",
@@ -93,7 +94,7 @@
        "apihelp-delete-example-reason": "删除<kbd>Main Page</kbd>,原因<kbd>Preparing for move</kbd>。",
        "apihelp-disabled-description": "此模块已禁用。",
        "apihelp-edit-description": "创建和编辑页面。",
-       "apihelp-edit-param-title": "您希望编辑的页面标题。不能与<var>$1pageid</var>一起使用。",
+       "apihelp-edit-param-title": "编辑的页面标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-edit-param-pageid": "要编辑的页面的页面 ID。不能与<var>$1title</var>一起使用。",
        "apihelp-edit-param-section": "段落数。<kbd>0</kbd>用于首段,<kbd>new</kbd>用于新的段落。",
        "apihelp-edit-param-sectiontitle": "新段落的标题。",
        "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
        "api-help-right-apihighlimits": "在API查询中使用更高的上限(慢查询:$1;快查询:$2)。慢查询的限制也适用于多值参数。",
        "api-help-open-in-apisandbox": "<small>[在沙盒中打开]</small>",
+       "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# Present the fields to the user, and obtain their submission.\n# Post to this module, supplying <var>$1returnurl</var> and any relevant fields.\n# Check the <samp>status</samp> in the response.\n#* If you received <samp>PASS</samp> or <samp>FAIL</samp>, you're done. The operation either succeeded or it didn't.\n#* If you received <samp>UI</samp>, present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* If you received <samp>REDIRECT</samp>, direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* If you received <samp>RESTART</samp>, that means the authentication worked but we don't have a linked user account. You might treat this as <samp>UI</samp> or as <samp>FAIL</samp>.",
        "api-help-authmanagerhelper-request": "使用此身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>。",
        "api-help-authmanagerhelper-messageformat": "返回消息使用的格式。",
+       "api-help-authmanagerhelper-mergerequestfields": "合并用于所有身份验证请求的字段信息至一个数组中。",
+       "api-help-authmanagerhelper-additional-params": "此模块允许额外参数,取决于可用的身份验证请求。使用<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>与<kbd>amirequestsfor=$1</kbd>(或之前来自此模块的相应,如果可以)以决定可用请求及其使用的字段。",
        "api-credits-header": "制作人员",
        "api-credits": "API 开发人员:\n* Yuri Astrakhan(创建者,2006年9月~2007年9月的开发组领导)\n* Roan Kattouw(2007年9月~2009年的开发组领导)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch(2013年至今的开发组领导)\n\n请将您的评论、建议和问题发送至mediawiki-api@lists.wikimedia.org,或提交错误请求至https://phabricator.wikimedia.org/。"
 }
index 57f1e6b..32c8fd5 100644 (file)
@@ -51,7 +51,11 @@ class ConfirmLinkSecondaryAuthenticationProvider extends AbstractSecondaryAuthen
                        return AuthenticationResponse::newAbstain();
                }
 
-               $maybeLink = array_filter( $state['maybeLink'], function ( $req ) {
+               $maybeLink = array_filter( $state['maybeLink'], function ( $req ) use ( $user ) {
+                       if ( !$req->action ) {
+                               $req->action = AuthManager::ACTION_CHANGE;
+                       }
+                       $req->username = $user->getName();
                        return $this->manager->allowsAuthenticationDataChange( $req )->isGood();
                } );
                if ( !$maybeLink ) {
index ae1a2a7..7c161ca 100644 (file)
@@ -2,6 +2,9 @@
 /**
  * Base code for MediaWiki installer.
  *
+ * DO NOT PATCH THIS FILE IF YOU NEED TO CHANGE INSTALLER BEHAVIOR IN YOUR PACKAGE!
+ * See mw-config/overrides/README for details.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
diff --git a/includes/installer/InstallerOverrides.php b/includes/installer/InstallerOverrides.php
new file mode 100644 (file)
index 0000000..eba3a20
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+/**
+ * MediaWiki installer overrides. See mw-config/overrides/README for details.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @since 1.20
+ */
+class InstallerOverrides {
+       private static function getOverrides() {
+               global $IP;
+               static $overrides;
+
+               if ( !$overrides ) {
+                       $overrides = [
+                               'LocalSettingsGenerator' => 'LocalSettingsGenerator',
+                               'WebInstaller' => 'WebInstaller',
+                               'CliInstaller' => 'CliInstaller',
+                       ];
+                       foreach ( glob( "$IP/mw-config/overrides/*.php" ) as $file ) {
+                               require $file;
+                       }
+               }
+
+               return $overrides;
+       }
+
+       /**
+        * Instantiates and returns an instance of LocalSettingsGenerator or its descendant classes
+        * @param Installer $installer
+        * @return LocalSettingsGenerator
+        */
+       public static function getLocalSettingsGenerator( Installer $installer ) {
+               $className = self::getOverrides()['LocalSettingsGenerator'];
+               return new $className( $installer );
+       }
+
+       /**
+        * Instantiates and returns an instance of WebInstaller or its descendant classes
+        * @param WebRequest $request
+        * @return WebInstaller
+        */
+       public static function getWebInstaller( WebRequest $request ) {
+               $className = self::getOverrides()['WebInstaller'];
+               return new $className( $request );
+       }
+
+       /**
+        * Instantiates and returns an instance of CliInstaller or its descendant classes
+        * @param string $siteName
+        * @param string|null $admin
+        * @param array $options
+        * @return CliInstaller
+        */
+       public static function getCliInstaller( $siteName, $admin = null, array $options = [] ) {
+               $className = self::getOverrides()['CliInstaller'];
+               return new $className( $siteName, $admin, $options );
+       }
+}
index 032490b..3ec5342 100644 (file)
        "config-mysql-charset": "Conjunto de caracteres de la base de datos:",
        "config-mysql-binary": "Binario",
        "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "En <strong>modo binario</strong>, MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.\n\nEn <strong>modo UTF-8</strong>, MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
+       "config-mysql-charset-help": "En <strong>modo binario</strong>, MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y permite utilizar la gama completa de caracteres Unicode.\n\nEn <strong>modo UTF-8</strong>, MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no permitirá almacenar caracteres por encima del [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
        "config-mssql-auth": "Tipo de autenticación:",
        "config-mssql-install-auth": "Selecciona el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi seleccionas \"{{int:config-mssql-windowsauth}}\", se usarán las credenciales del usuario con el que se ejecuta el servidor web.",
        "config-mssql-web-auth": "Selecciona el tipo de autenticación que utilizará el servidor web para conectarse al servidor de base de datos, durante el funcionamiento normal de la wiki.\nSi seleccionas \"{{int:config-mssql-windowsauth}}\", se usarán las credenciales del usuario con el cual se ejecuta el servidor web.",
        "config-email-sender-help": "Escribe la dirección de correo electrónico que se usará como dirección de retorno en los mensajes electrónicos de salida.\nAquí llegarán los correos electrónicos que no lleguen a su destino.\nMuchos servidores de correo electrónico exigen que por lo menos la parte del nombre del dominio sea válida.",
        "config-upload-settings": "Subidas de imágenes y archivos",
        "config-upload-enable": "Habilitar la subida de archivos",
-       "config-upload-help": "La carga de archivos expone potencialmente su servidor a riesgos de seguridad.\nPara obtener más información, lea la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sección de seguridad] en el manual.\n\nPara habilitar la carga de archivos, cambie el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.\nA continuación, habilite esta opción.",
+       "config-upload-help": "La subida de archivos potencialmente expone tu servidor a riesgos de seguridad.\nPara obtener más información, consulta la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sección de seguridad] en el manual.\n\nPara activar la subida de archivos, cambia el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.\nLuego, activa esta opción.",
        "config-upload-deleted": "Directorio para los archivos eliminados:",
        "config-upload-deleted-help": "Elige un directorio en el que guardar los archivos eliminados.\nLo ideal es una carpeta no accesible desde la red.",
        "config-logo": "URL del logo :",
index 4bee62f..740ed35 100644 (file)
        "config-profile-no-anon": "Création de compte requise",
        "config-profile-fishbowl": "Éditeurs autorisés seulement",
        "config-profile-private": "Wiki privé",
-       "config-profile-help": "Les wikis fonctionnent mieux lorsque vous laissez le plus de personnes possible les modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, de nombreuses autres utilisations ont été trouvées au logiciel et il n’est pas toujours facile de convaincre tout le monde des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle '''{{int:config-profile-wiki}}''' autorise toute personne à modifier, y compris sans s’identifier.\n'''{{int:config-profile-no-anon}}''' fournit plus de contrôle, mais peut rebuter les contributeurs occasionnels.\n\n'''{{int:config-profile-fishbowl}}''' autorise la modification par les utilisateurs approuvés, mais le public peut toujours lire les pages et leur historique.\n'''{{int:config-profile-private}}''' n’autorise que les utilisateurs approuvés à voir les pages dans le même groupe que les utilisateurs autorisés à y écrire.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights page correspondante du manuel].",
+       "config-profile-help": "Les wikis fonctionnent au mieux lorsque vous laissez un maximum de personnes les modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, MediaWiki est utilisé dans bien d'autres cas et il n’est pas toujours facile de convaincre tout le monde des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle <strong>{{int:config-profile-wiki}}</strong> autorise toute personne à modifier, y compris sans s’identifier.\n<strong>{{int:config-profile-no-anon}}</strong> fournit plus de contrôle, mais peut rebuter les contributeurs occasionnels.\n\n<strong>{{int:config-profile-fishbowl}}</strong> autorise la modification par les utilisateurs approuvés mais le public peut toujours consulter les pages et leur historique.\n<strong>{{int:config-profile-private}}</strong> n’autorise que les utilisateurs approuvés à voir et éditer les pages.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights page correspondante du manuel].",
        "config-license": "Droits d'auteur et licence :",
        "config-license-none": "Aucune licence en bas de page",
        "config-license-cc-by-sa": "Creative Commons attribution partage à l'identique",
index 1c1d143..d878a88 100644 (file)
@@ -16,7 +16,8 @@
                        "The Polish",
                        "Sannita",
                        "C.R.",
-                       "Macofe"
+                       "Macofe",
+                       "Matteocng"
                ]
        },
        "config-desc": "Programma di installazione per MediaWiki",
        "config-email-sender-help": "Inserisci l'indirizzo email da utilizzare come indirizzo di ritorno per la posta in uscita.\nQuesto è dove verranno inviati gli eventuali errori.\nMolti server di posta richiedono che almeno la parte del nome di dominio sia valido.",
        "config-upload-settings": "Caricamenti di immagini e file",
        "config-upload-enable": "Consentire il caricamento di file",
-       "config-upload-help": "Il caricamento di file può potenzialmente esporre il tuo server a rischi di sicurezza.\nPer ulteriori informazioni, leggi la  [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sezione sulla sicurezza] nel manuale.\n\nPer consentire il caricamento di file, modificare la modalità nella sottodirectory <code>images</code> della directory principale di MediaWiki affinché il server web possa scriverci.\nPoi attivare questa opzione.",
+       "config-upload-help": "Il caricamento di file può potenzialmente esporre il tuo server a rischi di sicurezza.\nPer ulteriori informazioni, leggi la  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sezione sulla sicurezza] nel manuale.\n\nPer consentire il caricamento di file, modificare la modalità nella sottodirectory <code>images</code> della directory principale di MediaWiki affinché il server web possa scriverci.\nPoi attivare questa opzione.",
        "config-upload-deleted": "Directory per i file cancellati:",
        "config-upload-deleted-help": "Scegli una directory in cui archiviare i file cancellati.\nIdealmente, questa non dovrebbe essere accessibile dal web.",
        "config-logo": "URL del logo:",
index 9711496..8870569 100644 (file)
@@ -40,13 +40,13 @@ class RefreshLinksJob extends Job {
        const PARSE_THRESHOLD_SEC = 1.0;
        /** @var integer Lag safety margin when comparing root job times to last-refresh times */
        const CLOCK_FUDGE = 10;
+       /** @var integer How many seconds to wait for slaves to catch up */
+       const LAG_WAIT_TIMEOUT = 15;
 
        function __construct( Title $title, array $params ) {
                parent::__construct( 'refreshLinks', $title, $params );
                // Avoid the overhead of de-duplication when it would be pointless
                $this->removeDuplicates = (
-                       // Master positions won't match
-                       !isset( $params['masterPos'] ) &&
                        // Ranges rarely will line up
                        !isset( $params['range'] ) &&
                        // Multiple pages per job make matches unlikely
@@ -83,20 +83,22 @@ class RefreshLinksJob extends Job {
 
                // Job to update all (or a range of) backlink pages for a page
                if ( !empty( $this->params['recursive'] ) ) {
+                       // When the base job branches, wait for the slaves to catch up to the master.
+                       // From then on, we know that any template changes at the time the base job was
+                       // enqueued will be reflected in backlink page parses when the leaf jobs run.
+                       if ( !isset( $params['range'] ) ) {
+                               try {
+                                       wfGetLBFactory()->waitForReplication( [
+                                               'wiki'    => wfWikiID(),
+                                               'timeout' => self::LAG_WAIT_TIMEOUT
+                                       ] );
+                               } catch ( DBReplicationWaitError $e ) { // only try so hard
+                                       $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+                                       $stats->increment( 'refreshlinks.lag_wait_failed' );
+                               }
+                       }
                        // Carry over information for de-duplication
                        $extraParams = $this->getRootJobParams();
-                       // Avoid slave lag when fetching templates.
-                       // When the outermost job is run, we know that the caller that enqueued it must have
-                       // committed the relevant changes to the DB by now. At that point, record the master
-                       // position and pass it along as the job recursively breaks into smaller range jobs.
-                       // Hopefully, when leaf jobs are popped, the slaves will have reached that position.
-                       if ( isset( $this->params['masterPos'] ) ) {
-                               $extraParams['masterPos'] = $this->params['masterPos'];
-                       } elseif ( wfGetLB()->getServerCount() > 1 ) {
-                               $extraParams['masterPos'] = wfGetLB()->getMasterPos();
-                       } else {
-                               $extraParams['masterPos'] = false;
-                       }
                        $extraParams['triggeredRecursive'] = true;
                        // Convert this into no more than $wgUpdateRowsPerJob RefreshLinks per-title
                        // jobs and possibly a recursive RefreshLinks job for the rest of the backlinks
@@ -109,29 +111,18 @@ class RefreshLinksJob extends Job {
                        JobQueueGroup::singleton()->push( $jobs );
                // Job to update link tables for a set of titles
                } elseif ( isset( $this->params['pages'] ) ) {
-                       $this->waitForMasterPosition();
                        foreach ( $this->params['pages'] as $pageId => $nsAndKey ) {
                                list( $ns, $dbKey ) = $nsAndKey;
                                $this->runForTitle( Title::makeTitleSafe( $ns, $dbKey ) );
                        }
                // Job to update link tables for a given title
                } else {
-                       $this->waitForMasterPosition();
                        $this->runForTitle( $this->title );
                }
 
                return true;
        }
 
-       protected function waitForMasterPosition() {
-               if ( !empty( $this->params['masterPos'] ) && wfGetLB()->getServerCount() > 1 ) {
-                       // Wait for the current/next slave DB handle to catch up to the master.
-                       // This way, we get the correct page_latest for templates or files that just
-                       // changed milliseconds ago, having triggered this job to begin with.
-                       wfGetLB()->waitFor( $this->params['masterPos'] );
-               }
-       }
-
        /**
         * @param Title $title
         * @return bool
index e3ada8e..a3f8825 100644 (file)
@@ -61,9 +61,6 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
        // Group of module
        protected $group;
 
-       // Whether to enable variable expansion (e.g. "{skin}")
-       protected $allowVariables = false;
-
        /**
         * @param array $options For back-compat, this can be omitted in favour of overwriting getPages.
         */
@@ -79,7 +76,6 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                                case 'scripts':
                                case 'group':
                                case 'targets':
-                               case 'allowVariables':
                                        $this->{$member} = $option;
                                        break;
                        }
@@ -109,30 +105,19 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                // Filter out pages from origins not allowed by the current wiki configuration.
                if ( $config->get( 'UseSiteJs' ) ) {
                        foreach ( $this->scripts as $script ) {
-                               $page = $this->expandVariables( $context, $script );
-                               $pages[$page] = [ 'type' => 'script' ];
+                               $pages[$script] = [ 'type' => 'script' ];
                        }
                }
 
                if ( $config->get( 'UseSiteCss' ) ) {
                        foreach ( $this->styles as $style ) {
-                               $page = $this->expandVariables( $context, $style );
-                               $pages[$page] = [ 'type' => 'style' ];
+                               $pages[$style] = [ 'type' => 'style' ];
                        }
                }
 
                return $pages;
        }
 
-       private function expandVariables( ResourceLoaderContext $context, $pageName ) {
-               if ( !$this->allowVariables ) {
-                       return $pageName;
-               }
-               return strtr( $pageName, [
-                       '{skin}' => $context->getSkin()
-               ] );
-       }
-
        /**
         * Get group name
         *
index c1c10c2..974789f 100644 (file)
@@ -40,11 +40,6 @@ class DBSiteStore implements SiteStore {
         */
        private $dbLoadBalancer;
 
-       /**
-        * @var string[]
-        */
-       private $languageCodeMapping = [];
-
        /**
         * @since 1.27
         *
@@ -101,17 +96,15 @@ class DBSiteStore implements SiteStore {
                );
 
                foreach ( $res as $row ) {
-                       $languageCode = $row->site_language === '' ? null : $row->site_language;
-                       if ( isset( $this->languageCodeMapping[ $languageCode ] ) ) {
-                               $languageCode = $this->languageCodeMapping[ $languageCode ];
-                       }
-
                        $site = Site::newForType( $row->site_type );
                        $site->setGlobalId( $row->site_global_key );
                        $site->setInternalId( (int)$row->site_id );
                        $site->setForward( (bool)$row->site_forward );
                        $site->setGroup( $row->site_group );
-                       $site->setLanguageCode( $languageCode );
+                       $site->setLanguageCode( $row->site_language === ''
+                               ? null
+                               : $row->site_language
+                       );
                        $site->setSource( $row->site_source );
                        $site->setExtraData( unserialize( $row->site_data ) );
                        $site->setExtraConfig( unserialize( $row->site_config ) );
@@ -294,13 +287,4 @@ class DBSiteStore implements SiteStore {
                return $ok;
        }
 
-       /**
-        * Provide an array that maps language codes
-        *
-        * @param string[] $newMapping
-        */
-       public function setLanguageCodeMapping( array $newMapping ) {
-               $this->languageCodeMapping = $newMapping;
-       }
-
 }
index 424d8e6..9654440 100644 (file)
@@ -42,11 +42,6 @@ class FileBasedSiteLookup implements SiteLookup {
         */
        private $cacheFile;
 
-       /**
-        * @var string[]
-        */
-       private $languageCodeMapping = [];
-
        /**
         * @param string $cacheFile
         */
@@ -123,18 +118,13 @@ class FileBasedSiteLookup implements SiteLookup {
         * @return Site
         */
        private function newSiteFromArray( array $data ) {
-               $languageCode = $data['language'];
-               if ( isset( $this->languageCodeMapping[ $languageCode ] ) ) {
-                       $languageCode = $this->languageCodeMapping[ $languageCode ];
-               }
-
                $siteType = array_key_exists( 'type', $data ) ? $data['type'] : Site::TYPE_UNKNOWN;
                $site = Site::newForType( $siteType );
 
                $site->setGlobalId( $data['globalid'] );
                $site->setForward( $data['forward'] );
                $site->setGroup( $data['group'] );
-               $site->setLanguageCode( $languageCode );
+               $site->setLanguageCode( $data['language'] );
                $site->setSource( $data['source'] );
                $site->setExtraData( $data['data'] );
                $site->setExtraConfig( $data['config'] );
@@ -146,13 +136,4 @@ class FileBasedSiteLookup implements SiteLookup {
                return $site;
        }
 
-       /**
-        * Provide an array that maps language codes
-        *
-        * @param string[] $newMapping
-        */
-       public function setLanguageCodeMapping( array $newMapping ) {
-               $this->languageCodeMapping = $newMapping;
-       }
-
 }
index 8dff163..3099a9b 100644 (file)
@@ -854,7 +854,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                        !isset( $coreField['baseField'] )
                                        || !isset( $fieldInfo[$coreField['baseField']] )
                                ) && !in_array( $fieldName, $specialFields, true )
-                               && $coreField['type'] !== 'submit'
+                               && ( !isset( $coreField['type'] ) || $coreField['type'] !== 'submit' )
                        ) {
                                $coreFieldDescriptors[$fieldName] = null;
                                continue;
@@ -1050,6 +1050,11 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                        ], $this->msg( 'userlogin-helplink2' )->text() ),
                                        'weight' => 200,
                                ],
+                               // button for ResetPasswordSecondaryAuthenticationProvider
+                               'skipReset' => [
+                                       'weight' => 110,
+                                       'flags' => [],
+                               ],
                        ];
                }
                $fieldDefinitions['username'] += [
index 431b556..ac7e62e 100644 (file)
@@ -72,6 +72,7 @@ class SpecialContributions extends IncludableSpecialPage {
                $this->opts['target'] = $target;
                $this->opts['topOnly'] = $request->getBool( 'topOnly' );
                $this->opts['newOnly'] = $request->getBool( 'newOnly' );
+               $this->opts['hideMinor'] = $request->getBool( 'hideMinor' );
 
                $nt = Title::makeTitleSafe( NS_USER, $target );
                if ( !$nt ) {
@@ -142,6 +143,9 @@ class SpecialContributions extends IncludableSpecialPage {
                if ( $this->opts['newOnly'] ) {
                        $feedParams['newonly'] = true;
                }
+               if ( $this->opts['hideMinor'] ) {
+                       $feedParams['hideminor'] = true;
+               }
                if ( $this->opts['deletedOnly'] ) {
                        $feedParams['deletedonly'] = true;
                }
@@ -188,6 +192,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                'deletedOnly' => $this->opts['deletedOnly'],
                                'topOnly' => $this->opts['topOnly'],
                                'newOnly' => $this->opts['newOnly'],
+                               'hideMinor' => $this->opts['hideMinor'],
                                'nsInvert' => $this->opts['nsInvert'],
                                'associated' => $this->opts['associated'],
                        ] );
@@ -441,6 +446,10 @@ class SpecialContributions extends IncludableSpecialPage {
                        $this->opts['newOnly'] = false;
                }
 
+               if ( !isset( $this->opts['hideMinor'] ) ) {
+                       $this->opts['hideMinor'] = false;
+               }
+
                $form = Html::openElement(
                        'form',
                        [
@@ -461,6 +470,7 @@ class SpecialContributions extends IncludableSpecialPage {
                        'month',
                        'topOnly',
                        'newOnly',
+                       'hideMinor',
                        'associated',
                        'tagfilter'
                ];
@@ -609,6 +619,17 @@ class SpecialContributions extends IncludableSpecialPage {
                                [ 'class' => 'mw-input' ]
                        )
                );
+               $filters[] = Html::rawElement(
+                       'span',
+                       [ 'class' => 'mw-input-with-label' ],
+                       Xml::checkLabel(
+                               $this->msg( 'sp-contributions-hideminor' )->text(),
+                               'hideMinor',
+                               'mw-hide-minor-edits',
+                               $this->opts['hideMinor'],
+                               [ 'class' => 'mw-input' ]
+                       )
+               );
 
                Hooks::run(
                        'SpecialContributions::getForm::filters',
index b046bf9..9f3e5f0 100644 (file)
@@ -160,7 +160,7 @@ class SpecialCreateAccount extends LoginSignupSpecialPage {
        }
 
        protected function logAuthResult( $success, $status = null ) {
-               LoggerFactory::getInstance( 'authmanager-stats' )->info( 'Account creation attempt', [
+               LoggerFactory::getInstance( 'authevents' )->info( 'Account creation attempt', [
                        'event' => 'accountcreation',
                        'successful' => $success,
                        'status' => $status,
index 28c68aa..493ae2a 100644 (file)
@@ -154,7 +154,7 @@ class SpecialUserLogin extends LoginSignupSpecialPage {
        }
 
        protected function logAuthResult( $success, $status = null ) {
-               LoggerFactory::getInstance( 'authmanager-stats' )->info( 'Login attempt', [
+               LoggerFactory::getInstance( 'authevents' )->info( 'Login attempt', [
                        'event' => 'login',
                        'successful' => $success,
                        'status' => $status,
index 201e4e8..8620eb1 100644 (file)
@@ -64,6 +64,7 @@ class ContribsPager extends ReverseChronologicalPager {
                $this->deletedOnly = !empty( $options['deletedOnly'] );
                $this->topOnly = !empty( $options['topOnly'] );
                $this->newOnly = !empty( $options['newOnly'] );
+               $this->hideMinor = !empty( $options['hideMinor'] );
 
                $year = isset( $options['year'] ) ? $options['year'] : false;
                $month = isset( $options['month'] ) ? $options['month'] : false;
@@ -246,6 +247,10 @@ class ContribsPager extends ReverseChronologicalPager {
                        $condition[] = 'rev_parent_id = 0';
                }
 
+               if ( $this->hideMinor ) {
+                       $condition[] = 'rev_minor_edit = 0';
+               }
+
                return [ $tables, $index, $condition, $join_conds ];
        }
 
index 5eef0c2..cc4c6d0 100644 (file)
@@ -477,7 +477,7 @@ class User implements IDBAccessObject {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
                                wfDebug( "User: cache miss for user {$this->mId}\n" );
 
-                               $this->loadFromDatabase();
+                               $this->loadFromDatabase( self::READ_NORMAL );
                                $this->loadGroups();
                                $this->loadOptions();
 
old mode 100755 (executable)
new mode 100644 (file)
index 1241f6b..69a82c5 100644 (file)
        "createacct-email-ph": "Электрон почта адресығыҙҙы яҙығыҙ",
        "createacct-another-email-ph": "Электрон почта адресығыҙҙы яҙығыҙ",
        "createaccountmail": "Осраҡлы рәүештә хасил ителгән ваҡытлыса серһүҙҙе файҙаланырға һәм уны миңә ошо электрон почтаһы адресына ебәрергә",
+       "createaccountmail-help": "Серһүҙен һорамайынса, башҡа кешегә иҫәп яҙмаһын төҙөү өсөн ҡулланыла ала.",
        "createacct-realname": "Ысын исемегеҙ (мотлаҡ түгел)",
        "createaccountreason": "Сәбәп:",
        "createacct-reason": "Сәбәп",
        "createacct-reason-ph": "Икенсе иҫәп яҙмаһы һеҙгә ни өсөн кәрәк?",
+       "createacct-reason-help": "Иҫәп яҙмаһын төҙөү журналында күренгән хәбәр",
        "createacct-submit": "Иҫәп яҙмаһын булдырырға",
        "createacct-another-submit": "Иҫәп яҙмаһын булдырырға",
        "createacct-continue-submit": "Иҫәп яҙмаһын булдырыуҙы дауам итергә",
        "minoredit": "Әҙ генә үҙгәрештәр",
        "watchthis": "Күҙәтеү исемлегенә",
        "savearticle": "Яҙҙырып ҡуйырға",
+       "publishpage": "Битте баҫтырырға",
        "preview": "Ҡарап сығыу",
        "showpreview": "Ҡарап сығырға",
        "showdiff": "Индерелгән үҙгәрештәр",
        "whatlinkshere-links": "← һылтанмалар",
        "whatlinkshere-hideredirs": "$1 йүнәлтеүҙәре",
        "whatlinkshere-hidetrans": "Ҡушылғандарҙы $1",
-       "whatlinkshere-hidelinks": "Һылтанмаларҙы $1",
-       "whatlinkshere-hideimages": "файл һылтанмаларын $1",
+       "whatlinkshere-hidelinks": "$1 һылтанмалар",
+       "whatlinkshere-hideimages": "$1 файл һылтанмалары",
        "whatlinkshere-filters": "Һайлау",
        "whatlinkshere-submit": "Күсергә",
        "autoblockid": "Автобикләү #$1",
        "searchsuggest-containing": "эстәлегендә...",
        "api-error-badaccess-groups": "Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй",
        "api-error-badtoken": "Эске хата: дөрөҫ булмаған токен",
+       "api-error-blocked": "Мөхәррирләү һеҙҙең өсөн бикләнде.",
        "api-error-copyuploaddisabled": "Был серверҙа URL адрес буйынса йөкләү өҙөлгән",
        "api-error-duplicate": "Бындай эстәлекле {{PLURAL:$1|файл}}  бар.",
        "api-error-duplicate-archive": "Сайтта бындай эстәлекле {{PLURAL:$1|башҡа файл}} бар ине инде, ләкин {{PLURAL:$1|1=ул юйылды|улар юйылды}}",
        "log-action-filter-delete-event": "Журналды юйыу",
        "log-action-filter-delete-revision": "Версияны алып ташларға",
        "log-action-filter-import-interwiki": "Трансвики импорты",
+       "log-action-filter-managetags-create": "Тег төҙөү",
+       "log-action-filter-managetags-delete": "Тегты юйыу",
+       "log-action-filter-newusers-autocreate": "Автоматик төҙөү",
        "log-action-filter-patrol-patrol": "Ҡулдан патруль яһау",
        "log-action-filter-patrol-autopatrol": "Автоматик патруль",
        "log-action-filter-protect-protect": "Һаҡлау",
        "log-action-filter-protect-modify": "Яңынан тейәү",
        "log-action-filter-protect-unprotect": "Һаҡты алып ташлау",
+       "log-action-filter-protect-move_prot": "Һаҡлауҙы күсереү",
+       "log-action-filter-rights-rights": "Ҡулдан үҙгәртеү",
+       "log-action-filter-rights-autopromote": "Автоматик үҙгәртеү",
        "log-action-filter-upload-upload": "Яңы күсереү",
        "log-action-filter-upload-overwrite": "Ҡабаттан тейәү",
+       "authmanager-create-disabled": "Иҫәп яҙмаһын булдырыу бикләнгән.",
+       "authmanager-authplugin-setpass-failed-title": "Серһүҙҙе үҙгәртеү хатаһы",
        "authmanager-userdoesnotexist": "\"$1\" иҫәп яҙмаһы теркәлмәгән.",
        "authmanager-email-label": "Электрон почта адресы",
        "authmanager-email-help": "Электрон почта адресы",
index a51080f..761f799 100644 (file)
        "createacct-yourpasswordagain": "पासवर्ड निश्चित गर",
        "createacct-yourpasswordagain-ph": "आजी पासवर्ड लेख",
        "userlogin-remembermypassword": "मुलाई अघाडी झान्या काम गराइराख्या",
+       "cannotloginnow-title": "अईल भितर झान नाइँ पाईनो",
        "yourdomainname": "तमरो ज्ञानक्षेत्र(डोमेन):",
        "password-change-forbidden": "ये विकिमी पासवर्ड परिवर्तन गर्न सक्नुहुन्न।",
        "login": "प्रवेश (लगईन)",
index 6e2915b..cc58b13 100644 (file)
        "sp-contributions-username": "IP address or username:",
        "sp-contributions-toponly": "Only show edits that are latest revisions",
        "sp-contributions-newonly": "Only show edits that are page creations",
+       "sp-contributions-hideminor": "Hide minor edits",
        "sp-contributions-submit": "Search",
        "sp-contributions-explain": "",
        "sp-contributions-footer": "-",
index c0929da..fe9b585 100644 (file)
        "upload-http-error": "Produciuse un erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "A copia de cargas non está dispoñible neste dominio.",
        "upload-foreign-cant-upload": "Este wiki non está configurado para subir ficheiros ao repositorio de ficheiros externo solicitado.",
+       "upload-foreign-cant-load-config": "A carga da configuración de carga de ficheiros para o repositorio de ficheiros externo fallou.",
        "upload-dialog-title": "Subir un ficheiro",
        "upload-dialog-button-cancel": "Cancelar",
        "upload-dialog-button-done": "Feito",
index bf8930a..f1218d0 100644 (file)
        "right-reupload-shared": "דריסה מקומית של קבצים מאתר קובצי המדיה המשותף",
        "right-upload_by_url": "העלאת קובץ מכתובת אינטרנט",
        "right-purge": "רענון זיכרון המטמון של האתר ללא מעבר בדף אישור",
-       "right-autoconfirmed": "עק×\99פת ×\94×\92×\91×\9cת ×§×¦×\91 ×\94ער×\99×\9b×\95ת ×\94×\9e×\91×\95ססת על כתובת IP",
+       "right-autoconfirmed": "עק×\99פת ×\94×\92×\91×\9c×\95ת ×\94קצ×\91 ×\94×\9e×\91×\95סס×\95ת על כתובת IP",
        "right-bot": "התייחסות לעריכות כאוטומטיות",
        "right-nominornewtalk": "ביטול שליחת התראה על הודעה חדשה למשתמש בעת עריכה משנית בדף השיחה שלו",
        "right-apihighlimits": "שימוש ב־API עם פחות הגבלות",
index 4501c7b..9bb9554 100644 (file)
        "userlogin-remembermypassword": "Система чу виса",
        "yourdomainname": "Хьа нана-цIа:",
        "login": "Чувала/яла",
-       "nav-login-createaccount": "ЦÓ\80и Ñ\8fÑ\8cккÑ\85а/Ший oагÓ\80Ñ\83в ÐµÐ»Ð°",
-       "userlogin": "ЦÓ\80и Ñ\8fÑ\8cккÑ\85а/Ð\9eагÓ\80Ñ\83в ÐµÐ»Ð°",
-       "userloginnocreate": "ЧÑ\83вала/Ñ\8fла",
+       "nav-login-createaccount": "ШоаÑ\88 Ð´Ð¾Ð²Ð·Ð¸Ð¹Ñ\82аÑ\80 / Ð\94агаÑ\80а Ð¹Ð¾Ð°Ð·Ñ\83в ÐºÑ\85оллаÑ\80",
+       "userlogin": "ШоаÑ\88 Ð´Ð¾Ð²Ð·Ð¸Ð¹Ñ\82аÑ\80 Ðµ Ð´Ð°Ð³Ð°Ñ\80а Ð¹Ð¾Ð°Ð·Ñ\83в ÐºÑ\85оллаÑ\80",
+       "userloginnocreate": "ШоаÑ\88 Ð´Ð¾Ð²Ð·Ð¸Ð¹Ñ\82а",
        "logout": "Аравала/яла",
        "userlogout": "Аравала/яла",
-       "notloggedin": "Оаш шоай цӀи хьааьннадац",
+       "notloggedin": "Оаш шоаш довзийтадац системан",
        "userlogin-noaccount": "Доакъашхочун учета яздар дице хьа?",
        "userlogin-joinproject": "ДIахоттале {{SITENAME}}аца",
-       "nologin": "Ð\9bеламе Ð´IаÑ\8fздаÑ\80 Ð´Ð°Ñ\86? '''$1'''.",
+       "nologin": "Ð\94агаÑ\80а Ð¹Ð¾Ð°Ð·Ñ\83в Ð¹Ð¸Ñ\86е Ñ\85Ñ\8cога? $1.",
        "nologinlink": "Дагара йоазув хьакхолла",
        "createaccount": "Дагара йоазув хьакхолла",
-       "gotaccount": "Укхаза дӀаязабенна дий шо? '''$1'''.",
+       "gotaccount": "Укхаза тхьовре дӀаяьзденна дий шо? $1.",
        "gotaccountlink": "Чувала/яла",
-       "userlogin-resetlink": "Чувала/яла цӀии дIоагӀаи дийцаденнадий?",
+       "userlogin-resetlink": "Чувалара/ялара дараш дицданнадий шоана?",
        "userlogin-resetpassword-link": "ТIеракхосс хьа пароль?",
        "userlogin-helplink2": "Система чуваларах новкъостал",
        "userlogin-createanother": "Кхыдола дагара йоазув хьакхолла",
        "createacct-benefit-body1": "{{PLURAL:$1|нийсдар|нийсдараш}}",
        "createacct-benefit-body2": "{{PLURAL:$1|статья|статьяш}}",
        "createacct-benefit-body3": "{{PLURAL:$1|доакъашхо|доакъашхой}} тӀеххьара хан",
-       "badretype": "Оаша яьккха дIоагIий цIераш шоайл таралуш яц.",
-       "loginerror": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\87Ñ\83н Ñ\86Iи Ð½Ð¸Ð¹Ñ\81а Ñ\8fÑ\86",
-       "mailmypassword": "Керда къайлад|оаг|а эца",
-       "mailerror": "Хоам Ð´IабоÑ\85Ñ\8cийÑ\82аÑ\88 Ð³IалаÑ\82 Ð´Ð°Ñ\8cннад: $1",
-       "emailconfirmlink": "Ð\94оаÑ\80жален Ñ\85оамни Ñ\85Ñ\8cожадоÑ\80г Ð´IаÑ\87IоагIаде",
+       "badretype": "Оаша Iочуяьздаь къайладIоагIий цIераш цхьантара яц.",
+       "loginerror": "Ð\94оакÑ\8aаÑ\88Ñ\85о Ð²Ð¾Ð²Ð·Ð°Ñ\80а Ð³IалаÑ\82",
+       "mailmypassword": "КъайладIоагIа тIеракхоссар",
+       "mailerror": "Ð\9aаÑ\8cÑ\85аÑ\82 Ð´IадоÑ\85Ñ\8cиййÑ\82аÑ\88 Ð³Ó\80алаÑ\82 Ñ\85илаÑ\80: $1",
+       "emailconfirmlink": "Ð\91акÑ\8aде Ñ\85Ñ\8cа Ñ\8dлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\88Ñ\82а Ð°Ð´Ñ\80еÑ\81",
        "loginlanguagelabel": "Мотт: $1",
        "pt-login": "Чувала/яла",
        "pt-login-button": "Чувала/яла",
        "changepassword": "КъайладIоaгIа дIахувцар",
        "oldpassword": "Къаьна къайладIоагӀа:",
        "newpassword": "Керда къайладIоагӀа:",
-       "retypenew": "Ð\9aеÑ\80да ÐºÑ\8aайладIоагÓ\80а Ñ\8eÑ\85а Ó\80оÑ\8fзаде:",
+       "retypenew": "ЮÑ\85аÑ\8fзде ÐºÐµÑ\80да ÐºÑ\8aайладIоагÓ\80а:",
        "resetpass-submit-loggedin": "КъайладIоагӀа дӀахувца",
-       "resetpass-submit-cancel": "ЮÑ\85авал/Ñ\8fлa",
+       "resetpass-submit-cancel": "ЭÑ\88аÑ\86",
        "passwordreset": "Пароль тIеракхоссар",
-       "passwordreset-username": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\87Ñ\83нна цӀи:",
-       "passwordreset-email": "Ð\94\85оамни Ð¼Ð¾Ñ\82Ñ\82иг:",
+       "passwordreset-username": "Ð\94оакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н цӀи:",
+       "passwordreset-email": "ЭлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81:",
        "bold_sample": "Сома йоазон текст",
        "bold_tip": "Сома йоазон текст",
        "italic_sample": "Сиха йоазон текст",
        "minoredit": "ЗӀамига хувцам",
        "watchthis": "Зем бе укх оагӀон",
        "savearticle": "ОагӀув дIаязъе",
-       "preview": "Хьалхе бӀаргтассар",
+       "preview": "Хьалххе бIаргтохар",
        "showpreview": "Хьалххе бIаргтохар",
        "showdiff": "Даь дола хувцамаш",
        "anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 дагара йоазув хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
-       "summary-preview": "Ð\9bоаÑ\86ам Ð±а:",
+       "summary-preview": "СÑ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80 Ñ\85Ñ\83Ñ\80гда:",
        "subject-preview": "Кортале хургья:",
-       "blockedtitle": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85о Ñ\87Ó\80ега Ð±ÐµÐ»Ð° Ð²Ð°/Ñ\8f",
-       "blockednoreason": "баÑ\85Ñ\8cан Ð´Ð¾Ð°Ñ\86аÑ\88 Ð´Ð°",
-       "loginreqlink": "чувала/яла",
-       "loginreqpagetext": "Ð\9aÑ\85Ñ\8bйола Ð¾Ð°Ð³Ó\80Ñ\83внаÑ\88ка Ñ\85Ñ\8cожаÑ\80гдолаÑ\88, Ð¾Ð°Ñ\88 $1 Ð´Ðµ Ð´ÐµÐ·Ð°.",
+       "blockedtitle": "Ð\94оакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\87Iега Ñ\82еÑ\85аб",
+       "blockednoreason": "баÑ\85Ñ\8cан Ð±ÐµÐ»Ð³Ð°Ð»Ð´Ð°Ñ\8cккÑ\85а Ð´Ð°Ñ\86",
+       "loginreqlink": "довзийта",
+       "loginreqpagetext": "Ð\9eаÑ\88 Ñ\88оаÑ\88 $1 Ð´ÐµÐ·Ð° ÐºÑ\85Ñ\8bйола Ð¾Ð°Ð³IонаÑ\88ка Ñ\85Ñ\8cожаÑ\80гдолаÑ\88.",
        "accmailtitle": "КъайладIоагӀа дӀадахьийтад",
        "newarticle": "(Kерда)",
        "newarticletext": "Шо тIахьожаяргаца дехьадаьннад йоаца оагӀон тӀа.\nИз хьакхолларгьйолаш кӀалхагӀа доала корачу текст Iочуязде (нагахьа санна кхетаде хала дале [$1 новкъосталара оагӀонга] хьажа).\nЦа ховш укхаза нийсденнадале, шоай браузера '''Юха''' (назад) тоIаер тӀа пӀелг тоӀабе.",
        "noarticletext": "ХIанза укх оагӀон тӀа текст яц.\nШун аьттув ба [[Special:Search/{{PAGENAME}}|цу тайпара цӀи хьоаяр кораде]] кхыйола оагIонаш тIа, иштта\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола тептарий дIаяздаьраш], е\n'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} изза мо цӀи йолаш оагӀув хьакхолла]'''</span>.",
        "noarticletext-nopermission": "ХIанз укх оагӀон тӀа текст яц.\nШун аьттув ба [[Special:Search/{{PAGENAME}}|цу тайпара цӀи белгалъяр хьалаха]] кхыйола оагIонаш тIа, иштта\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола тептарай дIаяздаьраш].</span> Ер оагӀув хьакхолла Хьа бокъо яц.",
-       "note": "'''Ð¥Ó\80амоалар:'''",
+       "note": "'''Ð\91елгалдоаÑ\85ар:'''",
        "previewnote": "'''Хьалхе б|аргтассам мара бац.'''\nЯздам кхы яздаь дац!",
        "editing": "Хувцам: $1",
        "creating": "«$1» оагIув хьакхоллар",
        "preferences": "Оттамаш",
        "mypreferences": "ГIирсаш",
        "prefs-skin": "БIагала куц",
-       "skin-preview": "Ð¥Ñ\8cажа",
+       "skin-preview": "Ð¥Ñ\8cалÑ\85Ñ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80",
        "prefs-personal": "Хьа хьай далам",
        "prefs-rc": "Керда хувцамаш",
        "prefs-watchlist": "Зем бара хьаязъяьр",
        "prefs-help-email": "Д-хоамни моттиг ала эшаш дац, амма новкъа даца, наггахь санна къайладIоагIа шоана дийцалой, цу тIа хьатIадайтаргда.",
        "prefs-help-email-others": "Кхыбола дакъалаьцархоша шоаца бувзам я йийшхургья шун оагIува тIа гIолла, д-хоамни хьаела ца езаш.",
        "prefs-signature": "Кулгяздар",
+       "prefs-preview": "Хьалххе бIаргтохар",
        "userrights-user-editname": "Дакъалаьцархочунна цIи Iоязаде",
        "editusergroup": "Дакъалаьцархочунна тоабаш хувца",
        "saveusergroups": "Дакъалаьцархочунна тоабаш дита",
        "rightsnone": "(а)",
        "revdelete-summary": "хувцамий лоацам",
        "searchsuggest-search": "Лахар",
+       "expand_templates_preview": "Хьалххе бIаргтохар",
        "pagelang-name": "ОагIув",
        "special-characters-group-latin": "Лаьтмий",
        "special-characters-group-greek": "Джелтий",
index db31115..f7c2aa3 100644 (file)
        "tog-showtoolbar": "ایڈٹ ٹولبار وکھاؤ",
        "tog-editondblclick": "صفیاں تے ڈبل کلک کرن تے تبدیلیاں لیاؤ",
        "tog-editsectiononrightclick": "سیکشن سرخی تے تبدیلی لیاؤ سجے کلک نال",
-       "tog-watchcreations": "جیہڑے صفے میں بناندا واں اوہ میری اکھ تھلے لسٹ چ کر دیو",
-       "tog-watchdefault": "جیہڑے صفے میں لکھداں اوہ میری اکھ تھلے لسٹ چ کر دیو",
-       "tog-watchmoves": "جیڈے صفحے میں لے چلداں اوہ میری اکھ تھلے کر دیو",
-       "tog-watchdeletion": "جیڈے صفحے میں مٹانداں اوہ میری اکھ تھلے کر دیو",
+       "tog-watchcreations": "صفے جیہڑے میں بناندا واں تے جیہڑیاں فائیلاں میں چڑھائواں اوہ میری اکھ تھلے لسٹ چ کر دیو",
+       "tog-watchdefault": "جیہڑے صفے تے فائیلاں میں لکھداں اوہ میری اکھ تھلے لسٹ چ کر دیو",
+       "tog-watchmoves": "جیڈے صفحے تے فائیلاں میں لے چلداں اوہ میری اکھ تھلے کر دیو",
+       "tog-watchdeletion": "جیڈے صفحے تے فائیلاں میں مٹانداں اوہ میری اکھ تھلے کر دیو",
+       "tog-watchuploads": "نویائیاں فائیلاں جیہڑیاں میں چڑھائواں اوہ میری اکھ تھلے لسٹ چ کر دیو",
+       "tog-watchrollback": "صفحے جہناں نوں میں واپس کراں اوہ میری اکھ تھلے لسٹ چ کر دیو",
        "tog-minordefault": "ساریاں تبدیلیاں نوں نکا ڈیفالٹ نال دسو۔",
        "tog-previewontop": "ایڈٹ باکس توں پہلے پریویو وکھاؤ",
        "tog-previewonfirst": "پہلی تبدیلی تے پریویو وکھاؤ",
        "tog-watchlisthideliu": "تبدیلیاں نوں لکاؤ اوناں لاگ ان ورتن والیاں کولوں جیہڑے واچلسٹ تے نیں۔",
        "tog-watchlisthideanons": "تبدیلیاں واجلسٹ دے گمنام ورتن والیاں توں لکاؤ",
        "tog-watchlisthidepatrolled": "نکی لکھائی اکھ تھلوں لکاؤ",
+       "tog-watchlisthidecategorization": "صفحیاں دی گٹھ لکائو۔",
        "tog-ccmeonemails": "مینوں اوہناں ای میلاں دیاں کاپیاں بھیجو جیہڑیاں میں دوجیاں نوں بھیجاں۔",
        "tog-diffonly": "تبدیلی توں علاوہ صفحہ نا وکھاؤ",
        "tog-showhiddencats": "لکیاں کیٹاگریاں وکھاؤ",
-       "tog-norollbackdiff": "صفحے دی واپسی تے تبدیلی کڈ دو",
+       "tog-norollbackdiff": "صفحے دی واپسی تے تبدیلی نہ وکھائو",
        "tog-useeditwarning": "جدوں میں کوئی صفحہ تبدیلی کر کے بچاۓ بغیر چھڈن لگاں تے منوں دس دیو",
        "underline-always": "ہمیشہ",
        "underline-never": "کدی وی نئیں",
-       "underline-default": "براؤزر ڈیفالٹ",
+       "underline-default": "سکÛ\8cÙ\86 Û\8cا Ø¨Ø±Ø§Ø¤Ø²Ø± Ú\88Û\8cÙ\81اÙ\84Ù¹",
        "editfont-style": "تبدیلی کرن ویلے دی لکھائی دا خط:",
        "editfont-default": "براؤزر ڈیفالٹ",
        "editfont-monospace": "اکوجۓ حالی تھاں آلا خط",
        "oct": "اکتوبر",
        "nov": "نومبر",
        "dec": "دسمبر",
+       "january-date": "جنوری $1",
+       "february-date": "فروری $1",
+       "march-date": "مارچ $1",
+       "april-date": "اپریل $1",
+       "may-date": "مئی $1",
+       "june-date": "جون $1",
+       "july-date": "جولائی $1",
+       "august-date": "اگست $1",
+       "september-date": "ستمبر $1",
+       "october-date": "اکتوبر $1",
+       "november-date": "نومبر $1",
+       "december-date": "دسمبر $1",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|گٹھ|گٹھیاں}}",
        "category_header": "\"$1\" کیٹاگری وچ صفے",
        "subcategories": "تھلے آلی کیٹاگری",
        "newwindow": "(نئی ونڈو چ کھولو)",
        "cancel": "مکاؤ",
        "moredotdotdot": "مزید۔۔۔۔",
-       "mypage": "میرا صفہ",
+       "morenotlisted": "ایہ لسٹ پوری نئی۔",
+       "mypage": "صفہ",
        "mytalk": "میریاں گلاں",
-       "anontalk": "اس آئی پی آسطے گل کرو",
+       "anontalk": "گل",
        "navigation": "کھوج",
        "and": "&#32;تے",
        "qbfind": "کھوج",
        "create-this-page": "اے صفحہ بناؤ",
        "delete": "مٹاؤ",
        "deletethispage": "اے صفحہ مٹاؤ",
+       "undeletethispage": "اس صفحے نوں واپس لیاؤ",
        "undelete_short": "مٹانا واپس {{PLURAL:$1|اکتبدیلی|$1 تبدیلی}}",
        "viewdeleted_short": "ویکھو {{PLURAL:$1|اک مٹائی گئی تبدیلی|$1 مٹائیاں گئیاں تبدیلیاں}}",
        "protect": "بچاؤ",
index ec1403e..dfe755e 100644 (file)
        "sp-contributions-username": "This message appears whenever someone requests [[Special:Contributions]].\n{{Identical|IP address or username}}",
        "sp-contributions-toponly": "A checkbox at [[Special:Mycontributions|Special:Contributions]]",
        "sp-contributions-newonly": "Used as checkbox label at [[Special:Mycontributions|Special:Contributions]].\n\n\"page creation\" means the \"first revision\" of a page.\n\nPreceded by {{msg-mw|Sp-contributions-toponly}}.",
+       "sp-contributions-hideminor": "Used as checkbox label at [[Special:Mycontributions|Special:Contributions]].\n\nSee also:\n* {{msg-mw|Tog-hideminor}}",
        "sp-contributions-submit": "{{Identical|Search}}",
        "sp-contributions-explain": "{{optional}}",
        "sp-contributions-footer": "{{ignored}}This is the footer for users that are not anonymous or newbie on [[Special:Contributions]].",
index 31790e2..a9d1e5a 100644 (file)
        "noname": "用户名无效。",
        "loginsuccesstitle": "登录哉",
        "loginsuccess": "<strong>侬现在以“$1”个身份登录到{{SITENAME}}。</strong>",
-       "nosuchuser": "寻弗着用户“$1”。用户名是大小写敏感外加区分繁简体个。请检查拼写,或者[[Special:CreateAccount|开只新账æ\88·]]ã\80\82",
+       "nosuchuser": "寻弗着用户“$1”。用户名是大小写敏感外加区分繁简体个。请检查拼写,或者[[Special:CreateAccount|开只新账å\8f·]]ã\80\82",
        "nosuchusershort": "无没叫“$1”个用户。请检查侬个输入。",
        "nouserspecified": "侬必须选个用户名。",
        "login-userblocked": "箇个用户拨封锁拉许。弗允许登录。",
        "createaccount-title": "垃拉{{SITENAME}}里向创建新账户",
        "createaccount-text": "有人垃拉{{SITENAME}}里向利用侬个邮箱创建仔一只叫 \"$2\" 个新帐户($4),密码是 \"$3\" 。侬应该立即登录并更改密码。\n\n如果箇个账户创建错误个说话,侬可以忽略此信息。",
        "login-throttled": "你侬试登忒多次哉。\n等 $1 再试试凑相。",
-       "login-abort-generic": "登录弗成功 - 已终止",
+       "login-abort-generic": "侬登录失败 - 中止哉",
        "login-migrated-generic": "侬个账号已经畀移脱哉,并且侬个用户名来箇wiki弗再存在。",
        "loginlanguagelabel": "闲话:$1",
        "suspicious-userlogout": "侬登出个要求已经拨回头脱,因为渠可能是由已损坏个浏览器或者缓存代理传送个。",
        "previewnote": "<strong>该个还只是预览。</strong>倷个修改还朆保存!",
        "continue-editing": "到编辑区去",
        "previewconflict": "箇个预览显示了上头文字编辑区里向个内容。渠会得垃拉侬保存之后出现。",
-       "session_fail_preview": "'''弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|登出]]之后重新登录。",
+       "session_fail_preview": "弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。\n\n侬作兴已经登出哉。<strong>请核实侬啊曾登录勒上,再试一遍</strong>。如果仍旧弗来事,请[[Special:UserLogout|登出]]著再重新登录,并确保侬个浏览器允许本站个cookie。",
        "session_fail_preview_html": "弗好意思!因为会话数据落失,我伲弗好处理侬个编辑。\n\n<em>由于{{SITENAME}}允许使用原始个HTML,为著防范JavaScript攻击,预览已经囥脱。</em>\n\n<strong>如果箇是一趟合法个编辑,请再试一遍。</strong>如果仍旧弗来事,请[[Special:UserLogout|登出]]著再重新登录,并确保侬个浏览器允许本站个cookie。",
        "token_suffix_mismatch": "<strong>由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。</strong>箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
        "editing": "来里编写$1",
        "yourtext": "侬个文字",
        "storedversion": "已保存版本",
        "nonunicodebrowser": "'''警告:侬个浏览器弗兼容Unicode编码。'''箇搭有一只工作区将使侬可以安全编辑页面:非ASCII字符将以十六进制编码方式出现垃拉编辑框里向。",
-       "editingold": "''' 注意:倷勒里改动一只已经过期个页面修改。 如果倷保存俚个说话,勒拉该个修改之后个亨白浪当个修改侪会呒拨个。'''",
+       "editingold": "<strong>警告:倷勒里编辑该只页面个旧版本。</strong>如果倷保存俚个说话,勒拉该个版本之后个亨白浪当个修改侪会呒不个。",
        "yourdiff": "两样",
        "copyrightwarning": "请注意侬对{{SITENAME}}个所有贡献侪必须垃拉$2下头发布(请查看垃拉$1个细节)。假使侬弗希望侬个文字畀任意修改搭再发布,请弗要提交。<br />\n侬同时也要向阿拉保证侬所提交个内容是侬自家所作,或得自一个弗受版权保护或相似自由个来源。<strong>弗要垃拉弗曾获得授权个情况下头发表!</strong>",
        "copyrightwarning2": "请注意侬对{{SITENAME}}个所有贡献\n侪可能畀别个贡献者编辑,修改或删除。\n假使侬弗希望侬个文字畀任意修改搭仔再发布,请弗要提交。<br />\n侬同时也要向我伲保证侬提交个内容是侬自家所作,或得自一个弗受版权保护或相似自由个来源(参阅$1个细节)。\n''' 弗要垃拉弗曾获得授权个情况下头发表!'''",
        "cantcreateaccounttitle": "弗好开户",
        "cantcreateaccount-text": "从箇只IP地址 (<b>$1</b>) 创建账户已经畀[[User:$3|$3]]禁止。\n\n$3封禁个原因是''$2''",
        "viewpagelogs": "望箇页日志",
-       "nohistory": "该只页面呒编辑历史。",
+       "nohistory": "该只页面呒编辑历史。",
        "currentrev": "最后版本",
        "currentrev-asof": "$1个最新修订版",
        "revisionasof": "垃拉$1所作出个修订版",
        "revdelete-unsuppress": "垃拉已恢复个修订里向移除限制",
        "revdelete-log": "理由:",
        "revdelete-submit": "应用于拣中个{{PLURAL:$1|修订}}",
-       "revdelete-success": "'''修订个可见性已经成功更新。'''",
+       "revdelete-success": "修订个可见性已经更新哉。",
        "revdelete-failure": "版本个可见性无法更新:$1",
        "logdelete-success": "日志个可见性设置好哉。",
        "logdelete-failure": "'''事件个可见性无法设置:'''\n$1",
        "prefsnologintext2": "请登录来更改侬个用户设置。",
        "prefs-skin": "皮肤",
        "skin-preview": "预览",
-       "datedefault": "呒偏好",
+       "datedefault": "呒偏好",
        "prefs-labs": "实验性特色",
        "prefs-user-pages": "用户页",
        "prefs-personal": "用户档案",
        "logentry-newusers-create": "用户账号$1畀{{GENDER:$2|创建}}",
        "logentry-newusers-create2": "用户账号$3畀$1{{GENDER:$2|创建}}",
        "logentry-newusers-autocreate": "用户账号$1畀自动{{GENDER:$2|创建}}",
-       "logentry-rights-rights": "$1{{GENDER:$2|更改}}$3个用户组从$4到$5",
+       "logentry-rights-rights": "$1{{GENDER:$2|更改}}{{GENDER:$6|$3}}个用户组从$4到$5",
        "logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
        "rightsnone": "(呒)",
        "revdelete-summary": "编辑摘要",
index 4000da9..3babdbe 100644 (file)
        "upload-http-error": "发生HTTP错误:$1",
        "upload-copy-upload-invalid-domain": "不能从该域名上载文件副本。",
        "upload-foreign-cant-upload": "此wiki未配置为上传文件至请求的外部文件存储库。",
+       "upload-foreign-cant-load-config": "加载外部文件存储库的文件上传配置失败。",
        "upload-dialog-title": "上传文件",
        "upload-dialog-button-cancel": "取消",
        "upload-dialog-button-done": "完成",
        "linkaccounts-success-text": "账户已链接。",
        "linkaccounts-submit": "链接帐户",
        "unlinkaccounts": "取消链接账户",
-       "unlinkaccounts-success": "账户已取消链接。"
+       "unlinkaccounts-success": "账户已取消链接。",
+       "authenticationdatachange-ignored": "身份验证数据更改未处理。也许没有配置的提供者?"
 }
index 0d04c41..8b1d86d 100644 (file)
@@ -17,8 +17,5 @@ foreach ( glob( $base . '/*.php' ) as $file ) {
        $generator->readFile( $file );
 }
 
-// This class is not defined, but might be added by the installer
-$generator->forceClassPath( 'MyLocalSettingsGenerator', "$base/mw-config/overrides.php" );
-
 // Write out the autoload
 $generator->generateAutoload( 'maintenance/generateLocalAutoload.php' );
diff --git a/mw-config/overrides.php b/mw-config/overrides.php
deleted file mode 100644 (file)
index 3dfecaa..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-/**
- * MediaWiki installer overrides.
- * Modify this file if you are a packager who needs to modify the behavior of
- * the MediaWiki installer. Altering it is preferred over changing anything in
- * /includes.
- *
- * Note: this file doesn't gets included from a global scope, don't use globals directly.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/*
-
-Example of modifications:
-
-       public static function getLocalSettingsGenerator( Installer $installer ) {
-               return new MyLocalSettingsGenerator( $installer );
-       }
-
-Then add the following to the bottom of this file:
-
-class MyLocalSettingsGenerator extends LocalSettingsGenerator {
-       function getText() {
-               // Modify an existing setting
-               $this->values['wgDefaultSkin'] = 'vector';
-               // add a new setting
-               $ls = parent::getText();
-               return $ls . "\n\$wgUseTex = true;\n";
-       }
-}
-*/
-
-/**
- * @since 1.20
- */
-class InstallerOverrides {
-       /**
-        * Instantiates and returns an instance of LocalSettingsGenerator or its descendant classes
-        * @param Installer $installer
-        * @return LocalSettingsGenerator
-        */
-       public static function getLocalSettingsGenerator( Installer $installer ) {
-               return new LocalSettingsGenerator( $installer );
-       }
-
-       /**
-        * Instantiates and returns an instance of WebInstaller or its descendant classes
-        * @param WebRequest $request
-        * @return WebInstaller
-        */
-       public static function getWebInstaller( WebRequest $request ) {
-               return new WebInstaller( $request );
-       }
-
-       /**
-        * Instantiates and returns an instance of CliInstaller or its descendant classes
-        * @param string $siteName
-        * @param string|null $admin
-        * @param array $options
-        * @return CliInstaller
-        */
-       public static function getCliInstaller( $siteName, $admin = null, array $options = [] ) {
-               return new CliInstaller( $siteName, $admin, $options );
-       }
-}
diff --git a/mw-config/overrides/README b/mw-config/overrides/README
new file mode 100644 (file)
index 0000000..f251330
--- /dev/null
@@ -0,0 +1,22 @@
+Don't modify the installer if you want to alter its behavior, including
+the contents of generated LocalSettings.php in your package. Instead,
+you can override classes used by the installer.
+
+You can override 3 classes:
+* LocalSettingsGenerator - generates LocalSettings.php
+* WebInstaller - web instller UI
+* CliInstaller - command line installer
+
+Example override:
+
+$overrides['LocalSettingsGenerator'] = 'MyLocalSettingsGenerator';
+
+class MyLocalSettingsGenerator extends LocalSettingsGenerator {
+       function getText() {
+               // Modify an existing setting
+               $this->values['wgDefaultSkin'] = 'vector';
+               // add a new setting
+               $ls = parent::getText();
+               return $ls . "\n\$wgMiserMode = true;\n";
+       }
+}
index 106a83b..1e80c26 100644 (file)
@@ -1379,11 +1379,9 @@ return [
        ],
        'mediawiki.checkboxtoggle' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.checkboxtoggle.js',
-               'position' => 'top',
        ],
        'mediawiki.checkboxtoggle.styles' => [
                'styles' => 'resources/src/mediawiki/mediawiki.checkboxtoggle.css',
-               'position' => 'top',
        ],
        'mediawiki.cookie' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.cookie.js',
index 579bd5f..f8d283a 100644 (file)
@@ -108,6 +108,9 @@ input[type="number"],
 .mw-ui-input-inline {
        display: inline-block;
        width: auto;
+       // Make sure we limit `width` to parent element because
+       // in case of text `input` fields, `width: auto;` equals `size` attribute.
+       max-width: 100%;
 }
 
 // mw-ui-input-large
index a2386b3..62760d2 100644 (file)
 ( function ( mw, $ ) {
        'use strict';
 
-       var $checkboxes = $( 'li input[type=checkbox]' );
+       $( function () {
+               var $checkboxes = $( 'li input[type=checkbox]' );
 
-       function selectAll( check ) {
-               $checkboxes.prop( 'checked', check );
-       }
+               function selectAll( check ) {
+                       $checkboxes.prop( 'checked', check );
+               }
 
-       $( '.mw-checkbox-all' ).click( function ( e ) {
-               selectAll( true );
-               e.preventDefault();
-       } );
-       $( '.mw-checkbox-none' ).click( function ( e ) {
-               selectAll( false );
-               e.preventDefault();
-       } );
-       $( '.mw-checkbox-invert' ).click( function ( e ) {
-               $checkboxes.each( function () {
-                       $( this ).prop( 'checked', !$( this ).is( ':checked' ) );
+               $( '.mw-checkbox-all' ).click( function ( e ) {
+                       selectAll( true );
+                       e.preventDefault();
+               } );
+               $( '.mw-checkbox-none' ).click( function ( e ) {
+                       selectAll( false );
+                       e.preventDefault();
                } );
-               e.preventDefault();
+               $( '.mw-checkbox-invert' ).click( function ( e ) {
+                       $checkboxes.each( function () {
+                               $( this ).prop( 'checked', !$( this ).is( ':checked' ) );
+                       } );
+                       e.preventDefault();
+               } );
+
        } );
 
 }( mediaWiki, jQuery ) );
index 275ed27..85bf954 100644 (file)
@@ -30,9 +30,6 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                        // For ResourceLoader::inDebugMode since it doesn't have context
                        'ResourceLoaderDebug' => true,
 
-                       // For ResourceLoaderContext::newDummyContext()
-                       'DefaultSkin' => 'vector',
-
                        // Avoid influence from wgInvalidateCacheOnLocalSettingsChange
                        'CacheEpoch' => '20140101000000',
 
index d254e81..580ef6c 100644 (file)
@@ -175,7 +175,12 @@ class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
                $this->assertCount( 1, $res->neededRequests );
                $req = $res->neededRequests[0];
                $this->assertInstanceOf( ConfirmLinkAuthenticationRequest::class, $req );
-               $this->assertEquals( $reqs, \TestingAccessWrapper::newFromObject( $req )->linkRequests );
+               $expectReqs = $this->getLinkRequests();
+               foreach ( $expectReqs as $r ) {
+                       $r->action = AuthManager::ACTION_CHANGE;
+                       $r->username = $user->getName();
+               }
+               $this->assertEquals( $expectReqs, \TestingAccessWrapper::newFromObject( $req )->linkRequests );
        }
 
        public function testContinueLinkAttempt() {
index e6bb5a7..85834d7 100644 (file)
@@ -49,12 +49,6 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                        'scripts' => [ 'MediaWiki:Common.js' ],
                ];
 
-               $variableParams = [
-                       'allowVariables' => true,
-                       'styles' => [ 'MediaWiki:Common.css', 'MediaWiki:{skin}.css' ],
-                       'scripts' => [ 'MediaWiki:Common.js', 'MediaWiki:{skin}.js' ],
-               ];
-
                return [
                        [ [], new HashConfig( $settings ), [] ],
                        [ $params, new HashConfig( $settings ), [
@@ -73,12 +67,6 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                                ),
                                []
                        ],
-                       [ $variableParams, new HashConfig( $settings ), [
-                               'MediaWiki:Common.js' => [ 'type' => 'script' ],
-                               'MediaWiki:vector.js' => [ 'type' => 'script' ],
-                               'MediaWiki:Common.css' => [ 'type' => 'style' ],
-                               'MediaWiki:vector.css' => [ 'type' => 'style' ]
-                       ] ],
                ];
        }
 
index 316fd89..32dd7f2 100644 (file)
@@ -67,20 +67,6 @@ class DBSiteStoreTest extends MediaWikiTestCase {
                }
        }
 
-       /**
-        * @covers DBSiteStore::getSites
-        * @covers DBSiteStore::setLanguageCodeMapping
-        */
-       public function testLanguageCodeMapping() {
-               TestSites::insertIntoDb();
-
-               $store = $this->newDBSiteStore();
-               $store->setLanguageCodeMapping( [ 'no' => 'nb' ] );
-
-               $site = $store->getSite( 'nowiki' );
-               $this->assertEquals( $site->getLanguageCode(), 'nb' );
-       }
-
        /**
         * @covers DBSiteStore::saveSites
         */
index bebda79..7984795 100644 (file)
@@ -98,15 +98,4 @@ class FileBasedSiteLookupTest extends PHPUnit_Framework_TestCase {
                return tempnam( sys_get_temp_dir(), 'mw-test-sitelist' );
        }
 
-       public function testLanguageCodeMapping() {
-               $sites = $this->getSites();
-               $cacheBuilder = $this->newSitesCacheFileBuilder( $sites );
-               $cacheBuilder->build();
-
-               $cache = new FileBasedSiteLookup( $this->cacheFile );
-               $cache->setLanguageCodeMapping( [ 'en' => 'fa' ] );
-
-               $this->assertEquals( $cache->getSite( 'enwiktionary' )->getLanguageCode(), 'fa' );
-       }
-
 }