Gabriel Wicke <gwicke@wikimedia.org> <gwicke@users.mediawiki.org>
Gabriel Wicke <gwicke@wikimedia.org> <wicke@wikidev.net>
Geoffrey Mon <geofbot@gmail.com>
+Geoffrey Trang <geoffreytrang@gmail.com>
Gergő Tisza <gtisza@wikimedia.org>
Gergő Tisza <gtisza@wikimedia.org> <tgr.huwiki@gmail.com>
Giftpflanze <gifti@tools.wmflabs.org>
Matthew Britton <hugglegurch@gmail.com> <gurch@users.mediawiki.org>
Matthew Flaschen <mflaschen@wikimedia.org>
Matthew Walker <mwalker@wikimedia.org>
+MatthiasDD <Matthias_K2@gmx.de>
Matthias Mullie <git@mullie.eu>
Matthias Mullie <git@mullie.eu> <mmullie@wikimedia.org>
Matěj Grabovský <mgrabovsky@yahoo.com> <mgrabovsky@users.mediawiki.org>
physikerwelt (Moritz Schubotz) <wiki@physikerwelt.de>
PiRSquared17 <pirsquared@tools.wmflabs.org>
Platonides <platonides@gmail.com> <platonides@users.mediawiki.org>
+pppery <mapreader@olum.org>
PranavK <pranavmk98@gmail.com>
Prateek Saxena <psaxena@wikimedia.org>
Prateek Saxena <psaxena@wikimedia.org> <prtksxna@gmail.com>
Victor Vasiliev <vasilvv@mit.edu> <vasilvv@gmail.com>
Vikas S Yaligar <vikasyaligar.it@gmail.com>
Vivek Ghaisas <v.a.ghaisas@gmail.com>
+Volker E <volker.e@wikimedia.org>
wctaiwan <wctaiwan@gmail.com>
withoutaname <drevitchi@gmail.com>
X! <soxred93@gmail.com> <soxred93@users.mediawiki.org>
{{int:version-credits-summary}} <!--
-MediaWiki 1.29 is a collaborative project released under the
+MediaWiki 1.31 is a collaborative project released under the
GNU General Public License v2. We would like to recognize the
following names for their contribution to the product.
* Alex Z.
* Alexander I. Mashin
* Alexander Lehmann
+* Alexander Mashin
* Alexander Monk
* Alexander Sigachov
* Alexandre Emsenhuber
* Angela Beesley Starling
* ankur
* Antoine Musso
+* Antoni Siek
* Antonio Ospite
* apexkid
* April King
* Cindy Cicalese
* ckoerner
* Conrad Irwin
+* Cormac Parle
* cryptocoryne
* Dan Barrett
* Dan Collins
* Darkdragon09
* DaSch
* datguy
+* David Barratt
* David Baumgarten
* David Causse
* David Chan
* David Lynch
* David McCabe
* David Mudrák
+* David Sn
+* Dayllan Maza
* dcausse
* dennisroczek
* Denny Vrandecic
* Derk-Jan Hartman
* Derric Atzrott
* Derrick Coetzee
+* Deskana
* Dévai Tamás
* Devi Krishnan
* Diederik van Liere
* divadsn
+* Dmaza
* Domas Mituzas
* Douglas Gardner
* DPStokesNZ
* Eddie Greiner-Petter
* Edward Chernenko
* Edward Z. Yang
+* Egbe Eugene
* Elisabeth Bauer
* Elliott Eggleston
* Elvis Stansvik
* Emufarmers
* enigmaeth
* Entlinkt
+* Envel Le Hir
* Eranroz
* Eric Evans
* Eric Schneider
* ExplosiveHippo
* Faidon Liambotis
* Federico Leva
+* Felipe L. Ewald
* Fenzik Joseph
+* Filippo Giunchedi
* firebus
* Florian Schmidt
* fomafix
+* Framawiki
* Fran Rogers
* Fred Emmott
* FunPika
* Gary Guo
* gbt248
* Geoffrey Mon
+* GeoffreyT2000
* georggi
* Gergő Tisza
* Gero Scholz
* Giuseppe Lavagetto
* gladoscc
* glaisher
+* golopot
* Greg Maxwell
* Greg Sabino Mullane
* Gregory Szorc
* Helder
* Henning Snater
* Hojjat
+* Hoto Cocoa
* Huji
* Hydriz
* Ian Baker
+* Ian Marlier
* Ilmari Karonen
* Inez Korczyński
* IoannisKydonis
* jarry1250
* Jaska Zedlik
* Jason Richey
+* Jayprakash12345
* jeblad
* Jeff Hobson
* Jeff Janes
* Jerome Jamnicky
* Jesús Martínez Novo
* jhobs
+* jhsoby
* Jiabao
* Jidanni
* Jimmy Collins
* John N
* Jon Harald Søby
* Jon Robson
+* Jonathan
* Jonathan Wiltshire
* Jools Wills
* jsahleen
* Julian Ostrow
* Juliano F. Ravasi
+* Julien Girault
* Juliusz Gonera
* Jure Kajzer
* Justin Du
* Kartik Mistry
* Karun Dambiec
* Katie Filbert
+* KeerthanaS
* Kevin Israel
* Kghbln
* Kim Eik
* madurangasiriwardena
* Magnus Manske
* mainframe98
+* Mako Bates
* Manuel Menal
* Manuel Schneider
* Marc Ordinas i Llopis
* Marco Schuster
* MarcoAurelio
* Marcus Buck
+* Margaret Epps
* Marius Hoch
* Mark Bergsma
* Mark Clements
* Max Semenik
* Max Sikström
* mayankmadan
+* Mehmet Mert Yıldıran
* Meno25
* merl
* Merlijn S. van Deen
* nullspoon
* Nuria Ruiz
* Nx.devnull
+* Obaid Raza
* Ocean behind ears
* Od1n
* Olaf Lenz
* Pavel Selitskas
* Pcoombe
* Perside Rosalie
+* petarpetkovic
* Peter Coombe
* Peter Gehres
* Peter Hedenskog
* physikerwelt (Moritz Schubotz)
* PieRRoMaN
* Pikne
+* Piotr Miazga
* PiRSquared17
* Platonides
* Pmlineditor
* rahul21
* Raimond Spekking
* Ramunas Geciauskas
+* RazeSoldier
* Remember the dot
* René Kijewski
* Reza
* Ryan Kaldari
* Ryan Lane
* Ryan Schmidt
+* ryan10145
* S Page
* Salvatore Ingala
* Sam Reed
* Sébastien Santoro
* Sergio Santoro
* Sethakill
+* Sfic
* Shahyar
* Shane Gibbons
* Shane King
* shirayuki
* Sidhant Gupta
* Siebrand Mazeland
+* Simeon Dahl
* Simon Walker
* Smriti Singh
* Solitarius
* Subin Siby
* Subramanya Sastry
* Sumit Asthana
+* Suriyaa Kudo
* svip
* Szymon Świerkosz
* T.D. Corell
* UltrasonicNXT
* Umherirrender
* utkarsh95
+* Valerio Bozzolan
* Van de Bugger
* Viačeslav
* Victor Barbu
* Victor Porton
* Victor Vasiliev
* Ville Stadista
+* vinithegit
* vishnu
* Vitaliy Filippov
* Vivek Ghaisas
* Zhaofeng Li
* Zhengzhu Feng
* Zhuyifei1999
+* zoranzoki21
* Zppix
* محمد شعیب
<!-- END CONTRIBUTOR LIST -->
were removed (deprecated since 1.27).
* (T180921) $wgReferrerPolicy now supports having fallbacks for browsers that are not
using the latest version of the Referrer Policy specification.
+* $wgFragmentMode is now set to [ 'legacy', 'html5' ] by default. This is a first step of
+ migration to human-readable section IDs that will later result in 'html5' being the
+ default mode.
=== New features in 1.31 ===
* Wikimedia\Rdbms\IDatabase->select() and similar methods now support
the ParserOutput::getText() post-cache transformations.
* Added a hook, UploadForm:getInitialPageText, to allow extensions to alter the
initial page text for file uploads.
-* (T181651) The info page for File pages now displays the file's base-36 SHA1
+* (T181651) The info page for File pages now displays the file's base-16 SHA1
hash value in the table of basic information.
=== External library changes in 1.31 ===
* The driver 'mysql' for MySQL, deprecated in MediaWiki 1.30, has been removed.
The driver has been deprecated since PHP 5.5 and was removed in PHP 7.0. The
default driver for MySQL has been 'mysqli' since MediaWiki 1.22.
+* The following properties of PreparedEdit were deprecated in 1.21 and have been removed:
+ * PreparedEdit->newText
+ * PreparedEdit->oldText
+ * PreparedEdit->pst
== Compatibility ==
MediaWiki 1.31 requires PHP 5.5.9 or later. Although HHVM 3.18.5 or later is supported,
$wgAutoloadLocalClasses = [
'APCBagOStuff' => __DIR__ . '/includes/libs/objectcache/APCBagOStuff.php',
'APCUBagOStuff' => __DIR__ . '/includes/libs/objectcache/APCUBagOStuff.php',
+ 'AbkhazUppercaseCollation' => __DIR__ . '/includes/collation/AbkhazUppercaseCollation.php',
'AbstractContent' => __DIR__ . '/includes/content/AbstractContent.php',
'Action' => __DIR__ . '/includes/actions/Action.php',
'ActiveUsersPager' => __DIR__ . '/includes/specials/pagers/ActiveUsersPager.php',
'MediaWiki\\EditPage\\TextboxBuilder' => __DIR__ . '/includes/editpage/TextboxBuilder.php',
'MediaWiki\\Edit\\PreparedEdit' => __DIR__ . '/includes/edit/PreparedEdit.php',
'MediaWiki\\HeaderCallback' => __DIR__ . '/includes/HeaderCallback.php',
+ 'MediaWiki\\Http\\HttpRequestFactory' => __DIR__ . '/includes/http/HttpRequestFactory.php',
'MediaWiki\\Interwiki\\ClassicInterwikiLookup' => __DIR__ . '/includes/interwiki/ClassicInterwikiLookup.php',
'MediaWiki\\Interwiki\\InterwikiLookup' => __DIR__ . '/includes/interwiki/InterwikiLookup.php',
'MediaWiki\\Interwiki\\InterwikiLookupAdapter' => __DIR__ . '/includes/interwiki/InterwikiLookupAdapter.php',
'GetIP': modify the ip of the current user (called only once).
&$ip: string holding the ip as determined so far
+'GetLangPreferredVariant': Called in LanguageConverter#getPreferredVariant() to
+ allow fetching the language variant code from cookies or other such
+ alternative storage.
+&$req: language variant from the URL (string) or boolean false if no variant
+ was specified in the URL; the value of this variable comes from
+ LanguageConverter#getURLVariant()
+
'GetLinkColours': modify the CSS class of an array of page links.
$linkcolour_ids: array of prefixed DB keys of the pages linked to,
indexed by page_id.
*
* @since 1.30
*/
-$wgFragmentMode = [ 'legacy' ];
+$wgFragmentMode = [ 'legacy', 'html5' ];
/**
* Which ID escaping mode should be used for external interwiki links? See documentation
* because articles can be created such that they are hard to view or edit.
*
* In some rare cases you may wish to remove + for compatibility with old links.
- *
- * Theoretically 0x80-0x9F of ISO 8859-1 should be disallowed, but
- * this breaks interlanguage links
*/
$wgLegalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+";
// being set. This is used by ConfirmEdit to display a captcha
// without any error message cruft.
} else {
- $this->hookError = $status->getWikiText();
+ $this->hookError = $this->formatStatusErrors( $status );
}
// Use the existing $status->value if the hook set it
if ( !$status->value ) {
} elseif ( !$status->isOK() ) {
# ...or the hook could be expecting us to produce an error
// FIXME this sucks, we should just use the Status object throughout
- $this->hookError = $status->getWikiText();
+ $this->hookError = $this->formatStatusErrors( $status );
$status->fatal( 'hookaborted' );
$status->value = self::AS_HOOK_ERROR_EXPECTED;
return false;
return true;
}
+ /**
+ * Wrap status errors in an errorbox for increased visiblity
+ *
+ * @param Status $status
+ * @return string Wikitext
+ */
+ private function formatStatusErrors( Status $status ) {
+ $errmsg = $status->getWikiText(
+ 'edit-error-short',
+ 'edit-error-long',
+ $this->context->getLanguage()
+ );
+ return <<<ERROR
+<div class="errorbox">
+{$errmsg}
+</div>
+<br clear="all" />
+ERROR;
+ }
+
/**
* Return the summary to be used for a new section.
*
return new OOUI\ButtonWidget( [
'id' => 'mw-editform-cancel',
- 'href' => $this->getContextTitle()->getLinkUrl( $cancelParams ),
+ 'href' => $this->getContextTitle()->getLinkURL( $cancelParams ),
'label' => new OOUI\HtmlSnippet( $this->context->msg( 'cancel' )->parse() ),
'framed' => false,
'infusable' => true,
* @return string
*/
public function getUniqueID() {
- $id = $this->getUniqueIDUnescaped();
+ $id = $this->getUniqueIdUnescaped();
if ( $id ) {
return $this->xmlEncode( $id );
}
"title" => $item->getTitle(),
"url" => $this->xmlEncode( wfExpandUrl( $item->getUrlUnescaped(), PROTO_CURRENT ) ),
"permalink" => $item->rssIsPermalink,
- "uniqueID" => $item->getUniqueId(),
+ "uniqueID" => $item->getUniqueID(),
"description" => $item->getDescription(),
"date" => $this->xmlEncode( $this->formatTime( $item->getDate() ) ),
"author" => $item->getAuthor()
// uses htmlentities, which does not work with XML
$templateParams = [
'language' => $this->xmlEncode( $this->getLanguage() ),
- 'feedID' => $this->getFeedID(),
+ 'feedID' => $this->getFeedId(),
'title' => $this->getTitle(),
'url' => $this->xmlEncode( wfExpandUrl( $this->getUrlUnescaped(), PROTO_CURRENT ) ),
'selfUrl' => $this->getSelfUrl(),
// Manually escaping rather than letting Mustache do it because Mustache
// uses htmlentities, which does not work with XML
$templateParams = [
- "uniqueID" => $item->getUniqueId(),
+ "uniqueID" => $item->getUniqueID(),
"title" => $item->getTitle(),
"mimeType" => $this->xmlEncode( $wgMimeType ),
"url" => $this->xmlEncode( wfExpandUrl( $item->getUrlUnescaped(), PROTO_CURRENT ) ),
* Restore error level to previous value
*/
function wfRestoreWarnings() {
- MediaWiki\suppressWarnings( true );
+ MediaWiki\restoreWarnings();
}
/**
use GlobalVarConfig;
use Hooks;
use IBufferingStatsdDataFactory;
+use MediaWiki\Http\HttpRequestFactory;
use MediaWiki\Preferences\PreferencesFactory;
use MediaWiki\Shell\CommandFactory;
use MediaWiki\Storage\BlobStore;
use MediaWiki\Storage\BlobStoreFactory;
+use MediaWiki\Storage\RevisionFactory;
+use MediaWiki\Storage\RevisionLookup;
use MediaWiki\Storage\RevisionStore;
use Wikimedia\Rdbms\LBFactory;
use LinkCache;
return $this->getService( 'RevisionStore' );
}
+ /**
+ * @since 1.31
+ * @return RevisionLookup
+ */
+ public function getRevisionLookup() {
+ return $this->getService( 'RevisionLookup' );
+ }
+
+ /**
+ * @since 1.31
+ * @return RevisionFactory
+ */
+ public function getRevisionFactory() {
+ return $this->getService( 'RevisionFactory' );
+ }
+
/**
* @since 1.31
* @return PreferencesFactory
return $this->getService( 'PreferencesFactory' );
}
+ /**
+ * @since 1.31
+ * @return HttpRequestFactory
+ */
+ public function getHttpRequestFactory() {
+ return $this->getService( 'HttpRequestFactory' );
+ }
+
///////////////////////////////////////////////////////////////////////////
// NOTE: When adding a service getter here, don't forget to add a test
// case for it in MediaWikiServicesTest::provideGetters() and in
<?php
/**
- *
- *
- * Created on Dec 29, 2015
- *
* Copyright © 2015 Geoffrey Mon <geofbot@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
/**
* Handle the form submission if everything validated properly
*
+ * @deprecated since 1.31, use PreferencesFactory
+ *
* @param array $formData
* @param PreferencesForm $form
* @return bool|Status|string
use MediaWiki\Storage\MutableRevisionRecord;
use MediaWiki\Storage\RevisionAccessException;
+use MediaWiki\Storage\RevisionFactory;
+use MediaWiki\Storage\RevisionLookup;
use MediaWiki\Storage\RevisionRecord;
use MediaWiki\Storage\RevisionStore;
use MediaWiki\Storage\RevisionStoreRecord;
return MediaWikiServices::getInstance()->getRevisionStore();
}
+ /**
+ * @return RevisionLookup
+ */
+ protected static function getRevisionLookup() {
+ return MediaWikiServices::getInstance()->getRevisionLookup();
+ }
+
+ /**
+ * @return RevisionFactory
+ */
+ protected static function getRevisionFactory() {
+ return MediaWikiServices::getInstance()->getRevisionFactory();
+ }
+
/**
* @param bool|string $wiki The ID of the target wiki database. Use false for the local wiki.
*
* @return Revision|null
*/
public static function newFromId( $id, $flags = 0 ) {
- $rec = self::getRevisionStore()->getRevisionById( $id, $flags );
+ $rec = self::getRevisionLookup()->getRevisionById( $id, $flags );
return $rec === null ? null : new Revision( $rec, $flags );
}
* @return Revision|null
*/
public static function newFromTitle( LinkTarget $linkTarget, $id = 0, $flags = 0 ) {
- $rec = self::getRevisionStore()->getRevisionByTitle( $linkTarget, $id, $flags );
+ $rec = self::getRevisionLookup()->getRevisionByTitle( $linkTarget, $id, $flags );
return $rec === null ? null : new Revision( $rec, $flags );
}
* @return Revision|null
*/
public static function newFromPageId( $pageId, $revId = 0, $flags = 0 ) {
- $rec = self::getRevisionStore()->getRevisionByPageId( $pageId, $revId, $flags );
+ $rec = self::getRevisionLookup()->getRevisionByPageId( $pageId, $revId, $flags );
return $rec === null ? null : new Revision( $rec, $flags );
}
}
}
- $rec = self::getRevisionStore()->newRevisionFromArchiveRow( $row, 0, $title, $overrides );
+ $rec = self::getRevisionFactory()->newRevisionFromArchiveRow( $row, 0, $title, $overrides );
return new Revision( $rec, self::READ_NORMAL, $title );
}
*/
public static function newFromRow( $row ) {
if ( is_array( $row ) ) {
- $rec = self::getRevisionStore()->newMutableRevisionFromArray( $row );
+ $rec = self::getRevisionFactory()->newMutableRevisionFromArray( $row );
} else {
- $rec = self::getRevisionStore()->newRevisionFromRow( $row );
+ $rec = self::getRevisionFactory()->newRevisionFromRow( $row );
}
return new Revision( $rec );
$row['user'] = $wgUser;
}
- $this->mRecord = self::getRevisionStore()->newMutableRevisionFromArray(
+ $this->mRecord = self::getRevisionFactory()->newMutableRevisionFromArray(
$row,
$queryFlags,
$this->ensureTitle( $row, $queryFlags, $title )
);
} elseif ( is_object( $row ) ) {
- $this->mRecord = self::getRevisionStore()->newRevisionFromRow(
+ $this->mRecord = self::getRevisionFactory()->newRevisionFromRow(
$row,
$queryFlags,
$this->ensureTitle( $row, $queryFlags, $title )
*/
public function getPrevious() {
$title = $this->getTitle();
- $rec = self::getRevisionStore()->getPreviousRevision( $this->mRecord, $title );
+ $rec = self::getRevisionLookup()->getPreviousRevision( $this->mRecord, $title );
return $rec === null ? null : new Revision( $rec, self::READ_NORMAL, $title );
}
*/
public function getNext() {
$title = $this->getTitle();
- $rec = self::getRevisionStore()->getNextRevision( $this->mRecord, $title );
+ $rec = self::getRevisionLookup()->getNextRevision( $this->mRecord, $title );
return $rec === null ? null : new Revision( $rec, self::READ_NORMAL, $title );
}
return false;
}
- $record = self::getRevisionStore()->getKnownCurrentRevision( $title, $revId );
+ $record = self::getRevisionLookup()->getKnownCurrentRevision( $title, $revId );
return $record ? new Revision( $record ) : false;
}
}
return $store;
},
+ 'RevisionLookup' => function ( MediaWikiServices $services ) {
+ return $services->getRevisionStore();
+ },
+
+ 'RevisionFactory' => function ( MediaWikiServices $services ) {
+ return $services->getRevisionStore();
+ },
+
'BlobStoreFactory' => function ( MediaWikiServices $services ) {
global $wgContLang;
return new BlobStoreFactory(
return new DefaultPreferencesFactory( $config, $wgContLang, $authManager, $linkRenderer );
},
+ 'HttpRequestFactory' => function ( MediaWikiServices $services ) {
+ return new \MediaWiki\Http\HttpRequestFactory();
+ },
+
///////////////////////////////////////////////////////////////////////////
// NOTE: When adding a service here, don't forget to add a getter function
// in the MediaWikiServices class. The convenience getter should just call
// Convert this deprecated setting to modern system
if ( $wgExperimentalHtmlIds ) {
+ wfDeprecated( '$wgExperimentalHtmlIds', '1.30' );
$wgFragmentMode = [ 'html5-legacy', 'html5' ];
}
// rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
if ( !$title && $revId !== null && $revId > 0 ) {
- $dbr = $this->getDbConnectionRef( $dbMode );
+ $dbr = $this->getDBConnectionRef( $dbMode );
// @todo: Title::getSelectFields(), or Title::getQueryInfo(), or something like that
$row = $dbr->selectRow(
[ 'revision', 'page' ],
if ( $this->isExternal() ) {
$target = SpecialPage::getTitleFor(
'GoToInterwiki',
- $this->getPrefixedDBKey()
+ $this->getPrefixedDBkey()
);
}
- return $target->getFullUrl( $query, false, $proto );
+ return $target->getFullURL( $query, false, $proto );
}
/**
if ( $title->inNamespace( NS_FILE ) ) {
$fileObj = wfFindFile( $title );
if ( $fileObj !== false ) {
- $output = $fileObj->getSha1();
+ // Convert the base-36 sha1 value obtained from database to base-16
+ $output = Wikimedia\base_convert( $fileObj->getSha1(), 36, 16, 40 );
$pageInfo['header-basic'][] = [
$this->msg( 'pageinfo-file-hash' ),
$output
<?php
/**
- *
- *
- * Created on Sep 5, 2006
- *
* Copyright © 2006, 2010 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 4, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on Jan 29, 2015
- *
* Copyright © 2015 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on August 26, 2014
- *
* Copyright © 2014 Petr Bena (benapetr@gmail.com)
*
* This program is free software; you can redistribute it and/or modify
if ( $rev ) {
$title = $rev->getTitle();
if ( isset( $this->props['ids'] ) ) {
- $vals["{$prefix}id"] = $title->getArticleId();
+ $vals["{$prefix}id"] = $title->getArticleID();
$vals["{$prefix}revid"] = $rev->getId();
}
if ( isset( $this->props['title'] ) ) {
<?php
/**
- *
- *
- * Created on Jun 30, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 25, 2008
- *
* Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on August 16, 2007
- *
* Copyright © 2007 Iker Labarga "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on June 1, 2008
- *
* Copyright © 2008 Bryan Tong Minh <Bryan.TongMinh@Gmail.com>
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 05, 2007
- *
* Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on June 06, 2011
- *
* Copyright © 2011 Sam Reed
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 13, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on March 5, 2011
- *
* Copyright © 2011 Bryan Tong Minh <Bryan.TongMinh@Gmail.com>
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 19, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 19, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 19, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 22, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 22, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Feb 2, 2009
- *
* Copyright © 2009 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 19, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Aug 29, 2014
- *
* Copyright © 2014 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Dec 22, 2014
- *
* Copyright © 2014 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- * Created on January 3rd, 2013
- *
* 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
<?php
/**
- *
- *
- * Created on Sep 19, 2006
- *
* Copyright © 2006-2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com",
* Daniel Cannon (cannon dot danielc at gmail dot com)
*
<?php
/**
- *
- *
- * Created on Jan 4, 2008
- *
* Copyright © 2008 Yuri Astrakhan "<Firstname><Lastname>@gmail.com",
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on Sep 4, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Dec 29, 2015
- *
* Copyright © 2015 Geoffrey Mon <geofbot@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Dec 27, 2012
- *
* Copyright © 2012 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 31, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Apr 15, 2012
- *
* Copyright © 2012 Szymon Świerkosz beau@adres.pl
*
* This program is free software; you can redistribute it and/or modify
$user->setOption( $key, $value );
$changed = true;
} else {
- $this->addWarning( [ 'apiwarn-validationfailed', wfEscapeWikitext( $key ), $validation ] );
+ $this->addWarning( [ 'apiwarn-validationfailed', wfEscapeWikiText( $key ), $validation ] );
}
}
<?php
/**
- *
- *
- * Created on Sep 24, 2006
- *
* Copyright © 2006, 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Dec 01, 2007
- *
* Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on Dec 01, 2007
- *
* Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
/**
* API for MediaWiki 1.14+
*
- * Created on Sep 2, 2008
- *
* Copyright © 2008 Soxred93 soxred93@gmail.com,
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 1, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 7, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on December 12, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on Oct 3, 2014
- *
* Copyright © 2014 Wikimedia Foundation and contributors
*
* Heavily based on ApiQueryDeletedrevs,
/**
* API for MediaWiki 1.12+
*
- * Created on Mar 16, 2008
- *
* Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
* based on ApiQueryAllPages.php
*
<?php
/**
- *
- *
- * Created on July 7, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Dec 1, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 25, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on Sep 27, 2015
- *
* Copyright © 2015 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on July 7, 2007
- *
* Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 16, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
/**
* API module to handle links table back-queries
*
- * Created on Aug 19, 2014
- *
* Copyright © 2014 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 7, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 10, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on May 13, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on May 13, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on June 14, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
/**
* Query the list of contributors to a page
*
- * Created on Nov 14, 2013
- *
* Copyright © 2013 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on Oct 3, 2014
- *
* Copyright © 2014 Wikimedia Foundation and contributors
*
* Heavily based on ApiQueryDeletedrevs,
<?php
/**
- *
- *
- * Created on Jul 2, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 25, 2008
- *
* Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 27, 2008
- *
* Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on July 7, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on May 13, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
/**
* API for MediaWiki 1.12+
*
- * Created on May 10, 2010
- *
* Copyright © 2010 Sam Reed
* Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
* based on ApiQueryAllPages.php
<?php
/**
- *
- *
- * Created on Sep 7, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
/**
* API for MediaWiki 1.17+
*
- * Created on May 14, 2010
- *
* Copyright © 2010 Sam Reed
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
/**
* API for MediaWiki 1.17+
*
- * Created on May 14, 2010
- *
* Copyright © 2010 Sam Reed
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
<?php
/**
- *
- *
- * Created on July 6, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on May 13, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 25, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
/**
* API for MediaWiki 1.17+
*
- * Created on May 14, 2011
- *
* Copyright © 2011 Sam Reed
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
<?php
/**
- *
- *
- * Created on May 13, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on May 12, 2007
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 16, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on January 21, 2013
- *
* Copyright © 2013 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Aug 7, 2010
- *
* Copyright © 2010 soxred93, Bryan Tong Minh
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on December 31, 2012
- *
* Copyright © 2012 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Feb 13, 2009
- *
* Copyright © 2009 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Dec 22, 2010
- *
* Copyright © 2010 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Monday, January 28, 2008
- *
* Copyright © 2008 Brent Garber
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 19, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 7, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 3, 2014 as a split from ApiQueryRevisions
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on July 30, 2007
- *
* Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 25, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Jul 9, 2009
- *
* Copyright © 2009
*
* This program is free software; you can redistribute it and/or modify
/**
* Module to fetch tokens via action=query&meta=tokens
*
- * Created on August 8, 2014
- *
* Copyright © 2014 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 16, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on July 30, 2007
- *
* Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on July 30, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 25, 2006
- *
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Oct 4, 2008
- *
* Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on Jun 25, 2013
- *
* Copyright © 2013 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Jun 20, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on Feb 25, 2015
- *
* Copyright © 2015 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
/**
* API for MediaWiki 1.14+
*
- * Created on Jun 18, 2012
- *
* Copyright © 2012 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on January 1, 2017
- *
* Copyright © 2017 Justin Du "<justin.d128@gmail.com>"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Jul 29, 2011
- *
* Copyright © 2011 John Du Hart john@johnduhart.me
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Sep 7, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Jul 3, 2007
- *
* Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Aug 21, 2008
- *
* Copyright © 2008 - 2010 Bryan Tong Minh <Bryan.TongMinh@Gmail.com>
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- *
- *
- * Created on Jan 4, 2008
- *
* Copyright © 2008 Yuri Astrakhan "<Firstname><Lastname>@gmail.com",
*
* This program is free software; you can redistribute it and/or modify
"api-help-param-direction": "באיזה כיוון למנות:\n;newer:לרשום את הישנים ביותר בהתחלה. לתשומת לבך: $1start חייב להיות לפני $1end.\n;older:לרשום את החדשים ביותר בהתחלה (בררת מחדל). לתשומת לבך: $1start חייב להיות אחרי $1end.",
"api-help-param-continue": "כשיש עוד תוצאות, להשתמש בזה בשביל להמשיך.",
"api-help-param-no-description": "<span class=\"apihelp-empty\">(ללא תיאור)</span>",
+ "api-help-param-maxbytes": "לא יכול להיות ארוך {{PLURAL:$1|מבית אחד|מ־$1 בתים}}.",
+ "api-help-param-maxchars": "לא יכול להיות ארוך {{PLURAL:$1|מתו אחד|מ־$1 תווים}}.",
"api-help-examples": "{{PLURAL:$1|דוגמה|דוגמאות}}:",
"api-help-permissions": "{{PLURAL:$1|הרשאה|הרשאות}}:",
"api-help-permissions-granted-to": "{{PLURAL:$1|הוענק ל|הוענקו ל}}: $2",
"apihelp-query+deletedrevs-param-excludeuser": "Не перечислять правки данного участника.",
"apihelp-query+deletedrevs-param-namespace": "Перечислять только страницы этого пространства имён.",
"apihelp-query+deletedrevs-param-limit": "Максимальное количество правок в списке.",
- "apihelp-query+deletedrevs-param-prop": "Ð\9aакие Ñ\81войÑ\81Ñ\82ва возвÑ\80аÑ\89аÑ\82Ñ\8c:\n;revid: Ð\94обавлÑ\8fеÑ\82 иденÑ\82иÑ\84икаÑ\82оÑ\80 Ñ\83далÑ\91нной пÑ\80авки.\n;parentid: Ð\94обавлÑ\8fеÑ\82 иденÑ\82иÑ\84икаÑ\82оÑ\80 пÑ\80едÑ\8bдÑ\83Ñ\89ей веÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.\n;user: Ð\94обавлÑ\8fеÑ\82 ник Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его пÑ\80авкÑ\83.\n;userid: Ð\94обавлÑ\8fеÑ\82 иденÑ\82иÑ\84икаÑ\82оÑ\80 Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его пÑ\80авкÑ\83.\n;comment: Ð\94обавлÑ\8fеÑ\82 опиÑ\81ание пÑ\80авки.\n;parsedcomment: Ð\94обавлÑ\8fеÑ\82 Ñ\80аÑ\81паÑ\80Ñ\81енное опиÑ\81ание пÑ\80авки.\n;minor: Ð\9eÑ\82меÑ\87аеÑ\82, бÑ\8bла ли пÑ\80авка малÑ\8bм.\n;len: Ð\94обавлÑ\8fеÑ\82 длинÑ\83 (в байÑ\82аÑ\85) пÑ\80авки.\n;sha1: Ð\94обавлÑ\8fеÑ\82 Ñ\85Ñ\8dÑ\88 SHA-1 (base 16) пÑ\80авки.\n;content: Ð\94обавлÑ\8fеÑ\82 Ñ\81одеÑ\80жимое пÑ\80авки.\n;token: <span class=\"apihelp-deprecated\">УÑ\81Ñ\82аÑ\80ело.</span> Ð\92озвÑ\80аÑ\89аеÑ\82 Ñ\82окен Ñ\80едакÑ\82иÑ\80ованиÑ\8f.\n;tags: Теги правки.",
+ "apihelp-query+deletedrevs-param-prop": "Ð\9aакие Ñ\81войÑ\81Ñ\82ва возвÑ\80аÑ\89аÑ\82Ñ\8c:\n;revid: Ð\94обавлÑ\8fеÑ\82 иденÑ\82иÑ\84икаÑ\82оÑ\80 Ñ\83далÑ\91нной пÑ\80авки.\n;parentid: Ð\94обавлÑ\8fеÑ\82 иденÑ\82иÑ\84икаÑ\82оÑ\80 пÑ\80едÑ\8bдÑ\83Ñ\89ей веÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.\n;user: Ð\94обавлÑ\8fеÑ\82 ник Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его пÑ\80авкÑ\83.\n;userid: Ð\94обавлÑ\8fеÑ\82 иденÑ\82иÑ\84икаÑ\82оÑ\80 Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его пÑ\80авкÑ\83.\n;comment: Ð\94обавлÑ\8fеÑ\82 опиÑ\81ание пÑ\80авки.\n;parsedcomment: Ð\94обавлÑ\8fеÑ\82 Ñ\80аÑ\81паÑ\80Ñ\81енное опиÑ\81ание пÑ\80авки.\n;minor: Ð\9eÑ\82меÑ\87аеÑ\82, бÑ\8bла ли пÑ\80авка малÑ\8bм.\n;len: Ð\94обавлÑ\8fеÑ\82 длинÑ\83 (в байÑ\82аÑ\85) пÑ\80авки.\n;sha1: Ð\94обавлÑ\8fеÑ\82 Ñ\85Ñ\8dÑ\88 SHA-1 (base 16) пÑ\80авки.\n;content: Ð\94обавлÑ\8fеÑ\82 Ñ\81одеÑ\80жимое пÑ\80авки.\n;token: <span class=\"apihelp-deprecated\">УÑ\81Ñ\82аÑ\80ело.</span> Ð\92озвÑ\80аÑ\89аеÑ\82 Ñ\82окен Ñ\80едакÑ\82иÑ\80ованиÑ\8f.\n;tags: Ð\9cеÑ\82ки правки.",
"apihelp-query+deletedrevs-example-mode1": "Список последних удалённых правок страниц <kbd>Main Page</kbd> и <kbd>Talk:Main Page</kbd> с содержимым (режим 1).",
"apihelp-query+deletedrevs-example-mode2": "Список последних 50 удалённых правок участника <kbd>Bob</kbd> (режим 2).",
"apihelp-query+deletedrevs-example-mode3-main": "Список последних 50 удалённых правок в основном пространстве имён (режим 3)",
"apihelp-query+recentchanges-paramvalue-prop-redirect": "Отмечает правку, если страница является перенаправлением.",
"apihelp-query+recentchanges-paramvalue-prop-patrolled": "Отмечает патрулируемые правки как отпатрулированные или неотпатрулированные.",
"apihelp-query+recentchanges-paramvalue-prop-loginfo": "Добавляет информацию о записи журнала (идентификатор записи, её тип, и так далее).",
- "apihelp-query+recentchanges-paramvalue-prop-tags": "Перечисляет теги записи.",
+ "apihelp-query+recentchanges-paramvalue-prop-tags": "Перечисляет метки записи.",
"apihelp-query+recentchanges-paramvalue-prop-sha1": "Добавляет значение контрольных сумм для записей, связанных с версией.",
"apihelp-query+recentchanges-param-token": "Вместо этого используйте <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
"apihelp-query+recentchanges-param-show": "Показать только элементы, удовлетворяющие данным критериям. Например, чтобы отобразить только малые правки, сделанные зарегистрированными участниками, установите $1show=minor|!anon.",
"apihelp-query+siteinfo-paramvalue-prop-languages": "Возвращает список языков, поддерживаемых MediaWiki (опционально локализованных с помощью <var>$1inlanguagecode</var>).",
"apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Возвращает список языковых кодов, для которых включён [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]], а также варианты, поддерживаемые для каждого языка.",
"apihelp-query+siteinfo-paramvalue-prop-skins": "Возвращает список доступных скинов (опционально локализованных с помощью <var>$1inlanguagecode</var>, в противном случае — на языке вики).",
- "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Возвращает список тегов рашсирений парсера.",
+ "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Возвращает список меток рашсирений парсера.",
"apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Возвращает список перехватчиков функций парсера.",
"apihelp-query+siteinfo-paramvalue-prop-showhooks": "Возвращает список всех подписанных перехватчиков (содержимое <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
"apihelp-query+siteinfo-paramvalue-prop-variables": "Возвращает список идентификаторов переменных.",
"apihelp-query+watchlist-paramvalue-prop-sizes": "Добавляет старую и новую длину страницы.",
"apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Добавляет метку времени, когда участник был уведомлён о правке.",
"apihelp-query+watchlist-paramvalue-prop-loginfo": "Добавляет информацию о журнале, где уместно.",
+ "apihelp-query+watchlist-paramvalue-prop-tags": "Перечисляет метки записи.",
"apihelp-query+watchlist-param-show": "Показать только элементы, удовлетворяющие данным критериям. Например, чтобы отобразить только малые правки, сделанные зарегистрированными участниками, установите $1show=minor|!anon.",
"apihelp-query+watchlist-param-type": "Какие типы правок показать:",
"apihelp-query+watchlist-paramvalue-type-edit": "Обычные правки страниц.",
"apihelp-setpagelanguage-param-pageid": "Идентификатор страницы, язык которой вы желаете поменять. Не может быть использовано одновременно с <var>$1title</var>.",
"apihelp-setpagelanguage-param-lang": "Код нового языка. Используйте <kbd>default</kbd> для смены на язык содержимого по умолчанию для этой вики.",
"apihelp-setpagelanguage-param-reason": "Причина изменения.",
- "apihelp-setpagelanguage-param-tags": "Изменить теги записей в журнале, возникающих в результате этого действия.",
+ "apihelp-setpagelanguage-param-tags": "Изменить метки записей в журнале, возникающих в результате этого действия.",
"apihelp-setpagelanguage-example-language": "Изменить язык <kbd>Main Page</kbd> на баскский.",
"apihelp-setpagelanguage-example-default": "Изменить язык страницы с идентификатором 123 на язык по умолчанию.",
"apihelp-stashedit-summary": "Подготовка правки в общем кэше.",
--- /dev/null
+<?php
+/**
+ * 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
+ *
+ * @since 1.31
+ *
+ * @file
+ */
+
+class AbkhazUppercaseCollation extends CustomUppercaseCollation {
+
+ public function __construct() {
+ parent::__construct( [
+ 'А',
+ 'Б',
+ 'В',
+ 'Г',
+ 'Гь',
+ 'Гә',
+ 'Ҕ',
+ 'Ҕь',
+ 'Ҕә',
+ 'Д',
+ 'Дә',
+ 'Е',
+ 'Ж',
+ 'Жь',
+ 'Жә',
+ 'З',
+ 'Ӡ',
+ 'Ӡә',
+ 'И',
+ 'К',
+ 'Кь',
+ 'Кә',
+ 'Қ',
+ 'Қь',
+ 'Қә',
+ 'Ҟ',
+ 'Ҟь',
+ 'Ҟә',
+ 'Л',
+ 'М',
+ 'Н',
+ 'О',
+ 'П',
+ 'Ҧ',
+ 'Р',
+ 'С',
+ 'Т',
+ 'Тә',
+ 'Ҭ',
+ 'Ҭә',
+ 'У',
+ 'Ф',
+ 'Х',
+ 'Хь',
+ 'Хә',
+ 'Ҳ',
+ 'Ҳә',
+ 'Ц',
+ 'Цә',
+ 'Ҵ',
+ 'Ҵә',
+ 'Ч',
+ 'Ҷ',
+ 'Ҽ',
+ 'Ҿ',
+ 'Ш',
+ 'Шь',
+ 'Шә',
+ 'Ы',
+ 'Ҩ',
+ 'Џ',
+ 'Џь',
+ 'ь',
+ 'ә',
+ ], Language::factory( 'ab' ) );
+ }
+}
return new CollationEt;
case 'xx-uca-fa':
return new CollationFa;
+ case 'uppercase-ab':
+ return new AbkhazUppercaseCollation;
case 'uppercase-ba':
return new BashkirUppercaseCollation;
case 'uppercase-se':
* conflicts with other people using private use area)
*
* This does not support fancy things like secondary differences, etc.
+ * (It supports digraphs, trigraphs etc. though.)
*
* It is expected most people will subclass this and just override the
* constructor to hard-code an alphabet.
private $puaSubset;
/**
- * @note This assumes $alphabet does not contain U+F3000-U+F303F
+ * @note This assumes $alphabet does not contain U+F3000-U+F3FFF
*
* @param array $alphabet Sorted array of uppercase characters.
* @param Language $lang What language for number sorting.
*/
public function __construct( array $alphabet, Language $lang ) {
- // It'd be trivial to extend this past 64, you'd just
- // need a bit of bit-fiddling. Doesn't seem necessary right
- // now.
- if ( count( $alphabet ) < 1 || count( $alphabet ) >= 64 ) {
- throw new UnexpectedValueException( "Alphabet must be < 64 items" );
+ if ( count( $alphabet ) < 1 || count( $alphabet ) >= 4096 ) {
+ throw new UnexpectedValueException( "Alphabet must be < 4096 items" );
}
- $this->alphabet = $alphabet;
+ $this->firstLetters = $alphabet;
+ // For digraphs, only the first letter is capitalized in input
+ $this->alphabet = array_map( [ $lang, 'uc' ], $alphabet );
$this->puaSubset = [];
$len = count( $alphabet );
for ( $i = 0; $i < $len; $i++ ) {
- $this->puaSubset[] = "\xF3\xB3\x80" . chr( $i + 128 );
+ $this->puaSubset[] = "\xF3\xB3" . chr( floor( $i / 64 ) + 128 ) . chr( ( $i % 64 ) + 128 );
}
+
+ // Sort these arrays so that any trigraphs, digraphs etc. are first
+ // (and they get replaced first in convertToPua()).
+ $lengths = array_map( 'mb_strlen', $this->alphabet );
+ array_multisort( $lengths, SORT_DESC, $this->firstLetters, $this->alphabet, $this->puaSubset );
+
parent::__construct( $lang );
}
}
public function getFirstLetter( $string ) {
- // In case a title has a PUA code in it, make it sort
- // under the header for the character it would replace
- // to avoid inconsistent behaviour. This class mostly
- // assumes that people will not use PUA codes.
- return parent::getFirstLetter(
- str_replace( $this->puaSubset, $this->alphabet, $string )
- );
+ $sortkey = $this->getSortKey( $string );
+
+ // In case a title begins with a character from our alphabet, return the corresponding
+ // first-letter. (This also happens if the title has a corresponding PUA code in it, to avoid
+ // inconsistent behaviour. This class mostly assumes that people will not use PUA codes.)
+ $index = array_search( substr( $sortkey, 0, 4 ), $this->puaSubset );
+ if ( $index !== false ) {
+ return $this->firstLetters[ $index ];
+ }
+
+ // String begins with a character outside of our alphabet, fall back
+ return parent::getFirstLetter( $string );
}
}
}
/**
- * Set the IContextSource object
- *
* @since 1.18
* @param IContextSource $context
*/
}
/**
- * Get the Config object
- *
* @since 1.23
* @return Config
*/
}
/**
- * Get the WebRequest object
- *
* @since 1.18
* @return WebRequest
*/
}
/**
- * Get the Title object
- *
* @since 1.18
* @return Title|null
*/
}
/**
- * Get the OutputPage object
- *
* @since 1.18
* @return OutputPage
*/
}
/**
- * Get the User object
- *
* @since 1.18
* @return User
*/
}
/**
- * Get the Language object
- *
* @since 1.19
* @return Language
*/
}
/**
- * Get the Skin object
- *
* @since 1.18
* @return Skin
*/
}
/**
- * Get the Timing object
- *
* @since 1.27
* @return Timing
*/
}
/**
- * Get the Stats object
- *
* @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
*
* @since 1.25
}
/**
- * Set the SiteConfiguration object
- *
- * @param Config $s
+ * @param Config $config
*/
- public function setConfig( Config $s ) {
- $this->config = $s;
+ public function setConfig( Config $config ) {
+ $this->config = $config;
}
/**
- * Get the Config object
- *
* @return Config
*/
public function getConfig() {
}
/**
- * Get the stats object
- *
* @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
*
* @return IBufferingStatsdDataFactory
}
/**
- * Get the timing object
- *
* @return Timing
*/
public function getTiming() {
}
/**
- * Set the WebRequest object
- *
- * @param WebRequest $r
+ * @param WebRequest $request
*/
- public function setRequest( WebRequest $r ) {
- $this->request = $r;
+ public function setRequest( WebRequest $request ) {
+ $this->request = $request;
}
/**
- * Get the WebRequest object
- *
* @return WebRequest
*/
public function getRequest() {
}
/**
- * Set the Title object
- *
- * @param Title $t
+ * @param Title $title
*/
- public function setTitle( Title $t ) {
- $this->title = $t;
+ public function setTitle( Title $title ) {
+ $this->title = $title;
}
/**
- * Get the Title object
- *
* @return Title|null
*/
public function getTitle() {
}
/**
- * Set the WikiPage object
- *
* @since 1.19
- * @param WikiPage $p
+ * @param WikiPage $wikiPage
*/
- public function setWikiPage( WikiPage $p ) {
- $this->wikipage = $p;
+ public function setWikiPage( WikiPage $wikiPage ) {
+ $this->wikipage = $wikiPage;
}
/**
}
/**
- * Set the OutputPage object
- *
- * @param OutputPage $o
+ * @param OutputPage $output
*/
- public function setOutput( OutputPage $o ) {
- $this->output = $o;
+ public function setOutput( OutputPage $output ) {
+ $this->output = $output;
}
/**
- * Get the OutputPage object
- *
* @return OutputPage
*/
public function getOutput() {
}
/**
- * Set the User object
- *
- * @param User $u
+ * @param User $user
*/
- public function setUser( User $u ) {
- $this->user = $u;
+ public function setUser( User $user ) {
+ $this->user = $user;
}
/**
- * Get the User object
- *
* @return User
*/
public function getUser() {
}
/**
- * Set the Language object
- *
- * @param Language|string $l Language instance or language code
+ * @param Language|string $language Language instance or language code
* @throws MWException
* @since 1.19
*/
- public function setLanguage( $l ) {
- if ( $l instanceof Language ) {
- $this->lang = $l;
- } elseif ( is_string( $l ) ) {
- $l = RequestContext::sanitizeLangCode( $l );
- $obj = Language::factory( $l );
+ public function setLanguage( $language ) {
+ if ( $language instanceof Language ) {
+ $this->lang = $language;
+ } elseif ( is_string( $language ) ) {
+ $language = RequestContext::sanitizeLangCode( $language );
+ $obj = Language::factory( $language );
$this->lang = $obj;
} else {
throw new MWException( __METHOD__ . " was passed an invalid type of data." );
}
/**
- * Get the Language object
- *
* @return Language
* @since 1.19
*/
}
/**
- * Set the Skin object
- *
- * @param Skin $s
+ * @param Skin $skin
*/
- public function setSkin( Skin $s ) {
- $this->skin = clone $s;
+ public function setSkin( Skin $skin ) {
+ $this->skin = clone $skin;
$this->skin->setContext( $this );
}
/**
- * Get the Skin object
- *
* @return Skin
*/
public function getSkin() {
* shutdown by separate persistence handler objects, for example.
*/
interface IContextSource extends MessageLocalizer {
+
/**
- * Get the WebRequest object
- *
* @return WebRequest
*/
public function getRequest();
/**
- * Get the Title object
- *
* @return Title|null
*/
public function getTitle();
public function getWikiPage();
/**
- * Get the OutputPage object
- *
* @return OutputPage
*/
public function getOutput();
/**
- * Get the User object
- *
* @return User
*/
public function getUser();
/**
- * Get the Language object
- *
* @return Language
* @since 1.19
*/
public function getLanguage();
/**
- * Get the Skin object
- *
* @return Skin
*/
public function getSkin();
public function getConfig();
/**
- * Get the stats object
- *
* @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
*
* @since 1.25
public function getStats();
/**
- * Get the timing object
- *
* @since 1.27
* @return Timing
*/
*/
interface MutableContext {
+
/**
- * Set the Config object
- *
* @param Config $config
*/
public function setConfig( Config $config );
/**
- * Set the WebRequest object
- *
- * @param WebRequest $r
+ * @param WebRequest $request
*/
- public function setRequest( WebRequest $r );
+ public function setRequest( WebRequest $request );
/**
- * Set the Title object
- *
- * @param Title $t
+ * @param Title $title
*/
- public function setTitle( Title $t );
+ public function setTitle( Title $title );
/**
- * Set the WikiPage object
- *
- * @param WikiPage $p
+ * @param WikiPage $wikiPage
*/
- public function setWikiPage( WikiPage $p );
+ public function setWikiPage( WikiPage $wikiPage );
/**
- * Set the OutputPage object
- *
- * @param OutputPage $o
+ * @param OutputPage $output
*/
- public function setOutput( OutputPage $o );
+ public function setOutput( OutputPage $output );
/**
- * Set the User object
- *
- * @param User $u
+ * @param User $user
*/
- public function setUser( User $u );
+ public function setUser( User $user );
/**
- * Set the Language object
- *
- * @param Language|string $l Language instance or language code
+ * @param Language|string $language Language instance or language code
*/
- public function setLanguage( $l );
+ public function setLanguage( $language );
/**
- * Set the Skin object
- *
- * @param Skin $s
+ * @param Skin $skin
*/
- public function setSkin( Skin $s );
+ public function setSkin( Skin $skin );
}
}
/**
- * Set the WebRequest object
- *
- * @param WebRequest $r
+ * @param WebRequest $request
*/
- public function setRequest( WebRequest $r ) {
- $this->request = $r;
+ public function setRequest( WebRequest $request ) {
+ $this->request = $request;
}
/**
- * Get the WebRequest object
- *
* @return WebRequest
*/
public function getRequest() {
}
/**
- * Get the Stats object
- *
* @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
*
* @return IBufferingStatsdDataFactory
}
/**
- * Get the timing object
- *
* @return Timing
*/
public function getTiming() {
}
/**
- * Set the Title object
- *
* @param Title|null $title
*/
public function setTitle( Title $title = null ) {
}
/**
- * Get the Title object
- *
* @return Title|null
*/
public function getTitle() {
}
/**
- * Set the WikiPage object
- *
* @since 1.19
- * @param WikiPage $p
+ * @param WikiPage $wikiPage
*/
- public function setWikiPage( WikiPage $p ) {
- $pageTitle = $p->getTitle();
+ public function setWikiPage( WikiPage $wikiPage ) {
+ $pageTitle = $wikiPage->getTitle();
if ( !$this->hasTitle() || !$pageTitle->equals( $this->getTitle() ) ) {
$this->setTitle( $pageTitle );
}
// Defer this to the end since setTitle sets it to null.
- $this->wikipage = $p;
+ $this->wikipage = $wikiPage;
}
/**
}
/**
- * @param OutputPage $o
+ * @param OutputPage $output
*/
- public function setOutput( OutputPage $o ) {
- $this->output = $o;
+ public function setOutput( OutputPage $output ) {
+ $this->output = $output;
}
/**
- * Get the OutputPage object
- *
* @return OutputPage
*/
public function getOutput() {
}
/**
- * Set the User object
- *
- * @param User $u
+ * @param User $user
*/
- public function setUser( User $u ) {
- $this->user = $u;
+ public function setUser( User $user ) {
+ $this->user = $user;
}
/**
- * Get the User object
- *
* @return User
*/
public function getUser() {
}
/**
- * Set the Language object
- *
- * @param Language|string $l Language instance or language code
+ * @param Language|string $language Language instance or language code
* @throws MWException
* @since 1.19
*/
- public function setLanguage( $l ) {
- if ( $l instanceof Language ) {
- $this->lang = $l;
- } elseif ( is_string( $l ) ) {
- $l = self::sanitizeLangCode( $l );
- $obj = Language::factory( $l );
+ public function setLanguage( $language ) {
+ if ( $language instanceof Language ) {
+ $this->lang = $language;
+ } elseif ( is_string( $language ) ) {
+ $language = self::sanitizeLangCode( $language );
+ $obj = Language::factory( $language );
$this->lang = $obj;
} else {
throw new MWException( __METHOD__ . " was passed an invalid type of data." );
}
/**
- * Set the Skin object
- *
- * @param Skin $s
+ * @param Skin $skin
*/
- public function setSkin( Skin $s ) {
- $this->skin = clone $s;
+ public function setSkin( Skin $skin ) {
+ $this->skin = clone $skin;
$this->skin->setContext( $this );
}
/**
- * Get the Skin object
- *
* @return Skin
*/
public function getSkin() {
*/
public $oldContent;
- /**
- * $newContent in text form
- *
- * @var string
- * @deprecated since 1.21
- */
- public $newText;
-
- /**
- * $oldContent in text from
- *
- * @var string
- * @deprecated since 1.21
- */
- public $oldText;
-
- /**
- * $pstContent in text form
- *
- * @var string
- * @deprecated since 1.21
- */
- public $pst;
}
/**
* Set how wide each image will be, in pixels.
*
- * @param int $num Integer > 0; invalid numbers will be ignored
+ * @param string $num Number. Unit other than 'px is invalid. Invalid numbers
+ * and those below 0 are ignored.
*/
public function setWidths( $num ) {
- if ( $num > 0 ) {
- $this->mWidths = (int)$num;
+ $parsed = Parser::parseWidthParam( $num, false );
+ if ( isset( $parsed['width'] ) && $parsed['width'] > 0 ) {
+ $this->mWidths = $parsed['width'];
}
}
/**
* Set how high each image will be, in pixels.
*
- * @param int $num Integer > 0; invalid numbers will be ignored
+ * @param string $num Number. Unit other than 'px is invalid. Invalid numbers
+ * and those below 0 are ignored.
*/
public function setHeights( $num ) {
- if ( $num > 0 ) {
- $this->mHeights = (int)$num;
+ $parsed = Parser::parseWidthParam( $num, false );
+ if ( isset( $parsed['width'] ) && $parsed['width'] > 0 ) {
+ $this->mHeights = $parsed['width'];
}
}
--- /dev/null
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+namespace MediaWiki\Http;
+
+use CurlHttpRequest;
+use DomainException;
+use Http;
+use MediaWiki\Logger\LoggerFactory;
+use MWHttpRequest;
+use PhpHttpRequest;
+use Profiler;
+
+/**
+ * Factory creating MWHttpRequest objects.
+ */
+class HttpRequestFactory {
+
+ /**
+ * Generate a new MWHttpRequest object
+ * @param string $url Url to use
+ * @param array $options (optional) extra params to pass (see Http::request())
+ * @param string $caller The method making this request, for profiling
+ * @throws DomainException
+ * @return MWHttpRequest
+ * @see MWHttpRequest::__construct
+ */
+ public function create( $url, array $options = [], $caller = __METHOD__ ) {
+ if ( !Http::$httpEngine ) {
+ Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
+ } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
+ throw new DomainException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
+ ' Http::$httpEngine is set to "curl"' );
+ }
+
+ if ( !isset( $options['logger'] ) ) {
+ $options['logger'] = LoggerFactory::getInstance( 'http' );
+ }
+
+ switch ( Http::$httpEngine ) {
+ case 'curl':
+ return new CurlHttpRequest( $url, $options, $caller, Profiler::instance() );
+ case 'php':
+ if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
+ throw new DomainException( __METHOD__ . ': allow_url_fopen ' .
+ 'needs to be enabled for pure PHP http requests to ' .
+ 'work. If possible, curl should be used instead. See ' .
+ 'http://php.net/curl.'
+ );
+ }
+ return new PhpHttpRequest( $url, $options, $caller, Profiler::instance() );
+ default:
+ throw new DomainException( __METHOD__ . ': The setting of Http::$httpEngine is not valid.' );
+ }
+ }
+
+ /**
+ * Simple function to test if we can make any sort of requests at all, using
+ * cURL or fopen()
+ * @return bool
+ */
+ public function canMakeRequests() {
+ return function_exists( 'curl_init' ) || wfIniGetBool( 'allow_url_fopen' );
+ }
+
+}
* @file
*/
-use MediaWiki\Logger\LoggerFactory;
use Psr\Log\LoggerInterface;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\NullLogger;
* Renamed from HttpRequest to MWHttpRequest to avoid conflict with
* PHP's HTTP extension.
*/
-class MWHttpRequest implements LoggerAwareInterface {
+abstract class MWHttpRequest implements LoggerAwareInterface {
const SUPPORTS_FILE_POSTS = false;
/**
* @param string $caller The method making this request, for profiling
* @param Profiler $profiler An instance of the profiler for profiling, or null
*/
- protected function __construct(
- $url, $options = [], $caller = __METHOD__, $profiler = null
+ public function __construct(
+ $url, array $options = [], $caller = __METHOD__, $profiler = null
) {
global $wgHTTPTimeout, $wgHTTPConnectTimeout;
/**
* Generate a new request object
+ * Deprecated: @see HttpRequestFactory::create
* @param string $url Url to use
* @param array $options (optional) extra params to pass (see Http::request())
* @param string $caller The method making this request, for profiling
* @throws DomainException
- * @return CurlHttpRequest|PhpHttpRequest
+ * @return MWHttpRequest
* @see MWHttpRequest::__construct
*/
public static function factory( $url, $options = null, $caller = __METHOD__ ) {
- if ( !Http::$httpEngine ) {
- Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
- } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
- throw new DomainException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
- ' Http::$httpEngine is set to "curl"' );
- }
-
- if ( !is_array( $options ) ) {
- $options = [];
- }
-
- if ( !isset( $options['logger'] ) ) {
- $options['logger'] = LoggerFactory::getInstance( 'http' );
- }
-
- switch ( Http::$httpEngine ) {
- case 'curl':
- return new CurlHttpRequest( $url, $options, $caller, Profiler::instance() );
- case 'php':
- if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
- throw new DomainException( __METHOD__ . ': allow_url_fopen ' .
- 'needs to be enabled for pure PHP http requests to ' .
- 'work. If possible, curl should be used instead. See ' .
- 'http://php.net/curl.'
- );
- }
- return new PhpHttpRequest( $url, $options, $caller, Profiler::instance() );
- default:
- throw new DomainException( __METHOD__ . ': The setting of Http::$httpEngine is not valid.' );
- }
+ return \MediaWiki\MediaWikiServices::getInstance()
+ ->getHttpRequestFactory()
+ ->create( $url, $options, $caller );
}
/**
"config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
"config-install-done": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקיית הבסיס שבה הותקן הוויקי שלך (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
"config-install-done-path": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקייה <code>$4</code>. ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
+ "config-install-success": "מדיה־ויקי הותקנה בהצלחה. עכשיו אפשר\nלבקר בכתובת <$1$2> כדי לצפות בוויקי שלך.\nאם יש לך שאלות, ר' את רשימת השאלות הנפוצות שלנו:\n<https://www.mediawiki.org/wiki/Manual:FAQ> ואפשר גם להשתמש\nבאתרי התמיכה שקישורים אליהם מופיעים באותו הדף.",
"config-download-localsettings": "הורדת <code>LocalSettings.php</code>",
"config-help": "עזרה",
"config-help-tooltip": "להרחיב",
"Milicevic01",
"Aktron",
"Сербијана",
- "Zoranzoki21"
+ "Zoranzoki21",
+ "Acamicamacaraca"
]
},
"config-desc": "Инсталација за Медијавики",
"config-title": "Инсталација Медијавикија $1",
- "config-information": "Информације",
+ "config-information": "Информација",
+ "config-localsettings-key": "Кључ за уградњу:",
"config-session-error": "Грешка при започињању сесије: $1",
"config-session-expired": "Ваши подаци о сесији су истекли.\nСесије су подешене да трају $1.\nЊихов рок можете повећати постављањем <code>session.gc_maxlifetime</code> у php.ini.\nПоново покрените инсталацију.",
"config-no-session": "Ваши подаци о сесији су изгубљени!\nПроверите Ваш php.ini и обезбедите да је <code>session.save_path</code> постављен на одговарајући директоријум.",
"config-back": "← Назад",
"config-continue": "Настави →",
"config-page-language": "Језик",
- "config-page-welcome": "Ð\94обÑ\80о доÑ\88ли на Ð\9cедиÑ\98аÐ\92ики!",
+ "config-page-welcome": "Ð\94обÑ\80о доÑ\88ли на Ð\9cедиÑ\98авики!",
"config-page-dbconnect": "Повезивање са базом података",
"config-page-upgrade": "Надоградња постојеће инсталације",
"config-page-dbsettings": "Подешавања базе података",
"config-page-name": "Назив",
- "config-page-options": "Поставке",
+ "config-page-options": "Подешавања",
"config-page-install": "Инсталирај",
"config-page-complete": "Завршено!",
"config-page-restart": "Поновно покретање инсталације",
"config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] је инсталиран",
"config-db-type": "Тип базе података:",
"config-db-host": "Хост базе података",
+ "config-db-wiki-settings": "Идентификуј овај вики",
"config-db-name": "Назив базе података:",
- "config-db-password": "Лозинка за базу података:",
+ "config-db-name-oracle": "Шема базе података:",
+ "config-db-username": "Корисничко име базе података:",
+ "config-db-password": "Лозинка базе података:",
+ "config-db-port": "Порт базе података:",
+ "config-db-schema": "Шема за Медијавики:",
"config-type-mysql": "MySQL (или компактибилан)",
"config-type-postgres": "PostgreSQL",
"config-type-sqlite": "SQLite",
"config-mysql-myisam": "MyISAM",
"config-mysql-utf8": "UTF-8",
"config-mssql-auth": "Тип провере идентитета:",
- "config-mssql-sqlauth": "Провера идентитета за SQL Server",
- "config-mssql-windowsauth": "Провера идентитета Windows-а",
+ "config-mssql-sqlauth": "Провера идентитета SQL Server-а",
+ "config-mssql-windowsauth": "Провера идентитета Виндоуса",
"config-site-name": "Име викија:",
- "config-admin-name": "Ð\9aорисничко име:",
+ "config-admin-name": "Ð\92аÑ\88е корисничко име:",
"config-admin-password": "Лозинка:",
"config-admin-email": "Имејл адреса:",
- "config-optional-skip": "Ð\94оÑ\81адно ми Ñ\98е, Ñ\85аÑ\98де да инÑ\81Ñ\82алиÑ\80амо вики.",
+ "config-optional-skip": "Ð\94оÑ\81адно ми Ñ\98е, Ñ\81амо инÑ\81Ñ\82алиÑ\80аÑ\98 вики.",
"config-profile-no-anon": "Неопходно је отворити налог",
"config-profile-fishbowl": "Само овлашћени корисници",
"config-profile-private": "Приватна вики",
"config-skins": "Теме",
"config-install-step-done": "готово",
"config-install-step-failed": "није успело",
+ "config-install-extensions": "Обухвата екстензије",
+ "config-install-schema": "Прављење шеме",
+ "config-install-tables": "Прављење табела",
+ "config-install-keys": "Генеришем тајне кључеве",
"config-install-mainpage-exists": "Главна страна већ постоји, прескакање",
+ "config-install-mainpage-failed": "Не могу да убацим главну страну: „$1”",
+ "config-download-localsettings": "Преузми <code>LocalSettings.php</code>",
"config-help": "помоћ",
"config-help-tooltip": "кликните да проширите",
+ "config-nofile": "Не могу да пронађем датотеку „$1”. Није ли она била избрисана?",
+ "config-skins-screenshots": "„$1” (снимци екрана: $2)",
+ "config-screenshot": "снимак екрана",
"mainpagetext": "<strong>Медијавики је успешно инсталиран.</strong>",
"mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борете против спама на Вашој вики]"
}
* This will apply such updates post-send for web requests. Note that
* any checks from "syncChecks" are still synchronous.
*
+ * Bogus warning
+ * @suppress PhanAccessMethodProtected
+ *
* @param array $config
* @throws FileBackendError
*/
if ( !$externalCallback && !$generalCallback && !$checkIfSafe ) {
return;
}
- $dtd = $reader->readOuterXML();
+ $dtd = $reader->readOuterXml();
$callbackReturn = false;
if ( $generalCallback ) {
* @since 1.18
*/
final public static function factory( $dbType, $p = [] ) {
- static $canonicalDBTypes = [
- 'mysql' => [ 'mysqli' ],
- 'postgres' => [],
- 'sqlite' => [],
- 'oracle' => [],
- 'mssql' => [],
- ];
- static $classAliases = [
- 'DatabaseMssql' => DatabaseMssql::class,
- 'DatabaseMysqli' => DatabaseMysqli::class,
- 'DatabaseSqlite' => DatabaseSqlite::class,
- 'DatabasePostgres' => DatabasePostgres::class
+ // For database types with built-in support, the below maps type to IDatabase
+ // implementations. For types with multipe driver implementations (PHP extensions),
+ // an array can be used, keyed by extension name. In case of an array, the
+ // optional 'driver' parameter can be used to force a specific driver. Otherwise,
+ // we auto-detect the first available driver. For types without built-in support,
+ // an class named "Database<Type>" us used, eg. DatabaseFoo for type 'foo'.
+ static $builtinTypes = [
+ 'mssql' => DatabaseMssql::class,
+ 'mysql' => [ 'mysqli' => DatabaseMysqli::class ],
+ 'sqlite' => DatabaseSqlite::class,
+ 'postgres' => DatabasePostgres::class,
];
- $driver = false;
$dbType = strtolower( $dbType );
- if ( isset( $canonicalDBTypes[$dbType] ) && $canonicalDBTypes[$dbType] ) {
- $possibleDrivers = $canonicalDBTypes[$dbType];
- if ( !empty( $p['driver'] ) ) {
- if ( in_array( $p['driver'], $possibleDrivers ) ) {
- $driver = $p['driver'];
- } else {
- throw new InvalidArgumentException( __METHOD__ .
- " type '$dbType' does not support driver '{$p['driver']}'" );
- }
+ $class = false;
+ if ( isset( $builtinTypes[$dbType] ) ) {
+ $possibleDrivers = $builtinTypes[$dbType];
+ if ( is_string( $possibleDrivers ) ) {
+ $class = $possibleDrivers;
} else {
- foreach ( $possibleDrivers as $posDriver ) {
- if ( extension_loaded( $posDriver ) ) {
- $driver = $posDriver;
- break;
+ if ( !empty( $p['driver'] ) ) {
+ if ( !isset( $possibleDrivers[$p['driver']] ) ) {
+ throw new InvalidArgumentException( __METHOD__ .
+ " type '$dbType' does not support driver '{$p['driver']}'" );
+ } else {
+ $class = $possibleDrivers[$p['driver']];
+ }
+ } else {
+ foreach ( $possibleDrivers as $posDriver => $possibleClass ) {
+ if ( extension_loaded( $posDriver ) ) {
+ $class = $possibleClass;
+ break;
+ }
}
}
}
} else {
- $driver = $dbType;
+ $class = 'Database' . ucfirst( $dbType );
}
- if ( $driver === false || $driver === '' ) {
+ if ( $class === false ) {
throw new InvalidArgumentException( __METHOD__ .
" no viable database extension found for type '$dbType'" );
}
- $class = 'Database' . ucfirst( $driver );
- if ( isset( $classAliases[$class] ) ) {
- $class = $classAliases[$class];
- }
-
if ( class_exists( $class ) && is_subclass_of( $class, IDatabase::class ) ) {
// Resolve some defaults for b/c
$p['host'] = isset( $p['host'] ) ? $p['host'] : false;
}
public function waitForAll( $pos, $timeout = null ) {
+ $timeout = $timeout ?: $this->mWaitTimeout;
+
$oldPos = $this->mWaitForPos;
try {
$this->mWaitForPos = $pos;
$ok = true;
for ( $i = 1; $i < $serverCount; $i++ ) {
if ( $this->mLoads[$i] > 0 ) {
- $ok = $this->doWait( $i, true, $timeout ) && $ok;
+ $start = microtime( true );
+ $ok = $this->doWait( $i, true, max( 1, (int)$timeout ) ) && $ok;
+ $timeout -= ( microtime( true ) - $start );
+ if ( $timeout <= 0 ) {
+ break; // timeout reached
+ }
}
}
} finally {
$edit->newContent = $content;
$edit->oldContent = $this->getContent( Revision::RAW );
- // NOTE: B/C for hooks! don't use these fields!
- $edit->newText = $edit->newContent
- ? ContentHandler::getContentText( $edit->newContent )
- : '';
- $edit->oldText = $edit->oldContent
- ? ContentHandler::getContentText( $edit->oldContent )
- : '';
- $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialFormat ) : '';
-
if ( $edit->output ) {
$edit->output->setCacheTime( wfTimestampNow() );
}
// default
$gender = User::getDefaultOption( 'gender' );
- // allow prefix.
- $title = Title::newFromText( $username );
+ // allow prefix and normalize (e.g. "*foo" -> "*foo" ).
+ $title = Title::newFromText( $username, NS_USER );
if ( $title && $title->inNamespace( NS_USER ) ) {
$username = $title->getText();
if ( $argA == 'nowiki' ) {
// {{filepath: | option [| size] }}
$isNowiki = true;
- $parsedWidthParam = $parser->parseWidthParam( $argB );
+ $parsedWidthParam = Parser::parseWidthParam( $argB );
} else {
// {{filepath: [| size [|option]] }}
- $parsedWidthParam = $parser->parseWidthParam( $argA );
+ $parsedWidthParam = Parser::parseWidthParam( $argA );
$isNowiki = ( $argB == 'nowiki' );
}
# Special case; width and height come in one variable together
if ( $type === 'handler' && $paramName === 'width' ) {
- $parsedWidthParam = $this->parseWidthParam( $value );
+ $parsedWidthParam = self::parseWidthParam( $value );
if ( isset( $parsedWidthParam['width'] ) ) {
$width = $parsedWidthParam['width'];
if ( $handler->validateParam( 'width', $width ) ) {
* Parsed a width param of imagelink like 300px or 200x300px
*
* @param string $value
+ * @param bool $parseHeight
*
* @return array
* @since 1.20
*/
- public function parseWidthParam( $value ) {
+ public static function parseWidthParam( $value, $parseHeight = true ) {
$parsedWidthParam = [];
if ( $value === '' ) {
return $parsedWidthParam;
$m = [];
# (T15500) In both cases (width/height and width only),
# permit trailing "px" for backward compatibility.
- if ( preg_match( '/^([0-9]*)x([0-9]*)\s*(?:px)?\s*$/', $value, $m ) ) {
+ if ( $parseHeight && preg_match( '/^([0-9]*)x([0-9]*)\s*(?:px)?\s*$/', $value, $m ) ) {
$width = intval( $m[1] );
$height = intval( $m[2] );
$parsedWidthParam['width'] = $width;
/**
* Get the ParserOutput from this object, or false in case of failure
*
- * @return ParserOutput
+ * @return ParserOutput|bool
*/
public function getParserOutput() {
return $this->parserOutput;
* @param PreferencesForm $form
* @return bool|Status|string
*/
- protected function legacySaveFormData( $formData, PreferencesForm $form ) {
+ public function legacySaveFormData( $formData, PreferencesForm $form ) {
return $this->saveFormData( $formData, $form );
}
// Optimistic: If the global is not set, or is an empty array, replace it entirely.
// Will be O(1) performance.
- if ( !isset( $GLOBALS[$key] ) || ( is_array( $GLOBALS[$key] ) && !$GLOBALS[$key] ) ) {
+ if ( !array_key_exists( $key, $GLOBALS ) || ( is_array( $GLOBALS[$key] ) && !$GLOBALS[$key] ) ) {
$GLOBALS[$key] = $val;
continue;
}
$this->setLimitOffset( $fallbackLimit );
$fallbackSearchResult = $this->completionSearch( $fbs );
$results->appendAll( $fallbackSearchResult );
- $fallbackLimit -= count( $fallbackSearchResult );
+ $fallbackLimit -= $fallbackSearchResult->getSize();
if ( $fallbackLimit <= 0 ) {
break;
}
* the usual skin elements but still using CSS, JS, and such via OutputPage and
* ResourceLoader.
*
- * Created on Sep 08, 2014
- *
* Copyright © 2014 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
* the usual skin elements but still using CSS, JS, and such via OutputPage and
* ResourceLoader.
*
- * Created on Sep 08, 2014
- *
* Copyright © 2014 Wikimedia Foundation and contributors
*
* This program is free software; you can redistribute it and/or modify
public function getFinalGroupName() {
$name = $this->getName();
- // Allow overbidding the group from the wiki side
+ // Allow overriding the group from the wiki side
$msg = $this->msg( 'specialpages-specialpagegroup-' . strtolower( $name ) )->inContentLanguage();
if ( !$msg->isBlank() ) {
$group = $msg->text();
<?php
-/**
- * MediaWiki Widgets – ComplexNamespaceInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
namespace MediaWiki\Widget;
/**
* Namespace input widget. Displays a dropdown box with the choice of available namespaces, plus two
* checkboxes to include associated namespace or to invert selection.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
*/
class ComplexNamespaceInputWidget extends \OOUI\Widget {
<?php
-/**
- * MediaWiki Widgets – ComplexTitleInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
namespace MediaWiki\Widget;
/**
* Complex title input widget.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
*/
class ComplexTitleInputWidget extends \OOUI\Widget {
<?php
-/**
- * MediaWiki Widgets – DateInputWidget class.
- *
- * @copyright 2016 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
namespace MediaWiki\Widget;
* Date input widget.
*
* @since 1.29
+ * @copyright 2016 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
*/
class DateInputWidget extends \OOUI\TextInputWidget {
<?php
-/**
- * MediaWiki Widgets – DateTimeInputWidget class.
- *
- * @copyright 2016 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
namespace MediaWiki\Widget;
use OOUI\Tag;
/**
* Date-time input widget.
+ *
+ * @copyright 2016 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
*/
class DateTimeInputWidget extends \OOUI\InputWidget {
<?php
-/**
- * MediaWiki Widgets – NamespaceInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
namespace MediaWiki\Widget;
/**
* Namespace input widget. Displays a dropdown box with the choice of available namespaces.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
*/
class NamespaceInputWidget extends \OOUI\DropdownInputWidget {
<?php
-/**
- * MediaWiki Widgets – SearchInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
namespace MediaWiki\Widget;
/**
* Search input widget.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
*/
class SearchInputWidget extends TitleInputWidget {
<?php
-/**
- * MediaWiki Widgets – SelectWithInputWidget class.
- *
- * @copyright 2011-2017 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
namespace MediaWiki\Widget;
-use \OOUI\TextInputWidget;
-use \OOUI\DropdownInputWidget;
+use OOUI\DropdownInputWidget;
+use OOUI\TextInputWidget;
/**
* Select and input widget.
+ *
+ * @copyright 2011-2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
*/
class SelectWithInputWidget extends \OOUI\Widget {
<?php
-/**
- * MediaWiki Widgets – TitleInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
namespace MediaWiki\Widget;
/**
* Title input widget.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
*/
class TitleInputWidget extends \OOUI\TextInputWidget {
<?php
-/**
- * MediaWiki Widgets – UserInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
namespace MediaWiki\Widget;
/**
* User input widget.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
*/
class UserInputWidget extends \OOUI\TextInputWidget {
<?php
-/**
- * MediaWiki Widgets – UsersMultiselectWidget class.
- *
- * @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
namespace MediaWiki\Widget;
-use \OOUI\MultilineTextInputWidget;
+use OOUI\MultilineTextInputWidget;
/**
* Widget to select multiple users.
+ *
+ * @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
*/
class UsersMultiselectWidget extends \OOUI\Widget {
$req = $this->getURLVariant();
+ Hooks::run( 'GetLangPreferredVariant', [ &$req ] );
+
if ( $wgUser->isSafeToLoad() && $wgUser->isLoggedIn() && !$req ) {
$req = $this->getUserVariant();
} elseif ( !$req ) {
"specialpage-securitylevel-not-allowed-title": "Nie toegestaan",
"cannotauth-not-allowed-title": "Geen toegang",
"cannotauth-not-allowed": "U word nie toegelaat om die bladsy te gebruik nie",
- "credentialsform-account": "Gebruikersnaam:"
+ "credentialsform-account": "Gebruikersnaam:",
+ "edit-error-short": "Fout: $1",
+ "edit-error-long": "Foute:\n\n$1"
}
"content-model-css": "CSS",
"content-json-empty-object": "كائن فارغ",
"content-json-empty-array": "مصفوفة فارغة",
- "deprecated-self-close-category": "صفحات تستخدم وسوم أتش تي أم أل غير صالحة",
+ "deprecated-self-close-category": "صفحات تستخدم وسوم HTML غير صالحة",
"deprecated-self-close-category-desc": "هذه الصفحة تحتوي على وسوم HTML مغلقة ذاتيا، مثل <code><b/></code> أو <code><span/></code>. سلوك هذه سيتغير سريعا ليكون متوافقا مع معيار HTML5، لذا فاستخدامهم في نص الويكي ينبغي أن يتم الاستغناء عنه.",
"duplicate-args-warning": "<strong>تنبيه:</strong> المدخل \"$3\" ل[[:$1]] المستعمل في [[:$2]] مكرر. آخر قيمة مكرر منه هي المعتمدة.",
"duplicate-args-category": "صفحات تستعمل قالبا ببيانات مكررة",
"rcfilters-activefilters": "المرشحات النشطة",
"rcfilters-advancedfilters": "مرشحات متقدمة",
"rcfilters-limit-title": "النتائج للعرض",
- "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|تغيير|$1 تغييرات}}، $2",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|تغيير|تغييرات}}، $2",
"rcfilters-date-popup-title": "الفترة الزمنية للبحث",
"rcfilters-days-title": "عدد الأيام الأخيرة",
"rcfilters-hours-title": "عدد الساعات الأخيرة",
"doubleredirects": "تحويلات مزدوجة",
"doubleredirectstext": "هذه الصفحة تعرض الصفحات التي تحول إلى صفحات تحويل أخرى.\nكل سطر يحتوي على وصلات للتحويلة الأولى والثانية وهدف التحويلة الثانية، والذي عادة ما يشير إلى صفحة الهدف \"الحقيقية\"، التي من المفترض أن تحول إليها التحويلة الأولى.\nالمدخلات <del>المشطوبة</del> صححت.",
"double-redirect-fixed-move": "نُقلت [[$1]].\nحُدّثت تلقائيا وهي الآن تحويلة إلى [[$2]].",
- "double-redirect-fixed-maintenance": "تصحيح تلقائي لتحويلة مزدوجة من [[$1]] إلى [[$2]] في مهمة صيانة.",
+ "double-redirect-fixed-maintenance": "تصحيح تلقائي لتحويلة مزدوجة من [[$1]] إلى [[$2]] في مهمة صيانة",
"double-redirect-fixer": "مصلح التحويل",
"brokenredirects": "تحويلات مكسورة",
"brokenredirectstext": "التحويلات التالية تصل لصفحات غير موجودة:",
"restrictionsfield-badip": "عنوان أيبي أو نطاق غير صحيح: $1",
"restrictionsfield-label": "نطاقات الأيبي المسموح بها:",
"restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم:\n<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "خطأ: $1",
+ "edit-error-long": "الأخطاء:\n\n$1",
"revid": "المراجعة $1",
"pageid": "معرف الصفحة $1",
"rawhtml-notallowed": "لا يمكن استخدام وسوم <html> خارج الصفحات العادية.",
"restrictionsfield-badip": "Direición o rangu IP inválidu: $1",
"restrictionsfield-label": "Rangos d'IP permitíos:",
"restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Error: $1",
+ "edit-error-long": "Errores:\n\n$1",
"revid": "revisión $1",
"pageid": "ID de páxina $1",
"rawhtml-notallowed": "Les etiquetes <html> nun pueden usase fuera de les páxines normales.",
"changecredentials-submit": "Иҫәп мәғлүмәттәрен үҙгәртеү",
"removecredentials": "Иҫәп мәғлүмәттәрен юйырға",
"removecredentials-submit": "Иҫәп мәғлүмәттәрен юйырға",
- "credentialsform-account": "Иҫәп яҙмаһы исеме:"
+ "credentialsform-account": "Иҫәп яҙмаһы исеме:",
+ "edit-error-short": "Хата: $1"
}
"grouppage-sysop": "{{ns:project}}:Адміністрацыя",
"grouppage-bureaucrat": "{{ns:project}}:Бюракраты",
"grouppage-suppress": "{{ns:project}}:Падаўляльнікі_вэрсіяў",
- "right-read": "прагляд старонак",
- "right-edit": "рэдагаваньне старонак",
- "right-createpage": "стварэньне старонак (акрамя старонак абмеркаваньняў)",
+ "right-read": "Ð\9fрагляд старонак",
+ "right-edit": "Рэдагаваньне старонак",
+ "right-createpage": "Стварэньне старонак (акрамя старонак абмеркаваньняў)",
"right-createtalk": "стварэньне старонак абмеркаваньня",
"right-createaccount": "стварэньне новых рахункаў удзельніка",
"right-autocreateaccount": "Аўтаматычны ўваход з вонкавага рахунку ўдзельніка",
"doubleredirects": "Двайныя перанакіраваньні",
"doubleredirectstext": "На гэтай старонцы пададзены сьпіс перанакіраваньняў на іншыя перанакіраваньні. Кожны радок утрымлівае спасылкі на першае і другое перанакіраваньне, а таксама мэтавую старонку другога перанакіраваньня, якая звычайна зьяўляецца «сапраўднай» мэтавай старонкай, куды павіннае спасылацца першае перанакіраваньне.\n<del>Закрэсьленыя</del> элемэнты былі выпраўленыя.",
"double-redirect-fixed-move": "[[$1]] была перанесеная.\nСтаронка аўтаматычна абноўленая і цяпер перанакіроўвае на [[$2]].",
- "double-redirect-fixed-maintenance": "Аўтаматычнае выпраўленьне падвойнага перанакіраваньня з [[$1]] на [[$2]] падчас тэхнічнага абслугоўваньня.",
+ "double-redirect-fixed-maintenance": "Аўтаматычнае выпраўленьне падвойнага перанакіраваньня з [[$1]] на [[$2]] падчас тэхнічнага абслугоўваньня",
"double-redirect-fixer": "Выпраўленьне перанакіраваньняў",
"brokenredirects": "Некарэктныя перанакіраваньні",
"brokenredirectstext": "Наступныя перанакіраваньні спасылаюцца на неіснуючыя старонкі:",
"restrictionsfield-badip": "Няслушны IP-адрас ці дыяпазон: $1",
"restrictionsfield-label": "Дазволеныя IP-дыяпазоны:",
"restrictionsfield-help": "Адзін IP-адрас ці CIDR-дыяпазон на радок. Каб дазволіць усё, ужывайце:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Памылка: $1",
"revid": "вэрсія $1",
"pageid": "Ідэнтыфікатар старонкі $1",
"rawhtml-notallowed": "<html>-тэгі ня могуць быць выкарыстаныя па-за звычайнымі старонкамі.",
"tag-filter-submit": "Филтриране",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Етикет|Етикети}}]]: $2)",
"tag-mw-contentmodelchange": "промяна на модела на съдържание",
+ "tag-mw-rollback": "Отмяна",
"tag-mw-undo": "Отмяна",
"tags-title": "Етикети",
"tags-intro": "Тук са изброени всички етикети, които могат да се ползват за отбелязване на редакциите, както и тяхното значение.",
"linkaccounts-success-text": "Сметката беше свързана.",
"linkaccounts-submit": "Свързване на сметки",
"restrictionsfield-badip": "Невалиден IP-адрес или интервал от адреси: $1",
+ "edit-error-short": "Грешка: $1",
+ "edit-error-long": "Грешки:\n\n$1",
"revid": "версия $1"
}
"tog-shownumberswatching": "धियान रखे वाला प्रयोगकर्ता लोग के संख्या देखावल जाव",
"tog-oldsig": "राउर वर्तमान दसखत:",
"tog-fancysig": "दसखत के विकी पाठ के रुप में उपयोग करीं (बिना ऑटोमेटिक कड़ी के)",
- "tog-uselivepreview": "लà¤\97ातार à¤\9dलà¤\95 (लाà¤\87व पà¥\8dरà¥\80वà¥\8dयà¥\82) à¤\87सà¥\8dतà¥\87माल à¤\95à¤\87ल à¤\9cाव",
+ "tog-uselivepreview": "पनà¥\8dना à¤\95à¥\87 रà¥\80लà¥\8bड à¤\95à¤\87लà¥\87 बिना à¤à¥\80 à¤\9dलà¤\95 दà¥\87à¤\96ावल à¤\9cाय",
"tog-forceeditsummary": "संपादन सारांश ना भरल गइल होखे त हमके सूचित कइल जाय",
"tog-watchlisthideown": "धियानसूची से हमार खुद के संपादन छिपावल जाय",
"tog-watchlisthidebots": "धियानसूची से बॉट संपादन छिपावल जाय",
"speciallogtitlelabel": "टारगेट (टाइटिल या {{ns:user}}:प्रयोगकर्ता खाती प्रयोगकर्तानाँव):",
"log": "सगरी लॉग",
"all-logs-page": "सगरी पब्लिक लॉग",
+ "alllogstext": "{{SITENAME}} के सगरी मौजूद लॉग सब के कंबाइन डिस्प्ले।\nआप लॉग के प्रकार, प्रयोगकर्ता नाँव (केस सेंसेटिव), या प्रभावित पन्ना (इहो केस सेंसेटिव) बीछ के एकरा के कम आइटम पर फोकस के के देख सकी ला।",
"logempty": "लॉग में कौनों मैचिंग आइटम ना बा।",
"allpages": "सगरी पन्ना",
"nextpage": "अगिला पन्ना ($1)",
"usermessage-editor": "सिस्टम मसेंजर",
"watchlist": "धियानसूची",
"mywatchlist": "धियानसूची",
+ "watchlistfor2": "$1 खाती $2",
"watch": "धियानसूची में डालीं",
"watchthispage": "ई पन्ना ध्यानसूची में डालीं",
"unwatch": "धियानसूची से हटाईं",
+ "watchlist-details": "{{PLURAL:$1|$1 पन्ना}} राउर धियानसूची में बा (आ वार्ता पन्ना)।",
+ "wlheader-showupdated": "राउर अंतिम विजिट के बाद जवना पन्ना सभ में बदलाव भइल बा ऊ <strong>मोट अच्छर</strong> में देखावल जात बाड़ें।",
+ "wlnote": "नीचे $3, $4 तक ले, आखिरी {{PLURAL:$2|घंटा|<strong>$2</strong> घंटा}} में भइल {{PLURAL:$1|अंतिम बदलाव बा|अंतिम <strong>$1</strong> बदलाव बाड़ें}}।",
"wlshowlast": "पछिला $1 घंटा $2 दिन देखावल जाय",
+ "watchlist-options": "धियानसूची बिकल्प",
"watching": "ध्यानसूची में जाते हुए",
"unwatching": "ध्यानसूची से हटते हुए",
+ "enotif_reset": "सगरी पन्ना सभ देखल चिन्हित करीं",
"created": "बनावल गईल",
"actioncomplete": "काम पुरा भइल",
"dellogpage": "हटवले के लिस्ट",
"contribslink": "योगदान",
"blocklogpage": "निष्क्रिय खाता",
"blocklogentry": "[[$1]] के ब्लॉक कइल गइल, समाप्ती के अवधि $2 $3",
+ "reblock-logentry": "[[$1]] खातिर रोक सेटिंग बदलल गइल आ अब समाप्ती समय बा $2 $3",
"block-log-flags-nocreate": "खाता निर्माण सक्षम नइखे",
"proxyblocker": "प्रॉक्सी ब्लॉककर्ता",
"movepagebtn": "पन्ना स्थांतरण करीं",
"pageinfo-content-model": "पन्ना सामग्री के मॉडल",
"pageinfo-robot-policy": "रोबोट द्वारा इंडेक्सिंग",
"pageinfo-robot-index": "एलाऊ बा",
+ "pageinfo-robot-noindex": "डिसएलाऊ",
"pageinfo-watchers": "पन्ना पर धियान रखे वाला लोग के संख्या",
"pageinfo-few-watchers": "$1 से कम धियान रखे {{PLURAL:$1|वाला|वाला लोग}}",
"pageinfo-redirects-name": "एह पन्ना पर आवे वाला अनुप्रेषणन के संख्या",
"pageinfo-subpages-name": "एह पन्ना के उपपन्ना संख्या",
+ "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|अनुप्रेषण}}; $3 {{PLURAL:$3|गैर-अनुप्रेषण}})",
"pageinfo-firstuser": "पन्ना बनावेवाला",
"pageinfo-firsttime": "पन्ना बनावे के तारीख",
"pageinfo-lastuser": "अंतिम संपादक",
"pageinfo-recent-edits": "हाल के संपादन संख्या (पछिला $1 में)",
"pageinfo-recent-authors": "हाल के बिभिन्न संपादक लोग के संख्या",
"pageinfo-magic-words": "जादुई शब्द {{{{PLURAL:$1||शब्द|शब्द}}}} ($1)",
+ "pageinfo-hidden-categories": "छिपल {{PLURAL:$1|श्रेणी}} ($1)",
"pageinfo-templates": "ट्रांसक्लूड {{PLURAL:$1|टेम्पलेट|टेम्पलेट सभ}} ($1)",
"pageinfo-toolboxlink": "पन्ना से जुड़ल जानकारी",
"pageinfo-contentpage": "सामग्री पन्ना के रूप में गिनती वाला",
"nextdiff": "नया संपादन →",
"widthheightpage": "$1 × $2, $3 {{PLURAL:$3|पन्ना}}",
"file-info-size": "$1 × $2 पिक्सेल, फाइल साइज: $3, MIME टाइप: $4",
+ "file-info-size-pages": "$1 × $2 पिक्सेल, फाइल साइज: $3, MIME प्रकार: $4, $5 {{PLURAL:$5|पन्ना}}",
"file-nohires": "ए से उच्च गुणवत्ता उपलब्ध नइखे।",
"svg-long-desc": "एसवीजी फाइल, नॉमिनली $1 x $2 पिक्सल, फाइल के आकार: $3",
"show-big-image": "ओरिजनल फाइल",
"imgmultigo": "जाईं!",
"imgmultigoto": "$1 पन्ना पर जाईं",
"autoredircomment": "पन्ना [[$1]] पर अनुप्रेषित कइल गइल",
+ "watchlisttools-clear": "धियानसूची साफ करीं",
+ "watchlisttools-view": "प्रासंगिक बदलाव देखीं",
+ "watchlisttools-edit": "धियानसूची देखीं आ संपादित करीं",
+ "watchlisttools-raw": "मूल धियानसूची संपादित करीं",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|बात करीं]])",
"version-no-ext-name": "[अज्ञात नाम]",
"redirect": "फाइल, प्रयोगकर्ता, पन्ना रिवीजन या लॉग आइडी से अनुप्रेषण",
"tags-active-no": "ना",
"tags-hitcount": "$1 {{PLURAL:$1|बदलाव}}",
"logentry-delete-delete": "$1 द्वारा पन्ना $3 {{GENDER:$2|हटा}} दिहल गइल",
+ "logentry-delete-restore": "$1 पन्ना $3 ($4) के वापस ले {{GENDER:$2|अइलें|अइली}}",
"logentry-delete-revision": "$1 पन्ना $3 पर {{PLURAL:$5|रिवीजन|$5 रिवीजन सभ}} के विजिबिलिटी {{GENDER:$2|बदललें|बदलली}}: $4",
"revdelete-content-hid": "छिपावल सामग्री",
"revdelete-restricted": "प्रबंधक पर प्रतिबंध लागू",
"subject-preview": "বিষয়ের প্রাকদর্শন:",
"previewerrortext": "আপনার পরিবর্তনগুলি প্রাকদর্শন করার চেষ্টা করার সময় একটি ত্রুটি ঘটেছে।",
"blockedtitle": "ব্যবহারকারীকে বাধা দেয়া হয়েছে",
- "blockedtext": "<strong>আপনার ব্যবহারকারী নাম বা আইপি ঠিকানাটিকে সম্পাদনায় বাধাদান করা হয়েছে।</strong>\n\n$1 এই বাধাটি প্রদান করেছেন। বাধার কারণ হিসেবে বলা হয়েছে:<em>$2</em>।\n\n* বাধা শুরুর সময়:$8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনি $1 অথবা [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকদের]] কারও সাথে এই বাধা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nআপনি \"(ব্যবহারকারীকে) ইমেইল করুন\" সুবিধাটি ব্যবহার করতে পারবেন না। তবে [[Special:Preferences|আপনার পছন্দ তালিকাতে]] যদি একটি বৈধ ইমেইল ঠিকানা নির্দিষ্ট করা হয়ে থাকে এবং সুবিধাটি ব্যবহারে যদি আপনাকে বাধা না দেওয়া হয়ে থাকে, তবে আপনি সুবিধাটি ব্যবহার করতে পারবেন।\n\nআপনার বর্তমান আইপি ঠিকানা হল $3, এবং আপনার বাধা নং হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
- "autoblockedtext": "à¦\86পনার à¦\86à¦\87পি ঠিà¦\95ানাà¦\9fিà¦\95à§\87 সà§\8dবয়à¦\82à¦\95à§\8dরিয়à¦à¦¾à¦¬à§\87 সমà§\8dপাদনায় বাধাদান à¦\95রা হয়à§\87à¦\9bà§\87 à¦\95ারণ à¦\8fমন à¦\86রà§\87à¦\95à¦\9cন বà§\8dযবহারà¦\95ারà§\80 à¦\8fà¦\9fি বà§\8dযবহার à¦\95রà§\87à¦\9bà§\87ন, যাà¦\95à§\87 $1 বাধা দিয়à§\87à¦\9bà§\87ন।\nযà§\87 à¦\95ারণà§\87 বাধা দà§\87à¦\93য়া হয়à§\87à¦\9bà§\87 সà§\87à¦\9fি হল:\n\n:<em>$2</em>\n\n* বাধা শà§\81রà§\81র সময়: $8\n* বাধা শà§\87ষà§\87র সময়: $6\n* যাà¦\95à§\87 বাধাদান à¦\95রা হয়à§\87à¦\9bà§\87: $7\n\nà¦\86পনি $1-à¦\8fর সাথà§\87 à¦\95িà¦\82বা à¦\85নà§\8dয যà§\87à¦\95à§\8bন [[{{MediaWiki:Grouppage-sysop}}|পà§\8dরশাসà¦\95à§\87র]] সাথà§\87 যà§\8bà¦\97াযà§\8bà¦\97 à¦\95রà§\87 à¦\8fà¦\87 বাধা সà¦\82à¦\95à§\8dরানà§\8dত বিষয়à§\87 à¦\86লà§\8bà¦\9aনা à¦\95রতà§\87 পারà§\87ন।\n\nলà¦\95à§\8dষà§\8dয à¦\95রà§\81ন, যদি à¦\86পনি \"à¦\8fà¦\87 বà§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\87-মà§\87à¦\87ল à¦\95রà§\81ন\" সà§\81বিধাà¦\9fি বà§\8dযবহার à¦\95রতà§\87 à¦\9aান, তবà§\87 [[Special:Preferences|à¦\86পনার পà¦\9bনà§\8dদ তালিà¦\95াতà§\87]] যদি à¦\8fà¦\95à¦\9fি বà§\88ধ à¦\87মà§\87à¦\87ল ঠিà¦\95ানা নিরà§\8dদিষà§\8dà¦\9f থাà¦\95তà§\87 হবà§\87 à¦\8fবà¦\82 à¦\86পনার সà§\87à¦\9fি বà§\8dযবহারà§\87 à¦\95à§\8bন বাধা থাà¦\95তà§\87 পারবà§\87 না।\n\nà¦\86পনার বরà§\8dতমান à¦\86à¦\87পি ঠিà¦\95ানা হà¦\9aà§\8dà¦\9bà§\87 $3, à¦\8fবà¦\82 বাধা নà¦\82 হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
+ "blockedtext": "<strong>আপনার ব্যবহারকারী নাম বা আইপি ঠিকানাটিকে সম্পাদনায় বাধাদান করা হয়েছে।</strong>\n\n$1 এই বাধাটি প্রদান করেছেন। বাধার কারণ হিসেবে বলা হয়েছে:<em>$2</em>।\n\n* বাধা শুরুর সময়: $8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনি $1 অথবা অন্য [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকদের]] সাথে এই বাধা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nআপনি \"ইমেইল করুন\" বৈশিষ্ট্যটি ব্যবহার করতে পারবেন না যদি না আপনার [[Special:Preferences|অ্যাকাউন্টের পছন্দসমূহে]] একটি বৈধ ইমেইল ঠিকানা নির্দিষ্ট না করা হয়ে থাকে এবং আপনাকে এটি ব্যবহার করা থেকে অবরুদ্ধ না করা হয়ে থাকে।\n\nআপনার বর্তমান আইপি ঠিকানা হল $3, এবং আপনার বাধা নং হল #$5।\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
+ "autoblockedtext": "à¦\86পনার à¦\86à¦\87পি ঠিà¦\95ানাà¦\9fিà¦\95à§\87 সà§\8dবয়à¦\82à¦\95à§\8dরিয়à¦à¦¾à¦¬à§\87 সমà§\8dপাদনায় বাধাদান à¦\95রা হয়à§\87à¦\9bà§\87 à¦\95ারণ à¦\8fমন à¦\86রà§\87à¦\95à¦\9cন বà§\8dযবহারà¦\95ারà§\80 à¦\8fà¦\9fি বà§\8dযবহার à¦\95রà§\87à¦\9bà§\87ন, যাà¦\95à§\87 $1 বাধা দিয়à§\87à¦\9bà§\87ন।\nযà§\87 à¦\95ারণà§\87 বাধা দà§\87à¦\93য়া হয়à§\87à¦\9bà§\87 সà§\87à¦\9fি হল:\n\n:<em>$2</em>\n\n* বাধা শà§\81রà§\81র সময়: $8\n* বাধা শà§\87ষà§\87র সময়: $6\n* যাà¦\95à§\87 বাধাদান à¦\95রা হয়à§\87à¦\9bà§\87: $7\n\nà¦\86পনি $1-à¦\8fর সাথà§\87 à¦\95িà¦\82বা à¦\85নà§\8dয যà§\87à¦\95à§\8bন [[{{MediaWiki:Grouppage-sysop}}|পà§\8dরশাসà¦\95à§\87র]] সাথà§\87 যà§\8bà¦\97াযà§\8bà¦\97 à¦\95রà§\87 à¦\8fà¦\87 বাধা সà¦\82à¦\95à§\8dরানà§\8dত বিষয়à§\87 à¦\86লà§\8bà¦\9aনা à¦\95রতà§\87 পারà§\87ন।\n\nলà¦\95à§\8dষà§\8dয à¦\95রà§\81ন, à¦\86পনি \"à¦\8fà¦\87 বà§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\87-মà§\87à¦\87ল à¦\95রà§\81ন\" বà§\88শিষà§\8dà¦\9fà§\8dযà¦\9fি বà§\8dযবহার à¦\95রতà§\87 পারবà§\87ন না যদি না à¦\86পনার [[Special:Preferences|à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র পà¦\9bনà§\8dদসমà§\82হà§\87]] à¦\8fà¦\95à¦\9fি বà§\88ধ à¦\87মà§\87à¦\87ল ঠিà¦\95ানা নিবনà§\8dধিত না থাà¦\95à§\87 à¦\8fবà¦\82 à¦\86পনাà¦\95à§\87 à¦\8fà¦\9fি বà§\8dযবহার à¦\95রা থà§\87à¦\95à§\87 à¦\85বরà§\81দà§\8dধ না à¦\95রা হয়à§\87 থাà¦\95à§\87।\n\nà¦\86পনার বরà§\8dতমান à¦\86à¦\87পি ঠিà¦\95ানা হà¦\9aà§\8dà¦\9bà§\87 $3, à¦\8fবà¦\82 বাধা নà¦\82 হল #$5।\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
"systemblockedtext": "আপনার ব্যবহারকারী নাম অথবা আইপি ঠিকানাটিকে স্বয়ংক্রিয়ভাবে মিডিয়াউইকি দ্বারা বাধাদান করা হয়েছে। যে কারণটি দেওয়া হয়েছে, সেটি হল:\n\n:<em>$2</em>\n\n* বাধা শুরুর সময়: $8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনার বর্তমান আইপি ঠিকানাটি হল $3।\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
"blockednoreason": "কোন কারণ দেওয়া হয়নি",
"whitelistedittext": "পাতায় সম্পাদনা করতে অনুগ্রহ করে $1 করুন।",
"blocklist-params": "বাধাদানের প্যারামিটার",
"blocklist-reason": "কারণ",
"ipblocklist-submit": "অনুসন্ধান",
- "ipblocklist-localblock": "সà§\8dথানà§\80য় বà§\8dলà¦\95",
+ "ipblocklist-localblock": "সà§\8dথানà§\80য় বাধা",
"ipblocklist-otherblocks": "অন্যান্য {{PLURAL:$1|বাধাঁ|বাধাঁসমূহ}}",
"infiniteblock": "অসীম",
"expiringblock": "$1 তারিখের $2 এ মেয়াদোত্তীর্ণ হবে",
"ipb_expiry_old": "মেয়াদোত্তীর্ণের সময় অতীত হয়েছে।",
"ipb_expiry_temp": "লুকানো ব্যবহারকারীনাম বাধা চিরস্থায়ী হতে হবে।",
"ipb_hide_invalid": "এই অ্যাকাউন্ট বাধা দেয়া সম্ভব নয়; এটি {{PLURAL:$1|একের অধিক|$1টি}} সম্পাদনা করেছে।",
- "ipb_already_blocked": "\"$1\" à¦\87তিমধà§\8dযà§\87 বà§\8dলà¦\95",
+ "ipb_already_blocked": "\"$1\" à¦\87তিমধà§\8dযà§\87 বাধাপà§\8dরাপà§\8dত।",
"ipb-needreblock": "$1 ইতিমধ্যেই বাধাপ্রাপ্ত আছেন। আপনি কি সেটিংস পরিবর্তন করতে চান?",
"ipb-otherblocks-header": "অন্যান্য {{PLURAL:$1|বাধা|বাধাসমূহ}}",
"unblock-hideuser": "আপনি এই ব্যবহারকারীকে বাধা মুক্ত করতে পারবেন না, কারণ এই ব্যবহারকারীদের ব্যবহারকারী নাম লুকানো রয়েছে।",
"softblockrangesreason": "বেনামী অবদান আপনার আইপি ঠিকানা থেকে অনুমোদিত নয় ($1)। দয়া করে প্রবেশ করুন।",
"xffblockreason": "X-Forwarded-For হেডারে থাকা আইপি ঠিকানাটি ব্লক করা হয়েছে, হয় এটি আপনার নিজের অথবা আপনার ব্যবহৃত প্রক্সি সার্ভারের আইপি ঠিকানা। ব্লক করার কারণ হল: $1",
"cant-see-hidden-user": "আপনি যে ব্যবহারকারীকে ব্লক বা লুকিয়ে রাখতে চাচ্ছেন তাকে আগে থেকেই ব্লক বা লুকিয়ে রাখা হয়েছে। এছাড়া আপনার Hideuser অধিকার নেই, তাই আপনি ব্যবহারকারীর অবস্থা পরিবর্তন করতে পারবেন না।",
- "ipbblocked": "à¦\86পনি à¦\85নà§\8dয à¦\95à§\8bন বà§\8dযবহারà¦\95রà§\80à¦\95à§\87 বà§\8dলà¦\95 বা à¦\86নবà§\8dলà¦\95 à¦\95রতà§\87 পারবà§\87ন না, à¦\95ারণ à¦\86পনি নিà¦\9cà§\87à¦\87 বà§\8dলà¦\95 রয়à§\87à¦\9bà§\87ন",
+ "ipbblocked": "à¦\86পনি à¦\85নà§\8dয à¦\95à§\8bন বà§\8dযবহারà¦\95রà§\80à¦\95à§\87 বাধাদান বা বাধা বাতিল à¦\95রতà§\87 পারবà§\87ন না, à¦\95ারণ à¦\86পনি নিà¦\9cà§\87à¦\87 à¦\85বরà§\81দà§\8dধ রয়à§\87à¦\9bà§\87ন।",
"ipbnounblockself": "আপনি নিজেকে আনব্লক করতে পারবেন না",
"lockdb": "ডাটাবেজ অবরুদ্ধ করা হোক",
"unlockdb": "ডাটাবেজ খুলে দেওয়া হোক",
"restrictionsfield-badip": "আইপি ঠিকানা অথবা পরিসীমা অবৈধ: $1",
"restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
"restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে ব্যবহার করুন: :<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "ত্রুটি: $1",
+ "edit-error-long": "ত্রুটিসমূহ:\n\n$1",
"revid": "সংশোধন $1",
"pageid": "পাতার আইডি $1",
"rawhtml-notallowed": "<html> ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।",
"category-empty": "<em>Ova kategorija trenutno ne sadrži članke ni medije.</em>",
"hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
"hidden-category-category": "Skrivene kategorije",
- "category-subcat-count": "{{PLURAL:$2|Ova kategorija samo ima sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
+ "category-subcat-count": "{{PLURAL:$2|1=Ova kategorija samo ima sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
"category-subcat-count-limited": "Ova kategorija sadrži {{PLURAL:$1|sljedeću $1 potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}.",
- "category-article-count": "{{PLURAL:$2|Ova kategorija sadrži samo sljedeću stranicu.|{{PLURAL:$1|Sljedeća stranica je|Sljedeće $1 stranice su|Sljedećih $1 stranica je}} u ovoj kategoriji, od ukupno $2.}}",
+ "category-article-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sljedeću stranicu.|{{PLURAL:$1|Sljedeća stranica je|Sljedeće $1 stranice su|Sljedećih $1 stranica je}} u ovoj kategoriji, od ukupno $2.}}",
"category-article-count-limited": "{{PLURAL:$1|Slijedeća $1 stranica je|Slijedeće $1 stranice su|Slijedećih $1 stranica je}} u ovoj kategoriji.",
"category-file-count": "{{PLURAL:$2|Ova kategorija ima slijedeću $1 datoteku.|{{PLURAL:$1|Prikazana je $1 datoteka|Prikazane su $1 datoteke|Prikazano je $1 datoteka}} u ovoj kategoriji, od ukupno $2.}}",
"category-file-count-limited": "{{PLURAL:$1|Slijedeća $1 datoteka je|Slijedeće $1 datoteke su|Slijedećih $1 datoteka je}} u ovoj kategoriji.",
"userjsispublic": "Tingueu en compte que les subpàgines de JavaScript no haurien de contenir dades confidencials perquè poden ser visibles per altres usuaris.",
"restrictionsfield-badip": "Adreça o interval d'IP no vàlid: $1",
"restrictionsfield-label": "Intervals d'IP permesos:",
+ "edit-error-short": "Error: $1",
+ "edit-error-long": "Errors:\n\n$1",
"revid": "revisió $1",
"pageid": "ID de pàgina $1",
"gotointerwiki": "A punt d’abandonar {{SITENAME}}",
"recentchanges-legend-heading": "<strong>Легенда: </strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
"recentchanges-submit": "Гайта",
+ "rcfilters-legend-heading": "<strong>Дацдарийн могӀам:</strong>",
"rcfilters-other-review-tools": "Талларан кхин гӀирсаш",
"rcfilters-group-results-by-page": "Карийнарш, агӀонгахь тобанаш ян",
"rcfilters-activefilters": "Жигара литтарш",
"autosumm-blank": "Агӏон чулацам дӏабяккхина",
"autosumm-replace": "АгӀона чуьраниг хийцина → «$1»",
"autoredircomment": "[[$1]] тӀе хьажийна",
+ "autosumm-removed-redirect": "ДӀаяьккхина дӀасхьажог [[$1]]",
"autosumm-new": "Керла агӀо: «$1»",
"autosumm-newblank": "Кхоьллина еса агӀо",
"lag-warn-normal": "{{PLURAL:$1|$1 Секунд}} хьалха бина хийцамаш хӀокху могӀамехь гуш ца хилла мега.",
"tag-filter-submit": "Литта",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Билгало|Билгалонаш}}]]: $2)",
"tag-mw-new-redirect": "Керла дӀасахьажорг",
+ "tag-mw-removed-redirect": "дӀаяьккхина дӀасхьажорг",
"tag-mw-rollback": "Юхаяккха",
"tag-mw-undo": "цаоьшу",
"tags-title": "Билгалонаш",
"actionthrottled": "چالاکی پێشی پێ گیرا",
"actionthrottledtext": "بە مەبەستی پێشگریی لە خراپکاری، ڕێگە نادرێت تۆ لە ماوەیەکی کورت دا لە سەر یەک ئەمە زۆر جار ئەنجام بدەی، ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
"protectedpagetext": "بۆ بەرگری لە دەستکاریکردن یان چالاکییەکانی تر ئەم پەڕەیە پارێزراوە.",
- "viewsourcetext": "دەتوانی سەرچاوەی ئەم پەڕە ببینی و کۆپیی بکەی٫",
+ "viewsourcetext": "دەتوانیت سەرچاوەی ئەم پەڕەیە ببینیت و لەبەری بگریتەوە.",
"viewyourtext": "دەتوانی ژێدەری <strong>دەستکارییەکەت</strong> لەم پەڕەیەدا ببینی و کۆپی بکەی.",
"protectedinterface": "ئەم پەڕەیە دەقی ڕواڵەتی نەرمامێری ئەم ویکییە نیشان دەدات و بۆ بەرگری لە خراپکاری پارێزراوە.\nبۆ زیادکردن یان گۆڕینی وەرگێڕانەکان بۆ ھەموو ویکییەکان، تکایە لە [https://translatewiki.net/ translatewiki.net]، پرۆژەی ناوچەیی کردنی میدیاویکی کەڵک وەربگرە.",
"editinginterface": "<strong>ھۆشیار بە:</strong> خەریکی دەستکاریی پەڕەیەک دەکەیت کە بۆ دابین کردنی دەقی ڕووکاری نەرمامێر بەکاردێت.\nگۆڕانکارییەکان لەم پەڕەیەدا لە سەر ڕواڵەتی پەڕەکان بۆ بەکارھێنەرانی تر لەم ویکییەدا کاریگەر دەبێت.",
"recentchanges-submit": "نیشانی بدە",
"rcfilters-legend-heading": "<strong>پێرستی ناوبڕەکان:</strong>",
"rcfilters-other-review-tools": "ئامرازەکانی تری بەسەرداچوونەوە",
+ "rcfilters-group-results-by-page": "ئەنجامەکان بە پێی پەڕە کۆبکەرەوە",
"rcfilters-activefilters": "پاڵێوەرە چالاکەکان",
"rcfilters-advancedfilters": "پاڵوێنە پێشکەوتووەکان",
+ "rcfilters-limit-title": "ئەنجام بۆ نیشاندان",
+ "rcfilters-limit-and-date-label": "$1 گۆڕانکاری، $2",
"rcfilters-days-show-days": "$1 {{PLURAL:$1|ڕۆژ}}",
"rcfilters-quickfilters": "پاڵوێنە پاشەکەوتکراوەکان",
"rcfilters-savedqueries-defaultlabel": "پاڵوێنە پاشەکەوتکراوەکان",
+ "rcfilters-savedqueries-setdefault": "بە بنەڕەتی کارای بکە",
+ "rcfilters-savedqueries-new-name-label": "ناو",
+ "rcfilters-savedqueries-new-name-placeholder": "وەسفی کاری پاڵوێنەکە بکە",
+ "rcfilters-savedqueries-apply-label": "دروستکردنی پاڵوێنە",
+ "rcfilters-savedqueries-cancel-label": "ھەڵوەشاندنەوە",
+ "rcfilters-savedqueries-add-new-title": "پاشەکەوتکردنی ھەڵبژاردەکانی پاڵوێنەکەی ئێستا",
+ "rcfilters-restore-default-filters": "ھێنانەوەی پاڵوێنە بنچینەییەکان",
"rcfilters-clear-all-filters": "ھەموو فیلتەرەکان بسڕەوە",
+ "rcfilters-show-new-changes": "نیشاندانی نوێترین دەستکارییەکان",
"rcfilters-search-placeholder": "پاڵاوتنی گۆڕانکارییە نوێیەکان (بگەڕێ یان دەست بە نووسین بکە)",
- "rcfilters-filterlist-title": "فیلتەرەکان",
+ "rcfilters-empty-filter": "ھیچ پاڵوێنەیەک چالاک نییە. ھەموو بەشدارییەکان نیشان دەدرێن.",
+ "rcfilters-filterlist-title": "پاڵێوکەکان",
"rcfilters-filterlist-whatsthis": "ئەمە چۆن کاردەکات؟",
+ "rcfilters-filterlist-feedbacklink": "ڕای خۆتمان پێ بڵێ لەسەر ئەم ئامرازە نوێیانە",
+ "rcfilters-highlightbutton-title": "ئەنجامەکان ڕووناک بکە",
"rcfilters-highlightmenu-title": "ڕەنگێکی نوێ ھەڵبژێرە",
+ "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-registered-label": "تۆمارکراو",
"rcfilters-filter-user-experience-level-registered-description": "ئەو بەکارھێنەرانەی لە ژوورەوەن",
"rcfilters-filter-user-experience-level-unregistered-label": "تۆمارنەکراوەکان",
"rcfilters-filter-user-experience-level-unregistered-description": "ئەو بەکارھێنەرانەی لە ژوورەوە نین",
"rcfilters-filter-user-experience-level-newcomer-label": "تازەکاران",
"rcfilters-filter-user-experience-level-newcomer-description": "کەمتر لە ١٠ دەستکاری و ٤ ڕۆژ لە چالاک بوون",
+ "rcfilters-filter-user-experience-level-learner-label": "خوێندکاران",
+ "rcfilters-filter-user-experience-level-learner-description": "ئەو بەکارھێنەرە تۆمارکراوانەی ئاستی ئەزموونەکەیان دەکەوێتە نێوان «تازەکاران» و «بەکارھێنەرانی پێشکەوتوو.»",
"rcfilters-filter-user-experience-level-experienced-label": "بەکارھێنەرانی پێشکەوتوو",
"rcfilters-filter-user-experience-level-experienced-description": "زیاتر لە ٣٠ ڕۆژ لە چالاکی و ٥٠٠ دەستکاری",
+ "rcfilters-filtergroup-automated": "دەستکارییە خۆگەڕەکان",
"rcfilters-filter-bots-label": "بۆت",
+ "rcfilters-filter-bots-description": "ئەو دەستکارییانەی بە ئامرازە خۆگەڕەکان کراون",
"rcfilters-filter-humans-label": "مرۆڤ (بۆت نییە)",
"rcfilters-filter-humans-description": "دەستکارییەکانی لەلایەن مرۆڤەکانەوە ئەنجام دراون",
"rcfilters-filter-patrolled-label": "پاسدراو",
"rcfilters-filter-patrolled-description": "ئەو دەستکارییانەی وەک پاسدراو دیاریکراون",
"rcfilters-filter-unpatrolled-label": "پاسنەدراوەکان",
"rcfilters-filter-unpatrolled-description": "ئەو دەستکارییانەی وەک پاسدراو دیارینەکراون",
+ "rcfilters-filtergroup-significance": "بەسوود",
"rcfilters-filter-minor-label": "دەستکارییە بچووکەکان",
"rcfilters-filter-minor-description": "ئەو دەستکارییانەی کە دەستکاریکەر وەک بچووک ناوی بردووە",
"rcfilters-filter-major-label": "دەستکارییە نا-بچووکەکان",
"rcfilters-filtergroup-watchlist": "پەڕەکانی لە پێڕستی چاودێریتن",
"rcfilters-filter-watchlist-watched-label": "لە پێرستی چاودێری",
"rcfilters-filter-watchlist-watched-description": "گۆڕانکاری لە پەڕەکانی کە لە پێڕستی چاودێریتن.",
+ "rcfilters-filter-watchlist-watchednew-label": "گۆڕانکارییە نوێکانی پێڕستی چاودێری",
"rcfilters-filter-watchlist-notwatched-label": "لە پێڕستی چاودێریت نییە",
+ "rcfilters-filter-watchlist-notwatched-description": "ھەمووشتێک جگە لە گۆڕانکاریی پەڕەکانی پێڕستی چاودێرییەکەت.",
+ "rcfilters-filter-watchlistactivity-unseen-label": "گۆڕانکارییە نەبینراوەکان",
+ "rcfilters-filter-watchlistactivity-unseen-description": "گۆڕانکاریی ئەو پەڕانەی سەردانت نەکردوون لەوەتەی گۆڕانکارییان تێدا کراوە.",
+ "rcfilters-filter-watchlistactivity-seen-label": "گۆڕانکارییە بینراوەکان",
"rcfilters-filtergroup-changetype": "جۆری گۆڕانکاری",
"rcfilters-filter-pageedits-label": "دەستکارییەکانی پەڕە",
+ "rcfilters-filter-pageedits-description": "دەستکارییەکانی ناوەڕۆکی ویکیپیدیا، لێدوانەکان، وەسفی پۆلەکان...",
"rcfilters-filter-newpages-label": "دروستکردنی پەڕەکان",
+ "rcfilters-filter-newpages-description": "ئەو دەستکارییانەی پەڕەی نوێ دروست دەکەن.",
"rcfilters-filter-categorization-label": "گۆڕانکاری پۆلەکان",
"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": "ھەموو ئەو گۆڕانکارییەی «نوێترین وەشان» نین.",
+ "rcfilters-view-tags": "دەستکارییە تاگکراوەکان",
+ "rcfilters-view-tags-help-icon-tooltip": "زیاتر بزانە لەسەر دەستکارییە تاگکراوەکان",
+ "rcfilters-liveupdates-button": "نوێکردنەوەی زیندوو",
"rcnotefrom": "ژێرەوە {{PLURAL:$5|گۆڕانکارییەکەیە|گۆڕانکارییەکانە}} لە <strong>$3، $4</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
"rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
"rcshowhideminor": "دەستکارییە بچووکەکان $1",
"revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاردراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
"rollback-success": "دەستکارییەکانی $1 وەرگێرایەوە؛<br />\nگۆڕدرا بۆ دوایین پێداچوونەوەی $2.",
"sessionfailure": "لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.\nئەم کردەوە هەڵوەشێندرایەوە بۆ بەرگری لە دزینی دراوەکانی دانیشتن.\nتکایە بگەڕێوە بۆ پەڕەی پێشوو و نوێی بکەوە، ئینجا دیسان تاقیی بکەوە.",
+ "changecontentmodel-legend": "گۆڕینی مۆدێلی ناوەڕۆک",
"changecontentmodel-title-label": "سەرناوی پەڕە",
"changecontentmodel-reason-label": "هۆکار:",
"changecontentmodel-submit": "گۆڕین",
+ "log-name-contentmodel": "لۆگی گۆڕینی مۆدێلی ناوەڕۆک",
+ "logentry-contentmodel-change": "$1 {{GENDER:$2|مۆدێلی}} ناوەڕۆکی پەڕەی $3ی لە «$4» گۆڕی بە «$5»",
"logentry-contentmodel-change-revertlink": "گەڕاندنەوە",
"logentry-contentmodel-change-revert": "گەڕاندنەوە",
"protectlogpage": "لۆگی پاراستن",
"protect-cascadeon": "ھەنووکە ئەم پەڕە پارێزراوە بۆ ئەوەی کە لە نێو ئەم {{PLURAL:$1|پەڕە کە پاراستنی تاڤگەییی|پەڕانە کە پاراستنی تاڤگەیییان}} بۆ چالاککراوە، ھێنراوە.\nدەتوانی ئاستی پاراستنی ئەم پەڕە بگۆڕی، بەڵام ھیچ کاریگەرییەکی نابێت لە سەر پاراستنی تاڤگەیی",
"protect-default": "بە ھەموو بەکارھێنەران ڕێگە بدە",
"protect-fallback": "تەنیا بە بەکارھێنەران بە مافی «$1» ڕێگە بدە",
- "protect-level-autoconfirmed": "تەنیا بە بەکارھێنەرانی پەسندکراو ڕێگە بدە",
+ "protect-level-autoconfirmed": "تەنیا بە [[ویکیپیدیا:بەکارھێنەرانی پەسندکراوی خۆگەڕ|بەکارھێنەرانی پەسندکراوی خۆگەڕ ]] ڕێگە بدە",
"protect-level-sysop": "تەنیا بە بەڕێوەبەران ڕێگە بدە",
"protect-summary-cascade": "تاڤگەیی",
"protect-expiring": "بەسەردەچێ لە ڕێکەوتی $1 (UTC)",
"logentry-protect-unprotect": "$1 {{GENDER:$2|پاراستنی}} لەسەر $3 لابرد",
"logentry-protect-protect": "$1 $3ی {{GENDER:$2|پاراست}} $4",
"logentry-protect-modify": "$1 ئاستی پاراستنی $3ی {{GENDER:$2|گۆڕی}} $4",
+ "logentry-protect-modify-cascade": "$1 $2 ئاستی پاراستنی $3ی $4 گۆڕی [تاڤگەیی]",
"logentry-rights-rights": "$1 ئەندامێتیی {{GENDER:$6|$3}}ی لە $4 بۆ $5 {{GENDER:$2|گۆڕی}}",
"logentry-upload-upload": "$1 $3ی {{GENDER:$2|بار کرد}}",
"logentry-upload-overwrite": "$1 وەشانێکی نوێی $3ی {{GENDER:$2|بار کرد}}",
"restrictionsfield-badip": "Neplatná IP adresa nebo rozsah: $1",
"restrictionsfield-label": "Povolené rozsahy IP adres:",
"restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Chyba: $1",
+ "edit-error-long": "Chyby:\n\n$1",
"revid": "revize $1",
"pageid": "Stránka s ID $1",
"rawhtml-notallowed": "Značky <html> nelze používat mimo běžné stránky.",
"preview": "Pòdzérk",
"showpreview": "Wëskrzëni pòdzérk",
"showdiff": "Wëskrzëni zjinaczi",
- "anoneditwarning": "<strong>Bôczë:</strong> Të nie jes wlogòwóny. Jeżlë wëkònôsz jakąs zmianã, twòja adresa IP mdze widocznô dlô wszëtczich. Jeżlë <strong>[$1 wlogùjesz sã]</strong> abò <strong>[$2 ùsadzysz kònto]</strong>twòje zjinaczi òstóną przëpisóné do kònta, co wicy mającë kònto dobëjesz rozmajité ùdogòdnienia.",
+ "anoneditwarning": "<strong>Bôczë:</strong> Të nie jes wlogòwóny. Jeżlë wëkònôsz jakąs zmianã, twòja adresa IP mdze widocznô dlô wszëtczich. Jeżlë <strong>[$1 wlogùjesz sã]</strong> abò <strong>[$2 ùsadzysz kònto]</strong>, twòje zjinaczi òstóną przëpisóné do kònta, co wicy mającë kònto dobëjesz rozmajité ùdogòdnienia.",
"anonpreviewwarning": "Të nie jes wlogòwóny. Jeżlë wprowadzysz jaczés zjinaczi, twòja adresa IP mdze ùmieszczónô w historie edicji starnë.",
"summary-preview": "Pòdzérk òpisënka zjinaków:",
"blockedtitle": "Brëkòwnik je zascëgóny",
"recentchangeslinked-feed": "Relaterede ændringer",
"recentchangeslinked-toolbox": "Relaterede ændringer",
"recentchangeslinked-title": "Ændringer der relaterer til \"$1\"",
- "recentchangeslinked-summary": "Dette er en liste over de seneste ændringer af sider, der linkes til fra en bestemt side (eller medlemmer af en bestemt kategori).\nSider på [[Special:Watchlist|din overvågningsliste]] er vist med '''fed''' skrift.",
+ "recentchangeslinked-summary": "Indtast et sidenavn for at sændringer på sider henvist til eller fra den side. (For at se medlemmer af en kategori indtast Category:Kategorinavn). Ændringer til sider på [[Special:Watchlist|din overvågningsliste]] er vist med <strong>fed</strong> skrift.",
"recentchangeslinked-page": "Sidenavn:",
"recentchangeslinked-to": "Vis ændringer i sider der henviser til den angivne side i stedet",
"recentchanges-page-added-to-category": "[[:$1]] tilføjet til kategori",
"removecredentials-invalidsubpage": "$1 er ikke en gyldig type for akkreditiver.",
"removecredentials-success": "Dine akkreditiver er blevet fjernet.",
"credentialsform-provider": "Akkreditivtype:",
- "credentialsform-account": "Kontonavn:"
+ "credentialsform-account": "Kontonavn:",
+ "edit-error-short": "Fejl: $1"
}
"tog-editondblclick": "Seiten mit Doppelklick bearbeiten",
"tog-editsectiononrightclick": "Einzelne Abschnitte per Rechtsklick bearbeiten",
"tog-enotifrevealaddr": "Ihre E-Mail-Adresse in Benachrichtigungs-E-Mails anzeigen",
+ "cancel": "Abbrechen",
"view-pool-error": "Entschuldigen Sie bitte, dass die Server im Moment überlastet sind.\nZu viele Benutzer versuchen, diese Seite zu besuchen.\nBitte warten Sie einige Minuten, bevor Sie es noch einmal versuchen.\n\n$1",
"generic-pool-error": "Entschuldigen Sie bitte, dass die Server im Moment überlastet sind.\nZu viele Benutzer wollen diese Ressource ansehen.\nBitte warten Sie einen Moment, bevor Sie sie erneut aufrufen.",
"badaccess-group0": "Sie haben nicht die erforderlichen Benutzerrechte für diese Aktion.",
"changepassword-success": "Ihr Passwort wurde erfolgreich geändert.",
"changepassword-throttled": "Sie haben zu viele Anmeldeversuche unternommen.\nBitte warten Sie $1, bevor Sie es erneut versuchen.",
"resetpass-no-info": "Sie müssen sich anmelden, um auf diese Seite direkt zuzugreifen.",
+ "resetpass-submit-cancel": "Abbrechen",
"resetpass-wrong-oldpass": "Ungültiges temporäres oder aktuelles Passwort.\nMöglicherweise haben Sie Ihr Passwort bereits erfolgreich geändert oder ein neues temporäres Passwort beantragt.",
"resetpass-recycled": "Bitte setzen Sie Ihr Passwort auf ein anderes Passwort als Ihr aktuelles fest.",
"resetpass-temp-emailed": "Sie haben sich mit einem temporären E-Mail-Code angemeldet. Um die Anmeldung abzuschließen, müssen Sie jetzt ein neues Passwort festlegen:",
"filename-bad-prefix": "Der Dateiname beginnt mit '''„$1“'''. Dies ist im allgemeinen der von einer Digitalkamera vorgegebene Dateiname und daher nicht sehr aussagekräftig.\nBitte geben Sie der Datei einen Namen, der den Inhalt besser beschreibt.",
"upload-file-error-text": "Bei der Erstellung einer temporären Datei auf dem Server ist ein interner Fehler aufgetreten.\nBitte informieren Sie einen [[Special:ListUsers/sysop|Administrator]].",
"upload-misc-error-text": "Beim Hochladen ist ein unbekannter Fehler aufgetreten.\nPrüfen Sie die URL auf Fehler, den Online-Status der Seite und versuchen es erneut.\nWenn das Problem weiter besteht, informieren Sie einen [[Special:ListUsers/sysop|Administrator]].",
+ "upload-dialog-button-cancel": "Abbrechen",
"uploadstash-badtoken": "Das Entfernen der vorab gespeicherten Dateien war erfolglos, vielleicht weil Ihre Sitzungsdaten abgelaufen sind. Bitte versuchen Sie es erneut.",
"img-auth-nopathinfo": "PATH_INFO fehlt.\nIhr Server ist nicht dafür eingerichtet, diese Information weiterzugeben.\nSie könnte CGI-gestützt sein und kann daher img_auth nicht ermöglichen.\nSiehe auch http://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
"img-auth-nologinnWL": "Sie sind nicht angemeldet und „$1“ ist nicht in der weißen Liste.",
"dberr-outofdate": "Beachten Sie, dass der Suchindex unserer Inhalte bei Google veraltet sein kann.",
"feedback-bugcheck": "Super! Bitte überprüfen Sie noch, ob es sich hierbei nicht um einen bereits [$1 bekannten Fehler] handelt.",
"feedback-bugornote": "Sofern Sie detailliert ein technisches Problem beschreiben möchten, melden Sie bitte [$1 einen Fehler].\nAnderenfalls können Sie auch das untenstehende einfache Formular nutzen. Ihr Kommentar wird, zusammen mit Ihrem Benutzernamen und der Version des von Ihnen verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.",
+ "feedback-cancel": "Abbrechen",
"feedback-thanks": "Vielen Dank. Ihre Rückmeldung wurde auf der Seite „[$2 $1]“ gespeichert.",
- "changecredentials": "Anmeldeinformationen ändern"
+ "authmanager-provider-password": "Passwortbasierte Authentifizierung",
+ "changecredentials": "Anmeldeinformationen ändern",
+ "changecredentials-submit": "Anmeldeinformationen ändern",
+ "credentialsform-provider": "Typ der Anmeldeinformationen:",
+ "credentialsform-account": "Benutzername:"
}
"doubleredirects": "Doppelte Weiterleitungen",
"doubleredirectstext": "Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.\nJede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel der zweiten Weiterleitung, welches für gewöhnlich die gewünschte Zielseite ist, auf die bereits die erste Weiterleitung zeigen sollte.\n<del>Durchgestrichene</del> Einträge wurden bereits erfolgreich bearbeitet.",
"double-redirect-fixed-move": "[[$1]] wurde verschoben.\nDie Seite wurde automatisch aktualisiert und leitet nun nach [[$2]] weiter.",
- "double-redirect-fixed-maintenance": "Automatische Bereinigung der doppelten Weiterleitung von [[$1]] nach [[$2]] in einem Wartungsauftrag.",
+ "double-redirect-fixed-maintenance": "Automatische Bereinigung der doppelten Weiterleitung von [[$1]] nach [[$2]] in einem Wartungsauftrag",
"double-redirect-fixer": "RedirectBot",
"brokenredirects": "Defekte Weiterleitungen",
"brokenredirectstext": "Diese Spezialseite listet Weiterleitungen auf nicht existierende Seiten auf.",
"restrictionsfield-badip": "Ungültige IP-Adresse oder ungültiger IP-Adressbereich: $1",
"restrictionsfield-label": "Erlaubte IP-Adressbereiche:",
"restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
+ "edit-error-short": "Fehler: $1",
+ "edit-error-long": "Fehler:\n\n$1",
"revid": "Version $1",
"pageid": "Seitenkennung $1",
"rawhtml-notallowed": "<html>-Tags können nicht außerhalb von normalen Seiten verwendet werden.",
"youremail": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
"username": "{{GENDER:$1|Όνομα χρήστη}}:",
"prefs-memberingroups": "{{GENDER:$2|Μέλος}} της {{PLURAL:$1|ομάδας|ομάδων}}:",
- "group-membership-link-with-expiry": "$1 (μέχρι τις $3 στις $4)",
+ "group-membership-link-with-expiry": "$1 (μέχρι τις $2)",
"prefs-registration": "Χρόνος εγγραφής:",
"yourrealname": "Πραγματικό όνομα:",
"yourlanguage": "Γλώσσα:",
"userrights-nodatabase": "Η βάση δεδομένων $1 δεν υπάρχει ή δεν είναι τοπική.",
"userrights-changeable-col": "Ομάδες που μπορείτε να αλλάξετε",
"userrights-unchangeable-col": "Ομάδες που δεν μπορείτε να αλλάξετε",
- "userrights-expiry-current": "Λήγει στις $2 στις $3",
+ "userrights-expiry-current": "Λήγει $1",
"userrights-expiry-none": "Δεν λήγει",
"userrights-expiry": "Λήγει:",
"userrights-expiry-existing": "Υπάρχουσα ώρα λήξης: $3, $2",
"rcfilters-activefilters": "Ενεργά φίλτρα",
"rcfilters-advancedfilters": "Σύνθετα Φίλτρα",
"rcfilters-limit-title": "Αλλαγές προς εμφάνιση",
- "rcfilters-limit-and-date-label": "{{PLURAL:$1|αλλαγή|$1 αλλαγές}}, $2",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|αλλαγή|αλλαγές}}, $2",
"rcfilters-date-popup-title": "Χρονική περίοδος αναζήτησης",
"rcfilters-days-title": "Πρόσφατες ημέρες",
"rcfilters-hours-title": "Πρόσφατες ώρες",
"recentchangeslinked-feed": "Σχετικές αλλαγές",
"recentchangeslinked-toolbox": "Σχετικές αλλαγές",
"recentchangeslinked-title": "Αλλαγές σχετικές με το «$1»",
- "recentchangeslinked-summary": "Î\91Ï\85Ï\84Ï\8cÏ\82 είναι Îνα καÏ\84άλογοÏ\82 αλλαγÏ\8eν Ï\80οÏ\85 Îγιναν Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84α Ï\83ε Ï\83ελίδεÏ\82 Ï\80οÏ\85 Ï\83Ï\85νδÎονÏ\84αι αÏ\80Ï\8c μια καθοÏ\81ιÏ\83μÎνη Ï\83ελίδα (ή Ï\83ε μÎλη μιαÏ\82 καθοÏ\81ιÏ\83μÎνηÏ\82 καÏ\84ηγοÏ\81ίαÏ\82).\nΣελίδεÏ\82 Ï\80οÏ\85 Ï\85Ï\80άÏ\81Ï\87οÏ\85ν Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82]] Ï\83αÏ\82 είναι '''ÎνÏ\84ονεÏ\82'''.",
+ "recentchangeslinked-summary": "Î\95ιÏ\83αγάγεÏ\84ε Îνα Ï\8cνομα Ï\83ελίδαÏ\82 για να δείÏ\84ε Ï\84ιÏ\82 αλλαγÎÏ\82 Ï\83ε Ï\83ελίδεÏ\82 Ï\80οÏ\85 Ï\83Ï\85νδÎονÏ\84αι ή αÏ\80Ï\8c αÏ\85Ï\84ή Ï\84η Ï\83ελίδα. (Î\93ια να δείÏ\84ε Ï\84α μÎλη μιαÏ\82 καÏ\84ηγοÏ\81ίαÏ\82, ειÏ\83αγάγεÏ\84ε Î\9aαÏ\84ηγοÏ\81ία:Î\8cνομα καÏ\84ηγοÏ\81ίαÏ\82.)\nÎ\91λλαγÎÏ\82 Ï\83ε Ï\83ελίδεÏ\82 Ï\83Ï\84ην [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82]] Ï\83αÏ\82 είναι <strong>ÎνÏ\84ονεÏ\82</strong>.",
"recentchangeslinked-page": "Όνομα σελίδας:",
"recentchangeslinked-to": "Εμφάνιση αλλαγών σε σελίδες συνδεδεμένες με την δεδομένη σελίδα αντί αυτής",
"recentchanges-page-added-to-category": "Η σελίδα [[:$1]] προστέθηκε στην κατηγορία",
"fileexists-forbidden": "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη˙ εάν ακόμη θέλετε να επιφορτώσωτε αυτό το αρχείο παρακαλώ πηγαίνετε πίσω και επιφορτώστε το υπό ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
"fileexists-shared-forbidden": "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη στο χώρο φύλαξης κοινών αρχείων.\nΕάν θέλετε παρ' όλ' αυτά να επιφορτώσετε το δικό σας αρχείο, παρακαλούμε πηγαίνετε πίσω και χρησιμοποιήστε ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
"fileexists-no-change": "Το ανεβασμένο αρχείο είναι ένα ακριβές αντίγραφο της τρέχουσας έκδοσης του <strong>[[:$1]]</strong>.",
- "fileexists-duplicate-version": "Το ανεβασμένο αρχείο είναι ένα ακριβές αντίγραφο {{{{PLURAL:$2|παλιότερης έκδοσης|παλιότερων εκδόσεων}} του <strong>[[:$1]]</strong>.",
+ "fileexists-duplicate-version": "Το ανεβασμένο αρχείο είναι ένα ακριβές αντίγραφο {{PLURAL:$2|παλιότερης έκδοσης|παλιότερων εκδόσεων}} του <strong>[[:$1]]</strong>.",
"file-exists-duplicate": "Αυτό το αρχείο είναι διπλότυπο {{PLURAL:$1|αυτού του αρχείου|αυτών των αρχείων}}:",
"file-deleted-duplicate": "Αρχείο παρόμοιο με αυτό εδώ ([[:$1]]) έχει προηγουμένως διαγραφεί. Θα πρέπει να ελέγξετε το ιστορικό διαγραφής του πριν να προχωρήσετε στην επαναφόρτωσή του.",
"file-deleted-duplicate-notitle": "Ένα αρχείο πανομοιότυπο με αυτό έχει προηγουμένως διαγραφεί, και ο τίτλος έχει κατασταλεί.\nΘα πρέπει να ζητήσετε από κάποιον με την δυνατότητα προβολής κατεσταλμένου αρχείου δεδομένων για να εξετάσει την κατάσταση προτού προχωρήσετε σε επαναφόρτωση του.",
"listfiles_size": "Μέγεθος",
"listfiles_description": "Περιγραφή",
"listfiles_count": "Εκδόσεις",
- "listfiles-show-all": "Συμπερίληψη παλαιών εκδόσεων των εικόνων",
+ "listfiles-show-all": "Συμπερίληψη παλαιών εκδόσεων αρχείων",
"listfiles-latestversion": "Τρέχουσα έκδοση",
"listfiles-latestversion-yes": "Ναι",
"listfiles-latestversion-no": "Όχι",
"doubleredirects": "Διπλές ανακατευθύνσεις",
"doubleredirectstext": "Αυτή η σελίδα καταγράφει σελίδες οι οποίες ανακατευθύνουν σε άλλες σελίδες ανακατεύθυνσης. \nΚάθε σειρά περιέχει συνδέσμους προς την πρώτη και τη δεύτερη ανακατεύθυνση, όπως επίσης και προς τον προορισμό της δεύτερης ανακατεύθυνσης, η οποία και είναι συνήθως η «πραγματική» σελίδα προορισμού στην οποία πρέπει να δείχνει η πρώτη ανακατεύθυνση. \nΤα <del>διαγεγραμμένα</del> λήμματα έχουν επιλυθεί.",
"double-redirect-fixed-move": "Η [[$1]] έχει μετακινηθεί.\nΕνημερώθηκε αυτόματα και τώρα είναι ανακατεύθυνση στην [[$2]].",
- "double-redirect-fixed-maintenance": "Αυτόματη διόρθωση διπλής ανακατεύθυνσης από [[$1]] σε [[$2]] σε εργασία συντήρησης.",
+ "double-redirect-fixed-maintenance": "Αυτόματη διόρθωση διπλής ανακατεύθυνσης από [[$1]] σε [[$2]] σε εργασία συντήρησης",
"double-redirect-fixer": "Διορθωτής ανακατευθύνσεων",
"brokenredirects": "Λανθασμένες ανακατευθύνσεις",
"brokenredirectstext": "Οι παρακάτω ανακατευθύνσεις οδηγούν σε σελίδες που δεν υπάρχουν:",
"lockmanager-fail-closelock": "Could not close lock file for \"$1\".",
"lockmanager-fail-deletelock": "Could not delete lock file for \"$1\".",
"lockmanager-fail-acquirelock": "Could not acquire lock for \"$1\".",
- "lockmanager-fail-openlock": "Could not open lock file for \"$1\".",
+ "lockmanager-fail-openlock": "Could not open lock file for \"$1\". Make sure your upload directory is configured correctly and your web server has permission to write to that directory. See https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory for more information.",
"lockmanager-fail-releaselock": "Could not release lock for \"$1\".",
"lockmanager-fail-db-bucket": "Could not contact enough lock databases in bucket $1.",
"lockmanager-fail-db-release": "Could not release locks on database $1.",
"doubleredirects-summary": "",
"doubleredirectstext": "This page lists pages that redirect to other redirect pages.\nEach row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the \"real\" target page to which the first redirect should point.\n<del>Crossed out</del> entries have been solved.",
"double-redirect-fixed-move": "[[$1]] has been moved.\nIt was automatically updated and now it redirects to [[$2]].",
- "double-redirect-fixed-maintenance": "Automatically fixing double redirect from [[$1]] to [[$2]] in a maintenance job.",
+ "double-redirect-fixed-maintenance": "Automatically fixing double redirect from [[$1]] to [[$2]] in a maintenance job",
"double-redirect-fixer": "Redirect fixer",
"brokenredirects": "Broken redirects",
"brokenredirects-summary": "",
"restrictionsfield-badip": "Invalid IP address or range: $1",
"restrictionsfield-label": "Allowed IP ranges:",
"restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Error: $1",
+ "edit-error-long": "Errors:\n\n$1",
"revid": "revision $1",
"pageid": "page ID $1",
"rawhtml-notallowed": "<html> tags cannot be used outside of normal pages.",
"restrictionsfield-badip": "Malvalida IP-adreso de la intervalo: $1",
"restrictionsfield-label": "Permesita IP-intervalo:",
"restrictionsfield-help": "Unu IP-adreso aŭ CIDR-intervalo per linio. Por permesigi ĉion, uzu:<pre>0.0.0.0/0</code>\n<code>::/0</pre>",
+ "edit-error-short": "Eraro: $1",
+ "edit-error-long": "Eraroj\n\n$1",
"revid": "revizio $1",
"pageid": "Identigilo de paĝo $1"
}
"doubleredirects": "Redirecciones dobles",
"doubleredirectstext": "Esta página contiene una lista de páginas que redirigen a otras páginas de redirección.\nCada fila contiene enlaces a la segunda y tercera redirección, así como la primera línea de la segunda redirección, en la que usualmente se encontrará el artículo «real» al que la primera redirección debería apuntar.\nLas entradas <del>tachadas</del> han sido resueltas.",
"double-redirect-fixed-move": "[[$1]] se ha trasladado.\nSe actualizó automáticamente y ahora redirecciona a [[$2]].",
- "double-redirect-fixed-maintenance": "Corrigiendo automáticamente la doble redirección desde [[$1]] a [[$2]] en un trabajo de mantenimiento.",
+ "double-redirect-fixed-maintenance": "Corrección automática de redirección doble de [[$1]] a [[$2]] mediante una tarea de mantenimiento",
"double-redirect-fixer": "Corrector de redirecciones",
"brokenredirects": "Redirecciones incorrectas",
"brokenredirectstext": "Las siguientes redirecciones enlazan a páginas que no existen:",
"restrictionsfield-badip": "Dirección o intervalo IP no válidos: $1",
"restrictionsfield-label": "Intervalos de IP permitidos:",
"restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activarlo todo, utiliza <pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Error: $1",
+ "edit-error-long": "Errores:\n\n$1",
"revid": "revisión $1",
"pageid": "ID de página $1",
"rawhtml-notallowed": "No se pueden emplear las etiquetas <html> si no es en las páginas normales.",
"restrictionsfield-badip": "Vigane IP-aadress või -aadressivahemik: $1",
"restrictionsfield-label": "Lubatud IP-aadressivahemikud:",
"restrictionsfield-help": "Üks IP-aadress või CIDR-vahemik rea kohta. Et lubada kõik, kasuta järgmist süntaksit:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Tõrge: $1",
+ "edit-error-long": "Tõrked:\n\n$1",
"revid": "redaktsioon $1",
"pageid": "lehekülje identifikaator $1",
"rawhtml-notallowed": "<html>-silte ei saa kasutada mujal kui harilikel lehekülgedel.",
"doubleredirects": "Birbideratze bikoitzak",
"doubleredirectstext": "Lerro bakoitzean lehen eta bigarren birzuzenketetarako loturak ikus daitezke, eta baita edukia daukan edo eduki beharko lukeen orrialderako lotura ere. Lehen birzuzenketak azken honetara <del>zuzendu</del> beharko luke.",
"double-redirect-fixed-move": "«[[$1]]» orria mugitu da.\nAutomatikoki eguneratu da, eta orain «[[$2]]» orrira darama.",
- "double-redirect-fixed-maintenance": "«[[$1]]» orritik «[[$2]]» orrira egindako birbideratze bikoitza automatikoki konpondua, mantentze lanak egitean.",
+ "double-redirect-fixed-maintenance": "[[$1]] orritik [[$2]] orrira egindako birbideratze bikoitza automatikoki konpondua, mantentze lanak egitean.",
"double-redirect-fixer": "Birbideratze zuzentzailea",
"brokenredirects": "Hautsitako birzuzenketak",
"brokenredirectstext": "Ondorengo birbideratze hauek existitzen ez diren orrietara bideratuta daude:",
"botpasswords-insert-failed": "شکست در افزودن نام ربات «$1». در حال حاضر اضافه شده است؟",
"botpasswords-update-failed": "شکست در بهروزرسانی نام رباتی «$1». حذف شده است؟",
"botpasswords-created-title": "گذرواژه ربات ایجاد شد",
- "botpasswords-created-body": "گذرواژهٔ رباتی برای ربات «$1» و کاربر «$2» ایجاد شد.",
+ "botpasswords-created-body": "گذرواژهٔ رباتی برای ربات «$1» و {{GENDER:$2|کاربر}} «$2» ایجاد شد.",
"botpasswords-updated-title": "گذرواژه ربات بهروز شد",
- "botpasswords-updated-body": "گذرواژهٔ رباتی برای ربات «$1» و کاربر «$2» بهروز شد.",
+ "botpasswords-updated-body": "گذرواژهٔ رباتی برای ربات «$1» و {{GENDER:$2|کاربر}} «$2» بهروز شد.",
"botpasswords-deleted-title": "گذرواژه ربات حذف شد",
- "botpasswords-deleted-body": "گذرواژهٔ رباتی برای ربات «$1» و کاربر «$2» حذف شد.",
+ "botpasswords-deleted-body": "گذرواژهٔ رباتی برای ربات «$1» و {{GENDER:$2|کاربر}} «$2» حذف شد.",
"botpasswords-newpassword": "<strong>$2</strong> گذرواژهٔ جدید برای ورود با حساب <strong>$1</strong> است. <em>لطفاً آن را برای ارجاع در آینده ذخیره کنید.</em> <br> (برای رباتهای قدیمی که نیاز به نام کاربری مطابق با حساب کاربریشان دارد، شما میتوانید از <strong>$3</strong> به عنوان نام کاربری و از <strong>$4</strong> به عنوان گذرواژه استفاده کنید.)",
"botpasswords-no-provider": "BotPasswordsSessionProvider موجود نیست.",
"botpasswords-restriction-failed": "محدودیتهای گذرواژهٔ ربات از این ورود جلوگیری میکند.",
"diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ میانی|$1 نسخهٔ میانی}}ِ همین کاربر نمایش داده نشده است)",
"diff-multi-otherusers": "({{PLURAL:$1|۱ نسخهٔ میانی|$1 نسخهٔ میانی}} ویرایش شده توسط {{PLURAL:$2|۱ کاربر|$2 کاربر}} نشان داده نشده)",
"diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} نسخهٔ میانی ویرایش شده توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده است)",
+ "diff-paragraph-moved-tonew": "پاراگراف جابهجا شده بود. کلیک کنید تا به جای جدیدش بروید.",
+ "diff-paragraph-moved-toold": "پاراگراف جابهجا شده بود. کلیک کنید تا به جای قدیمش بروید.",
"difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}} از تفاوت نسخهها ($1) {{PLURAL:$2|یافت|یافت}} نشد.\n\nاین اتفاق معمولاً در اثر دنبال کردن پیوند تفاوتی به یک صفحهٔ حذفشده پیش میآید.\nمیتوانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
"searchresults": "نتایج جستجو",
"searchresults-title": "نتایج جستجو برای «$1»",
"recentchangesdays-max": "حداکثر $1 {{PLURAL:$1|روز}}",
"recentchangescount": "تعداد پیشفرض ویرایشهای نمایش یافته:",
"prefs-help-recentchangescount": "این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحهها و سیاههها میشود.",
- "prefs-help-watchlist-token2": "این کلید رمز خوراک وب فهرست پیگیریهای شماست.\nهرکس آن را بداند میتواند فهرست پیگیریهایتان را بخواند، بنابراین آن را به اشتراک نگذارید. [[Special:ResetTokens|اگر لازم است آن را تغییر دهید اینجا را کلیک کنید]].",
+ "prefs-help-watchlist-token2": "این کلید رمز خوراک وب فهرست پیگیریهای شماست.\nهرکس آن را بداند میتواند فهرست پیگیریهایتان را بخواند، بنابراین آن را به اشتراک نگذارید. اگر لازم باشد [[Special:ResetTokens|میتوانید کلیدی نو ایجاد کنید]].",
"savedprefs": "ترجیحات شما ذخیره شد.",
"savedrights": "گروههای کاربری {{GENDER:$1|$1}} ذخیره شدهاست.",
"timezonelegend": "منطقهٔ زمانی:",
"timezoneregion-indian": "اقیانوس هند",
"timezoneregion-pacific": "اقیانوس آرام",
"allowemail": "دریافت ایمیل از دیگر کاربران ممکن باشد",
+ "email-allow-new-users-label": "اجازهٔ دریافت ایمیل از کاربران تازهکار داده شود",
"email-blacklist-label": "این کاربران را از فرستادن رایانامه به من منع کن:",
"prefs-searchoptions": "جستجو",
"prefs-namespaces": "فضاهای نام",
"rcfilters-savedqueries-apply-and-setdefault-label": "ایجاد پالایه پیشفرض",
"rcfilters-savedqueries-cancel-label": "لغو",
"rcfilters-savedqueries-add-new-title": "ذخیره تنظیمات کنونی پالایه",
- "rcfilters-savedqueries-already-saved": "این پالایهها اکنون ذخیره شدهاند",
+ "rcfilters-savedqueries-already-saved": "این پالایهها اکنون ذخیره شدهاند. تنظیماتتان را تغییر دهید تا یک پالایهٔ ذخیره شدهٔ جدید بسازید.",
"rcfilters-restore-default-filters": "بازگردانی پالایههای پیشفرض",
"rcfilters-clear-all-filters": "پاککردن تمام پالایهها",
"rcfilters-show-new-changes": "دیدن جدیدترین تغییرات",
"recentchangeslinked-feed": "تغییرات مرتبط",
"recentchangeslinked-toolbox": "تغییرات مرتبط",
"recentchangeslinked-title": "تغییرات مرتبط با $1",
- "recentchangeslinked-summary": "در زیر فهرستی از تغییرات اخیر صفحههای پیوند داده شده از این صفحه (یا اعضای رده مورد نظر) را میبینید.\nصفحههایی که در [[Special:Watchlist|فهرست پیگیریهایتان]] باشند به صورت '''پررنگ''' نشان داده میشوند.",
+ "recentchangeslinked-summary": "نام یک صفحه را وارد کنید تا تغییرات صفحههایی که به آن پیوند دادهاند یا از آن پیوند گرفتهاند را ببینید. (برای مشاهدهٔ اعضای یک رده، ورودی را به صورت رده:نام رده وارد کنید). تغییرات در صفحههایی که در [[Special:Watchlist|فهرست پیگیریهای شما]] هستند <strong>ضخیم</strong> نمای مییابند.",
"recentchangeslinked-page": "نام صفحه:",
"recentchangeslinked-to": "نمایش تغییرات صفحههایی که به صفحهٔ دادهشده پیوند دارند",
"recentchanges-page-added-to-category": "[[:$1]] به رده اضافه شد",
"autosumm-removed-redirect": "تغییرمسیر به [[$1]] حذف شد",
"autosumm-new": "صفحهای تازه حاوی «$1» ایجاد کرد",
"autosumm-newblank": "ایجاد صفحه خالی",
- "size-bytes": "$1 بایت",
+ "size-bytes": "$1 {{PLURAL:$1|بایت}}",
"size-kilobytes": "$1 کیلوبایت",
"size-megabytes": "$1 مگابایت",
"size-gigabytes": "$1 گیگابایت",
"version-poweredby-others": "دیگران",
"version-poweredby-translators": "مترجمان translatewiki.net",
"version-credits-summary": "افراد زیر را به خاطر ویرایشهایش در [[Special:Version|مدیاویکی]] معرفی مینمائیم.",
- "version-license-info": "مدیاویکی یک نرمافزار آزاد است. میتوانید آن را با شرایط نگارش ۲، یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرمافزار آزاد منتشر شدهاست، بازنشر کنید.\n\nمدیاویکی با این امید که مفید واقع شود منتشر شدهاست، ولی هیچگونه ضمانتی، حتی ضمانت ضمنی تجاری یا مناسب بودن برای یک مصرف خاص را ارائه نمیکند. برای اطلاعات بیشتر، پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید [{{SERVER}}{{SCRIPTPATH}}/COPYING یک نسخه از پروانه جامع همگانی گنو] را به همراه این برنامه دریافت کرده باشید. در غیر این صورت با Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA یا آن را [//www.gnu.org/licenses/old-licenses/gpl-2.0.html مکاتبه کرده یا آن را به صورت برخط بخوانید].",
+ "version-license-info": "مدیاویکی یک نرمافزار آزاد است. میتوانید آن را با شرایط نگارش ۲، یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرمافزار آزاد منتشر شدهاست، بازنشر کنید.\n\nمدیاویکی با این امید که مفید واقع شود منتشر شدهاست، ولی <em>هیچگونه ضمانتی</em>، حتی ضمانت ضمنی <strong>تجاری</strong> یا <strong>مناسب بودن برای یک مصرف خاص</strong> را ارائه نمیکند. برای اطلاعات بیشتر، پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید [{{SERVER}}{{SCRIPTPATH}}/COPYING یک نسخه از پروانه جامع همگانی گنو] را به همراه این برنامه دریافت کرده باشید. در غیر این صورت با Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA یا آن را [//www.gnu.org/licenses/old-licenses/gpl-2.0.html مکاتبه کرده یا آن را به صورت برخط بخوانید].",
"version-software": "نسخهٔ نصبشده",
"version-software-product": "محصول",
"version-software-version": "نسخه",
"tag-mw-contentmodelchange": "تغییر مدل محتوا",
"tag-mw-contentmodelchange-description": "ویرایشهایی که [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel مدل محتوای صفحه را تغییر میدهند]",
"tag-mw-new-redirect": "تغییر مسیر جدید",
+ "tag-mw-new-redirect-description": "ویرایشهایی که یک تغییرمسیر جدید ساختهاند یا صفحهای را به یک تغییرمسیر تبدیل کردهاند",
"tag-mw-removed-redirect": "تغییرمسیر حذف شد",
+ "tag-mw-removed-redirect-description": "ویرایشهایی که یک صفحهٔ تغییرمسیر را به صفحهای غیر تغییرمسیر تغییر دادهاند",
+ "tag-mw-changed-redirect-target": "تغییر هدف تغییرمسیر",
+ "tag-mw-changed-redirect-target-description": "ویرایشهایی که هدف یک تغییرمسیر را تغییر دادهاند",
"tag-mw-blank": "خالیکردن",
"tag-mw-blank-description": "ویرایشهایی که یک صفحه را خالی میکنند",
"tag-mw-replace": "جایگزین شد",
"tag-mw-replace-description": "ویرایشهایی که بیش از ۹۰ درصد صفحه را حذف میکنند",
"tag-mw-rollback": "واگردانی",
+ "tag-mw-rollback-description": "ویرایشهایی که با استفاده از پیوند واگردانی، ویرایشهای قبلی را واگردانی کردهاند",
+ "tag-mw-undo": "خنثیسازی",
+ "tag-mw-undo-description": "ویرایشهایی که با استفاده از پیوند خنثیسازی، ویرایشهای قبلی را خنثی کردهاند",
"tags-title": "برچسبها",
"tags-intro": "این صفحه فهرستیاست از برچسبهایی که نرمافزار با آنها ویرایشها را علامتگذری میکند، به همراه معانی آنها.",
"tags-tag": "نام برچسب",
"limitreport-expansiondepth": "بیشترین عمق گسترش",
"limitreport-expensivefunctioncount": "تعداد تابع تجزیهگر پرمصرف",
"expandtemplates": "بسط دادن الگوها",
- "expand_templates_intro": "این صفحهٔ ویژه متنی را دریافت کرده و تمام الگوهای بهکاررفته در آن را به طور بازگشتی بسط میدهد. همچنین تابعهای تجزیه چون <code><nowiki>{{</nowiki>#language:…}}</code> و متغیرهایی چون <code><nowiki>{{</nowiki>CURRENTDAY}}</code> را هم بسط میدهد — در واقع تقریباً هرچه را که داخل دوآکولاد باشد. این کار با صدازدن مرحلهٔ تجزیهٔ مربوط در خود مدیاویکی صورت میگیرد.",
+ "expand_templates_intro": "این صفحهٔ ویژه، ویکیمتنی را دریافت کرده و تمام الگوهای بهکاررفته در آن را به طور بازگشتی بسط میدهد. همچنین تابعهای تجزیه چون <code><nowiki>{{</nowiki>#language:…}}</code> و متغیرهایی چون <code><nowiki>{{</nowiki>CURRENTDAY}}</code> را هم بسط میدهد — در واقع تقریباً هرچه را که داخل دوآکولاد باشد. این کار با صدازدن مرحلهٔ تجزیهٔ مربوط در خود مدیاویکی صورت میگیرد.",
"expand_templates_title": "عنوان موضوع، برای {{FULLPAGENAME}} و غیره:",
"expand_templates_input": "ویکیمتن ورودی:",
"expand_templates_output": "نتیجه",
"expand_templates_preview": "پیشنمایش",
"expand_templates_preview_fail_html": "<em>به دلیل این که در {{SITENAME}} اچتیامال خام فعال است و اطلاعات نشست کاربری از دست رفت، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوااسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیشنمایش مشروع است، لطفاً دوباره سعی کنید.</strong>\nاگر هنوز کار نکرد، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید، و از این که مرورگر شما اجازه دریافت کوکی از این وبگاه را میدهد اطمینان حاصل کنید.",
"expand_templates_preview_fail_html_anon": "<em>به دلیل این که در {{SITENAME}} اچتیامال خام فعال است و اطلاعات نشست کاربری از دست رفت، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوااسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیشنمایش مشروع است، لطفا [[Special:UserLogin|به سامانه وارد شوید]] و دوباره تلاش کنید.</strong>",
- "expand_templates_input_missing": "شما نیازمندید که حداقل متنهایی را برای وارد کردن تهیه کنید.",
+ "expand_templates_input_missing": "میبایست دست کم مقداری ویکیمتن را وارد کنید.",
"pagelanguage": "تغییر زبان صفحه",
"pagelang-name": "صفحه",
"pagelang-language": "زبان",
"log-action-filter-upload": "نوع بارگذاری",
"log-action-filter-all": "همه",
"log-action-filter-block-block": "بستن",
- "log-action-filter-block-reblock": "تصØÛ\8cØ Ø¨Ù\84اک",
+ "log-action-filter-block-reblock": "تغÛ\8cÛ\8cر Ù\82طع دسترسÛ\8c",
"log-action-filter-block-unblock": "باز شدن",
"log-action-filter-contentmodel-change": "تغییر مدل محتوا",
"log-action-filter-contentmodel-new": "ایجاد صفحه با مدل محتوای غیر استاندارد",
"uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.",
"uploaded-hostile-svg": "Tallennetun SVG-tiedoston tyylielementissä löytyi turvaton CSS.",
"uploaded-event-handler-on-svg": "Setting event-handler attributes <code>$1=\"$2\"</code> is not allowed in SVG files.",
- "uploaded-href-attribute-svg": "href-attribuutit SVG-tiedostoissa saavat linkittää vain http://- tai https://-kohteisiin, löytyi <code><$1 $2=\"$3\"></code>.",
+ "uploaded-href-attribute-svg": "<a>-elementit voivat linkittää (href) vain kohteisiin data: (upotettu tiedosto), http://, https:// tai fragment (#, sama tiedosto). Muissa elementeissä, kuten <image>, vain data: ja fragment ovat sallittuja. Kokeile kuvien upottamista, kun viet SVG-tiedostoasi. Löytyi <code><$1 $2=\"$3\"></code>.",
"uploaded-href-unsafe-target-svg": "Löytyi href epäturvalliseen dataan: URI-kohde <code><$1 $2=\"$3\"></code> tallennetussa SVG-tiedostossa.",
"uploaded-animate-svg": "Found \"animate\" tag that might be changing href, using the \"from\" attribute <code><$1 $2=\"$3\"></code> in the uploaded SVG file.",
"uploaded-setting-event-handler-svg": "Setting event-handler attributes is blocked, found <code><$1 $2=\"$3\"></code> in the uploaded SVG file.",
"limitreport-expansiondepth": "Highest expansion depth",
"limitreport-expensivefunctioncount": "Vaativien jäsenninfunktioiden lukumäärä",
"expandtemplates": "Laajenna mallineet",
- "expand_templates_intro": "Tämä toimintosivu ottaa syötteeksi tekstiä ja laajentaa kaikki siinä olevat mallineet rekursiivisesti.\nSe myös laajentaa tuetut parserifunktiot kuten\n<code><nowiki>{{</nowiki>#language:...}}</code> ja -muuttujat kuten\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nKäytännössä se laajentaa melkein kaiken, joka on kaksoisaaltosulkeiden sisällä.",
+ "expand_templates_intro": "Tämä toimintosivu ottaa syötteeksi wikitekstiä ja laajentaa kaikki siinä olevat mallineet rekursiivisesti.\nSe myös laajentaa tuetut parserifunktiot kuten\n<code><nowiki>{{</nowiki>#language:...}}</code> ja -muuttujat kuten\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nKäytännössä se laajentaa melkein kaiken, joka on kaksoisaaltosulkeiden sisällä.",
"expand_templates_title": "Otsikko (esimerkiksi muuttujaa {{FULLPAGENAME}} varten)",
"expand_templates_input": "Syötä wikiteksti:",
"expand_templates_output": "Tulos",
"restrictionsfield-badip": "Virheellinen IP-osoite tai alue: $1",
"restrictionsfield-label": "Sallitut IP-alueet:",
"restrictionsfield-help": "Yksi IP-osoite tai CIDR-alue per rivi. Ottaaksesi kaiken käyttöön, käytä:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "$1",
+ "edit-error-long": "Virheet:\n\n$1",
"revid": "versio $1",
"pageid": "sivun tunnistenumero $1",
"rawhtml-notallowed": "<html> komentoa ei voida käyttää normaalien sivujen ulkopuolella.",
"prefs-help-recentchangescount": "Ceci inclut les modifications récentes, les pages d'historiques et les journaux.",
"prefs-help-watchlist-token2": "Voici la clé secrète du flux Web de votre liste de suivi.\nToute personne la connaissant pourra lire votre liste de suivi, ne la communiquez donc pas.\nSi nécessaire, [[Special:ResetTokens|vous pouvez la réinitialiser ici]].",
"savedprefs": "Les préférences ont été sauvegardées.",
- "savedrights": "Les droits d’utilisat{{GENDER:$1|eur|rice}} de $1 ont été enregistrés.",
+ "savedrights": "Le groupes de l'utilisat{{GENDER:$1|eur|rice}} $1 ont été sauvegardés.",
"timezonelegend": "Fuseau horaire :",
"localtime": "Heure locale :",
"timezoneuseserverdefault": "Utiliser la valeur par défaut du wiki ($1)",
"doubleredirects": "Doubles redirections",
"doubleredirectstext": "Voici une liste des pages qui redirigent vers des pages qui sont elles-mêmes des pages de redirection.\nChaque entrée contient des liens vers la première et la seconde redirections, ainsi que la première ligne de texte de la seconde page, ce qui fournit habituellement la « vraie » page cible, vers laquelle la première redirection devrait rediriger.\nLes entrées <del>barrées</del> ont été résolues.",
"double-redirect-fixed-move": "[[$1]] a été déplacé.\nIl a été mis à jour automatiquement et redirige maintenant vers [[$2]].",
- "double-redirect-fixed-maintenance": "Correction automatique de la double redirection de [[$1]] vers [[$2]] dans une tâche de maintenance.",
+ "double-redirect-fixed-maintenance": "Correction automatique de la double redirection de [[$1]] vers [[$2]] dans une tâche de maintenance",
"double-redirect-fixer": "Correcteur de redirection",
"brokenredirects": "Redirections cassées",
"brokenredirectstext": "Ces redirections mènent vers des pages inexistantes :",
"movepagetalktext": "Si vous cochez cette case, la page de discussion associée sera automatiquement renommée, à moins qu’une page de discussion non vide existe déjà sous ce nouveau nom.\n\nDans ce cas, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
"moveuserpage-warning": "<strong>Attention :</strong> Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seule la page sera renommée et que l’utilisateur <em>ne</em> sera <em>pas</em> renommé.",
"movecategorypage-warning": "<strong>Avertissement :</strong> Vous êtes sur le point de renommer une page de catégorie. Veuillez noter que seule la catégorie sera renommée et <em>qu’aucune</em> des pages de l’ancienne catégorie ne sera transférée dans la nouvelle.",
- "movenologintext": "Pour pouvoir renommer une page, vous devez être [[Special:UserLogin|identifié{{GENDER:||e}}]] avec un compte d’utilisateur enregistré.",
+ "movenologintext": "Pour pouvoir renommer une page, vous devez être un utilisateur enregistré et être [[Special:UserLogin|connecté{{GENDER:||e}}]].",
"movenotallowed": "Vous n'avez pas la permission de renommer les pages.",
"movenotallowedfile": "Vous n'avez pas la permission de renommer les fichiers.",
"cant-move-user-page": "Vous n’avez pas la permission de renommer les pages principales des utilisateurs (sauf les sous-pages).",
- "cant-move-to-user-page": "Vous n’avez pas la permission de renommer une page vers une page d’utilisateur (mais vous pouvez le faire vers une sous-page d’utilisateur).",
+ "cant-move-to-user-page": "Vous n’avez pas la permission de renommer une page vers une page utilisateur (mais vous pouvez le faire vers une sous-page utilisateur).",
"cant-move-category-page": "Vous n'avez pas la permission de renommer les pages de catégorie.",
"cant-move-to-category-page": "Vous n'avez pas la permission de renommer une page vers une page de catégorie.",
"cant-move-subpages": "Vous n’avez pas le droit de renommer des sous-pages.",
"restrictionsfield-badip": "Adresse IP ou plage non valide : $1",
"restrictionsfield-label": "Plages IP autorisées :",
"restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Erreur : $1",
+ "edit-error-long": "Erreurs :\n\n$1",
"revid": "version $1",
"pageid": "ID de page $1",
"rawhtml-notallowed": "Les balises <html> ne peuvent pas être utilisées en dehors des pages normales.",
"pageinfo-category-subcats": "Número de subcategorías",
"pageinfo-category-files": "Número de ficheiros",
"pageinfo-user-id": "ID do usuario",
+ "pageinfo-file-hash": "Valor de hash",
"markaspatrolleddiff": "Marcar como revisada",
"markaspatrolledtext": "Marcar esta páxina como revisada",
"markaspatrolledtext-file": "Marcar esta versión de ficheiro como verificada",
"restrictionsfield-badip": "Enderezo IP ou rango de IP non válido: $1",
"restrictionsfield-label": "Rangos de IP permitidos:",
"restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utiliceː\n<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Erro: $1",
+ "edit-error-long": "Erros:\n\n$1",
"revid": "revisión $1",
"pageid": "identificador de páxina $1",
"rawhtml-notallowed": "As marcas <html> non poden usarse fóra das páxinas normais.",
"doubleredirects": "הפניות כפולות",
"doubleredirectstext": "בדף הזה מופיעה רשימת דפי הפניה שמפנים לדפי הפניה אחרים.\nכל שורה מכילה קישור לשתי ההפניות הראשונות, וכן את היעד של ההפניה השנייה, שהיא לרוב היעד ה\"אמיתי\" של ההפניה, שההפניה הראשונה אמורה להצביע אליו.\nפריטים <del>מחוקים</del> כבר תוקנו.",
"double-redirect-fixed-move": "הדף [[$1]] הועבר.\nהוא עודכן אוטומטית ועכשיו מפנה לדף [[$2]].",
- "double-redirect-fixed-maintenance": "תיקון אוטומטי של הפניה כפולה מהדף [[$1]] אל הדף [[$2]] במשימת תחזוקה.",
+ "double-redirect-fixed-maintenance": "תיקון אוטומטי של הפניה כפולה מהדף [[$1]] אל הדף [[$2]] במשימת תחזוקה",
"double-redirect-fixer": "מתקן הפניות",
"brokenredirects": "הפניות לא תקינות",
"brokenredirectstext": "ההפניות שלהלן מפנות לדפים שאינם קיימים:",
"restrictionsfield-badip": "כתובת או טווח כתובות IP בלתי תקין: $1",
"restrictionsfield-label": "טווחי כתובות IP מותרים:",
"restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "שגיאה: $1",
+ "edit-error-long": "שגיאות:\n\n$1",
"revid": "גרסה $1",
"pageid": "מזהה דף $1",
"rawhtml-notallowed": "לא ניתן להשתמש בתגיות <html> מחוץ לדפים רגילים.",
"Rajatkatiyar10",
"Dcljr",
"Bhatakati aatma",
- "Shypoetess"
+ "Shypoetess",
+ "Innocentbunny"
]
},
"tog-underline": "लिंक रेखांकित करें:",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>से जुड़े पृष्ठ</strong> चयनित पृष्ठ",
"rcfilters-filter-showlinkedto-label": "लिंक करने वाले पृष्ठों पर परिवर्तन दिखाएं",
"rcfilters-filter-showlinkedto-option-label": "<strong>से जुड़ने वाले पृष्ठ</strong> चयनित पृष्ठ",
- "rcfilters-target-page-placeholder": "पृष्ठ का नाम दर्ज करें",
+ "rcfilters-target-page-placeholder": "पृष्ठ(अथवा श्रेणी) का नाम भरें",
"rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
"rclistfromreset": "चुने दिनांक पहले जैसा करें",
"rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
"pageinfo-category-subcats": "उपश्रेणियों की संख्या",
"pageinfo-category-files": "फ़ाइलों की संख्या",
"pageinfo-user-id": "सदस्य पता",
+ "pageinfo-file-hash": "हैश मान",
"markaspatrolleddiff": "जाँचा हुआ चिन्हित करें",
"markaspatrolledtext": "इस पृष्ठ को जाँचा हुआ चिन्हित करें",
"markaspatrolledtext-file": "इस फ़ाइल संस्करण को जांचा हुआ चिन्हित करें",
"restrictionsfield-badip": "अमान्य आईपी पते या सीमा: $1",
"restrictionsfield-label": "अनुमत आईपी सीमा:",
"restrictionsfield-help": "एक आईपी पता या सीडीआरएल सीमा प्रति पंक्ति में लिखें। सभी को सक्रिय करने के लिए <pre>0.0.0.0/0::/0</pre> का उपयोग करें।",
+ "edit-error-short": "त्रुटि: $1",
+ "edit-error-long": "त्रुटि:\n\n$1",
"revid": "अवतरण $1",
"pageid": "पेज आईडी $1",
"rawhtml-notallowed": "<html> टैग का उपयोग सामान्य पन्नों के बाहर नहीं किया जा सकता है।",
"hidden-category-category": "Skrivene kategorije",
"category-subcat-count": "{{PLURAL:$2|1=Ova kategorija sadržava samo sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću $1 potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od ukupno $2.}}",
"category-subcat-count-limited": "Ova kategorija ima {{PLURAL:$1|podkategoriju|$1 podkategorije|$1 podkategorija}}.",
- "category-article-count": "{{PLURAL:$2|Ova kategorija sadrži samo sljedeću stranicu.|{{PLURAL:$1|Prikazana stranica jedina je|Prikazane su $1 stranice su|Prikazano je $1 stranica}} u ovoj kategoriji, od ukupno $2.}}",
+ "category-article-count": "{{PLURAL:$2|1=Ova kategorija sadržava samo sljedeću stranicu.|{{PLURAL:$1|Prikazana je $1 stranica|Prikazane su $1 stranice|Prikazano je $1 stranica}} u ovoj kategoriji, od ukupno $2.}}",
"category-article-count-limited": "{{PLURAL:$1|stranica je|$1 stranice su|$1 stranica je}} u ovoj kategoriji.",
"category-file-count": "Ova kategorija sadrži $2 {{PLURAL:$2|datoteku|datoteke|datoteka}}. {{PLURAL:$1|Slijedi $1 datoteka|Slijede $1 datoteke|Slijedi $1 datoteka}}.",
"category-file-count-limited": "{{PLURAL:$1|datoteka je|$1 datoteke su|$1 datoteka su}} u ovoj kategoriji.",
"restrictionsfield-badip": "Érvénytelen IP-cím vagy -tartomány: $1",
"restrictionsfield-label": "Engedélyezett IP-tartományok:",
"restrictionsfield-help": "Egy IP-cím vagy CIDR-tartomány soronként. Minden engedélyezéséhez használd a következő tartományokat:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
+ "edit-error-short": "Hiba: $1",
+ "edit-error-long": "Hibák:\n\n$1",
"revid": "$1 változat",
"pageid": "$1 lapazonosító",
"rawhtml-notallowed": "<html> címkék nem használhatók normál lapokon kívül.",
"showhideselectedversions": "Ցուցադրել/թաքցնել ընտրված խմբագրումները",
"editundo": "հետ շրջել",
"diff-empty": "(Տարբերություն չկա)",
- "diff-multi-sameuser": "(Միևնույն մասնակցի {{PLURAL:$1|մեկ միջանկյալ տարբերակ|$1 միջանկյալ տարբերակներ}} թաքցրված է)",
+ "diff-multi-sameuser": "(Միևնույն մասնակցի {{PLURAL:$1|մեկ միջանկյալ տարբերակ|$1 միջանկյալ տարբերակներ}} թաքցված է)",
"searchresults": "Որոնման արդյունքներ",
"searchresults-title": "«$1»-ի որոնման արդյունքներ",
"titlematches": "Համընկած հոդվածների անվանումներ",
"doubleredirects": "Redirectiones duple",
"doubleredirectstext": "Iste pagina lista paginas de redirection verso altere paginas de redirection.\nCata linea contine ligamines al prime e al secunde redirection, con le destination del secunde redirection. Iste es normalmente le \"ver\" pagina de destination, al qual le prime redirection tamben deberea punctar.\nLe entratas <del>cancellate</del> ha essite resolvite.",
"double-redirect-fixed-move": "[[$1]] ha essite renominate.\nIllo ha essite automaticamente actualisate e ora redirige verso [[$2]].",
- "double-redirect-fixed-maintenance": "Corrige automaticamente le redirection duple de [[$1]] a [[$2]] durante un carga de mantenentia.",
+ "double-redirect-fixed-maintenance": "Correction automatic del redirection duple de [[$1]] a [[$2]] in un processo de mantenentia",
"double-redirect-fixer": "Corrector de redirectiones",
"brokenredirects": "Redirectiones rupte",
"brokenredirectstext": "Le sequente redirectiones mena a paginas non existente:",
"restrictionsfield-badip": "Adresse o intervallo IP non valide: $1",
"restrictionsfield-label": "Intervallos IP permittite:",
"restrictionsfield-help": "Un adresse IP o intervallo CIDR per linea. Pro activar toto, usa:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Error: $1",
+ "edit-error-long": "Errores:\n\n$1",
"revid": "version $1",
"pageid": "ID de pagina $1",
"rawhtml-notallowed": "Etiquettas <html> non pote esser usate foras de paginas normal.",
"Tusholi"
]
},
- "tog-underline": "ТIаÑ\85Ñ\8cожаÑ\8fÑ\80га кIала така хьакхар:",
- "tog-hideminor": "Къайладаккха з|амига дола хувцамаш керда хувцамашта юкъера",
+ "tog-underline": "ТIаÑ\82овжама кIала така хьакхар:",
+ "tog-hideminor": "Къайладаккха зӏамига дола хувцамаш керда хувцамашта юкъера",
"tog-hidepatrolled": "Къайладаккха ха дера чакхдаьнна дола (патрулированные) хувцамаш керда хувцамашта юкъера",
"tog-newpageshidepatrolled": "Къайлаяьккха ха дера чакхъянна йола (патрулированные) оагIонаш керда оагIонашта юкъера",
"tog-hidecategorization": "Къайлаяха оагӀонай категореш",
"tog-watchlisthideminor": "Са зем бара хьаязъяьр чура зIамига хувцамаш къайладаха",
"tog-watchlisthideliu": "Шоаш хьабайзийта доакъошхоша хувцамаш къайладаха зем бара хьаязъяьр чура",
"tog-watchlisthideanons": "ЦIийоацача доакъошхоша хувцамаш къайладаха зем бара хьаязъяьр чура",
- "tog-watchlisthidepatrolled": "Ха даь дола хувцамаш къайладаха зем бара хьаязъяьр чура",
- "tog-watchlisthidecategorization": "Ð\9aÑ\8aайлаÑ\8fккÑ\85а оагÓ\80онай каÑ\82егоÑ\80еÑ\88",
+ "tog-watchlisthidepatrolled": "Ха даь дола хувцамаш къайладаха зéма хьаязъяьра чу",
+ "tog-watchlisthidecategorization": "Ð\9eагÓ\80онаÑ\88Ñ\82а оагIаÑ\82аÑ\88 Ñ\82оÑ\85аÑ\80 кÑ\8aайладаккÑ\85а",
"tog-ccmeonemails": "Сона хьатIаахийта аз доакъашхошта дIадахийта дола каьхатий кепаш",
"tog-diffonly": "Ма гойта оагIон чулоацам ши верси вIашидистара кIал",
- "tog-showhiddencats": "Ð\93ойÑ\82а кÑ\8aайла каÑ\82егоÑ\80еш",
- "tog-useeditwarning": "Хоамбе хьадаь хувцамаш дӀа ца яздеш аз болх дӀаберзабеча ханахь",
+ "tog-showhiddencats": "Ð\93ойÑ\82а кÑ\8aайла оагIаÑ\82аш",
+ "tog-useeditwarning": "Хоамбе хьадаь хувцамаш дӀа а ца яздеш аз болх дӀаберзабеча хана",
"underline-always": "Даиман",
"underline-never": "ЦIаккха",
"underline-default": "Браузера гIирсаш тоаяраш лелае",
"sunday": "кIиранди",
"monday": "оршот",
"tuesday": "шинара",
- "wednesday": "Ð\9aхаьра",
+ "wednesday": "кхаьра",
"thursday": "éра",
"friday": "пӀаьраска",
"saturday": "шоатта",
- "sun": "Ð\9aIиранди",
- "mon": "Ð\9eÑ\80Ñ\88",
- "tue": "Шин",
- "wed": "Ð\9aÑ\85",
- "thu": "Ð\95Ñ\80",
- "fri": "Ð\9fI",
- "sat": "Шоа",
+ "sun": "кIиранди",
+ "mon": "оÑ\80Ñ\88оÑ\82",
+ "tue": "шинара",
+ "wed": "кÑ\85аÑ\8cÑ\80а",
+ "thu": "еÑ\80а",
+ "fri": "пIаÑ\8cÑ\80аÑ\81ка",
+ "sat": "шоатта",
"january": "АгIой",
"february": "Саь-кур",
"march": "Мутт-хьал",
"anontalk": "Дувца оттадар",
"navigation": "Навигаци",
"and": " а",
- "faq": "Ð\9aТХ",
+ "faq": "Ð\9aÐ\9bХ",
"actions": "Ардамаш",
"namespaces": "ЦIерий аренаш",
"variants": "Эршаш",
"otherlanguages": "Кхыча меттаех",
"redirectedfrom": "($1 дIа-сахьожаяьй укхаз)",
"redirectpagesub": "ОагIув-дIа-сахьожадар",
- "redirectto": "Ð\94Iа-Ñ\81аÑ\85Ñ\8cожадар укхаза:",
+ "redirectto": "Ð\94Iа-Ñ\85Ñ\8cа Ñ\85Ñ\8cожавар укхаза:",
"lastmodifiedat": "Ер оагIув тIеххьара хийца хиннай $2 $1 яьннача ха́на.",
"viewcount": "Укх оагIонга хьежа хиннаб $1{{PLURAL:$1|-зза}}.",
"protectedpage": "ГIо оттадаь лораяь оагIув",
"badaccess-groups": "ДIадийха ардам кхоачашде могаш ба алхха доакъашхой {{PLURAL:$2|1=тоабан «$1»|укх тоабаш чура: $1}}",
"versionrequired": "Эшаш я $1 версех йола MediaWiki",
"versionrequiredtext": "Укх оагIонца болх бергболаш $1 версех йола MediaWiki эша. Хьажа [[Special:Version|програмни Iалашдарах бола хоамага]].",
- "ok": "Мега",
+ "ok": "Мег",
"retrievedfrom": "Хьаст — «$1»",
"youhavenewmessages": "{{PLURAL:$3|Хьога денад}} $1 ($2).",
"youhavenewmessagesfromusers": "{{PLURAL:$4|Хьога кхаьчад}} $1 {{PLURAL:$3|1=$3 доакъашхочунгара|$3 доакъашхоштагара|1=кхыволча доакъашхочунгара}} ($2).",
"showtoc": "хьахьокха",
"hidetoc": "хьулде",
"collapsible-collapse": "дIахьулде",
- "collapsible-expand": "доаржаде",
- "confirmable-yes": "XӀа-а",
+ "collapsible-expand": "хьадоаржаде",
+ "confirmable-yes": "XӀау",
"confirmable-no": "A",
"thisisdeleted": "БIаргтоха е юхаметтаоттае $1?",
"viewdeleted": "Хьажа $1?",
"yourpasswordagain": "Юхаязде къайладIоагIа:",
"createacct-yourpasswordagain": "Бакъйе пароль",
"createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Ӏочуязъе пароль",
- "userlogin-remembermypassword": "Ража чу виса",
+ "userlogin-remembermypassword": "Ражача чувиса",
"yourdomainname": "Хьа нана-цIа:",
"login": "Чувала/яла",
"nav-login-createaccount": "Шоаш довзийтар / Дагара йоазув кхоллар",
"logout": "Аравала/яла",
"userlogout": "Аравала/яла",
- "notloggedin": "Ð\9eаÑ\88 Ñ\88оаÑ\88 довзийÑ\82адаÑ\86 Ñ\81иÑ\81Ñ\82еман",
- "userlogin-noaccount": "Ð\94оакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\83Ñ\87еÑ\82а Ñ\8fздаÑ\80 диÑ\86е Ñ\85Ñ\8cа?",
- "userlogin-joinproject": "ДIахоттале {{SITENAME}}аца",
+ "notloggedin": "РажаÑ\87а Ñ\87Ñ\83даÑ\8cннадаÑ\86 Ñ\88о",
+ "userlogin-noaccount": "Ð\94агаÑ\80а йоазÑ\83в деÑ\86е Ñ\85Ñ\8cога?",
+ "userlogin-joinproject": "ДIахоттале {{SITENAME}} яхача проекта",
"createaccount": "Дагара йоазув хьакхолла",
"userlogin-resetpassword-link": "Тӏеракхосса езий хьа пароль?",
- "userlogin-helplink2": "Раже чувалара новкъостал",
+ "userlogin-helplink2": "Ражеча чувалара новкъостал",
"userlogin-createanother": "Кхыдола дагара йоазув хьакхолла",
"createacct-emailoptional": "Электронни поштан цӀай (ца яздича мегаш да)",
"createacct-email-ph": "Ӏочуязде хьай электронни поштан цӀай",
"bold_tip": "Сома йоазон текст",
"italic_sample": "Сиха йоазон текст",
"italic_tip": "Сиха йоазон текст",
- "link_sample": "ТIахьожаярга дáкъа цIи",
- "link_tip": "Чура тIахьожаярг",
+ "link_sample": "Тӏатовжама кепакерта цIи",
+ "link_tip": "Чура тӏатовжам",
"extlink_sample": "http://www.example.com тIахьожаярга дáкъа цIи",
"extlink_tip": "Арахьара тIахьожаярг (йиц ма ялийтта префикс http://)",
"headline_sample": "Дáкъа цIера текст",
"nowiki_sample": "Укхаза хувца езаш йоаца текст хьачуоттае",
"nowiki_tip": "Теркал ма е вики-форматировани",
"image_tip": "Чуоттаяь файл",
- "media_tip": "Файла тIахьожавар",
+ "media_tip": "Файлá тIатовжам",
"sig_tip": "Хьа кулгаяздар а, хӀанзара ха а",
"hr_tip": "ПхьорагIен така (цох пайда эцар тIехдаьнна кастта ма де)",
"summary": "Хувцамий сурт оттадар",
"rcshowhidebots": "$1 боташ",
"rcshowhidebots-show": "Хьахьокха",
"rcshowhidebots-hide": "Къайладаккха",
- "rcshowhideliu": "$1 бовзийтарчара доакъашхой",
+ "rcshowhideliu": "$1 ражача дӏаэтта доакъашхой",
"rcshowhideliu-show": "Хьахьокха",
"rcshowhideliu-hide": "Къайлабаха",
"rcshowhideanons": "$1 цIияккханза доакъашхой",
"linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIача $1 оагIо тIахьожаву|ТIехьайоагIача $1 оагIонаш тIахьожаву}} укх файла тIа:",
"linkstoimage-more": "$1-ннел дуккхагIа {{PLURAL:$1|оагIув}} я укх файла тIахьожавеш.\nУкх хьаязъяьра чу белгалъяй цу файла {{PLURAL:$1|алхха $1 тIахьожаярг}}.\nТIакхача йиш я иштта [[Special:WhatLinksHere/$2|бIарчча хьаязъяьра]].",
"nolinkstoimage": "Укх файла тӏатовжаш оагӏонаш яц.",
- "linkstoimage-redirect": "$1 (Ñ\84айлови дÓ\80а-Ñ\81аÑ\85Ñ\8cожадар) $2",
+ "linkstoimage-redirect": "$1 (Ñ\84айлови дÓ\80а-Ñ\85Ñ\8cа Ñ\85Ñ\8cожавар) $2",
"sharedupload": "Ер файл $1 чура я, из пайда эцаш лелае мегаш я кхыйола проекташ чу.",
"sharedupload-desc-here": "Ер файл $1 чура я, иштта кхыйола проекташ чу пайда эца аьттув болаш я.\nЦун [$2 сурт оттадара оагIон] хоам кIалхахь хьабоалабаьб.",
"filepage-nofile": "Ишта цӀи йола файл йоацаш я.",
"sp-contributions-newonly": "ОагIонаш кхоллара мара хувцамаш ма гойта.",
"sp-contributions-submit": "Хьалáха",
"whatlinkshere": "Тӏатовжамаш укхаза",
- "whatlinkshere-title": "«$1» ← укхунна тӏатовжаш йола оагӏонаш",
+ "whatlinkshere-title": "«$1» яхача оагӏонна тӏатовжаш йола оагӏонаш",
"whatlinkshere-page": "ОагIув:",
- "linkshere": "ТIехьайоагIа оагIонаш тIахьожаву «'''[[:$1]]'''»:",
- "nolinkshere": "Ð\9eагIона '''[[:$1]]''' кÑ\85Ñ\8bйола оагIонаÑ\88каÑ\80а Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80гаÑ\88 йоаÑ\86аÑ\88 Ñ\8f.",
+ "linkshere": "«'''[[:$1]]'''» яхача оагIонна тIахьожавеш я тIехьайоагIа:",
+ "nolinkshere": "Ð\9aÑ\85Ñ\8bйолÑ\87а оагÓ\8fонаÑ\88каÑ\80а '''[[:$1]]''' Ñ\8fÑ\85аÑ\87а оагÓ\8fон Ñ\82IаÑ\82овжамаÑ\88 доаÑ\86аÑ\88 да.",
"isredirect": "оагIув-дIа-сахьожадар",
"istemplate": "юкъейоалаяр",
"isimage": "Файлови тӏатовжам",
"whatlinkshere-prev": "{{PLURAL:$1|1=хьалхайоагIа|хьалхайоагIараш}} $1",
"whatlinkshere-next": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
"whatlinkshere-links": "← тӏатовжамаш",
- "whatlinkshere-hideredirs": "$1 дIа-сахьожадараш",
- "whatlinkshere-hidetrans": "$1 Ñ\8eкÑ\8aейоалаÑ\8fраш",
- "whatlinkshere-hidelinks": "$1 тIахьожаяргаш",
+ "whatlinkshere-hideredirs": "$1 дӀа-хьа хьожавараш",
+ "whatlinkshere-hidetrans": "$1 Ñ\8eкÑ\8aедоаладаÑ\8cраш",
+ "whatlinkshere-hidelinks": "$1 тӏатовжамаш",
"whatlinkshere-hideimages": "$1 файлай тIахьожаяргаш",
"whatlinkshere-filters": "Фильтраш",
"blockip": "ЧIега тоха {{GENDER:$1|доакъашхочун}}",
"movelogpage": "ЦӀераш хувцара тептар",
"movereason": "Бахьан:",
"revertmove": "юха",
- "export": "ОагIонай экспорт",
+ "export": "Оагӏоний экспорт",
"allmessagesname": "Хоам",
"allmessagesdefault": "Массаза йола текст",
"allmessages-filter-all": "Еррига",
"exif-software": "Программни Iалашдар",
"exif-artist": "Автор",
"exif-exifversion": "Верси Exif",
- "exif-colorspace": "Ð\91еÑ\81ай моÑ\82Ñ\82",
+ "exif-colorspace": "Ð\91еÑ\81ий моÑ\82Ñ\82иг",
"exif-pixelxdimension": "Сурта шорал",
"exif-pixelydimension": "Сурта лакхал",
"exif-datetimeoriginal": "Оригинальни таьрахьи хаи",
"htmlform-submit": "ДIадахьийта",
"htmlform-reset": "Хувцамаш юхадаккха",
"htmlform-selectorother-other": "Кхыдар",
- "logentry-delete-delete": "$1 {{GENDER:$2|дIаяккхай}} оагIув $3",
+ "logentry-delete-delete": "$1 яхача доакъашхочо {{GENDER:$2|дIаяккхай}} $3 яха оагӏув",
"logentry-delete-restore": "$1 доакъашхочо {{GENDER:$2|юхаметтаоттаяьй}} $3 яха оагIув ($4)",
"logentry-delete-revision": "$1 цIи йолча доакъашхочо {{GENDER:$2|хийцай}} $3 яхача оагIон {{PLURAL:$5|$5 версин|1=версин}} гуш хилар: $4",
"revdelete-content-hid": "чулоацам къайлабаьккхаб",
- "logentry-move-move": "$1 доакъашхочо $3 яхача оагӏон {{GENDER:$2|цӀи хийцай}} $4 яхача цӏерах",
+ "logentry-move-move": "$1 доакъашхочо $3 яхача оагӏон {{GENDER:$2|цӀи хийцай}} укх цӏерах → $4",
"logentry-move-move-noredirect": "$1 {{GENDER:$2|цӀи хийцай}} $3 → $4 дӀа-сахьожадар ца дуташ.",
"logentry-move-move_redir": "$1 доакъашхочо $3 яхача оагIон {{GENDER:$2|цIи хийцай}} укхунах → $4 дӀа-сахьожадара тIагIолла.",
"logentry-patrol-patrol-auto": "$1 ше-ше {{GENDER:$2|ха даь техкай}} $3 оагIон верси $4",
"title-invalid-interwiki": "La demandita pagino-titulo kontenas inter-wiki-ala ligilo, olqua ne povas uzesar en tituli.",
"title-invalid-talk-namespace": "La demandita pagino-titulo referas a diskuto-pagino, qua ne existas.",
"title-invalid-characters": "La demandita pagino-titulo kontenas ne-valida literi: \"$1\".",
- "perfcached": "La sequanta datumi esas kashizita* e li povus ne aktualigesar nuntempe. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+ "title-invalid-magic-tilde": "La pagino demandata kontenas nevalida 'magiala' intersequo di tildi =>(<nowiki>~~~</nowiki>).",
+ "title-invalid-too-long": "La pagino demandata esas tre longa. Ol mustas esar min longa kam $1 {{PLURAL:$1|byte|bytes}} segun la kodexado UTF-8.",
+ "title-invalid-leading-colon": "La pagino demandata kontenas nevalida bi-punto en lua komenco.",
+ "perfcached": "La sequanta datumi esas en la memorio dil komputero, e povas esar aktualigita. Admaxime {{PLURAL:$1|un rezulto|$1 rezulti}} esas disponebla che la 'cache' dil komputero.",
+ "perfcachedts": "La sequanta datumi esas en la memorio dil komputero, ed aktualigesis lastafoye ye $1. Admaxime {{PLURAL:$4|un rezulto|$4 rezulti}} esas disponebla che la memorio 'cache'.",
+ "querypage-no-updates": "Ica pagino ne povas aktualigesar.\nLa datumi en ol ne rinovigesos.",
"viewsource": "Vidar font-kodo",
"viewsource-title": "Videz la fonto/fonti por $1",
"actionthrottled": "Agado limitizita",
+ "actionthrottledtext": "Por preventar trouzo kun vandala skopo, tu ne povas facar ica agado plurafoye dum kurta periodo di tempo, e tu superiris ica limito.\nVoluntez probar ol itere, pos kelka minuti.",
"protectedpagetext": "Ta pagino protektesis por preventar redaktadi od altra agi.",
"viewsourcetext": "Vu povas vidar ed kopiar la fonto-kodexo di ta pagino.",
"viewyourtext": "Vu darfas vidar e kopiar la fonto di <strong>vua redakti</strong> ad ita pagino.",
"protectedinterface": "Ita pagino provizas 'interface' texto por la programaro en ita wiki, ed esas protektita por preventar mis-uzo.\nPor introduktar o chanjar tradukaji di la wiki-i, voluntez vizitar [https://translatewiki.net/ translatewiki.net], la projeto qua provizas tradukaji a MediaWiki.",
"editinginterface": "<strong>Averto:</strong> Vu redaktas pagino qua uzesas por provizar 'interface' texto di la programaro.\nChanji a ta pagino chanjos la aspekto di pagini por altra uzeri di ta wiki.",
"translateinterface": "Por introduktar o chanjar tradukaji en omna wiki-i, voluntez uzar [https://translatewiki.net/ translatewiki.net], la komuna projeto MediaWiki.",
+ "cascadeprotected": "Ica pagino protektesis kontre l'editado pro ke lua kontenajo transskribesas en la sequanta {{PLURAL:$1|pagino, qua esas|pagini, qui esas}} protektita kande selektesis por ol la formo di \"protekto en kaskado\":\n$2",
"namespaceprotected": "Vu ne es permisita redaktar pagini en la nomaro <strong>$1</strong>.",
"customcssprotected": "Vu ne es permisita redaktar ita CSS pagino nam ol kontenas personal ajustaji di altra uzero.",
"customjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino nam ol kontenas personal ajustaji di altra uzero.",
"titleprotected": "Ita titulo es protektita de kreado da [[User:$1|$1]].\nLa motivo es <em>$2</em>.",
"filereadonlyerror": "La dosiero \"$1\" ne es modifikebla nam la depozeyo di dosieri \"$2\" esas nur lektebla.\n\nLa sistem-administrero qua klozis ol ofris ita klarigo: \"$3\".",
"invalidtitle-knownnamespace": "Ne-valida titulo kun nomaro \"$2\" e texto \"$3\"",
+ "invalidtitle-unknownnamespace": "Nevalida titulo kun nekonocata nombro di limitilo 'namespace' $1 e texto \"$2\"",
"exception-nologin": "Vu ne eniris",
"exception-nologin-text": "Voluntez enirar konto por acesar la pagino od ago.",
"exception-nologin-text-manual": "Voluntez $1 por acesar ta pagino od ago.",
"nosuchusershort": "Esas nula uzero \"$1\".\nKontrolez la espelado.",
"nouserspecified": "Vu mustas specigar uzantonomo.",
"login-userblocked": "Ta uzero es interdiktita. Enirado ne permisesas.",
- "wrongpassword": "La skribita pasovorto esis nekorekta. Voluntez probar itere.",
+ "wrongpassword": "La skribita pasovorto ne esas korekta.\nVoluntez probar itere.",
"wrongpasswordempty": "Vu ne skribis pasovorto. Probez nove.",
"passwordtooshort": "Pasovorti mustas kontenar adminime {{PLURAL:$1|1 signo|$1 signi}}.",
"passwordtoolong": "Pasovorti ne mustas esar plu longa kam {{PLURAL:$1|1 litero|$1 literi}}.",
"password-login-forbidden": "La uzo di ita uzeronomo e pasovorto es interdiktita.",
"mailmypassword": "Sendez nova pasovorto per e-posto",
"passwordremindertitle": "Nova provizora pasovorto por {{SITENAME}}",
+ "passwordremindertext": "Ulu (probable tu, del IP-adreso $1) solicitis nova pasovorto de {{SITENAME}} ($4). Provizora pasovorto por l'uzero \"$2\" kreesis e sendesis a \"$3\". Se to esis tua volunto, tu mustas facar 'log in' e selektar nova pasovorto nun.\nTua tempala pasovorto expiros en {{PLURAL:$5|un dio|$5 dii}}.\n\nSe altra persono facis la demando, o se tu rimemoris tua anciena pasovorto e ne bezonas modifikar ol, tu povas ignorar ica mesajo e durar l'uzo di tua anciena pasovorto.",
"noemail": "Ne esas e-adreso konservita por la uzero \"$1\".",
"noemailcreate": "Tu mustas informar valida e-posto",
"passwordsent": "Nova pasovorto sendesis a la e-adreso registragita por \"$1\".\nVoluntez enirar altrafoye pos recevar ol.",
"eauthentsent": "E-posto por konfirmar l'informi sendesis a la e-posto indikita da vu.\nAnte ke altra e-posto sendesos a vua konto, vu mustos sequar l'instrukti mencionata en la e-posto, por konfirmar ke la konto fakte esas vua.",
"throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.",
"mailerror": "Eroro sendante posto: $1",
- "acct_creation_throttle_hit": "Vizitanti ad ica wiki uzante vua IP adreso kreis {{PLURAL:$1|1 konto|$1 konti}} ye la antea dio (24 hori), qua esas la maximo permisata. Konseque, vizitanti uzante ca IP adreso ne pluse povas krear konti prezente.",
+ "acct_creation_throttle_hit": "Viziteri di ica wiki uzante vua IP-adreso kreis {{PLURAL:$1|1 konto|$1 konti}} dum la sequanta $2, quo esas la maxima quanto permisata dum ta periodo. Konseque, viziteri uzante ica IP-adreso ne pluse povas krear nova konti prezente.",
"emailauthenticated": "Vua e-postal adreso autentikigesis ye $2, ye $3.",
"emailnotauthenticated": "Vua e-postal adreso ne ja autentikigesas.\nNula mesaji sendesos por irga di la sequanta funcioni.",
"noemailprefs": "Prizentez e-postal adreso en vua preferaji por disponar ita funcioni.",
"emailconfirmlink": "Konfirmez vua adreso di e-posto",
+ "invalidemailaddress": "La e-posto informata ne povas aceptesar, pro ke ol semblas havar nevalida formato.\nVoluntez skribar korekte la e-posto, od efacar l'informo.",
"cannotchangeemail": "E-posto-adreso dil konto ne povas chanjesar ye ta wikio.",
"emaildisabled": "Ita ret-sito ne povas sendar e-mesaji.",
"accountcreated": "Konto kreesis",
"login-abort-generic": "Vua eniro-probo faliis - Cesigita",
"login-migrated-generic": "Vua konto esas migrata, e vua uzeronomo ne plus existas che ita wikio.",
"loginlanguagelabel": "Linguo: $1",
+ "suspicious-userlogout": "Vua demando pri ekiro ('log out') refuzesis, pro ke ol semblas sendesir de retnavigilo krevita, o de 'proxy' antee konservita.",
"pt-login": "Enirar",
"pt-login-button": "Enirar",
"pt-login-continue-button": "Durez enirar",
"botpasswords-label-delete": "Efacar",
"botpasswords-label-resetpassword": "Sendez nova pasovorto per e-posto",
"botpasswords-label-grants": "Uzebla grantaji:",
+ "botpasswords-label-grants-column": "Permisita",
+ "botpasswords-bad-appid": "La nomo \"$1\" por la bot-programo esas nevalida.",
+ "botpasswords-updated-title": "La pasovorto dil 'bot' aktualigesis",
"resetpass-submit-loggedin": "Chanjar pasovorto",
"resetpass-submit-cancel": "Anular",
"resetpass-wrong-oldpass": "Nevalida provizora od aktuala pasovorto.\nForsan vu ja chanjis vua pasovorto o demandis nova provizora pasovorto.",
"resetpass-temp-emailed": "Vu eniris uzante provizora pasovorto.\nPor parkompletigar enirado, vu mustas krear nova pasovorto hike:",
"resetpass-temp-password": "Provizora pasovorto:",
"passwordreset": "Sendez nova pasovorto per e-posto",
+ "passwordreset-text-one": "Garnisez ica formulario por recevar provizora pasovorto per vua e-posto.",
"passwordreset-username": "Uzantonomo:",
+ "passwordreset-domain": "Interreto-domeno:",
+ "passwordreset-email": "E-postal adreso:",
+ "passwordreset-emailtitle": "Detali pri la konto en {{SITENAME}}",
+ "passwordreset-emailtext-ip": "Ulu (probable vu, de la IP-adresO $1) demandis la remplaso di la pasovorto por {{SITENAME}} ($4). La sequanta {{PLURAL:$3|konto|konti}} esas asociita kun ta adreso di e-posto:\n\n$2\n\nIca tempala {{PLURAL:$3| pasovorto|pasovorti}} perdos la valideso pos {{PLURAL:$5|un dio|$5 dii}}.\nTu mustas facar 'log in' e selektar nova pasovorto nemediate. Se altra persono facis ica demando, o se vu rimemoris l'antea pasovorto e ne pluse bezonas modifikor ol, vu povas ignorar ica mesajo e durar l'uzo dil antea pasovorto.",
+ "passwordreset-emailelement": "Uzantonomo:\n$1\n\nProvizora pasovorto:\n$2",
+ "passwordreset-emailsentemail": "Se ica e-posto esas asociita kun vua konto, do la nova pasovorto sendesos a vu per e-posto.",
"passwordreset-invalidemail": "Ne-valida e-posto-adreso",
"passwordreset-nodata": "Nek uzeronomo nek e-posto-adreso esis provizita",
"changeemail": "Chanjar od efacar e-postal adreso",
"anoneditwarning": "<strong>Averto:</strong> Vu ne eniris.\nVua IP-adreso esos videbla publike se vu redaktos. Se vu <strong>[$1 enirus]</strong> od <strong>[$2 kreus konto]</strong>, vua redakti atribuesos a vua uzeronomo, kune kun altra bonaji.",
"anonpreviewwarning": "<em>Vu ne eniris. Konservar chanji registragos vua IP-adreso en la redakto-historio di ta pagino.</em>",
"missingcommenttext": "Voluntez, skribez komento sube.",
- "summary-preview": "Prevido di la rezumo:",
+ "summary-preview": "Previdado di la rezumo:",
+ "subject-preview": "Previdado di la temo:",
+ "previewerrortext": "Eventis eroro kande on probis krear previdado pri vua modifikuri.",
"blockedtitle": "La uzero esas blokusita",
"blockedtext": "<strong>Vua uzantonomo od IP-adreso blokusesis.</strong>\n\n$1 blokusis vu.\nLa motivo esis <em>$2</em>.\n\n* Komenco di la blokuso: $8\n* Fino di la blokuso: $6\n* Motivo dil blokuso: $7\n\nVu povas kontaktar $1 od altra [[{{MediaWiki:Grouppage-sysop}}|administrero]] por diskutar la blokuso.\nVu ne povas uzar \"email this user\" por sendar e-posto ecepte se valida email indikesis en tua [[Special:Preferences|preferaji dil uzanto]], e se vu ne blokusesis por uzar ol.\nVua nuna IP-adreso esas $3, e la ID dil blokuso esas #$5.\nVoluntez inkluzor omna detali adsupre en omna demandi quin vu facos.",
+ "autoblockedtext": "<strong>Vua uzantonomo od IP-adreso blokusesis.</strong>\n\n$1 blokusis vu.\nLa motivo esis <em>$2</em>.\n\n* Komenco di la blokuso: $8\n* Fino di la blokuso: $6\n* Motivo dil blokuso: $7\n\nVu povas kontaktar $1 od altra [[{{MediaWiki:Grouppage-sysop}}|administrero]] por diskutar la blokuso.\nVu ne povas uzar \"email this user\" por sendar e-posto ecepte se valida email indikesis en tua [[Special:Preferences|preferaji dil uzanto]], e se vu ne blokusesis por uzar ol.\nVua nuna IP-adreso esas $3, e la ID dil blokuso esas #$5.\nVoluntez inkluzor omna detali adsupre en omna demandi quin vu facos.",
"blockednoreason": "nula motivo donesis",
"whitelistedittext": "Vu mustas $1 por redaktar pagini.",
"nosuchsectiontitle": "On ne povis trovar la seciono",
"recentchangeslinked-feed": "Skyldar breytingar",
"recentchangeslinked-toolbox": "Skyldar breytingar",
"recentchangeslinked-title": "Breytingar tengdar \"$1\"",
- "recentchangeslinked-summary": "Þetta er listi yfir nýlega gerðar breytingar á síðum sem tengt er í frá tilgreindri síðu (eða á meðlimum úr tilgreindum flokki).\nSíður á [[Special:Watchlist|vaktlistanum þínum]] eru '''feitletraðar'''.",
+ "recentchangeslinked-summary": "Settu inn heiti á síðu til að sjá breytingar á síðum sem tengt er í frá þeirri síðu. (Til að sjá meðlimi í ákveðnum flokki, settu inn Flokkur:Nafn á flokki). \nBreytingar á síðum á [[Special:Watchlist|vaktlistanum þínum]] eru <strong>feitletraðar</strong>.",
"recentchangeslinked-page": "Síðutitill:",
"recentchangeslinked-to": "Sýna breytingar á síðum sem tengjast uppgefinni síðu í staðinn",
"recentchanges-page-added-to-category": "[[:$1]] bætt við flokk",
"pageinfo-article-id": "Einkennisnúmer síðunnar",
"pageinfo-language": "Tungumál síðunnar",
"pageinfo-language-change": "breyta",
+ "pageinfo-content-model": "Efnislíkan síðu",
"pageinfo-content-model-change": "breyta",
"pageinfo-robot-policy": "Attriðaskráning af vélmennum",
"pageinfo-robot-index": "Heimilað",
"version-libraries-license": "Notkunarleyfi",
"version-libraries-description": "Lýsing",
"version-libraries-authors": "Höfundar",
+ "redirect": "Endurbeining miðað við skrá, notanda, síðu, útgáfu eða innskráningarauðkenni",
"redirect-submit": "Áfram",
"redirect-lookup": "Fletta upp:",
"redirect-value": "Gildi:",
"Greis",
"Pierpao",
"Sakretsu",
- "Yiyi"
+ "Yiyi",
+ "Manvydasz"
]
},
"tog-underline": "Sottolinea i collegamenti:",
"doubleredirects": "Redirect doppi",
"doubleredirectstext": "In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.\nCiascuna riga contiene i collegamenti al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene la pagina di destinazione \"corretta\" alla quale dovrebbe puntare anche il primo redirect.\nI redirect <del>cancellati</del> sono stati corretti.",
"double-redirect-fixed-move": "[[$1]] è stata spostato.\nÈ stato automaticamente aggiornato e ora è un redirect a [[$2]].",
- "double-redirect-fixed-maintenance": "Corretto automaticamente il doppio redirect da [[$1]] a [[$2]] nel lavoro di manutenzione.",
+ "double-redirect-fixed-maintenance": "Corretto automaticamente il doppio redirect da [[$1]] a [[$2]] nel lavoro di manutenzione",
"double-redirect-fixer": "Correttore di redirect",
"brokenredirects": "Redirect errati",
"brokenredirectstext": "I seguenti redirect puntano a pagine inesistenti:",
"tag-mw-blank-description": "Modifiche che svuotano una pagina",
"tag-mw-replace": "Sostituito",
"tag-mw-replace-description": "Modifiche che rimuovono oltre il 90% del contenuto di una pagina",
- "tag-mw-rollback": "Rollback",
+ "tag-mw-rollback": "Atmesti",
"tag-mw-rollback-description": "Modifiche che ripristinano le versioni precedenti utilizzando il collegamento di rollback",
"tag-mw-undo": "Annulla",
"tag-mw-undo-description": "Modifiche che annullano le modifiche precedenti utilizzando il collegamento \"Annulla\"",
"restrictionsfield-badip": "Indirizzo IP o intervallo non valido: $1",
"restrictionsfield-label": "Intervalli IP consentiti:",
"restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Errore: $1",
+ "edit-error-long": "Errori:\n\n$1",
"revid": "versione $1",
"pageid": "ID della pagina $1",
"rawhtml-notallowed": "I tag <html> non possono essere utilizzati al di fuori delle normali pagine.",
"rcfilters-activefilters": "絞り込み",
"rcfilters-advancedfilters": "詳細フィルター",
"rcfilters-limit-title": "表示する件数",
- "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|件の変更}}、$2",
+ "rcfilters-limit-and-date-label": "過去$2の$1{{PLURAL:$1|件の変更}}",
"rcfilters-date-popup-title": "検索期間",
"rcfilters-days-title": "日数",
"rcfilters-hours-title": "時間",
"doubleredirects": "二重転送",
"doubleredirectstext": "このページでは、転送ページへの転送ページを列挙します。\n最初の転送ページ、その転送先にある転送ページ、さらにその転送先にあるページ、それぞれへのリンクを各行に表示しています。多くの場合は最終的な転送先が「正しい」転送先であり、最初の転送ページの転送先は最終的な転送先に直接向けるべきです。\n<del>取り消し線</del>が入った項目は解決済みです。",
"double-redirect-fixed-move": "[[$1]]を移動しました。\n自動的に更新され、今後は[[$2]]に転送されます。",
- "double-redirect-fixed-maintenance": "メンテナンス作業の一環として[[$1]]から[[$2]]への二重転送を自動的に修正します。",
+ "double-redirect-fixed-maintenance": "メンテナンス作業の一環として[[$1]]から[[$2]]への二重転送を自動的に修正します",
"double-redirect-fixer": "転送修正係",
"brokenredirects": "迷子のリダイレクト",
"brokenredirectstext": "以下は、存在しないページへのリダイレクトの一覧です:",
"restrictionsfield-badip": "無効な IP アドレス、またはその範囲: $1",
"restrictionsfield-label": "許可する IP の範囲:",
"restrictionsfield-help": "一行につき、単一の IP アドレス、もしくは CIDR による範囲。全帯域からの接続を許可する場合: <pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "エラー: $1",
+ "edit-error-long": "エラー:\n\n\n\n$1",
"revid": "版 $1",
"pageid": "ページID $1",
"rawhtml-notallowed": "<html>タグは通常ページ以外では使用できません。",
"rcfilters-restore-default-filters": "ნაგულისხმევი ფილტრების აღდგენა",
"rcfilters-clear-all-filters": "ყველა ფილტრის გაწმენდა",
"rcfilters-show-new-changes": "ახალი ცვლილებების ნახვა",
- "rcfilters-search-placeholder": "á\83¤á\83\98á\83\9aá\83¢á\83 á\83\98á\83¡ á\83\91á\83\9dá\83\9aá\83\9d á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98 (á\83\93á\83\90á\83\90á\83\97á\83\95á\83\90á\83\9aá\83\98á\83\94á\83 á\83\94á\83\97 á\83\90á\83\9c á\83\93á\83\90á\83\98á\83¬á\83§á\83\94á\83\97 á\83\90á\83\99á\83 á\83\94á\83¤á\83\95á\83\90)",
+ "rcfilters-search-placeholder": "á\83¤á\83\98á\83\9aá\83¢á\83 á\83\98á\83¡ á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98 (á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\94á\83\97 á\83\9bá\83\94á\83\9cá\83\98á\83£ á\83\90á\83\9c á\83\9bá\83\9dá\83«á\83\94á\83\91á\83\9cá\83\94á\83\97 á\83¤á\83\98á\83\9aá\83¢á\83 á\83\98á\83¡ á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98)",
"rcfilters-invalid-filter": "არასწორი ფილტრი",
"rcfilters-empty-filter": "აქტიური ფილტრები არ არის. აისახება ყველა წვლილი.",
"rcfilters-filterlist-title": "ფილტრები",
"doubleredirects": "이중 넘겨주기 목록",
"doubleredirectstext": "이 문서는 다른 넘겨주기 문서로 넘겨주고 있는 문서의 목록입니다.\n매 줄에는 첫 번째 문서와 두 번째 문서의 링크가 있습니다. 그리고 보통 첫 번째 문서가 넘겨주어야 할 \"실제\" 문서인 두 번째 넘겨주기의 대상이 있습니다.\n<del>취소선이 그어진</del> 부분은 이미 해결되었습니다.",
"double-redirect-fixed-move": "[[$1]] 문서를 이동하였습니다.\n이 문서는 자동으로 수정되었으며 이제 [[$2]] 문서로 자동으로 넘겨줍니다.",
- "double-redirect-fixed-maintenance": "유지 보수 작업에서 [[$1]]에서 [[$2]](으)로 이중 넘겨주기를 자동으로 고치고 있습니다.",
+ "double-redirect-fixed-maintenance": "유지 보수 작업에서 [[$1]]에서 [[$2]](으)로 이중 넘겨주기를 자동으로 고치고 있습니다",
"double-redirect-fixer": "넘겨주기 수리꾼",
"brokenredirects": "끊긴 넘겨주기 목록",
"brokenredirectstext": "존재하지 않는 문서로 넘겨주기가 되어 있는 문서의 목록입니다:",
"restriction-level-all": "모두",
"undelete": "삭제된 문서 보기",
"undeletepage": "삭제된 문서를 보거나 되살리기",
- "undeletepagetitle": "'''아래는 [[:$1|$1]] 판의 삭제된 판입니다'''.",
+ "undeletepagetitle": "<strong>아래 내용은 [[:$1|$1]] 문서의 삭제된 판입니다</strong>.",
"viewdeletedpage": "삭제된 문서 보기",
"undeletepagetext": "다음 {{PLURAL:$1|문서는 삭제되었지만|문서 $1개는 삭제되었지만}} 아직 보관되어 있고 되살릴 수 있습니다.\n보관된 문서는 주기적으로 삭제될 것입니다.",
"undelete-fieldset-title": "문서 되살리기",
"watchlistedit-raw-done": "주시문서 목록을 새로 고쳤습니다.",
"watchlistedit-raw-added": "{{PLURAL:$1|문서 1개|문서 $1개}}를 추가했습니다:",
"watchlistedit-raw-removed": "{{PLURAL:$1|문서 1개|문서 $1개}}를 제거했습니다:",
- "watchlistedit-clear-title": "주시문서 목록 지우기",
- "watchlistedit-clear-legend": "주시문서 목록 지우기",
+ "watchlistedit-clear-title": "주시문서 목록 비우기",
+ "watchlistedit-clear-legend": "주시문서 목록 비우기",
"watchlistedit-clear-explain": "모든 문서가 주시문서 목록에서 제거됩니다",
"watchlistedit-clear-titles": "제목:",
"watchlistedit-clear-submit": "주시목록 문서 지우기 (이는 영구적입니다!)",
"restrictionsfield-badip": "유효하지 않은 IP 주소나 대역: $1",
"restrictionsfield-label": "허용된 IP 대역:",
"restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "오류: $1",
+ "edit-error-long": "오류:\n\n$1",
"revid": "$1 판",
"pageid": "페이지 ID $1",
"rawhtml-notallowed": "<html> 태그는 일반 페이지 밖에서는 사용할 수 없습니다.",
"userjsispublic": "DEnkt drun: Op JavaScript-Ënnersäite solle keng vertraulech Informatioune stoe well se vun anere Benotzer kënne gesi ginn.",
"restrictionsfield-badip": "Net valabel IP-Adress oder Beräich: $1",
"restrictionsfield-label": "Zougeloossen IP-Beräicher:",
+ "edit-error-short": "Feeler: $1",
+ "edit-error-long": "Feeler:\n\n$1",
"revid": "Versioun $1",
"gotointerwiki": "{{SITENAME}} verloossen",
"gotointerwiki-invalid": "De spezifizéierten Titel ass net valabel.",
"autosumm-replace": "Teks vervange mit '$1'",
"autoredircomment": "Verwies door nao [[$1]]",
"autosumm-new": "Nuuj pazjena mit $1",
+ "autosumm-newblank": "haet 'n laeg pagina aangemaak",
"lag-warn-normal": "Verangeringe die nujer zeen es $1 {{PLURAL:$1|sekónd|sekónd}} waere mesjiens neet getuind in dees lies.",
"lag-warn-high": "Door 'ne hoege database-servertoeveur zeen verangeringe nujer es $1 {{PLURAL:$1|seconde|seconde}} mäögelik neet besjikbaar in de lies.",
"watchlistedit-normal-title": "Volglies bewirke",
"Macofe",
"Nemo bis",
"S4b1nuz E.656",
- "Luensu1959"
+ "Luensu1959",
+ "Feipìn"
]
},
"tog-underline": "Sotolìnnia i colegaménti",
- "tog-hideminor": "Ascondi e modìffiche minoî inte ùrtime modìffiche",
- "tog-hidepatrolled": "Ascondi e modìffiche verificæ inte ùrtime modìffiche",
- "tog-newpageshidepatrolled": "Ascondi e pàgine verificæ da l'elénco de pàgine ciù recénti",
+ "tog-hideminor": "Ascondi e modìfiche minôri inte ùrtime modìfiche",
+ "tog-hidepatrolled": "Ascondi e modìfiche verificæ inte ùrtime modìfiche",
+ "tog-newpageshidepatrolled": "Ascondi e pàgine verifichæ da l'elénco de pàgine ciù recénti",
"tog-hidecategorization": "Ascondi a categorizasión de pàgine",
- "tog-extendwatchlist": "mostra tùtte e modìffiche a-i öservatoî speciâli, no sôlo l'ùrtima",
- "tog-usenewrc": "Amùggia pe pàgina e modìffiche inte ùrtime modìffiche e sotta öservaçión",
+ "tog-extendwatchlist": "mostra tùtte e modìfiche di òservæ speciâli, no solo l'ùrtima",
+ "tog-usenewrc": "Amùggia pe pàgina e modìfiche inte ùrtime modìfiche e sotta òservaçión",
"tog-numberheadings": "Numeraçión aotomàtica di tìtoli de seçión",
- "tog-showtoolbar": "Fanni vedde a bâra di strumenti de modìffica",
- "tog-editondblclick": "Modìffica de pàgine tràmite dóggio clic",
+ "tog-showtoolbar": "Mostra a bâra di strumenti de modìfica",
+ "tog-editondblclick": "Modìfica de pàgine tràmite dóggio clic",
"tog-editsectiononrightclick": "Permetti de modificâ e seçioìn co-o clic drîto in sciô tìtolo",
- "tog-watchcreations": "Azonzi e pàgine che mi crêo e i files che càrego a-i öservatoî speciâli",
- "tog-watchdefault": "Azonzi e pàgine e i files che modìffico a-a mæ lista sotta öservaçión",
- "tog-watchmoves": "Azonzi e pà gine e i files che mescio a-a mæ lista sotta öservaçión",
- "tog-watchdeletion": "Azonzi e pàgine e i files che scancello a-a mæ lista sotta öservaçión",
- "tog-watchuploads": "Azonzi i nêuvi files che mi métto sotta öservaçión",
- "tog-watchrollback": "Azonzi a-a mæ lista sotta öservaçión e pàgine dôve ò fæto in rollback",
- "tog-minordefault": "Indica de longo cómme menô tùtte e modìffiche",
- "tog-previewontop": "Mostra l'anteprìmma de d'âto a-a cazélla de modìffica",
- "tog-previewonfirst": "Mostra l'anteprìmma in sciâ prìmma modìffica",
- "tog-enotifwatchlistpages": "Famme savéi via e-mail quande 'na pàgina ò in file inta mæ lista de öservaçión a vegne cangiâ.",
- "tog-enotifusertalkpages": "Màndime 'n'e-mail se gh'é de modìffiche inta mæ pàgina de discusción.",
- "tog-enotifminoredits": "Màndime 'n'email ascì pe-e modìffiche menoî de pàgine e di files",
- "tog-enotifrevealaddr": "Mostra o mæ indirìsso inte emails de notìffica",
+ "tog-watchcreations": "Azonzi e pàgine che mi crêo e i files che càrego a-i öservæ speciâli",
+ "tog-watchdefault": "Azonzi e pàgine e i file che mi modìffico a-a mæ lista sotta òservaçión",
+ "tog-watchmoves": "Azonzi e pà gine e i files che mescio a-a mæ lista sotta òservaçión",
+ "tog-watchdeletion": "Azonzi e pàgine e i file che scancèllo a-a mæ lista sotta òservaçión",
+ "tog-watchuploads": "Azonzi i nêuvi files che mi métto sotta òservaçión",
+ "tog-watchrollback": "Azonzi a-a mæ lista sotta òservaçión e pàgine dôve ò fæto in rollback",
+ "tog-minordefault": "Indica de longo cómme menô tùtte e modìfiche",
+ "tog-previewontop": "Mostra l'anteprìmma de d'âto a-a cazélla de modìfica",
+ "tog-previewonfirst": "Mostra l'anteprìmma in sciâ prìmma modìfica",
+ "tog-enotifwatchlistpages": "Famme savéi via e-mail quande 'na pàgina ò 'n file inta mæ lista de òservaçión a vegne cangiâ.",
+ "tog-enotifusertalkpages": "Màndime 'n'e-mail se gh'é de modìfiche inta mæ pàgina de discusción.",
+ "tog-enotifminoredits": "Màndime 'n'email ascì pe-e modìfiche menoî de pàgine e di files",
+ "tog-enotifrevealaddr": "Mostra o mæ indirìsso inte emails de notìfica",
"tog-shownumberswatching": "Mostra o nùmero di uténti che tegnan d'éuggio sta pàgina",
"tog-oldsig": "Firma atoâle:",
"tog-fancysig": "Tratta a firma cómme wikitesto (sénsa n'ingancio aotomàtico)",
"tog-uselivepreview": "Abìlita a fonçión de l'anteprìmma in diretta",
"tog-forceeditsummary": "Domàndame a confèrma se o cànpo de l'ògetto o l'é vêuo",
- "tog-watchlisthideown": "Ascondi e mæ modìffiche da-a lista sotta öservaçión",
- "tog-watchlisthidebots": "Ascondi e modìffiche di bot da-a lista sotta öservaçión",
- "tog-watchlisthideminor": "Ascondi e modìffiche minoî da-a lista sotta öservaçión",
- "tog-watchlisthideliu": "Ascondi e modìffiche di uténti intræ da-a lista sotta öservaçión",
+ "tog-watchlisthideown": "Ascondi e mæ modìfiche da-a lista sotta òservaçión",
+ "tog-watchlisthidebots": "Ascondi e modìfiche di bot da-a lista sotta òservaçión",
+ "tog-watchlisthideminor": "Ascondi e modìfiche minôri da-a lista sotta òservaçión",
+ "tog-watchlisthideliu": "Ascondi e modìfiche di uténti intræ da-a lista sotta òservaçión",
"tog-watchlistreloadautomatically": "Recàrega aotomaticaménte a lista di öservæ quande vegne cangiòu in filtro (ghe veu o JavaScript)",
- "tog-watchlisthideanons": "Ascondi e modìffiche di uténti sénsa nómme da-a lista sotta öservaçión",
- "tog-watchlisthidepatrolled": "Ascondi e modìffiche za controlæ da-a lista sotta öservaçión",
+ "tog-watchlisthideanons": "Ascondi e modìfiche di uténti sénsa nómme da-a lista sotta òservaçión",
+ "tog-watchlisthidepatrolled": "Ascondi e modìfiche za controlæ da-a lista sotta òservaçión",
"tog-watchlisthidecategorization": "Ascondi a categorizasión de pàgine",
"tog-ccmeonemails": "Màndime 'na còpia de e-mails che mi mando a-i âtri uténti",
"tog-diffonly": "No mostrâ o contegnûo da pàgina sotta o confronto fra verscioìn",
- "tog-showhiddencats": "Fanni vedde e categorîe ascôze",
- "tog-norollbackdiff": "Ometti o confronto tra verscioin doppo ch'ho fæto o ripristino",
- "tog-useeditwarning": "Avertime se lascio 'na paggina de modiffica sens'avei sarvou i cangi",
- "tog-prefershttps": "Adœuvia delongo una connescion segua quande se intra",
- "underline-always": "Sempre",
+ "tog-showhiddencats": "Fanni védde e categorîe ascôze",
+ "tog-norollbackdiff": "Ometti o confronto fra verscioin dòppo ch'ho fæto o riprìstino",
+ "tog-useeditwarning": "Avèrtime se lascio 'na pàgina de modìfica sens'avei sarvòu i cangiamenti",
+ "tog-prefershttps": "Adêuvia de longo 'na conesción segûa quande se intra",
+ "underline-always": "Sénpre",
"underline-never": "Mâi",
- "underline-default": "Impostassioin predefinie do navegatô o da skin",
- "editfont-style": "Stile do carattere de l'area de modiffica",
- "editfont-monospace": "Carattere a larghessa fissa",
- "editfont-sansserif": "Carattere sans-serif",
- "editfont-serif": "Carattere serif",
+ "underline-default": "Inpostasioìn predefinîe do navegatô ò da skin",
+ "editfont-style": "Stîle do caràtere de l'àrea de modìfica",
+ "editfont-monospace": "Caràtere a larghéssa fissa",
+ "editfont-sansserif": "Caràtere sans-serif",
+ "editfont-serif": "Caràtere serif",
"sunday": "doménega",
"monday": "lunesdì",
"tuesday": "mâtesdì",
"tagline": "Da {{SITENAME}}",
"help": "Agiùtto",
"search": "Riçèrca",
- "search-ignored-headings": " #<!-- lascia questa riga esattamente comm'a l'è --> <pre>\n# Elenco de intestaçioin che saian ignoræ da-a riçerca.\n# E modifiche a questa paggina saian effettive non apen-a a paggina a saiâ indiçizâ.\n# Ti poeu forçâ a re-indiçizzaçion de 'na paggina effettoando una modifica nulla.\n# A scintasci a l'è a seguente:\n# * Tutto da-o carattere \"#\" a-a fin da riga o l'è un commento\n# * Tutte e righe non voeue son e intestaçioin esatte da ignorâ, maiuscolo/minuscolo e tutto\nNotte\nVoxe correlæ\nCollegamenti esterni\n #</pre> <!-- lascia questa riga esattamente comm'a l'è -->",
+ "search-ignored-headings": " #<!-- lascia questa riga ezatamente com'a l'é --> <pre>\n# Elenco de intestaçioin che saian ignoræ da-a riçerca.\n# E modifiche a questa pagina saian effetive non apenn-a a pagina a saiâ indicizâ.\n# Ti peu forsâ a re-indicizaçion de 'na pagina efetoando 'na modifica nulla.\n# A scintasci a l'è a segoente:\n# * Tutto da-o carattere \"#\" a-a fin da riga o l'è un commento\n# * Tutte e righe non veue són e intestaçioin ezatte da ignorâ, maioscolo/minuscolo e tutto\nNòtte\nVôxe corelæ\nColegamenti estèrni\n #</pre> <!-- lascia quésta riga ezattamente com'a l'è -->",
"searchbutton": "Riçèrca",
"go": "Vanni",
"searcharticle": "Vanni",
"tool-link-userrights": "Modiffica groppi {{GENDER:$1|utente}}",
"tool-link-userrights-readonly": "Vixualizza groppi {{GENDER:$1|utente}}",
"tool-link-emailuser": "Manda un'e-mail a questo {{GENDER:$1|utente}}",
- "imagepage": "Vizualizza a paggina do file",
+ "imagepage": "Mostra a pagina do file",
"mediawikipage": "Vizualizza o messaggio",
"templatepage": "Vizualizza o modello",
- "viewhelppage": "Vizualizza a paggina d'agiutto",
- "categorypage": "Veddi a paggina da categoria",
- "viewtalkpage": "Amia a paggina de discuscion",
+ "viewhelppage": "Móstra a pagina d'agiutto",
+ "categorypage": "Veddi a pagina da categorîa",
+ "viewtalkpage": "Amîa a pagina de discusción",
"otherlanguages": "In âtre léngoe",
"redirectedfrom": "(Rendirissou da $1)",
- "redirectpagesub": "Paggina de rindirissamento",
+ "redirectpagesub": "Pagina de rindirissamento",
"redirectto": "Rendirissa a:",
"lastmodifiedat": "Sta pagina a l'è stæta cangiâ l'urtima votta o $1 a $2.",
- "viewcount": "'Sta paggina a l'è stæta vista {{PLURAL:$1|solo 'na vòtta|$1 vòtte}}.",
+ "viewcount": "Questa pagina a l'è stæta vista {{PLURAL:$1|solo 'na vòtta|$1 vòtte}}.",
"protectedpage": "Pàgina protètta",
"jumpto": "Vanni a:",
"jumptonavigation": "navegaçión",
- "jumptosearch": "çerca",
- "view-pool-error": "Scuza ma a-o momento i server sono stracarreghi.\nTroppi utenti çercan d' amiâ sta paggina.\nAspeta quarche menuto primma de çercâ torna d'accede a sta pagina.\n\n$1",
+ "jumptosearch": "çèrca",
+ "view-pool-error": "Ne rincresce, a-o momento i server sono soviacareghi.\nTròppi utenti çercan d'amiâ sta pagina.\nAspeta quarche menûto primma de çercâ d'acedde torna a sta pagina.\n\n$1",
"generic-pool-error": "Scuza ma a-o momento i server sono stracarreghi.\nTroppi utenti çercan d' amiâ sta risorsa.\nAspeta quarche menuto primma de çercâ torna d'accede a sta risorsa.",
"pool-timeout": "Tempo descheito aspêtando o sblocco",
"pool-queuefull": "A coa do pool a l'è pin-a",
"badaccess-group0": "No ti g'hæ o permisso pe fâ quest'assion.",
"badaccess-groups": "L'assion che ti vêu fâ a l'è permissa solo a i ûtenti {{PLURAL:$2|do gruppo|de un de sti gruppi}}: $1.",
"versionrequired": "Ghe voeu a verscion $1 de MediaWiki",
- "versionrequiredtext": "Pe doeuviâ sta paggina ghe voeu a verscion $1 do software MediaWiki. Amia [[Special:Version|l'appoxita paggina]].",
+ "versionrequiredtext": "Pe deuviâ sta pagina ghe veu a versción $1 do software MediaWiki. Amîa [[Special:Version|l'appoxita paggina]].",
"ok": "D'accòrdio",
"retrievedfrom": "Estræto da \"$1\"",
"youhavenewmessages": "Ti gh'æ $1 ($2).",
"mainpage-nstab": "Pàgina prinçipâ",
"nosuchaction": "No se poeu",
"nosuchactiontext": "L'açion specificâ inta URL a no l'è vallida.\nÒ che t'hæ scrito mâ, ò che donque l'ea sbaliou l'ingancio.\nÒ magara gh'è 'na cammoa into software dœuviou da {{SITENAME}}.",
- "nosuchspecialpage": "Sta paggina speciale a no gh'è",
- "nospecialpagetext": "<strong>A paggina speciale domandâ a no l'è stæta riconosciua.</strong>\n\nA lista de paggine speciale vallide a se treuva in [[Special:SpecialPages|Lista de paggine speciale]].",
+ "nosuchspecialpage": "Sta pagina speciale a no gh'é",
+ "nospecialpagetext": "<strong>A paggina speciale domandâ a no l'è stæta riconosciûa.</strong>\n\nA lista de pagine speciale valide a se treuva in [[Special:SpecialPages|Lista de paggine speciale]].",
"error": "Errô",
"databaseerror": "Errô do database",
"databaseerror-text": "L'è ocorso un errô inte 'na çerchia in sciô database. \nO porriæ indicâ un bug into software.",
"databaseerror-function": "Fonsion: $1",
"databaseerror-error": "Errô: $1",
"transaction-duration-limit-exceeded": "Pe evitâ un ato ritardo de replica, questa opiaçion a l'è stæta interotta perché a duata do tempo de scrittua ($1) a l'ha superou o limmite de $2 {{PLURAL:$2|segondo|segondi}}.\nSe t'ê aproeuvo a cangiâ tante cose inte'na votta sola, proeuva invece a cangiâ poche cose in tante votte.",
- "laggedslavemode": "'''Attension:''' a paggina a porriæ no riportâ i aggiornamenti ciù reçenti.",
+ "laggedslavemode": "'''Atension:''' a pagina a poriéva no riportâ i agiornamenti ciù recenti.",
"readonly": "Database bloccòu",
"enterlockreason": "Scrivi o motivo do blocco, e 'na stimma de quande o saiâ rimosso",
"readonlytext": "Po-u momento o database o l'è bloccou a-e neuve azonte e modiffiche, foscia pe 'na manutension ordenaia do database, doppo a quæ o saiâ torna accescibile.\n\nL'amministratô ch'o l'ha misso o blocco o l'ha dæto sta spiegassion: $1",
"unexpected": "Valô imprevisto: \"$1\"=\"$2\".",
"formerror": "Errô: imposcibbile inviâ o formulaio",
"badarticleerror": "L'açion che ti te veu fâ a non l'è permissa in sta pagina.",
- "cannotdelete": "Non se peu scassâ a paggina ò o file \"$1\" . O porriæ ese za stæto scassòu da quarchedun atro.",
- "cannotdelete-title": "Imposcibbile scassâ a paggina \"$1\"",
+ "cannotdelete": "Non se peu scasâ a pagina ò o file \"$1\" . O poriéva êse za stæto scasòu da quarchedun atro.",
+ "cannotdelete-title": "Imposcibile scasâ a pagina \"$1\"",
"delete-hook-aborted": "A scassaxon a l'è stæta annullâ dall'hook.\nO no l'ha dæto arcun-a spiegassion.",
- "no-null-revision": "No l'è stæto poscibbile creâ una verscion nulla pe-a paggina \"$1\"",
+ "no-null-revision": "No l'è stæto poscibile creâ una verscion nulla pe-a pagina \"$1\"",
"badtitle": "O tìtolo o no l'è corretto.",
- "badtitletext": "O tittolo da paggina çercâ o l'è vêuo, sballiòu o con caratteri no accettæ, oppû o deriva da 'n errô inti collegamenti inter-lengoa o inter-wiki.",
- "title-invalid-empty": "O tittolo da paggina domandâ o l'è veuo ò o contene solo che-o nomme de un namespace.",
- "title-invalid-utf8": "O tittolo da paggina domandâ o conten una sequensa UTF-8 non vallida.",
- "title-invalid-interwiki": "O tittolo da paggina domandâ o conten un ingancio interwiki ch'o no poeu ese doeuviòu inti tittoli.",
- "title-invalid-talk-namespace": "O tittolo da paggina domandâ o fa rifeimento a 'na paggina de discusscion ch'a no peu existe.",
- "title-invalid-characters": "O tittolo da paggina domandâ o conten di caratteri invallidi: \"$1\".",
+ "badtitletext": "O titolo da pagina çercâ o l'è vêuo, sbaliòu o con caratteri no acetæ, opûre o deriva da 'n erô inti colegamenti inter-lengoa o inter-wiki.",
+ "title-invalid-empty": "O titolo da pagina domandâ o l'è veuo ò o contegne solo che-o nomme de'n namespace.",
+ "title-invalid-utf8": "O titolo da pagina domandâ o contegne 'na sequensa UTF-8 non valida.",
+ "title-invalid-interwiki": "O titolo da pagina domandâ o contegne un ingancio interwiki ch'o no peu ese adeuviòu inti titoli.",
+ "title-invalid-talk-namespace": "O titolo da pagina domandâ o fa rifeimento a 'na pagina de discusción ch'a no peu existe.",
+ "title-invalid-characters": "O titolo da pagina domandâ o contegne di caratteri no validi: \"$1\".",
"title-invalid-relative": "O tittolo o conten un percorso relativo (./, ../). Tæ tittoli no son vallidi, perché risultian soventi irazonzibbili quande gestii da-o navegatô de l'utente.",
- "title-invalid-magic-tilde": "O tittolo da paggina domandâ o no l'è vallido in quante o conten a succescion speciale de tirde (<nowiki>~~~</nowiki>).",
- "title-invalid-too-long": "O tittolo da paggina domandâ o l'è troppo longo. O no peu ese ciù longo de {{PLURAL:$1|byte}} in codifica UTF-8.",
- "title-invalid-leading-colon": "O tittolo da paggina domandâ o no l'è vallido perchè o comensa con doî ponti.",
+ "title-invalid-magic-tilde": "O titolo da pagina domandâ o no l'è valido in quante o contegne a sucesión speciale de tirde (<nowiki>~~~</nowiki>).",
+ "title-invalid-too-long": "O titolo da pagina domandâ o l'è troppo longo. O no peu ese ciù longo de {{PLURAL:$1|byte}} inta codifica UTF-8.",
+ "title-invalid-leading-colon": "O titolo da pagina domandâ o no l'è valido perché o l'incomensa con doî ponti.",
"perfcached": "I dæti chì apreuvo son estræti da 'na coppia ''cache'' do database, e porrieivan no ese agiornæ. Un mascimo de {{PLURAL:$1|un risultou o l'è disponibbile|$1 risultæ son disponibbili}} into cache.",
"perfcachedts": "I dæti chì apreuvo son estræti da una coppia ''cache'' do database, o quæ urtimo agiornamento o remonta a-o $1. Un mascimo de {{PLURAL:$4|un risultou o l'è disponibbile|$4 risultæ son disponibili}} into cache.",
- "querypage-no-updates": "I aggiornamenti da paggina son temporaniamente sospeixi. I dæti in essa contegnui no saian aggiornæ.",
+ "querypage-no-updates": "I agiornamenti da pagina son temporaniamente sospeixi. I dæti in lé contegnui no saian aggiornæ.",
"viewsource": "Veddi a fonte",
"viewsource-title": "Visualizza sorgente de $1",
"actionthrottled": "Assion ritardâ",
"actionthrottledtext": "Comme mesua de segueça contra o spam, l'esecuçion de çerte açioin a l'è limitâ a un nummero mascimo de votte inte 'n determinòu periodo de tempo, limmite che ti t'hæ superòu. Se prega de riprovâ tra quarche menuto.",
- "protectedpagetext": "Sta paggina a l'è stæta protezûa pe impedîne a modiffica ò di atre açioin.",
- "viewsourcetext": "L'è poscibbile amiâ e copiâ a sorgente de sta paggina.",
- "viewyourtext": "L'è poscibbile amiâ e copiâ a sorgente de <strong>teu modiffiche</strong> a sta paggina.",
- "protectedinterface": "Sta paggina a conten un elemento ch'o fa parte de l'interfaccia utente do software de sto scito e a l'è protetta pe evitâ poscibbili abuxi.\nPe azonze o modificâ e tradussioin vallide insce tutti i wiki, deuvia [https://translatewiki.net/ translatewiki.net], o progetto de localizzassion de MediaWiki.",
- "editinginterface": "<strong>Attension:</strong> o scrito de sta paggina o fa parte de l'interfaccia utente do software de questo scito. Tutte e modiffiche apportæ a questa paggina se riflettan in scî messaggi visualizzæ pe tutti i utenti in sce questo wiki.",
+ "protectedpagetext": "Sta pagina a l'è stæta protezûa pe impedîne a modifica ò atre açioin.",
+ "viewsourcetext": "L'è poscibile amiâ e copiâ a sorgente de sta pagina.",
+ "viewyourtext": "L'è poscibile amiâ e copiâ a sorgente de <strong>teu modifiche</strong> a sta pagina.",
+ "protectedinterface": "Sta pagina a contegne un elemento ch'o fa parte de l'interfaccia utente do software de sto scito e a l'è protetta pe evitâ poscibili abuxi.\nPe azonze o modificâ e tradusioìn valide insce tutti i wiki, deuvia [https://translatewiki.net/ translatewiki.net], o progetto de localizasión de MediaWiki.",
+ "editinginterface": "<strong>Atensión:</strong> o scrîto de sta pagina o fa parte de l'interfaccia utente do software de questo scito. Tutte e modifiche aportæ a questa pagina se riflèttan in scî mesaggi visualizæ pe tutti i utenti in sce questa wiki.",
"translateinterface": "Pe azonze ò modificâ e tradussioin vallide insce tutti i wiki, deuvia [https://translatewiki.net/ translatewiki.net], o progetto MediaWiki pe-a localizzassion.",
- "cascadeprotected": "Insce sta paggina no l'è poscibbile effettuâ modiffiche perché a l'è inclusa {{PLURAL:$1|inta paggina indicâ de seguito, ch'a l'è stæta protetta|inte paggine indicæ de seguito, ch'en stæte protette}} selessionando a protession \"ricorsciva\":\n$2",
+ "cascadeprotected": "Insce sta pagina no l'è poscibile efetoâ modifiche perché a l'è incluza {{PLURAL:$1|inta pagina indicâ dòppo, ch'a l'è stæta protètta|inte pagine indichæ de seguito, che son stæte protètte}} selesionando a protesion \"ricorsciva\":\n$2",
"namespaceprotected": "No ti g'hæ i permissi necessai pe modificâ e paggine do namespace '''$1'''.",
"customcssprotected": "No ti g'hæ i permissi pe cangiâ sta pagina CSS percose a conten e impostaçioin personale de 'n atro utente.",
"customjsprotected": "No ti gh'æ i permessi pe cangiâ sta pagina de JavaScript percose a contegne e impostaçioin personæ de 'n atro utente",
- "mycustomcssprotected": "No ti g'hæ i permissi pe cangiâ sta paggina CSS.",
- "mycustomjsprotected": "No ti g'hæ o permisso pe modificâ sta paggina JavaScript .",
+ "mycustomcssprotected": "No ti g'hæ i permissi pe cangiâ sta pagina CSS.",
+ "mycustomjsprotected": "No ti g'hæ o permisso pe modificâ sta pagina JavaScript.",
"myprivateinfoprotected": "No ti g'hæ o permisso pe modificâ i teu dæti personali.",
"mypreferencesprotected": "No ti g'hæ o permisso pe modificâ e teu preferense.",
"ns-specialprotected": "No se pœu modificâ e paggine speciali",
"recentchanges-submit": "Fanni vedde",
"rcfilters-activefilters": "Filtri attivi",
"rcfilters-advancedfilters": "Filtri avançæ",
- "rcfilters-quickfilters": "Sarva e impostaçioin do filtro",
- "rcfilters-quickfilters-placeholder-title": "Nesciun ingancio sarvou ancon",
+ "rcfilters-quickfilters": "Sarva e impostaçioìn do filtro",
+ "rcfilters-quickfilters-placeholder-title": "Nisciun ingancio ancón sarvòu",
"rcfilters-quickfilters-placeholder-description": "Pe sarvâ e impostaçioin do to filtro e doeuviâle torna ciu tardi, clicca l'icona segnalibbro inte l'area \"Filtri attivi\" chì de sotta",
"rcfilters-savedqueries-defaultlabel": "Filtri sarvæ",
"rcfilters-savedqueries-rename": "Rinommina",
"rcfilters-savedqueries-unsetdefault": "Rimoeuvi comme predefinio",
"rcfilters-savedqueries-remove": "Leva",
"rcfilters-savedqueries-new-name-label": "Nomme",
- "rcfilters-savedqueries-apply-label": "Sarva impostaçioin",
+ "rcfilters-savedqueries-apply-label": "Sarva impostaçioìn",
"rcfilters-savedqueries-cancel-label": "Anulla",
"rcfilters-savedqueries-add-new-title": "Sarva e impostaçioin attoale do filtro",
"rcfilters-restore-default-filters": "Ripristina i filtri predefinii",
"rcfilters-clear-all-filters": "Netezza tutti i filtri",
- "rcfilters-search-placeholder": "Filtra i urtime modiffiche (navega ò comença a digitâ)",
+ "rcfilters-search-placeholder": "Filtra e urtime modifiche (navega ò comença a digitâ)",
"rcfilters-invalid-filter": "Filtro non vallido",
"rcfilters-empty-filter": "Nisciun filtro attivo. Se ghe vedde tutti i contributi.",
"rcfilters-filterlist-title": "Filtri",
- "rcfilters-filterlist-whatsthis": "Cos'o l'è sto chì?",
- "rcfilters-filterlist-feedbacklink": "Lascia un commento in sciâ noeuva fonçionalitæ sperimentale",
+ "rcfilters-filterlist-whatsthis": "C\81ómme fonsion-an?",
+ "rcfilters-filterlist-feedbacklink": "Dinne cöse ti ne pensi de quésti (neuvi) strumenti del filtro",
"rcfilters-highlightbutton-title": "Evidençia risultæ",
"rcfilters-highlightmenu-title": "Seleçion-a un cô",
"rcfilters-highlightmenu-help": "Seleçion-a un cô pe evidençiâ sta propietæ",
"rcfilters-filterlist-noresults": "Nisciun filtro atrovou",
"rcfilters-noresults-conflict": "Nisciun risultou trovou percose i critei de çerchia son in conflito",
"rcfilters-state-message-subset": "Sto filtro chì o no g'ha effetto percose i so risultæ son incluxi con quelli {{PLURAL:$2|do seguente filtro ciu ampio|di seguenti filtri ciu ampi}} (proeuva a evidençiâli pe distinguili): $1",
- "rcfilters-state-message-fullcoverage": "A seleçion de tutti i filtri inte 'n groppo l'è comme no seleçionâne manc'un, coscì che sto filtro o no fa effetto. O groppo o l'includde: $1",
+ "rcfilters-state-message-fullcoverage": "Seleçionâ tutti i filtri inte quésto gruppo l'è comme no seleçionâne nisciun, coscì che sto filtro o no l'à de effetto. O gruppo o l'includde: $1",
"rcfilters-filtergroup-authorship": "Aotô do contributo",
"rcfilters-filter-editsbyself-label": "E to modiffiche",
"rcfilters-filter-editsbyself-description": "I to contributi.",
"rcfilters-filter-editsbyother-label": "E modiffiche di atri",
"rcfilters-filter-editsbyother-description": "Tutte e modiffiche sarvo e to.",
- "rcfilters-filtergroup-userExpLevel": "Livello d'esperiença (solo pe i utenti registræ)",
- "rcfilters-filter-user-experience-level-registered-label": "Registrou",
- "rcfilters-filter-user-experience-level-registered-description": "Contributoî conessi.",
- "rcfilters-filter-user-experience-level-unregistered-label": "Non registrou",
- "rcfilters-filter-user-experience-level-unregistered-description": "Contributoî non conessi.",
+ "rcfilters-filtergroup-userExpLevel": "Livèllo d'esperiença (solo pe i utenti registræ)",
+ "rcfilters-filter-user-experience-level-registered-label": "Registròu",
+ "rcfilters-filter-user-experience-level-registered-description": "Contributoî conesci.",
+ "rcfilters-filter-user-experience-level-unregistered-label": "Non registròu",
+ "rcfilters-filter-user-experience-level-unregistered-description": "Contributoî non conesci.",
"rcfilters-filter-user-experience-level-newcomer-label": "Noeuvi utenti",
- "rcfilters-filter-user-experience-level-newcomer-description": "Meno de 10 modiffiche e 4 giorni d'attivitæ.",
+ "rcfilters-filter-user-experience-level-newcomer-description": "Meno de 10 modifiche e 4 giórni d'attivitæ.",
"rcfilters-filter-user-experience-level-learner-label": "Prinçipianti",
- "rcfilters-filter-user-experience-level-learner-description": "Con ciu esperiença di \"Noeuvi arrivæ\" ma meno che i \"Utenti esperti\".",
+ "rcfilters-filter-user-experience-level-learner-description": "Con ciu esperiença di \"Neuvi arrivæ\" ma meno che i \"Utenti asperti\".",
"rcfilters-filter-user-experience-level-experienced-label": "Utenti con esperiença",
"rcfilters-filter-user-experience-level-experienced-description": "Ciù de 30 giorni d'attivitæ e 500 modiffiche.",
"rcfilters-filtergroup-automated": "Contributi aotomattichi",
"rcfilters-typeofchange-conflicts-hideminor": "Questo filtro \"Tipo di modifica\" o l'è in conflito co-o filtro \"Modiffiche minoî\". Çerti tipi de modiffiche no poeuan ese indicæ comme \"minoî\".",
"rcfilters-filtergroup-lastRevision": "Urtima revixon",
"rcfilters-filter-lastrevision-label": "Urtima revixon",
- "rcfilters-filter-lastrevision-description": "I urtime modiffiche a 'na paggina.",
- "rcfilters-filter-previousrevision-label": "Verscioin precedente",
- "rcfilters-filter-previousrevision-description": "Tutte e modiffiche che no son l'urtima modiffica a-a paggina.",
+ "rcfilters-filter-lastrevision-description": "Solo e modiffiche ciu recenti a 'na pagina.",
+ "rcfilters-filter-previousrevision-label": "No l'urtima versción",
+ "rcfilters-filter-previousrevision-description": "Tutte e modifiche che no son \"l'urtima revixón\".",
"rcfilters-filter-excluded": "Escluzo",
"rcfilters-tag-prefix-namespace-inverted": "<strong>:non</strong> $1",
"rcfilters-view-tags": "Modiffiche etichettæ",
"recentchangeslinked-feed": "Cangiamenti correlæ",
"recentchangeslinked-toolbox": "Cangiaménti corelæ",
"recentchangeslinked-title": "Modiffiche correlæ a \"$1\"",
- "recentchangeslinked-summary": "Sta pàgina a fâ védde i cangiaménti ciù recénti a-e pàgine colegæ a questa.\nE pàgine che t'æ in öservaçión inti [[Special:Watchlist|öservæ speciâli]] son in '''grascetto'''.",
+ "recentchangeslinked-summary": "Scrivi o nomme de 'na pagina pe vèdde i cangiamenti a-e pagine coleghæ a ò da quésta pagina. (Pe védde i menbri de 'na catgorîa, scrive Category:Nomme da catgorîa). Cangiamenti e-e pagine insce [[Special:Watchlist|your Watchlist]] són in <strong>bold</strong>.",
"recentchangeslinked-page": "Nómme da pàgina:",
"recentchangeslinked-to": "Fanni védde sôlo i cangiaménti a-e pàggine conligæ a-a pàggina specificâ",
"recentchanges-page-added-to-category": "[[:$1]] azonto a-a categoria",
"category-article-count-limited": "{{PLURAL:$1|Rodomas|Rodomi|Rodoma}} $1 šios kategorijos {{PLURAL:$1|puslapis|puslapiai|puslapių}}.",
"category-file-count": "{{PLURAL:$2|Šioje kategorijoje yra viena rinkmena.|{{PLURAL:$1|Rodomas|Rodomi|Rodoma}} $1 šios kategorijos {{PLURAL:$1|rinkmena|rinkmenos|rinkmenų}} (iš viso kategorijoje yra $2 {{PLURAL:$2|rinkmena|rinkmenos|rinkmenų}}).}}",
"category-file-count-limited": "{{PLURAL:$1|Rodomas|Rodomi|Rodoma}} $1 šios kategorijos {{PLURAL:$1|failas|failai|failų}}.",
- "listingcontinuesabbrev": "tęs.",
+ "listingcontinuesabbrev": "tęsti",
"index-category": "Indeksuoti puslapiai",
"noindex-category": "Neindeksuoti puslapiai",
"broken-file-category": "Puslapiai su neteisingomis nuorodomis į failus",
"actionthrottled": "Veiksmas apribotas",
"actionthrottledtext": "Kad būtų apsisaugota nuo pažeidimų, jums neleidžiama pernelyg daug kartų atlikti šį veiksmą per trumpą laiko tarpą. Jūs viršijote šį limitą. Prašome vėl pamėginti po kelių minučių.",
"protectedpagetext": "Šis puslapis yra užrakintas, saugant jį nuo redagavimo.",
- "viewsourcetext": "Jūs galite peržiūrėti ir kopijuoti puslapio kodą:",
+ "viewsourcetext": "Jūs galite peržiūrėti ir kopijuoti puslapio kodą.",
"viewyourtext": "Jūs galite peržiūrėti ir kopijuoti <strong>savo pakeitimų</strong> kodą į šį puslapį:",
"protectedinterface": "Šiame puslapyje yra apsaugotas nuo piktnaudžiavimo programinės įrangos sąsajos tekstas. Norėdami pridėti ar pakeisti vertimus visose wiki, naudokite [https://translatewiki.net/ translatewiki.net] MediaWiki vertimų projektą.",
"editinginterface": "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudotojams šiame wiki.",
"media_sample": "Pavyzdys.ogg",
"media_tip": "Nuoroda į rinkmeną",
"sig_tip": "Jūsų parašas bei laikas",
- "hr_tip": "Horizontali linija (naudokite taupiai)",
+ "hr_tip": "Horizontali linija (naudokite saikingai)",
"summary": "Paaiškinimas:",
"subject": "Tema:",
"minoredit": "Tai smulkus pataisymas",
"search-file-match": "(atitinka rinkmenos turinį)",
"search-suggest": "Galbūt norėjote ieškoti: $1",
"search-rewritten": "Rodomi $1 rezultatai. Vietoje to ieškoti $2.",
- "search-interwiki-caption": "Dukterinių projektų rezultatai",
+ "search-interwiki-caption": "Kitų projektų rezultatai",
"search-interwiki-default": "Rezultatai iš $1:",
"search-interwiki-more": "(daugiau)",
"search-interwiki-more-results": "daugiau rezultatų",
"prefs-editwatchlist-clear": "Išvalyti stebimųjų sąrašą",
"prefs-watchlist-days": "Dienos rodomos stebimųjų sąraše:",
"prefs-watchlist-days-max": "Daugiausiai 7 {{PLURAL:$1|diena|dienos|dienų}}",
- "prefs-watchlist-edits": "Kiek daugiausia keitimų rodyti išplėstiniame stebimųjų sąraše:",
+ "prefs-watchlist-edits": "Kiek daugiausia keitimų rodyti stebimųjų sąraše:",
"prefs-watchlist-edits-max": "Didžiausias skaičius: 1000",
"prefs-watchlist-token": "Stebimųjų sąrašo raktas:",
"prefs-misc": "Įvairūs nustatymai",
"recentchangesdays-max": "(daugiausiai $1 {{PLURAL:$1|diena|dienos|dienų}})",
"recentchangescount": "Numatytasis rodomas keitimų skaičius:",
"prefs-help-recentchangescount": "Į tai įeina naujausi keitimai, puslapių istorijos ir specialiųjų veiksmų sąrašai.",
- "prefs-help-watchlist-token2": "Tai yra slaptas jūsų stebimųjų sąrašo raktas, skirtas žiniatinkliui.\nKiekvienas, kurį jį žino, gali skaityti jūsų stebimųjų puslapių sąrašą, taigi, juo nesidalinkite.\nJei reikia jį anuliuoti, [[Special:ResetTokens|spauskite čia]].",
+ "prefs-help-watchlist-token2": "Tai yra slaptas jūsų stebimųjų sąrašo raktas, skirtas žiniatinkliui.\nKiekvienas, kuris jį žino, gali skaityti jūsų stebimųjų puslapių sąrašą, taigi, juo nesidalinkite.\nJei norite, [[Special:ResetTokens|galite jį anuliuoti]].",
"savedprefs": "Nustatymai sėkmingai išsaugoti.",
"savedrights": "Naudotojo {{GENDER:$1|$1}} grupės buvo išsaugotos.",
"timezonelegend": "Laiko juosta:",
"email-blacklist-label": "Neleisti šiems vartotojams siųsti man el. laiškų:",
"prefs-searchoptions": "Paieška",
"prefs-namespaces": "Vardų sritys",
- "default": "pagal nutylėjimą",
+ "default": "numatytasis",
"prefs-files": "Failai",
"prefs-custom-css": "Asmeninis CSS",
"prefs-custom-js": "Asmeninis JavaSript",
"group-all": "(visi)",
"group-user-member": "{{GENDER:$1|naudotojas|naudotoja}}",
"group-autoconfirmed-member": "{{GENDER:$1|automatiškai patvirtintas naudotojas|automatiškai patvirtinta naudotoja}}",
- "group-bot-member": "Robotas",
- "group-sysop-member": "Administratorius",
- "group-bureaucrat-member": "Biurokratas",
+ "group-bot-member": "{{GENDER:$1|robotas}}",
+ "group-sysop-member": "{{GENDER:$1|administratorius|administratorė}}",
+ "group-bureaucrat-member": "{{GENDER:$1|biurokratas|biurokratė}}",
"group-suppress-member": "{{GENDER:$1|slopintojas|slopintoja}}",
"grouppage-user": "{{ns:project}}:Naudotojai",
"grouppage-autoconfirmed": "{{ns:project}}:Automatiškai patvirtinti naudotojai",
"recentchanges-legend": "Naujausių keitimų parinktys",
"recentchanges-summary": "Žemiau pateikiamas naujausių šio projekto pakeitimų sąrašas.",
"recentchanges-noresult": "Per nurodytą laiką atliktų keitimų, atitinkančių nurodytas sąlygas, nėra.",
- "recentchanges-feed-description": "Sekite pačius naujausius projekto keitimus šiame šaltinyje.",
+ "recentchanges-timeout": "Šios paieškos laikas baigėsi. Pabandykite ieškoti su kitais paieškos nustatymais.",
+ "recentchanges-network": "Dėl techninės klaidos, nepavyko įkelti rezultatų. Prašome pabandyti perkrauti puslapį.",
+ "recentchanges-feed-description": "Sekite pačius naujausius projekto keitimus šiame puslapyje.",
"recentchanges-label-newpage": "Šiuo keitimu sukurtas naujas puslapis",
"recentchanges-label-minor": "Tai smulkus pakeitimas",
"recentchanges-label-bot": "Šį keitimą atliko automatinė programa",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taip pat žiūrėkite [[Special:NewPages|naujausių straipsnių sąrašą]])",
"recentchanges-submit": "Rodyti",
"rcfilters-tag-remove": "Pašalinti '$1'",
+ "rcfilters-legend-heading": "<strong>Santrumpų sąrašas:</strong>",
"rcfilters-other-review-tools": "Kiti peržiūros įrankiai",
+ "rcfilters-group-results-by-page": "Grupuoti rezultatus pagal puslapį",
"rcfilters-activefilters": "Aktyvūs filtrai",
"rcfilters-advancedfilters": "Detalūs filtrai",
+ "rcfilters-limit-title": "Rodyti rezultatų",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}, $2",
+ "rcfilters-date-popup-title": "Paieškos laikotarpis",
+ "rcfilters-days-title": "Pastarosios dienos",
+ "rcfilters-hours-title": "Pastarosios valandos",
+ "rcfilters-days-show-days": "$1 {{PLURAL:$1|dienos|dienų}}",
+ "rcfilters-days-show-hours": "$1 {{PLURAL:$1|valandos|valandų}}",
+ "rcfilters-highlighted-filters-list": "Paryškinta: $1",
"rcfilters-quickfilters": "Išsaugoti filtrai",
"rcfilters-quickfilters-placeholder-title": "Nėra išsaugotų filtrų",
+ "rcfilters-quickfilters-placeholder-description": "Norėdami išsaugoti filtravimo nustatymus ir vėliau juos naudoti, spustelėkite žymės piktogramą, esančią aktyvių filtrų srityje.",
"rcfilters-savedqueries-defaultlabel": "Išsaugoti filtrai",
"rcfilters-savedqueries-rename": "Pervadinti",
"rcfilters-savedqueries-setdefault": "Nustatyti kaip numatytą",
"rcfilters-savedqueries-unsetdefault": "Pašalinti kaip numatytą",
"rcfilters-savedqueries-remove": "Pašalinti",
"rcfilters-savedqueries-new-name-label": "Pavadinimas",
- "rcfilters-savedqueries-new-name-placeholder": "Apibūdinkite šio filtro tikslą.",
+ "rcfilters-savedqueries-new-name-placeholder": "Apibūdinkite šio filtro tikslą",
"rcfilters-savedqueries-apply-label": "Sukurti filtrą",
+ "rcfilters-savedqueries-apply-and-setdefault-label": "Sukurti numatytąjį filtrą",
"rcfilters-savedqueries-cancel-label": "Atšaukti",
- "rcfilters-savedqueries-add-new-title": "Išsaugoti dabartinius filtro nustatymus",
+ "rcfilters-savedqueries-add-new-title": "Išsaugoti dabartinius filtravimo nustatymus",
"rcfilters-restore-default-filters": "Atstatyti numatytuosius filtrus",
"rcfilters-clear-all-filters": "Valyti visus filtrus",
- "rcfilters-search-placeholder": "Filtruoti naujausius pakeitimus (naršykite arba pradėkite rašyti)",
+ "rcfilters-show-new-changes": "Rodyti naujausius keitimus",
+ "rcfilters-search-placeholder": "Filtruoti pakeitimus (naudokitės meniu arba ieškokite filtro pavadinimo)",
"rcfilters-invalid-filter": "Negalimas filtras",
- "rcfilters-empty-filter": "Nėra aktyvių filtrų. Rodomi visi indeliai.",
+ "rcfilters-empty-filter": "Nėra aktyvių filtrų. Rodomi visi indėliai.",
"rcfilters-filterlist-title": "Filtrai",
"rcfilters-filterlist-whatsthis": "Kaip tai veikia?",
"rcfilters-filterlist-feedbacklink": "Pateikite atsiliepimą apie šiuos (naujus) filtravimo įrankius",
"rcfilters-highlightmenu-help": "Pasirinkite spalvą šio elemento paryškinimui",
"rcfilters-filterlist-noresults": "Nerastas toks filtras",
"rcfilters-noresults-conflict": "Nerasta jokių rezultatų, nes paieškos kriterijai konfliktuoja",
+ "rcfilters-filtergroup-authorship": "Indėlio autorius",
"rcfilters-filter-editsbyself-label": "Jūsų keitimai",
"rcfilters-filter-editsbyself-description": "Jūsų keitimai.",
"rcfilters-filter-editsbyother-label": "Kitų keitimai",
"rcfilters-filter-editsbyother-description": "Visi keitimai, išskyrus jūsų.",
- "rcfilters-filtergroup-userExpLevel": "Patirties lygis (tik registruotiems vartotojams)",
+ "rcfilters-filtergroup-userExpLevel": "Vartotojo registracija ir patirtis",
"rcfilters-filter-user-experience-level-registered-label": "Registruoti",
"rcfilters-filter-user-experience-level-registered-description": "Prisijungę naudotojai.",
"rcfilters-filter-user-experience-level-unregistered-label": "Neregistruoti",
"rcfilters-filter-user-experience-level-unregistered-description": "Naudotojai, kurie nėra prisijungę.",
"rcfilters-filter-user-experience-level-newcomer-label": "Naujokai",
- "rcfilters-filter-user-experience-level-newcomer-description": "Mažiau nei 10 keitimų ir 4 dienų aktyvumo.",
+ "rcfilters-filter-user-experience-level-newcomer-description": "Registruoti naudotojai, turintys mažiau nei 10 keitimų ir 4 aktyvias dienas.",
"rcfilters-filter-user-experience-level-learner-label": "Mokiniai",
+ "rcfilters-filter-user-experience-level-learner-description": "Registruoti naudotojai, kurių patirties lygis yra tarp „Naujokų“ ir „Patyrusių vartotojų“",
"rcfilters-filter-user-experience-level-experienced-label": "Patyrę vartotojai",
- "rcfilters-filter-user-experience-level-experienced-description": "Daugiau nei 30 dienų veiklos ir 500 keitimų.",
+ "rcfilters-filter-user-experience-level-experienced-description": "Registruoti naudotojai, turintys daugiau nei 500 keitimų ir 30 dienų veiklos.",
"rcfilters-filtergroup-automated": "Automatiniai indeliai",
- "rcfilters-filter-bots-label": "Robotas",
+ "rcfilters-filter-bots-label": "Roboto",
"rcfilters-filter-bots-description": "Keitimai, atlikti automatinių įrankių.",
"rcfilters-filter-humans-label": "Žmogaus (ne roboto)",
"rcfilters-filter-humans-description": "Keitimai atlikti žmonių.",
"rcfilters-filter-unpatrolled-description": "Pakeitimai pažymėti kaip nestebimi.",
"rcfilters-filtergroup-significance": "Reikšmė",
"rcfilters-filter-minor-label": "Smulkūs pakeitimai",
- "rcfilters-filter-minor-description": "Keitimai, kuriuos autorius pažymėjo kaip mažus.",
+ "rcfilters-filter-minor-description": "Keitimai, kuriuos autorius pažymėjo kaip smulkius.",
"rcfilters-filter-major-label": "Nesmulkūs pakeitimai",
"rcfilters-filter-major-description": "Keitimai, nepažymėti kaip smulkūs.",
- "rcfilters-filtergroup-watchlist": "Puslapiai, įtraukti į stebimų sąrašą",
- "rcfilters-filter-watchlist-watched-label": "Stebimų sąraše",
- "rcfilters-filter-watchlist-watched-description": "Pakeitimai puslapiuose, jūsų Stebimųjų sąraše.",
- "rcfilters-filter-watchlist-watchednew-label": "Nauji Stebimųjų sąrašo pakeitimai",
- "rcfilters-filter-watchlist-notwatched-label": "Nėra Stebimųjų sąraše",
+ "rcfilters-filtergroup-watchlist": "Stebimi puslapiai",
+ "rcfilters-filter-watchlist-watched-label": "Stebimųjų sąraše",
+ "rcfilters-filter-watchlist-watched-description": "Pakeitimai puslapiuose, iš jūsų stebimųjų sąrašo.",
+ "rcfilters-filter-watchlist-watchednew-label": "Nauji stebimųjų sąrašo pakeitimai",
+ "rcfilters-filter-watchlist-watchednew-description": "Pakeitimai stebimuose puslapiuose, kuriuose neapsilankėte nuo tada, kai pakeitimai buvo paskelbti.",
+ "rcfilters-filter-watchlist-notwatched-label": "Nėra stebimųjų sąraše",
+ "rcfilters-filter-watchlist-notwatched-description": "Visi keitimai, išskyrus keitimus puslapiuose iš stebimųjų sąrašo.",
+ "rcfilters-filtergroup-watchlistactivity": "Stebimųjų sąrašo veikla",
"rcfilters-filter-watchlistactivity-unseen-label": "Neperžiūrėti pakeitimai",
+ "rcfilters-filter-watchlistactivity-unseen-description": "Pakeitimai puslapiuose, kuriuose neapsilankėte nuo tada, kai pakeitimai buvo paskelbti.",
"rcfilters-filter-watchlistactivity-seen-label": "Peržiūrėti pakeitimai",
+ "rcfilters-filter-watchlistactivity-seen-description": "Pakeitimai puslapiuose, kuriuose apsilankėte nuo tada, kai pakeitimai buvo paskelbti.",
"rcfilters-filtergroup-changetype": "Pakeitimo tipas",
"rcfilters-filter-pageedits-label": "Puslapių keitimai",
+ "rcfilters-filter-pageedits-description": "Keitimai viki turinyje, aptarimuose, kategorijų aprašymuose…",
"rcfilters-filter-newpages-label": "Puslapių sukūrimai",
"rcfilters-filter-newpages-description": "Keitimai, kurie sukuria naujus puslapius.",
"rcfilters-filter-categorization-label": "Kategorijų pakeitimai",
- "rcfilters-filter-categorization-description": "Įrašai puslapių, kurie yra pridedami ar pašalinami iš kategorijų.",
- "rcfilters-filter-logactions-label": "Įrašyti veiksmai",
+ "rcfilters-filter-categorization-description": "Keitimai, kuriais puslapiai yra pridedami ar pašalinami iš kategorijų.",
+ "rcfilters-filter-logactions-label": "Įrašyti į sąrašą veiksmai",
+ "rcfilters-filter-logactions-description": "Administravimo veiksmai, paskyrų sukūrimai, puslapių trynimai, įkėlimai…",
+ "rcfilters-filtergroup-lastRevision": "Naujausios versijos",
+ "rcfilters-filter-lastrevision-label": "Naujausia versija",
"rcfilters-filter-lastrevision-description": "Tik naujausias puslapio keitimas.",
- "rcfilters-filter-previousrevision-description": "Visi keitimai, kurie nėra naujausi puslapio keitimai.",
+ "rcfilters-filter-previousrevision-label": "Ne naujausia versija",
+ "rcfilters-filter-previousrevision-description": "Visi keitimai, kurie nėra „paskutinė versija“.",
+ "rcfilters-filter-excluded": "Įkelta",
+ "rcfilters-tag-prefix-namespace-inverted": "<strong>:ne</strong> $1",
+ "rcfilters-exclude-button-off": "Įkelti pasirinktus",
+ "rcfilters-exclude-button-on": "Įkeliami pasirinktieji",
"rcfilters-view-tags": "Pažymėti keitimai",
- "rcfilters-view-tags-help-icon-tooltip": "Sužinoti daugiau apie Pažymėtus pakeitimus",
+ "rcfilters-view-namespaces-tooltip": "Rodyti rezultatus pagal vardų sritį",
+ "rcfilters-view-tags-tooltip": "Rodyti rezultatus naudojančius keitimo žymes",
+ "rcfilters-view-return-to-default-tooltip": "Grįžti į pagrindinį filtravimo meniu",
+ "rcfilters-view-tags-help-icon-tooltip": "Sužinoti daugiau apie pažymėtus pakeitimus",
"rcfilters-liveupdates-button": "Gyvi atnaujinimai",
"rcfilters-liveupdates-button-title-on": "Išjungti gyvus atnaujinimus",
+ "rcfilters-liveupdates-button-title-off": "Įkelti naujus keitimus, kai jie įvyksta",
"rcfilters-watchlist-markseen-button": "Pažymėti visus pakeitimus kaip peržiūrėtus",
"rcfilters-watchlist-edit-watchlist-button": "Redaguoti stebimųjų sąrašą",
"rcfilters-watchlist-showupdated": "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra <strong>paryškinti</strong>.",
"rcfilters-preference-label": "Slėpti patobulintą naujausių pakeitimų versiją",
"rcfilters-filter-showlinkedfrom-label": "Rodyti pakeitimus puslapiuose, iš kurių esate nukreipti",
- "rcfilters-target-page-placeholder": "Įveskite puslapio pavadinimą",
+ "rcfilters-target-page-placeholder": "Įveskite puslapio pavadinimą (arba kategoriją)",
"rcnotefrom": "Žemiau yra {{PLURAL:$5|pakeitimas|pakeitimai}} pradedant <strong>$3, $4</strong> (rodoma iki <strong>$1</strong> pakeitimų).",
"rclistfromreset": "Nustatyti duomenų pasirinkimą iš naujo",
"rclistfrom": "Rodyti naujus pakeitimus pradedant $3 $2",
"show": "Rodyti",
"minoreditletter": "S",
"newpageletter": "N",
- "boteditletter": "r",
+ "boteditletter": "a",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|stebintis naudotojas|stebintys naudotojai|stebinčių naudotojų}}]",
"rc_categories": "Riboti kategorijoms (atskirkite su „|“)",
"rc_categories_any": "Bet kuris iš pasirinktųjų",
"recentchangeslinked-feed": "Susiję keitimai",
"recentchangeslinked-toolbox": "Susiję keitimai",
"recentchangeslinked-title": "Su „$1“ susiję keitimai",
- "recentchangeslinked-summary": "Tai paskutinių keitimų, atliktų puslapiuose, į kuriuos yra nuoroda iš nurodyto puslapio (arba į nurodytos kategorijos narius), sąrašas.\nPuslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškinti'''.",
+ "recentchangeslinked-summary": "Įveskite puslapio pavadinimą, jei norite žiūrėti keitimus, atliktus puslapiuose, į kuriuos yra nuoroda į arba iš nurodyto puslapio. (Jei norite žiūrėti nurodytos kategorijos narius, įveskite Kategorija:Kategorijos pavadinimas). Puslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra <strong>paryškinti</strong>.",
"recentchangeslinked-page": "Puslapio pavadinimas:",
"recentchangeslinked-to": "Rodyti su duotuoju puslapiu susijusių puslapių pakeitimus",
"recentchanges-page-added-to-category": "[[:$1]] pridėta prie kategorijos",
- "recentchanges-page-added-to-category-bundled": "[[:$1]] ir [[Special:WhatLinksHere/$1|{{PLURAL:$2|vienas puslapis|$2 puslapiai}}]] pridėti prie kategorijos",
+ "recentchanges-page-added-to-category-bundled": "[[:$1]] pridėti prie kategorijos, [[Special:WhatLinksHere/$1|šis puslapis yra įtrauktas su kitais puslapiais]]",
"recentchanges-page-removed-from-category": "[[:$1]] pašalinta iš kategorijos",
- "recentchanges-page-removed-from-category-bundled": "[[:$1]] ir {{PLURAL:$2|vienas puslapis|$2 puslapiai}} pašalinti iš kategorijos",
+ "recentchanges-page-removed-from-category-bundled": "[[:$1]] pašalinti iš kategorijos, [[Special:WhatLinksHere/$1|šis puslapis yra įtrauktas kartu su kitais puslapiais]]",
"autochange-username": "MediaWiki automatinis pakeitimas",
"upload": "Įkelti rinkmeną",
"uploadbtn": "Įkelti rinkmeną",
"emaillink": "siųsti el. laišką",
"autoblocker": "Jūs buvote automatiškai užblokuotas, nes jūsų IP adresą neseniai naudojo „[[User:$1|$1]]“. Nurodyta naudotojo $1 blokavimo priežastis: „$2“.",
"blocklogpage": "Blokavimų sąrašas",
- "blocklog-showlog": "Šis naudotojas buvo užblokuotas.\nPateikiamas paskutinis blokavimo istorijos įrašas.",
+ "blocklog-showlog": "Šis naudotojas jau yra buvęs užblokuotas.\nPateikiamas paskutinis blokavimo istorijos įrašas.",
"blocklog-showsuppresslog": "Šis naudotojas buvo užblokuotas ir paslėptas anksčiau.\nŽemiau yra pateiktas slėpimų žurnalas:",
"blocklogentry": "užblokavo [[$1]], blokavimo laikas - $2 $3",
"reblock-logentry": "pakeisti [[$1]] blokavimo nustatymai, naujas blokavimo laikas – $2 $3",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Žyma|Žymos}}]]: $2)",
"tag-mw-contentmodelchange": "turinio modulio keitimas",
"tag-mw-contentmodelchange-description": "Pakeitimai, kurie [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel keičia puslapio turinio modelį]",
+ "tag-mw-blank-description": "Keitimai, ištrinantys visą puslapio turinį",
+ "tag-mw-replace": "Pakeista",
+ "tag-mw-rollback": "Atmesti",
"tag-mw-undo": "Anuliuoti",
"tags-title": "Žymos",
"tags-intro": "Šiame puslapyje yra žymų, kuriomis programinė įranga gali pažymėti keitimus, sąrašas bei jų reikšmės.",
"log-action-filter-patrol-autopatrol": "Automatinis patikrinimas",
"log-action-filter-protect-protect": "Apsauga",
"log-action-filter-protect-modify": "Apsaugos keitimas",
+ "log-action-filter-protect-unprotect": "Atrakinimas",
"log-action-filter-protect-move_prot": "Apsauga perkelta",
"log-action-filter-rights-rights": "Rankinis keitimas",
"log-action-filter-rights-autopromote": "Automatinis keitimas",
"linkaccounts-submit": "Susieti paskyras",
"unlinkaccounts": "Atsieti paskyras",
"unlinkaccounts-success": "Paskyra buvo atsieta.",
+ "edit-error-short": "Klaida: $1",
+ "edit-error-long": "Klaidos:\n\n$1",
"revid": "apžvalga $1",
"pageid": "puslapio ID $1",
"rawhtml-notallowed": "<html> negali būti naudojamos ne normaliuose puslapiuose.",
"gotointerwiki": "Išeinama iš {{SITENAME}}",
"gotointerwiki-invalid": "Nurodytas pavadinimas negalimas.",
+ "pagedata-title": "Puslapio duomenys",
"pagedata-bad-title": "Negalimas pavadinimas: $1."
}
"backend-fail-hashes": "Neizdevās iegūt failu kontrolsummas salīdzināšanai.",
"backend-fail-notsame": "Neidentisks fails jau pastāv $1.",
"backend-fail-delete": "Nevar izdzēst failu $1.",
+ "backend-fail-describe": "Nevarēja izmainīt faila \"$1\" metadatus.",
"backend-fail-alreadyexists": "Fails $1 jau pastāv.",
"backend-fail-store": "Neizdevās saglabāt failu \"$1\" \"$2\".",
"backend-fail-copy": "Nevar kopēt failu $1 uz $2.",
"protectcomment": "Iemesls:",
"protectexpiry": "Beidzas:",
"protect_expiry_invalid": "Beigu termiņš ir nederīgs.",
- "protect_expiry_old": "Beigu termiņs ir pagātnē.",
+ "protect_expiry_old": "Beigu termiņš ir pagātnē.",
"protect-unchain-permissions": "Pieslēgt papildu aizsargāšanas iespējas",
"protect-text": "Šeit var apskatīt un izmainīt lapas <strong>$1</strong> aizsardzības līmeni.",
"protect-locked-access": "Jūsu kontam nav atļaujas mainīt lapas aizsardzības pakāpi.\nPašreizējie lapas '''$1''' iestatījumi ir:",
"blocklist-userblocks": "Paslēpt kontu bloķējumus",
"blocklist-tempblocks": "Paslēpt pagaidu bloķējumus",
"blocklist-addressblocks": "Paslēpt vienas IP adreses bloķējumus",
+ "blocklist-rangeblocks": "Paslēpt IP adrešu diapazona blokus",
"blocklist-timestamp": "Laiks",
"blocklist-target": "Mērķis",
+ "blocklist-expiry": "Beidzas",
+ "blocklist-by": "Bloķējušais administrators",
"blocklist-params": "Bloķēšanas parametri",
"blocklist-reason": "Iemesls",
"ipblocklist-submit": "Meklēt",
"block-log-flags-nousertalk": "nevar izmainīt savu diskusiju lapu",
"block-log-flags-hiddenname": "lietotājvārds slēpts",
"ipb_expiry_invalid": "Nederīgs beigu termiņš",
+ "ipb_expiry_old": "Beigu termiņš ir pagātnē.",
"ipb_expiry_temp": "Slēpto lietotājvārdu bloķēšanai jābūt beztermiņa.",
"ipb_already_blocked": "\"$1\" jau ir bloķēts",
"ipb-needreblock": "$1 jau ir bloķēts.\nVai tu gribi izmainīt bloka uzstādījumus?",
"unlockconfirm": "Jā, es tiešām vēlos atbloķēt datubāzi.",
"lockbtn": "Bloķēt datubāzi",
"unlockbtn": "Atbloķēt datubāzi",
+ "locknoconfirm": "Tu neatzīmēji apstiprinājuma rūtiņu.",
"lockdbsuccesssub": "Datubāzes bloķēšana pabeigta",
"unlockdbsuccesssub": "Datubāze atbloķēta",
"unlockdbsuccesstext": "Datubāze ir atbloķēta.",
- "databasenotlocked": "Datubāzē nav bloķēta.",
+ "databaselocked": "Datubāze jau ir bloķēta.",
+ "databasenotlocked": "Datubāze nav bloķēta.",
"move-page": "Pārvietot $1",
"move-page-legend": "Pārvietot lapu",
"movepagetext": "Šajā lapā tu vari pārdēvēt vai pārvietot lapu, kopā tās izmaiņu hronoloģiju pārvietojot to uz citu nosaukumu.\nIepriekšējā lapa kļūs par lapu, kas pāradresēs uz jauno lapu.\nŠeit var automātiski izmainīt visas pāradresācijas (redirektus) uz šo lapu (2. ķeksis apakšā).\nSaites pārējās lapās uz iepriekšējo lapu netiks mainītas. Ja izvēlies neizmainīt pāradresācijas automātiski, noteikti pārbaudi un izlabo, izskaužot [[Special:DoubleRedirects|dubultu pāradresāciju]] vai [[Special:BrokenRedirects|pāradresāciju uz neesošu lapu]].\nTev ir jāpārliecinās, vai saites vēl aizvien ved tur, kur tās ir paredzētas.\n\nŅem vērā, ka lapa '''netiks''' pārvietota, ja jau eksistē kāda cita lapa ar vēlamo nosaukumu (izņemot gadījumus, kad tā ir tukša vai kad tā ir pāradresācijas lapa, kā arī tad, ja tai nav izmaiņu hronoloģijas).\nTas nozīmē, ka tu vari pārvietot lapu atpakaļ, no kurienes tu jau reiz to esi pārvietojis, ja būsi kļūdījies, bet tu nevari pārrakstīt jau esošu lapu.\n\n'''BRĪDINĀJUMS!'''\nPopulārām lapām tā var būt krasa un negaidīta pārmaiņa;\npirms turpināšanas vēlreiz pārdomā, vai tu izproti visas iespējamās sekas.",
"movenotallowedfile": "Tev nav atļaujas pārvietot failus.",
"cant-move-user-page": "Tev nav atļaujas pārvietot lietotāju lapas (neskaitot apakšlapas).",
"cant-move-to-user-page": "Tev nav atļaujas pārvietot lapu uz lietotāja lapu (neskaitot lietotāja lapas apakšlapu).",
+ "cant-move-category-page": "Tev nav atļaujas pārvietot kategoriju lapas.",
+ "cant-move-to-category-page": "Tev nav atļaujas pārvietot lapu uz kategorijas lapu.",
+ "cant-move-subpages": "Tev nav atļaujas pārvietot apakšlapas.",
+ "namespace-nosubpages": "Vārdtelpā \"$1\" apakšlapas nav atļautas.",
"newtitle": "Jaunais nosaukums:",
"move-watch": "Uzraudzīt šo lapu",
"movepagebtn": "Pārvietot lapu",
"specialpage-securitylevel-not-allowed-title": "Nav atļauts",
"cannotauth-not-allowed-title": "Atļauja liegta",
"credentialsform-account": "Konta nosaukums:",
+ "edit-error-short": "Kļūda: $1",
+ "edit-error-long": "Kļūdas:\n\n$1",
"revid": "versija $1",
"pageid": "lapas ID $1",
"gotointerwiki-invalid": "Norādītais nosaukums ir nederīgs.",
"doubleredirects": "Двојни пренасочувања",
"doubleredirectstext": "Оваа страница ги прикажува пренасочувачките страници до други пренасочувачки страници.\nСекој ред содржи врски кон првото и второто пренасочување, како и целта на второто пренасочување, кое обично ја посочува <i>вистинската</i> целна страница кон која првото пренасочување би требало да насочува.\n<del>Пречкртаните</del> ставки треба да се разрешат.",
"double-redirect-fixed-move": "Страницата „[[$1]]“ е преместена.\nСега е самоподновена и пренасочува кон [[$2]].",
- "double-redirect-fixed-maintenance": "Самоисправка на двојно пренасочување од [[$1]] на [[$2]] во задача за одржување.",
+ "double-redirect-fixed-maintenance": "Самоисправка на двојно пренасочување од [[$1]] на [[$2]] во задача за одржување",
"double-redirect-fixer": "Исправувач на пренасочувања",
"brokenredirects": "Прекинати пренасочувања",
"brokenredirectstext": "Следните пренасочувања водат до непостоечки страници.",
"restrictionsfield-badip": "Неважечки IP-дијапазон на адреси: $1",
"restrictionsfield-label": "Допуштени IP-опсези:",
"restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
+ "edit-error-short": "Грешка: $1",
+ "edit-error-long": "Грешки:\n\n$1",
"revid": "преработка $1",
"pageid": "назнака на страницата $1",
"rawhtml-notallowed": "<html>-ознаките не може да се користат вон нормалните страници.",
"log-action-filter-rights-rights": "मानवी बदल",
"log-action-filter-suppress-block": "रोधामार्फत सदस्य दाबणे",
"changecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) बदला",
- "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा"
+ "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा",
+ "edit-error-short": "त्रुटी: $1",
+ "edit-error-long": "त्रुटी:$1"
}
"restrictionsfield-badip": "Ugyldig IP-adresse eller intervall: $1",
"restrictionsfield-label": "Tillatte IP-intervaller:",
"restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk: <pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Feil: $1",
+ "edit-error-long": "Feil:\n\n$1",
"revid": "revisjon $1",
"pageid": "side-ID $1",
"rawhtml-notallowed": "<html>-tagger kan ikke brukes utenfor normale sider.",
"doubleredirects": "Dubbele doorverwijzingen",
"doubleredirectstext": "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.\nElke rij bevat koppelingen naar de eerste en de tweede doorverwijspagina en een koppeling naar de doelpagina van de tweede doorverwijspagina.\nMeestal is de laatste pagina het eigenlijke doel, waar de eerste pagina naar zou moeten doorverwijzen.\n<del>Doorgehaalde regels</del> geven aan dat het probleem al is opgelost.",
"double-redirect-fixed-move": "[[$1]] is verplaatst.\nHet is automatisch bijgewerkt en verwijst nu naar [[$2]].",
- "double-redirect-fixed-maintenance": "Automatische dubbele doorverwijzing van [[$1]] naar [[$2]] herstellen in een onderhoudstaak.",
+ "double-redirect-fixed-maintenance": "Automatische dubbele doorverwijzing van [[$1]] naar [[$2]] herstellen in een onderhoudstaak",
"double-redirect-fixer": "Doorverwijzingen opschonen",
"brokenredirects": "Defecte doorverwijzingen",
"brokenredirectstext": "De onderstaande doorverwijzingen verwijzen naar niet-bestaande pagina's.",
"restrictionsfield-badip": "Nieprawidłowy adres IP lub zakres adresów: $1",
"restrictionsfield-label": "Dozwolone zakresy adresów IP:",
"restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Błąd: $1",
+ "edit-error-long": "Błędy:\n\n$1",
"revid": "wersja $1",
"pageid": "ID strony: $1",
"rawhtml-notallowed": "Znaczniki <html> nie mogą być stosowane poza zwykłymi stronami.",
"Saanvel",
"Satdeep gill",
"Abbas dhothar",
- "Saraiki"
+ "Saraiki",
+ "BukhariSaeed"
]
},
"tog-underline": "جوڑ تھلے لین:",
"currentrev": "ہن آلی تبدیلی",
"currentrev-asof": "$1 ویلے دا صفحہ",
"revisionasof": "دی تبدیلیاں $1",
- "revision-info": " $1 دی دہرائی توں {{جنس:$6|$2}}$7",
+ "revision-info": "$1 دی دہرائی توں {{GENDER:$6|$2}}$7",
"previousrevision": "← اوس توں پچھلا کم",
"nextrevision": "نویں تبدیلی →",
"currentrevisionlink": "موجودہ حالت",
"revdelete-uname-unhid": "ورتن والے دا ناں ںئیں لکیا",
"revdelete-restricted": "مکھیاں تے روکاں لگیاں",
"revdelete-unrestricted": "مکھیاں تے روکاں لتھیاں",
- "logentry-move-move": "$1 {{جنس:$2|پلٹی}} صفہ $3 توں $4",
+ "logentry-move-move": "$1 {{GENDER:$2|پلٹی}} صفہ $3 توں $4",
"logentry-move-move-noredirect": "$1 {{GENDER:$2|پلٹی}} صفہ $3 توں $4 اک ڑیڈائرکٹ چھڈے بنا",
"logentry-move-move_redir": "$1 {{GENDER:$2|پلٹی}} صفہ $3 توں $4 ریڈائرکٹ",
"logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|پلٹی}} صفہ $3 توں $4 اک ریڈائرکٹ دے بنا کسے ریڈائرکٹ دتیاں",
"timezoneregion-indian": "هندی سمندر",
"timezoneregion-pacific": "غلی سمندر",
"allowemail": "د نورو کارنانو لخوا د برېښليک رالېږل چارن کړه",
+ "email-allow-new-users-label": "د نویو کارنانو لخوا د برېښناليک راليږلو ته اجازه ورکړئ",
+ "email-blacklist-label": "دا کارنان ماته د بریښنالیک رالیږلو څخه منع کړي:",
"prefs-searchoptions": "پلټنه",
"prefs-namespaces": "نوم-تشيالونه",
"default": "تلواليز",
"allpagesbadtitle": "ورکړ شوی سرليک سم نه دی او يا هم د ژبو او يا د بېلابېلو ويکي گانو مختاړی لري. ستاسو په سرليک کې يو يا څو داسې ابېڅې دي کوم چې په سرليک کې نه شي کارېدلی.",
"allpages-bad-ns": "{{SITENAME}} د \"$1\" په نامه هېڅ کوم نوم-تشيال نه لري.",
"allpages-hide-redirects": "مخ گرځونې پټول",
+ "cachedspecial-viewing-cached-ttl": "تاسو د دې پاڼې هغه نسخه ګورئ، کومه چې به ممکنن $1 زړه وي.",
"cachedspecial-refresh-now": "تر ټولو تازه کتل.",
"categories": "وېشنيزې",
"categories-submit": "ښکاره کول",
"activeusers-intro": "دا د هغو کارنانو لړليک دی چې په {{PLURAL:$1|تېرې|تېرو}} $1 {{PLURAL:$1|ورځ|ورځو}} کې يې ونډې ترسره کړي.",
"activeusers-count": "په {{PLURAL:$3|تېرې ورځ|تېرو $3 ورځو}} کې $1 {{PLURAL:$1|سمون|سمونونه}}",
"activeusers-from": "هغه کارنان کتل چې نومونه يې پېلېږي په:",
+ "activeusers-groups": "د ډلو کارنان ښودل:",
+ "activeusers-excludegroups": "د ګروپونو اړوند کاروونکي غوره کړئ:",
"activeusers-noresult": "کارن و نه موندل شو.",
"activeusers-submit": "فعاله کارنان ښکاره کول",
"listgrouprights": "د کارن ډلو رښتې",
"protect-otherreason-op": "بل سبب",
"protect-dropdown": "*د ژغورلو عام سببونه\n** ډېره زياته ورانکاري\n** ډېره زياته سپام خپرونه\n** بې گټې سمونې او خپرونې\n** ډېر لوستونکی مخ",
"protect-edit-reasonlist": "د ژغورنې سببونه سمول",
- "protect-expiry-options": "1 ساعت:1 hour,1 ورځ:1 day,1 اوونۍ:1 week,2 اوونۍ:2 weeks,1 مياشت:1 month,3 مياشتې:3 months,6 مياشتې:6 months,1 کال:1 year,نامحدوده:infinite",
+ "protect-expiry-options": "۲ ساعتونه:2 hours,۱ ورځ:1 day,۳ ورځې:3 days,۱ اوونۍ:1 week,۲ اوونۍ:2 weeks,۱ مياشت:1 month,۳ مياشت:3 months,۶ مياشت:6 months,۱ کال:1 year,نامحدوده:infinite",
"restriction-type": "اجازه:",
"restriction-level": "د بنديز کچه:",
"minimum-size": "وړه کچه",
"ipbenableautoblock": "په اتوماتيکه توگه د کارن په وروستنۍ IP پتې چې کارن کارولې، او هر هغو IP پتو باندې چې کارن د سمون هڅه ورباندې کړې بنديز لگول",
"ipbsubmit": "په دې کارن بنديز لگول",
"ipbother": "بل وخت:",
- "ipboptions": "2 ساعتونه:2 hours,1 ورځ:1 day,3 ورځې:3 days,1 اوونۍ:1 week,2 اوونۍ:2 weeks,1 مياشت:1 month,3 مياشتې:3 months,6 مياشتې:6 months,1 کال:1 year,نامحدوده:infinite",
+ "ipboptions": "۲ ساعتونه:2 hours,۱ ورځ:1 day,۳ ورځې:3 days,۱ اوونۍ:1 week,۲ اوونۍ:2 weeks,۱ مياشت:1 month,۳ مياشت:3 months,۶ مياشت:6 months,۱ کال:1 year,نامحدوده:infinite",
"ipbhidename": "کارن-نوم له سمون او لړليکونو پټول",
"ipbwatchuser": "د دې کارن د خبرو اترو مخ او کارن مخ کتل",
"ipb-disableusertalk": "د بنديز لگېدو سره دې د کارن د خبرو اترو مخ د سمولو مخنيوی هم پلي شي",
"sp-newimages-showfrom": "هغه نوې دوتنې چې په $1 په $2 بجو پيلېږي ښکاره کول",
"minutes-abbrev": "$1 دقیقي",
"hours-abbrev": "$1 گ",
+ "days-abbrev": "$1 ورځې",
"seconds": "{{PLURAL:$1|$1 ثانيه|$1 ثانيې}}",
"minutes": "{{PLURAL:$1|$1 دقيقه|$1 دقيقې}}",
"hours": "{{PLURAL:$1|يو ساعت|$1 ساعتونه}}",
"doubleredirects": "Redirecionamentos duplos",
"doubleredirectstext": "Esta página lista as páginas que redirecionam para outros redirecionamentos.\nCada linha contém links para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.\nEntradas <del>riscadas</del> foram resolvidas.",
"double-redirect-fixed-move": "[[$1]] foi movido\nEle foi atualizado automaticamente e agora é um redirecionamento para [[$2]]",
- "double-redirect-fixed-maintenance": "Corrigindo automaticamente o redirecionamento duplo de [[$1]] para [[$2]] em uma tarefa de manutenção.",
+ "double-redirect-fixed-maintenance": "A corrigir automaticamente o redirecionamento duplo de [[$1]] para [[$2]] num processo de manutenção",
"double-redirect-fixer": "Corretor de redirecionamentos",
"brokenredirects": "Redirecionamentos quebrados",
"brokenredirectstext": "Os seguintes redirecionamentos ligam para páginas inexistentes:",
"restrictionsfield-badip": "Endereço IP ou intervalo inválido: $1",
"restrictionsfield-label": "Intervalos IP permitidos:",
"restrictionsfield-help": "Um endereço IP ou intervalo CIDR por linha. Para ativar tudo, use\n<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Erro: $1",
+ "edit-error-long": "Erros:\n$1",
"revid": "revisão $1",
"pageid": "ID da página $1",
"rawhtml-notallowed": "As tags <html> não podem ser usadas fora das páginas normais.",
"doubleredirects": "Redirecionamentos duplos",
"doubleredirectstext": "Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.\nCada linha contém hiperligações para o primeiro e segundo redirecionamentos, bem como o destino do segundo redirecionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redirecionamento.\n<del>Entradas cortadas</del> já foram solucionadas.",
"double-redirect-fixed-move": "[[$1]] foi movida.\nEla foi atualizada automaticamente e agora redireciona para [[$2]].",
- "double-redirect-fixed-maintenance": "A corrigir automaticamente o redirecionamento duplo de [[$1]] para [[$2]] num processo de manutenção.",
+ "double-redirect-fixed-maintenance": "A corrigir automaticamente o redirecionamento duplo de [[$1]] para [[$2]] num processo de manutenção",
"double-redirect-fixer": "Corretor de redirecionamentos",
"brokenredirects": "Redirecionamentos quebrados",
"brokenredirectstext": "Os seguintes redirecionamentos contêm hiperligações para páginas inexistentes:",
"restrictionsfield-badip": "Endereço IP (ou gama de endereços IP) inválido: $1",
"restrictionsfield-label": "Gamas de endereços IP permitidas:",
"restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para ativar todos,\nuse: <pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Erro: $1",
+ "edit-error-long": "Erros:\n\n$1",
"revid": "revisão $1",
"pageid": "identificador de página $1",
"rawhtml-notallowed": "As etiquetas <html> não podem ser utilizadas fora de páginas normais.",
"anonpreviewwarning": "See also:\n* {{msg-mw|Anoneditwarning}}",
"missingsummary": "The text \"edit summary\" is in {{msg-mw|Summary}}.\n\nSee also:\n* {{msg-mw|Missingcommentheader}}\n* {{msg-mw|Savearticle}}\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.",
"selfredirect": "Notice displayed once after the user tries to create a redirect to the same article.\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.",
- "missingcommenttext": "This message is shown, when the textbox by a new-section is empty.",
+ "missingcommenttext": "This message is shown when the user tries to save a textbox created by the new section links, and the textbox is empty. \"Comment\" refers to the content that is supposed to be posted in the new section, usually a talk page comment.",
"missingcommentheader": "Edit summary that is shown if you enable \"Prompt me when entering a blank summary\" and add a new section without headline to a talk page.\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.\n\n\"Subject\" is {{msg-mw|subject}}.\n\nSee also:\n* {{msg-mw|Missingsummary}}\n* {{msg-mw|Savearticle}}",
"summary-preview": "Preview of the edit summary, shown under the edit summary itself.\nShould match: {{msg-mw|summary}}.",
"subject-preview": "Used as label for preview of the section title when adding a new section on a talk page.\n\nShould match {{msg-mw|subject}}.\n\nSee also:\n* {{msg-mw|Summary-preview}}\n\n{{Identical|Subject}}",
"pageinfo-category-subcats": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-files}}",
"pageinfo-category-files": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-subcats}}",
"pageinfo-user-id": "The numeric ID for a user\n{{Identical|User ID}}",
- "pageinfo-file-hash": "Base-36 SHA-1 value of the file",
+ "pageinfo-file-hash": "Base-16 SHA-1 value of the file",
"markaspatrolleddiff": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolledtext}}\n{{Identical|Mark as patrolled}}",
"markaspatrolledlink": "{{notranslate}}\nParameters:\n* $1 - link which has text {{msg-mw|Markaspatrolledtext}}",
"markaspatrolledtext": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolleddiff}}",
"semicolon-separator": "{{optional}}",
"comma-separator": "{{optional}}\n\nWarning: languages have different usages of punctuation, and sometimes they are swapped (e.g. openining and closing quotation marks, or full stop and colon in Armenian), or change their form (the full stop in Chinese and Japanese, the prefered \"colon\" in Armenian used in fact as the regular full stop, the comma in Arabic, Armenian, and Chinese...)\n\nTheir spacing (before or after) may also vary across languages (for example French requires a non-breaking space, preferably narrow if the browser supports NNBSP, on the inner side of some punctuations like quotation/question/exclamation marks, colon, and semicolons).",
"colon-separator": "{{optional}}\nChange it only if your language uses another character for ':' or it needs an extra space before the colon.",
- "autocomment-prefix": "{{optional}}",
+ "autocomment-prefix": "{{notranslate}}",
"pipe-separator": "{{optional}}",
"word-separator": "{{optional}}\nThis is a string which is (usually) put between words of the language. It is used, e.g. when messages are concatenated (appended to each other). Note that you must express a space as html entity &#32; because the editing and updating process strips leading and trailing spaces from messages.\n\nMost languages use a space, but some Asian languages, such as Thai and Chinese, do not.",
"ellipsis": "{{optional}}",
"restrictionsfield-badip": "An error message shown when one entered an invalid IP address or range in a restrictions field (such as Special:BotPassword). $1 is the IP address.",
"restrictionsfield-label": "Field label shown for restriction fields (e.g. on Special:BotPassword).",
"restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword).",
+ "edit-error-short": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-long}}\n{{Identical|Error}}",
+ "edit-error-long": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-short}}\n{{Identical|Error}}",
"revid": "Used to format a revision ID number in text. Parameters:\n* $1 - Revision ID number.\n{{Identical|Revision}}",
"pageid": "Used to format a page ID number in text. Parameters:\n* $1 - Page ID number.",
"rawhtml-notallowed": "Error message given when $wgRawHtml = true; is set and a user uses an <html> tag in a system message or somewhere other than a normal page.",
"recentchangeslinked-feed": "Cangiaminde culleghete",
"recentchangeslinked-toolbox": "Cangiaminde culleghete",
"recentchangeslinked-title": "Cangiaminde culleghete a \"$1\"",
- "recentchangeslinked-summary": "Queste jè 'a liste de le cangiaminde fatte de recende a le pàggene culleghete da ' na pàgene specifiche (o a le membre de 'na specifiche categorije).\nPàggene sus 'a [[Special:Watchlist|le Pàggene condrollete]] sonde in '''grascette'''.",
+ "recentchangeslinked-summary": "Mitte 'u nome de 'na pàgene pe 'ndrucà le cangiaminde a le pàggene ca sò collegate o ca appondane a sta pàgene. (Pe 'ndrucà le membre de 'na categorije, mitte Categoria:Nome d'a categorije). Le cangiaminde a le pàggene ca stonne jndr'à l'elenghe de [[Special:Watchlist|le Pàggene condrollate]] stonne in <strong>grascette</strong>.",
"recentchangeslinked-page": "Nome d'a vôsce:",
"recentchangeslinked-to": "Fa vedè le cangiaminde de le pàggene colleghete a 'na certa pàgene",
"recentchanges-page-added-to-category": "[[:$1]] aggiunde a categorije",
"doubleredirects": "Двойные перенаправления",
"doubleredirectstext": "На этой странице представлен список перенаправлений на другие перенаправления.\nКаждая строка содержит ссылки на первое и второе перенаправления, а также целевую страницу второго перенаправления, в которой обычно указывается название страницы, куда должно ссылаться первое перенаправление.\n<del>Зачёркнутые</del> записи были исправлены.",
"double-redirect-fixed-move": "Страница [[$1]] была перемещена.\nОна автоматически обновлена и теперь она перенаправляет на страницу [[$2]].",
- "double-redirect-fixed-maintenance": "Автоматическое исправление двойного перенаправления с [[$1]] на [[$2]] в работе по техническому обслуживанию.",
+ "double-redirect-fixed-maintenance": "Автоматическое исправление двойного перенаправления с [[$1]] на [[$2]] в работе по техническому обслуживанию",
"double-redirect-fixer": "Исправитель перенаправлений",
"brokenredirects": "Разорванные перенаправления",
"brokenredirectstext": "Следующие перенаправления указывают на несуществующие страницы:",
"rollback": "Откатить изменения",
"rollbacklink": "откатить",
"rollbacklinkcount": "откатить $1 {{PLURAL:$1|правку|правки|правок}}",
- "rollbacklinkcount-morethan": "откатить больше, чем $1 {{PLURAL:$1|правку|правки|правок}}",
+ "rollbacklinkcount-morethan": "откатить более $1 {{PLURAL:$1|правки|правок}}",
"rollbackfailed": "Ошибка при совершении отката",
"rollback-missingparam": "Отсутствуют обязательные параметры по запросу.",
"rollback-missingrevision": "Не удалось загрузить данные версии.",
"restrictionsfield-badip": "Недопустимый IP-адрес или диапазон адресов: $1",
"restrictionsfield-label": "Разрешённые диапазоны IP-адресов:",
"restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Ошибка: $1",
+ "edit-error-long": "Ошибки: $1",
"revid": "версия $1",
"pageid": "ID страницы $1",
"rawhtml-notallowed": "<html> теги могут быть использованы только в пределах обычных страниц.",
"parser-template-loop-warning": "Халыыптар бэйэ бэйлэригэр сигэниилэрэ (петля) булулунна: [[$1]]",
"template-loop-category": "Халыыптара бэйэ бэйэлэригэр сигэнэр сирэйдэр",
"template-loop-category-desc": "Бу сирэй халыыба бэйэтин ыҥырар, ол аата бэйэтин холбуу сатыыр эбит.",
+ "template-loop-warning": "<strong>Сэрэтии:</strong> Бу сирэй халыыпка хат эргийэн кэлиини оҥорор сирэйи ([[:$1]]) ыҥырар эбит (бүппэт рекурсия).",
"parser-template-recursion-depth-warning": "($1) халыып рекурсиятын муҥура бүппүт (Превышен предел глубины рекурсии)",
"language-converter-depth-warning": "Тыл конвертерын дириҥин хааччаҕа куоһарыллыбыт ($1)",
"node-count-exceeded-category": "Түмүктэрин ахсаана аһара барбыт сирэйдэр",
"recentchangesdays-max": "(улааппыта $1 күн)",
"recentchangescount": "Саҥа уларытыылар көрдөрүллэр ахсааннара:",
"prefs-help-recentchangescount": "Бу саҥа көннөрүүлэри, сирэй устуоруйаларын уонна сурунааллары көрдөрөр.",
- "prefs-help-watchlist-token2": "Бу кэтиир тиһигиҥ ситим-ханаалын кистэлэҥ күлүүһэ.\nБу күлүүһүнэн ким баҕарар эн кэтиир тиһиккин көрүөн сөп, онон кимиэхэ да биэримэ. [[Special:ResetTokens|Маны баттаан уларытыаххын сөп]].",
+ "prefs-help-watchlist-token2": "Бу кэтиир испииһэгиҥ ситим-ханаалын кистэлэҥ күлүүһэ.\nБу күлүүһүнэн ким баҕарар эн испииһэккин көрүөн сөп, онон кимиэхэ да биэримэ. Хаһан баҕарар [[Special:ResetTokens|маны баттаан уларытыаххын]] сөп.",
"savedprefs": "Эн туруорууларыҥ олохтоннулар.",
"savedrights": "{{GENDER:$1|$1}} кыттааччы бөлөҕө бигэргэннэ.",
"timezonelegend": "Олохтоох кэм:",
"timezoneregion-indian": "Индия байҕала",
"timezoneregion-pacific": "Чуумпу байҕал",
"allowemail": "Атын кыттааччылартан сурук тутары көҥүллүүбүн",
+ "email-allow-new-users-label": "Сабыс-саҥа киирбит дьонтон сурук тутары көҥүллээ",
+ "email-blacklist-label": "Бу дьон миэхэ суруйалларын боп:",
"prefs-searchoptions": "Көрдөөһүн",
"prefs-namespaces": "Аат дала",
"default": "чопчу ыйыллыбатаҕына маннык",
"prefs-editor": "Эрэдээктэр",
"prefs-preview": "Инники көрүү",
"prefs-advancedrc": "Дириҥэтиллибит туруоруулар",
+ "prefs-opt-out": "Тупсарыыттан батыныы",
"prefs-advancedrendering": "Дириҥэтиллибит туруоруулар",
"prefs-advancedsearchoptions": "Дириҥэтиллибит туруоруулар",
"prefs-advancedwatchlist": "Дириҥэтиллибит туруоруулар",
"recentchanges-legend": "Кэлиҥҥи уларытыылар хайдах көстөллөрүн туруоруу",
"recentchanges-summary": "Манна хаһан оҥоһуллубуттарынан сааһыланан {{SITENAME}} кэнники уларыытыылара көстөллөр.",
"recentchanges-noresult": "Этиллибит уларытыылар эппит кэмҥэр оҥоһуллубатахтар.",
+ "recentchanges-timeout": "Көрдөөһүн болдьоҕо бүттэ. Атыннык көрдүөххүн сөп.",
+ "recentchanges-network": "Саахал тахсан хаалан түмүгэ көстүбэтэ. Хат ыытан көр.",
+ "recentchanges-notargetpage": "Сирэй аатын үөһээ суруй, оччоҕо ону кытта ситимнээх көннөрүүлэр көстүөхтэрэ.",
"recentchanges-feed-description": "Бу ботуокка биики бүтэһик уларыйыыларын кэтииргэ.",
"recentchanges-label-newpage": "Бу уларытыы түмүгэр саҥа сирэй айыллыбыт.",
"recentchanges-label-minor": "Бу улахан суолтата суох уларытыы",
"rcfilters-hours-title": "Тиһэх чаастар",
"rcfilters-days-show-days": "$1 хонук",
"rcfilters-days-show-hours": "$1 чаас",
+ "rcfilters-highlighted-filters-list": "Тыктарыллыбыт: $1",
"rcfilters-quickfilters": "Бигэргэммит сиидэлэр",
- "rcfilters-quickfilters-placeholder-title": "Ð\91игÑ\8dÑ\80гÑ\8dммиÑ\82 Ñ\81игэ билигин суох",
+ "rcfilters-quickfilters-placeholder-title": "Ð\91игÑ\8dÑ\80гÑ\8dммиÑ\82 Ñ\81иидэ билигин суох",
"rcfilters-quickfilters-placeholder-description": "Сиидэ туруорууларын кэлин туһанарга, \"Холбоммут сиидэ\" хонуутугар кыбытык ойуутун баттаа.",
"rcfilters-savedqueries-defaultlabel": "Бигэргэммит сиидэлэр",
"rcfilters-savedqueries-rename": "Аатын уларыт",
"rcfilters-savedqueries-apply-and-setdefault-label": "Анаан этиллибэтэҕинэ туттуллар сиидэни оҥоруу",
"rcfilters-savedqueries-cancel-label": "Салҕаама",
"rcfilters-savedqueries-add-new-title": "Сиидэлэ билиҥҥи туруорууларын хааллар",
+ "rcfilters-savedqueries-already-saved": "Маннык сиидэлэр хайыы-үйэ бааллар. Туруорууларын уларытан саҥа Бигэргэммит сиидэтэ оҥор.",
"rcfilters-restore-default-filters": "Анаан этиллибэтэҕинэ турар сиидэлэри холбоо",
"rcfilters-clear-all-filters": "Сиидэлэри барытын суох гын",
"rcfilters-show-new-changes": "Тиһэх уларытыылар",
- "rcfilters-search-placeholder": "Сиидэлэри кэнники уларытыы (көр биитэр киллэр)",
+ "rcfilters-search-placeholder": "Сиидэлэр уларыйыылара (талбаны туһан биитэр сиидэ аатынан көрдөө)",
"rcfilters-invalid-filter": "Сатаммат сиидэ",
"rcfilters-empty-filter": "Холбоммут сиидэ суох. Улартыы барыта көстөр.",
"rcfilters-filterlist-title": "Сиидэ",
"rcfilters-filterlist-whatsthis": "Бу тугуй?",
- "rcfilters-filterlist-feedbacklink": "Саҥа (беÑ\82а) Ñ\81иидÑ\8dлÑ\8dÑ\80 Ñ\82Ñ\83Ñ\81Ñ\82аÑ\80Ñ\8bнан суруй",
+ "rcfilters-filterlist-feedbacklink": "Ð\91Ñ\83 (Ñ\81аҥа) Ñ\81иидÑ\8dлÑ\8dÑ\80 Ñ\82Ñ\83Ñ\81Ñ\82аÑ\80Ñ\8bнан биһиÑ\8dÑ\85Ñ\8d суруй",
"rcfilters-highlightbutton-title": "Түмүгүн бэлиэтээ",
"rcfilters-highlightmenu-title": "Өҥүн тал",
"rcfilters-highlightmenu-help": "Өҥүн талан, көстөр гын",
"rcfilters-filter-editsbyself-description": "Бэйэҥ уларытыыларыҥ.",
"rcfilters-filter-editsbyother-label": "Атыттар уларытыылара",
"rcfilters-filter-editsbyother-description": "Атыттар уларытыылара (Эйиэниттэн ураты).",
- "rcfilters-filtergroup-userExpLevel": "Ð\9aÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ñ\83опÑ\83Ñ\82Ñ\83н Ñ\82аһÑ\8bмÑ\8bнан (бÑ\8dлиÑ\8dÑ\82Ñ\8dммиÑ\82Ñ\82Ñ\8dÑ\80гÑ\8d Ñ\8dÑ\80Ñ\8d)",
+ "rcfilters-filtergroup-userExpLevel": "Ð\91Ñ\8dлиÑ\8dÑ\82Ñ\8dммиÑ\82инÑ\8dн Ñ\83онна Ñ\83опÑ\83Ñ\82Ñ\83н Ñ\82аһÑ\8bмÑ\8bнан",
"rcfilters-filter-user-experience-level-registered-label": "Бэлиэтэммиттэр",
"rcfilters-filter-user-experience-level-registered-description": "Киирбит эрэдээктэрдэр.",
"rcfilters-filter-user-experience-level-unregistered-label": "Бэлиэтэммэтэхтэр",
"rcfilters-filter-user-experience-level-unregistered-description": "Киирбэтэх эрэдээктэрдэр.",
"rcfilters-filter-user-experience-level-newcomer-label": "Саҥа киирбиттэр",
- "rcfilters-filter-user-experience-level-newcomer-description": "Ð\9eÑ\82ой Ñ\81аҥалаÑ\80: 10 көннөрүүттэн аҕыйаҕы оҥорбуттар уонна бэлиэтэмиттэрэ 4 хоно иликтэр.",
+ "rcfilters-filter-user-experience-level-newcomer-description": "Ð\91Ñ\8dлиÑ\8dÑ\82Ñ\8dммиÑ\82Ñ\82Ñ\8dÑ\80 гÑ\8bнан баÑ\80ан 10 көннөрүүттэн аҕыйаҕы оҥорбуттар уонна бэлиэтэмиттэрэ 4 хоно иликтэр.",
"rcfilters-filter-user-experience-level-learner-label": "Үөрэнээччилэр",
"rcfilters-filter-user-experience-level-learner-description": "\"Саҕалааччыттан\" элбэх, \"уопуттаахтан\" аҕыйах уопуттаах.",
"rcfilters-filter-user-experience-level-experienced-label": "Уопуттаах кыттааччылар",
- "rcfilters-filter-user-experience-level-experienced-description": "30 хонуктан ордук үлэлээбит уонна 500 көннөрүүнү оҥорбуттар.",
+ "rcfilters-filter-user-experience-level-experienced-description": "30 хонуктан ордук үлэлээбит уонна 500 көннөрүүттэн элбэҕи оҥорбуттар.",
"rcfilters-filtergroup-automated": "Аптамаат көннөрүүлэр",
"rcfilters-filter-bots-label": "Оруобат",
"rcfilters-filter-bots-description": "Аптамаатынан оҥоһуллубут көннөрүүлэр.",
"rcfilters-filter-watchlist-notwatched-description": "Кэтэбил тиһилигэр киирбит ыстатыйалары уларытыыттан уратыны барытын.",
"rcfilters-filtergroup-watchlistactivity": "Кэтэбил тиһилигин көҕө",
"rcfilters-filter-watchlistactivity-unseen-label": "Көрүллэ илик уларытыылар",
+ "rcfilters-filter-watchlistactivity-seen-label": "Көрүллүбүт уларытыылар",
"rcfilters-filtergroup-changetype": "Уларытыы көрүҥэ",
"rcfilters-filter-pageedits-label": "Сирэй уларытыылара",
"rcfilters-filter-pageedits-description": "Ис хоһоонун, ырытыылары, категорияны ойуулааһыны эҥин уларытыы...",
"rcfilters-watchlist-markseen-button": "Уларытыылары барытын көрөүллүбүт гын",
"rcfilters-watchlist-edit-watchlist-button": "Кэтэбилиҥ тиһилигин уларытыы",
"rcfilters-watchlist-showupdated": "Эн көрбүтүҥ кэннэ уларыйбыт <strong>модьу бичигинэн</strong> уонна толору бэлиэннэн бэлиэтэммит.",
+ "rcfilters-preference-label": "Тиһэх барылын көстүбэт гын",
+ "rcfilters-preference-help": "2017 сыл алтыһаанын уларытыыларын уонн ол кэннэ киирбит тэриллэри суох гынар.",
+ "rcfilters-filter-showlinkedfrom-label": "Сигэнэр сирэйдэрбэр уларытыылары көрдөр",
+ "rcfilters-filter-showlinkedfrom-option-label": "<strong>Талбыт сирэйиҥ</strong> сигэнэр сирэйдэрэ",
+ "rcfilters-filter-showlinkedto-label": "Сигэнэр сирэйдэри уларытыыны көрдөр",
+ "rcfilters-filter-showlinkedto-option-label": "<strong>Талбыт сирэйгэр</strong> сигэнэр сирэйдэр",
+ "rcfilters-target-page-placeholder": "Сирэй (категория) аатын суруй",
"rcnotefrom": "Манна {{PLURAL:$5|уларытыы көрдөрүлүннэ|уларытыылар көһүннүлэр}} баччаттан <strong>$3, $4</strong> (баччаттан элбэх көстүбэт <strong>$1</strong>).",
"rclistfromreset": "Дьылын-күнүн сот",
"rclistfrom": "Бу кэм $3 $2 кэнниттэн оҥоһуллубуттары көрдөр",
"recentchangeslinked-feed": "Сигэнэр уларытыылар",
"recentchangeslinked-toolbox": "Сигэнэр уларытыылар",
"recentchangeslinked-title": "\"$1\" кытта сибээстээх уларытыылар",
- "recentchangeslinked-summary": "Ð\91Ñ\83 анал Ñ\81иÑ\80Ñ\8dйгÑ\8d Ñ\81игÑ\8dнÑ\8dÑ\80 Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80 бүÑ\82Ñ\8dһик Ñ\83лаÑ\80Ñ\8bйÑ\8bÑ\8bлаÑ\80а көһүннүлÑ\8dÑ\80. [[Special:Watchlist|Ð\9aÑ\8dÑ\82Ñ\8dнÑ\8dÑ\80 Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80]] '''модÑ\8cÑ\83 биÑ\87игинÑ\8dн''' бÑ\8dлиÑ\8dÑ\82Ñ\8dннилÑ\8dÑ\80.",
+ "recentchangeslinked-summary": "СиÑ\80Ñ\8dй ааÑ\82Ñ\8bн Ñ\81Ñ\83Ñ\80Ñ\83йдаÑ\85Ñ\85Ñ\8bна киниÑ\8dÑ\85Ñ\8d Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 кини Ñ\81игÑ\8dнÑ\8dÑ\80 Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80ин Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b көÑ\81Ñ\82Ò¯Ó©Ò\95Ñ\8d. (Ð\9aаÑ\82егоÑ\80иÑ\8fÒ\95а кииÑ\80Ñ\8dÑ\80Ñ\8d Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80и көÑ\80Ó©Ñ\80гө маннÑ\8bк Ñ\81Ñ\83Ñ\80Ñ\83й: Category:Ð\9aаÑ\82егоÑ\80иÑ\8f ааÑ\82а). [[Special:Watchlist|Ð\9aÑ\8dÑ\82ииÑ\80 Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80иҥ]] Ñ\83лаÑ\80Ñ\8bйÑ\8bÑ\8bÑ\82а <strong>модÑ\8cÑ\83 биÑ\87игинÑ\8dн</strong> бÑ\8dлиÑ\8dÑ\82Ñ\8dммиÑ\82.",
"recentchangeslinked-page": "Сирэй аата:",
"recentchangeslinked-to": "Төттөрүтүн, ыйыллыбыт сирэйгэ сигэнэр сирэйдэри көрдөр",
"recentchanges-page-added-to-category": "[[:$1]] категорияҕа эбилиннэ",
"uploadbtn": "Билэни киллэрии",
"reuploaddesc": "Тохтот уонна киллэрии форматыгар төнүн",
"upload-tryagain": "Билэ туһунан сурук уларытыытын ыыт",
+ "upload-tryagain-nostash": "Билэни уонна ойуулааһынын хос ыыт",
"uploadnologin": "Биикигэ ааккын билиһиннэрбэтиҥ",
"uploadnologintext": "Билэлэри киллэрэргэ $1 наада",
"upload_directory_missing": "Суруйуу паапката ($1) суох, ону ааһан сиэрбэр ону бэйэтэ оҥорор кыаҕа суох.",
"file-deleted-duplicate-notitle": "Маннык билэ урут сотуллубут эбит, аата бобуллубут.\nБилэни саҥаттан киллэриэҥ иннинэ бобуллубут билэлэри көрөр кыахтаах киһиэхэ тахсан тоҕо бобуллубутун быһаарыс.",
"uploadwarning": "Сэрэтии",
"uploadwarning-text": "Бука диэн аллара баар билэ туһунан суругу уларыт уонна өссө хатылаа.",
+ "uploadwarning-text-nostash": "Бука диэн, хат ыытан көр, ойуулаһынан уларыт уонна хатылаа.",
"savefile": "Билэни суруттарыы",
"uploaddisabled": "Суруттарыы бобуллубут",
"copyuploaddisabled": "URL көмөтүнэн хачайдыыр кыах араарыллыбыт.",
"uploaded-script-svg": "Хачайдаммыт SVG-билэҕэ сценарийы өйүүр куттааллаах «$1» элэмиэн көһүннэ.",
"uploaded-hostile-svg": "Хачайдаммыт SVG-билэ истиилин элэмиэнигэр кутталлаах CSS-куод көһүннэ.",
"uploaded-event-handler-on-svg": "SVG-билэлэргэ <code>$1=\"$2\"</code> сабыытыйаны таҥастааччы атрибууттарын туруоруу көҥүллэммэт.",
- "uploaded-href-attribute-svg": "Манна көстүбүт <code><$1 $2=\"$3\"></code> SVG-билэ сигэҕэ аналлаах href-атрибуттарыгар, маннык эрэ көүллэнэр: http:// биитэр https://.",
+ "uploaded-href-attribute-svg": "<a> элэмиэн манна эрэ data сигэнэр (href) кыахтаах: (угуллубут билэ), http:// биитэр https:// сигэлэр биитэр фрагмент (#, ол докумуоҥҥа). Атын элэмиэннэргэ, холобур <image> элэмиэҥҥэ, data: уонна фрагмент эрэ көҥүллэнэр. Ойууну SVG экспортыыр кэмҥэр уган көр. Булулунна <code><$1 $2=\"$3\"></code>.",
"uploaded-href-unsafe-target-svg": "Хачайдаммыт SVG-билэҕэ кутталлаах сигэ көһүннэ <code><$1 $2=\"$3\"></code>.",
"uploaded-animate-svg": "«Animate» тиэк көһүннэ, кини «from»-атрибут көмөтүнэн <code><$1 $2=\"$3\"></code> хачайдаммыт SVG-билэҕэ сигэни уларытыан сөп.",
"uploaded-setting-event-handler-svg": "Дьайыы таҥастыыр тэрил атрибуутун уларытар бобуллубут, киллэриллибит SVG-билэҕэ <code><$1 $2=\"$3\"></code> куод көстүбүт.",
"uploadstash-exception": "Суруттараргын быстах уурар сиргэ харайар сатаммата ($1): \"$2\".",
"uploadstash-bad-path": "Маннык суол суох.",
"uploadstash-bad-path-invalid": "Суол алҕастаах.",
+ "uploadstash-bad-path-unknown-type": "Биллибэт көрүҥнээх «$1».",
+ "uploadstash-bad-path-unrecognized-thumb-name": "Ойуучаан аата сатаан ааҕыллыбата.",
+ "uploadstash-bad-path-no-handler": "$2 билэ $1 mime-көрүҥүн таҥастыыр бырагыраама көстүбэтэ.",
+ "uploadstash-bad-path-bad-format": "\"$1\" күлүүс сөп түбэспэт формааттаах.",
+ "uploadstash-file-not-found": "«$1» күлүүс көстүбэтэ.",
+ "uploadstash-file-not-found-no-thumb": "Ойуучааны ылар табыллыбата.",
+ "uploadstash-file-not-found-no-local-path": "Масштаабтаммыт ойуу сытар сирэ көстүбэтэ.",
+ "uploadstash-file-not-found-no-object": "Ойуучаан билэтин эбийиэгин оҥорор сатаммата.",
+ "uploadstash-file-not-found-no-remote-thumb": "Эскиис сатаан хостоммото: $1\nURL = $2",
+ "uploadstash-file-not-found-missing-content-type": "Content-type аат көстүбэтэ.",
+ "uploadstash-file-not-found-not-exists": "Билэ сытар сирэ көстүбэтэ эбэтэр өйдөммөтө.",
+ "uploadstash-file-too-large": "$1 баайтан бөдөҥ билэни таҥастыыр сатаммат.",
+ "uploadstash-not-logged-in": "Бэлиэтэммит кыттааччы суох, билэ кыттааччы киэнэ буолуохтаах.",
+ "uploadstash-wrong-owner": "Бу билэ ($1) кыттааччы киэнэ буолбатах.",
+ "uploadstash-no-such-key": "Күлүүс ($1) суох, сотор сатаммат.",
+ "uploadstash-no-extension": "Кэтирээһинэ кураанах.",
+ "uploadstash-zero-length": "Билэ уһуна нуулга тэҥ.",
"invalid-chunk-offset": "Бобуллубут сыҕарыйыы",
"img-auth-accessdenied": "Киирии бобуллубут",
"img-auth-nopathinfo": "PATH_INFO суох.\nЭн сиэрбэриҥ маннык сибидиэнньэни ыытарга туруоруллубатах эбит.\nБаҕар кини CGI олоҕурара буолуо ол иһин img_auth өйөөбөтө буолуо.\nМаны https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization көр.",
"listfiles_size": "Кээмэйэ",
"listfiles_description": "Быһаарыыта",
"listfiles_count": "Барыллар",
- "listfiles-show-all": "Ð\9eйÑ\83Ñ\83 Ñ\8dÑ\80гÑ\8d баÑ\80Ñ\8bлларын эмиэ киллэр",
+ "listfiles-show-all": "Ð\91илÑ\8d Ñ\8dÑ\80гÑ\8d Ñ\82оÑ\80Ñ\83мнарын эмиэ киллэр",
"listfiles-latestversion": "Билиҥҥи барыла",
"listfiles-latestversion-yes": "Сөп",
"listfiles-latestversion-no": "Суох",
"pageswithprop-legend": "Уларытыллыбыт туруоруулаах сирэйдэр",
"pageswithprop-text": "Манна сорох туруоруулара уларытыллыбыт сирэйдэр көстүбүттэр.",
"pageswithprop-prop": "Туруоруу аата:",
+ "pageswithprop-reverse": "Таҥнары наардаа",
+ "pageswithprop-sortbyvalue": "Көрдөрүүтүнэн наардаа",
"pageswithprop-submit": "Толор",
"pageswithprop-prophidden-long": "уһун тиэкис кистэммит ($1)",
"pageswithprop-prophidden-binary": "бинаар суолта кистэммит ($1)",
"doubleredirects": "Хос көһөрөөһүн",
"doubleredirectstext": "Бу сирэйгэ атын сиргэ утаарар хос утаарыылар тиһиктэрэ көстөр.\nХас устуруока аайы бастакы уонна иккис утаарыга сигэ баар, ону таһынан иккис утаарыыга баар сирэй аадырыһа (аата) баар, ол аата бастакы утаарыы дьиҥинэн ханна утаарыахтааҕа көстөр.\n<del>Сотуллубут</del> суруктар көннөрүллүбүттэр.",
"double-redirect-fixed-move": "[[$1]] сирэй аата уларытыллыбыт.\nАптамаатынан саҥардыллыбыт уонна бу сирэйгэ утаарар [[$2]].",
- "double-redirect-fixed-maintenance": "[[$1]] сирэйтэн [[$2]] сирэйгэ хос утаарыыны көннөрүү оҥоһулла сылдьар.",
+ "double-redirect-fixed-maintenance": "[[$1]] сирэйтэн [[$2]] сирэйгэ хос утаарыыны көннөрүү оҥоһулла сылдьар",
"double-redirect-fixer": "Утаарыылары көннөрөөччү",
"brokenredirects": "Быстыбыт көһөрүүлэр",
"brokenredirectstext": "Бу утаарыы сирэйдэрэ суох ыстатыйаларга сигэнэллэр (ыыталлар):",
"apisandbox-sending-request": "API-көрдөбүлү ыытыы…",
"apisandbox-loading-results": "API-түмүгүн ылыы…",
"apisandbox-results-error": "Көрдөбүлгэ API-хоруйу киллэрии кэмигэр алҕас таҕыста: $1.",
+ "apisandbox-results-login-suppressed": "Бу ыйытык браузер домены хааччахтыырын туораары бэлиэтэммэтэх кыттааччы ыйытыгын курдук таҥастаммыт. API кумаҕын токена оннук ыйытыктары аптамаатынан сороҕор сөпкө таҥастаабат, онон, бука диэн, бэйэҥ толор.",
"apisandbox-request-selectformat-label": "Көрдөбүлү маннык көрдөр:",
"apisandbox-request-format-url-label": "Көрдөбүл URL-ун устуруоката",
"apisandbox-request-url-label": "Көрдөбүл URL-аадырыһа:",
"enotif_lastdiff": "Уларытыыны манна көр: $1",
"enotif_anon_editor": "ааттамматах кыттааччы $1",
"enotif_body": "Аламай күн сырдыгынан, $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nУларытыы кылгас ис хоһооно: $PAGESUMMARY $PAGEMINOREDIT\n\nУларыппыт киһиэхэ суруйуоххун сөп:\nэл. почта: $PAGEEDITOR_EMAIL\nбиики: $PAGEEDITOR_WIKI\n\nБу сирэйи бэлиэтэммит ааккынан киирэн көрбөтөххүнэ уларыйбытын туһунан биллэриилэр кэлиэхтэрэ суоҕа. Биллэриилэри аналлаах сирэйгэ отой арааран кэбиһиэххин эмиэ сөп.\n\n Бары үтүөнү кытта, {{SITENAME}} биллэрэр тиһигэ\n\n--\nБиллэрии кэлэрин салайыы\n{{canonicalurl:{{#special:Preferences}}}}\n\nКэтиир тиһиги уларытыы\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nКэтиир тиһиктэн сирэйдэри сотуу\n$UNWATCHURL\n\nКөмө\n$HELPPAGE",
+ "enotif_minoredit": "Бу улахан суолтата суох уларытыы",
"created": "айыллыбыт",
"changed": "уларыппыт (уларытыллыбыт)",
"deletepage": "Сирэйи сот",
"delete-warning-toobig": "Бу сирэй уларыылара уһун историялаах, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маны соттоххуна, {{SITENAME}} билэтин тиһигин алдьатыан сөп; салгыыр буоллаххына сэрэнэн үлэлээ.",
"deleteprotected": "Бу сирэйи, көмүскэллээх буолан, сотор кыаҕыҥ суох эбит.",
"deleting-backlinks-warning": "<strong>Сэрэтии.</strong>\nСотоору гынар сирэйгэр [[Special:WhatLinksHere/{{FULLPAGENAME}}|атын сирэйдэр]] сигэнэллэр эбит.",
+ "deleting-subpages-warning": "<strong>Сэрэтии:</strong> Сотоору гынар сирэйиҥ анныгар [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|$1 сирэй|51=50-тан тахса сирэй}} баар эбит]].",
"rollback": "Уруккутугар төннөр",
"rollbacklink": "төннөр",
"rollbacklinkcount": "$1 көннөрүүнү суох гын",
"editcomment": "Уларытыыны маннык быһаарбыттар: <em>$1</em>.",
"revertpage": "([[User talk:$2|Ырытыы]]) көннөрүүлэрэ: [[Special:Contributions/$2|$2]] бу торумҥа: [[User:$1|$1]] төннөрүлүннүлэр",
"revertpage-nouser": "Аата кистэммит киһи уларытыылара суох оҥоһуллан, ыстатыйа бу киһи барылыгар төннөрүлүннэ: {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "$1 көннөрүүлэр бу торумҥа төннөрүлүннүлэр: $2.",
+ "rollback-success": "{{GENDER:$3|$1}} көннөрүүтэ сотулунна; {{GENDER:$4|$2}} барылыгар төннөрүлүннэ.",
"rollback-success-notify": "$1 уларытыылара сотулуннулар; \n$2 тиһэх торумугар төннөрүлүннэ. [$3 Уларытыыны көрдөр]",
"sessionfailure-title": "Сиэссийэ алҕаһа",
"sessionfailure": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.",
"undelete-search-title": "Сотуллубут сирэйдэри көрдөөһүн",
"undelete-search-box": "Сотуллубут сирэйдэри көрдөөһүн",
"undelete-search-prefix": "Мантан саҕаланар сирэйдэри көрдөө:",
+ "undelete-search-full": "Аатыгар манныктааҕы көрдөр:",
"undelete-search-submit": "Көрдөө",
"undelete-no-results": "Сотуллубут сирэйдэргэ эн көрдүүр сирэйиҥ көстүбэтэ.",
"undelete-filename-mismatch": "Сирэй $1 кэмнээҕи торумун төннөрөр кыах суох: аата сөп түбэспэт",
"sp-contributions-newonly": "Саҥаттан оҥоһуллубут сирэйдэри эрэ көрдөр",
"sp-contributions-hideminor": "Суолтата суох уларытыылары көрдөрүмэ",
"sp-contributions-submit": "Көрдөө",
+ "sp-contributions-outofrange": "Түмүгү көрдөрөр сатаммата. Көрдөммүт IP-диапазон CIDR /$1 лимиититтэн улахан эбит.",
"whatlinkshere": "Манна сигэнэллэр",
"whatlinkshere-title": "Сирэй манна сигэнэр \"$1\"",
"whatlinkshere-page": "Сирэй:",
"ipb_blocked_as_range": "Сыыһа: $1 IP-та чопчу бобуллубатах (не блокирован), онон аһыллар кыаҕа суох. Ол гынан баран IP бу $2 диапазон сорҕотун быһыытынан бобуллубут, ону арыйыахха (бобуутун устуохха) сөп.",
"ip_range_invalid": "IP-лар диапазоннара сатаммат.",
"ip_range_toolarge": "Мантан /$1 үөһэ диапазоннары хааччахтыыр сатаммат.",
+ "ip_range_exceeded": "IP-диапазон муҥутууру куоһарар. Көҥүллэнэр диапазон маннык: /$1.",
"proxyblocker": "Прокси бобуллуута",
"proxyblockreason": "Эн IP-ҥ аһаҕас прокси эбит, онон бобулунна. Интернет-провайдергын эбэтэр техническэй сулууспаны кытта сибээстэһэн кутталлаах суол баарын биллэр.",
"sorbsreason": "Эн IP-ҥ {{SITENAME}} саайт DNSBL-гар аһаҕас прокси быһыытынан сылдьар.",
"import-mapping-namespace": "Бу аат далыгар:",
"import-mapping-subpage": "Бу сирэй хос сирэйин курдук импортаа:",
"import-upload-filename": "Билэ аата:",
+ "import-upload-username-prefix": "Интервики префиксэ:",
+ "import-assign-known-users": "Олохтоох биикигэ маннык кыттааччылар баар буоллахтарына көннөрүүлэрин холботолоо",
"import-comment": "Хос быһаарыы:",
"importtext": "Сирэйи [[Special:Export|экспорт үнүстүрүмүөнүн]] көмөтүнэн бастакы биикиттэн экспортаа. \nБилэни бастаан бэйэҥ көмпүүтэргэр суруй, онтон манна көһөр.",
"importstart": "Сирэйдэри импортааһын...",
"imported-log-entries": "Сурунаал $1 {{PLURAL:$1|суруга|суруктара}} импортаннылар.",
"importfailed": "Импортыыр табыллыбата: $1",
"importunknownsource": "Импортанар сирэй биллибэт көрүҥнээх",
+ "importnoprefix": "Интервики префиксэ ыйыллыбатах",
"importcantopen": "Импортанар билэ кыайан арыллыбат",
"importbadinterwiki": "Интервики ыйынньык сыыһа",
"importsuccess": "Импортааһын түмүктэннэ!",
"pageinfo-category-subcats": "Субкатегория ахсаана",
"pageinfo-category-files": "Билэ ахсаана",
"pageinfo-user-id": "Кыттааччы нүөмэрэ",
+ "pageinfo-file-hash": "Хэш суолта",
"markaspatrolleddiff": "Бэрэбиэркэлэммит курдук бэлиэтээ",
"markaspatrolledtext": "Бу ыстатыйаны бэрэбиэркэлэммит курдук бэлиэтээ",
"markaspatrolledtext-file": "Билэ бу торумун ботуруулламмыт курдук бэлиэтээ",
"newimages-legend": "Фильтр",
"newimages-label": "Билэ аата (эбэтэр сорҕото):",
"newimages-user": "Кыттааччы аата эбэтэр IP-та",
+ "newimages-newbies": "Саҥа бэлиэ ааттартан эрэ оҥоһуллубуту көрдөр",
"newimages-showbots": "Руобаттар хачайдааһыннарын көрдөр",
"newimages-hidepatrolled": "Кэтэммит хачайданыылары сабыы.",
+ "newimages-mediatype": "Миэдьийэ көрүҥэ:",
"noimages": "Ойуу суох.",
"gallery-slideshow-toggle": "Ойуучааннары уларыт",
"ilsubmit": "Көрдөт",
"autosumm-blank": "Бу сирэй ыраастаныллыбыт",
"autosumm-replace": "Сирэй иһэ уларытыллыбыт: '$1'",
"autoredircomment": "Утаарыы: [[$1]]",
+ "autosumm-removed-redirect": "Сотуллубут утаарыы: $1",
+ "autosumm-changed-redirect-target": "Утаарыы мантан $1 манна $2 уларыйда",
"autosumm-new": "'$1' ыйааһыннаах саҥа сирэй оҥоһулунна",
"autosumm-newblank": "Кураанах сирэй оҥоһулунна",
"size-bytes": "$1 байт",
"fileduplicatesearch-noresults": "«$1» диэн билэ суох эбит.",
"specialpages": "Анал сирэйдэр",
"specialpages-note-top": "Легендата",
+ "specialpages-note-restricted": "* Көннөрү анал сирэйдэр.\n* <span class=\"mw-specialpagerestricted\">Хааччахтаах анал сирэйдэр.</span>",
"specialpages-group-maintenance": "Техническэй отчуоттар",
"specialpages-group-other": "Атын аналлаах сирэйдэр",
"specialpages-group-login": "Киирии / бэлиэтэнии",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Тиэк|Тиэктэр}}]]: $2)",
"tag-mw-contentmodelchange": "Иһинээҕи киэбин уларытыы сурунаала",
"tag-mw-contentmodelchange-description": "Сирэй [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel ис тутулун уларытар] көннөрүүлэр",
+ "tag-mw-new-redirect": "Саҥа утаарыы",
+ "tag-mw-new-redirect-description": "Саҥа утаарыыны оҥорор эбэтэр сирэйи утаарыы оҥорор уларытыылар",
+ "tag-mw-removed-redirect": "Сотуллубут утаарыы",
+ "tag-mw-removed-redirect-description": "Баар утаарыыны суох гынар уларытыылар",
+ "tag-mw-changed-redirect-target": "Атын сиргэ утаарыы",
+ "tag-mw-changed-redirect-target-description": "Атын сиргэ утаарар гынар уларытыылар",
+ "tag-mw-blank": "ыраастааһын",
+ "tag-mw-blank-description": "Сирэйи ыраастыыр уларытыылар",
+ "tag-mw-replace": "Солбуллубут",
+ "tag-mw-replace-description": "Сирэй 90% сотор уларытыылар",
+ "tag-mw-rollback": "Төннөрүү",
+ "tag-mw-undo": "Төннөрүү",
"tags-title": "Бэлиэлэр (тиэктэр)",
"tags-intro": "Бу сирэйгэ бырагыраамма уларытыылары бэлиэтиир анал бэлиэлэрин (тиэктэрин) тиһиктэрэ уонна ол бэлиэлэр суолталара көстөр.",
"tags-tag": "Бэлиэ (тиэк) аата",
"tags-create-reason": "Төрүөтэ:",
"tags-create-submit": "Оҥоруу",
"tags-create-no-name": "Бэлиэ аатын суруйуохтааххын.",
- "tags-create-invalid-chars": "Бэлиэ аатыгар сопутуой (<code>,</code>) эбэтэр слэш (<code>/</code>) буолуохтаах.",
+ "tags-create-invalid-chars": "Бэлиэ аатыгар сопутуой (<code>,</code>), паайп (<code>|</code>), эбэтэр слэш (<code>/</code>) суох буолуохтаах.",
"tags-create-invalid-title-chars": "Тиэк аатыгар сирэй баһыгар туттуллуо суохтаах бэлиэ киириэ суохтаах",
"tags-create-already-exists": "«$1» тиэк хайыы-үйэ баар эбит.",
"tags-create-warnings-above": "«$1» тиэги оҥорорго маннык {{PLURAL:$2|сэрэтии көһүннэ|сэрэтиилэр көһүннүлэр}}:",
"compare-invalid-title": "Суруллубут аат туттуллара сатаммат.",
"compare-title-not-exists": "Ыйбыт аатыҥ суох эбит.",
"compare-revision-not-exists": "Ыйбыт барылыҥ суох эбит.",
- "diff-form": "'''тас көстүүтэ, быһыыта'''",
+ "diff-form": "Уратылар",
+ "diff-form-oldid": "Торум урукку нүөмэрэ (булгуччута суох)",
+ "diff-form-revid": "Уратылаах торум нүөмэрэ",
+ "diff-form-submit": "Уратылары көрдөр",
+ "permanentlink": "Куруук баар сигэ",
+ "permanentlink-revid": "Уларытыы нүөмэрэ",
+ "permanentlink-submit": "Торумҥа көс",
"dberr-problems": "Баалаама! Бу саайт техническэй ыарахаттары көрсүбүт.",
"dberr-again": "Аҕыйах мүнүүтэннэн саҥардан көрөөр.",
"dberr-info": "(Билэ тиһигин кытта ситим быстыбыт: $1)",
"limitreport-expansiondepth": "Кэҥэтии дириҥин муҥутуур кээмэйэ",
"limitreport-expensivefunctioncount": "Анализатор \"сыаналаах\" функцияларын ахсаана",
"expandtemplates": "Халыыптары тэнитии",
- "expand_templates_intro": "Бу аналлаах сирэй тиэкис туох баар халыыптарын тэнитэн көрдөрөр.\nПарсер функциялара эмиэ тэнитиллэллэр. \n<code><nowiki>{{</nowiki>#language:...}}</code> уонна переменнайдар <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nУопсайынан, бу барыта хос фигурнай ускуопка иһигэр баар.",
+ "expand_templates_intro": "Бу аналлаах сирэй тиэкис туох баар халыыптарын тэнитэн көрдөрөр.\nПарсер функциялара эмиэ тэнитиллэллэр. \n<code><nowiki>{{#language:...}}</code> уонна переменнайдар <code><nowiki>{{CURRENTDAY}}</code>. \nУопсайынан, бу барыта хос фигурнай ускуопка иһигэр баар.",
"expand_templates_title": "{{FULLPAGENAME}} сирэй аата уонна да атын сибидиэнньэлэр:",
"expand_templates_input": "Киирэр сурук:",
"expand_templates_output": "Түмүк",
"expand_templates_preview": "Холоон көрүү",
"expand_templates_preview_fail_html": "<em>raw HTML холбоно сылдьар {{SITENAME}} ситим-сир сиэссийэтин сүтэрэн кэбиспит буолан, эрдэ көрүү сатаммат, бу JavaScript-атаакаттан көмүскэнэр ньыма.</em>\n\n<strong>Эрдэ көрөрүҥ буортуну аҕалбат буоллаҕына хатылаан көр.</strong>\nСин биир сатамматаҕына [[Special:UserLogout|үлэҕин түмүктээ]] уонна хат киирэн көр.",
"expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} ситим-сиргэ «сиикэй» HTML холбоммут буолан уонна эн ааккын эппэтэх буолаҥҥын эрдэ көрүү сатаммат, бу JavaScript-атаакаттан көмүскэнии.</em>\n\n<strong>Өскөтүн туох да куһаҕаны оҥоруоххун баҕарбат буоллаххына, [[Special:UserLogin|киир]] уонна хатылаа.",
- "expand_templates_input_missing": "Ðһиги Ñ\85аннÑ\8bк Ñ\8dмиÑ\82 Ñ\82иÑ\8dкиһи Ñ\82Ñ\83Ñ\80Ñ\83оÑ\80.",
+ "expand_templates_input_missing": "ТÑ\83гÑ\83 Ñ\8dмиÑ\82 Ñ\81Ñ\83Ñ\80Ñ\83йÑ\83оÑ\85Ñ\82ааÑ\85Ñ\85Ñ\8bн.",
"pagelanguage": "Сирэй тылын уларытыы",
"pagelang-name": "Сирэй",
"pagelang-language": "Омугун тыла",
"authprovider-confirmlink-request-label": "Ситимнэнэр бэлиэ-ааттар",
"authprovider-confirmlink-success-line": "$1: ситимнэннэ.",
"authprovider-confirmlink-failed": "Сороҕун эрэ ситимниир сатанна: $1",
+ "authprovider-confirmlink-ok-help": "Алҕас туһунан биллэрии кэнниттэн салгыырга.",
"authprovider-resetpass-skip-label": "Аһар",
"authprovider-resetpass-skip-help": "Аһарыгы хос ыытыыны көтүт.",
"authform-nosession-login": "Этэҥҥэ киирдиҥ, ол эрээри браузерыҥ киирбиккин «долоҕойугар тохтотуо» суоҕа.\n\n$1",
"authform-nosession-signup": "Этэҥҥэ бэлиэтэнниҥ, ол эрээри браузерыҥ киирбиккин «долоҕойугар тохтотуо» суоҕа.\n\n$1",
+ "authform-newtoken": "Токен суох. $1",
+ "authform-notoken": "Токен суох",
+ "authform-wrongtoken": "Алҕастаах токен",
"specialpage-securitylevel-not-allowed-title": "Көҥүллэммэт",
"specialpage-securitylevel-not-allowed": "Бу сирэйи туһанар кыаҕыҥ суох эбит, тоҕо диэтэххэ бу чахчы Эн буоларгын тургутар кыахпыт суох.",
"authpage-cannot-login": "Киириини салгыыр кыах суох.",
"authpage-cannot-link-continue": "Ситимниир кыах суох. Сиэссийэттэн тахсан хаалбыккын быһыылаах.",
"cannotauth-not-allowed-title": "Киирэр көҥүллэммэт",
"cannotauth-not-allowed": "Бу сирэйи туһанарыҥ сатаммат эбит",
+ "changecredentials": "Бэлиэтэммити уларыты",
+ "changecredentials-submit": "Бэлиэтэммити уларыт",
+ "changecredentials-invalidsubpage": "$1 бэлиэтэнии сатаммат көрүҥэ эбит.",
+ "changecredentials-success": "Бэлиэтэнииҥ уларытылынна.",
"removecredentials": "Бэлиэ-ааты сот",
"removecredentials-submit": "Бэлиэ-ааты сот",
"removecredentials-invalidsubpage": "$1 бэлиэтэнии сатаммат көрүҥэ эбит.",
"usercssispublic": "Болҕой: CSS сирэйигэр кистэлэҥ сибидиэнньэ суох буолуохтаах, тоҕо диэтэххэ ону атын кыттааччылар хааччаҕа суох көрөр кыахтаахтар.",
"restrictionsfield-badip": "IP эбэтэр IP-лар диапазоннара сатаммат: $1",
"restrictionsfield-label": "Көҥүллэммит IP диапазона:",
+ "restrictionsfield-help": "Устуруокаҕа биирдии IP-аадырыс эбэтэр CIDR-диапазон. Барытын көҥүллүүргэ маны туһан:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Алҕас: $1",
+ "edit-error-long": "Алҕас:\n\n$1",
"revid": "$1 торум",
"pageid": "$1 сирэй нүөмэрэ",
+ "rawhtml-notallowed": "<html> тиэктэр көннөрү сирэйдэр эрэ истэригэр туттулаллар.",
"gotointerwiki": "{{SITENAME}} сиртэн тахсарга",
"gotointerwiki-invalid": "Аат алҕастаах.",
- "gotointerwiki-external": "[[$2]] диэн сиргэ бараары {{SITENAME}} сиртэн тахсан эрэҕин.\n\n'''[$1 Манна $1 көс]'''"
+ "gotointerwiki-external": "[[$2]] диэн сиргэ бараары {{SITENAME}} сиртэн тахсан эрэҕин.\n\n'''[$1 Манна $1 көс]'''",
+ "undelete-cantedit": "Сөргүтэриҥ табыллыбата, тоҕо диэтэххэ бу сирэйи уларытар быраабыҥ суох эбит.",
+ "undelete-cantcreate": "Бу сирэйи сөргүтэриҥ табыллыбата, тоҕо диэтэххэ сотуллубут, саҥаны буоллаҕына оҥорор кыаҕыҥ суох эбит.",
+ "pagedata-title": "Сирэй туһунан",
+ "pagedata-text": "Бу сирэй сирэйдэр тустарынан кэпсиир алтыһааны көрдөрөр. URL-га сирэй аатын суруй. \n* Иһинээҕитэ эн көмпүүтэриҥ Accept диэнин туһанан көрдөрүллүө. Ол аата сирэй туһунан информация хайдах көстөрө көмпүүтэриҥ хайдах нарыламмытыттан тутулуктаах.",
+ "pagedata-not-acceptable": "Сөп түбэһэр формаат көстүбэтэ. MIME маннык көрүҥнэрэ сөп түбэһэллэр: $1",
+ "pagedata-bad-title": "Алҕастаах аат: $1."
}
"Srdjan m",
"Conquistador",
"Xð",
- "Сербијана"
+ "Сербијана",
+ "Acamicamacaraca"
]
},
"tog-underline": "Podvuci linkove:",
"uploadlogpage": "Registar postavljanja",
"uploadlogpagetext": "Ispod je popis najnovijih postavljanja datoteka.\nVidi [[Special:NewFiles|galeriju novih datoteka]] za slikovitiji pregled.",
"filename": "Ime fajla / Име датотеке",
- "filedesc": "Sažetak - СажеÑ\82ак",
- "fileuploadsummary": "Sažetak / СажеÑ\82ак:",
+ "filedesc": "Sažetak - Ð\9eпиÑ\81",
+ "fileuploadsummary": "Sažetak / Ð\9eпиÑ\81:",
"filereuploadsummary": "Izmjene datoteke:",
"filestatus": "Status autorskih prava:",
"filesource": "Izvor / Извор",
"delete-legend": "Obriši",
"historywarning": "<strong>Upozorenje</strong>: Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
"confirmdeletetext": "Upravo ćete obrisati stranicu sa svom njenom historijom.\nMolimo da potvrdite da ćete to učiniti, da razumijete posljedice te da to činite u skladu sa [[{{MediaWiki:Policy-url}}|pravilima]].",
- "actioncomplete": "Akcija završena\n\nАкција завршена",
+ "actioncomplete": "Radnja završena\n\nРадња завршена",
"actionfailed": "Akcija nije uspjela",
"deletedtext": "\"$1\" je obrisan/a.\nV. $2 za registar nedavnih brisanja.",
"dellogpage": "Evidencija brisanja",
"ipb-disableusertalk": "Onemogući ovog korisnika da uređuje svoju vlastitu stranicu za razgovor dok je blokiran",
"ipb-change-block": "Ponovno blokiraj korisnika sa ovim postavkama",
"ipb-confirm": "Potvrdite blokiranje",
- "badipaddress": "Neodgovarajuća IP adresa / Неодговарајућа ИП адреса",
+ "badipaddress": "Neodgovarajuća IP adresa / Неодговарајућа IP адреса",
"blockipsuccesssub": "Blokiranje je uspjelo",
"blockipsuccesstext": "[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />\nBlokiranja možete da pogledate [[Special:BlockList|ovde]].",
"ipb-blockingself": "Ovom akcijom ćete blokirati sebe! Da li ste sigurni da to želite?",
{
"@metadata": {
"authors": [
- "Saraiki"
+ "Saraiki",
+ "BukhariSaeed"
]
},
"tog-underline": "لنک ہیٹھ لکیر",
"createacct-benefit-body1": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
"createacct-benefit-body2": "\n$1 {{PLURAL:$1|ورقہ|ورقے}}",
"createacct-benefit-body3": "ہݨ دے {{PLURAL:$1|کم|کماں}}",
+ "badretype": "جہڑے پاس ورڈ تساں لکھن ٹھیک کائنی۔",
"loginerror": "لاگ ان وچ غلطی",
"createacct-error": "کھاتہ بݨاوݨ وچ غلطی",
"createaccounterror": "کھاتہ نی کھُل سڳیا:$1",
"botpasswords-label-resetpassword": "پاس ورڈ تبدیل کرو",
"botpasswords-label-grants-column": "ݙے ݙتا ڳئے",
"botpasswords-bad-appid": "\"$1\" بوٹ ناں ٹھیک کائنی۔",
+ "botpasswords-created-title": "بوٹ پاسورڈ بݨ ڳیا",
+ "botpasswords-updated-title": "بوٹ پاسورڈ تازہ تھی ڳیا",
"botpasswords-deleted-title": "بوٹ پاسورڈ مٹ ڳیا",
"resetpass_forbidden": "پاسورڈ تبدیل نی تھی سڳدا",
"resetpass_forbidden-reason": "پاسورڈ تبدیل نی تھی سڳدے:$1",
"currentrev": "موجودہ حالت",
"currentrev-asof": "حالیہ نسخہ بمطابق $1",
"revisionasof": "دی تبدیلیاں $1",
- "revision-info": " $1 دی دہرائی توں {{جنس:$6|$2}}$7",
+ "revision-info": "$1 دی دہرائی توں {{GENDER:$6|$2}}$7",
"previousrevision": "→ پراݨا نسخہ",
"nextrevision": "نویں تبدیلی →",
"currentrevisionlink": "موجودہ حالت",
"searchrelated": "متعلقہ",
"searchall": "یکے",
"search-nonefound": "سوال دے نال رلدے ملدے نتارے کائنی۔",
+ "powersearch-legend": "اضافی ڳول",
+ "powersearch-ns": "ناں جائیں وچ ڳولو:",
"powersearch-togglelabel": "ݙیکھو",
"powersearch-toggleall": "یکے",
"powersearch-togglenone": "کوئی وی کائنی",
+ "search-external": "ٻاہردی ڳول",
"preferences": "ترجیحات",
"mypreferences": "ترجیحات",
"prefs-edits": "تبدیلیاں دی گنتی:",
"prefs-watchlist-edits-max": "ودھ کنوں ودھ تعداد: 1000",
"prefs-misc": "رلیا ملیا",
"prefs-resetpass": "پاس ورڈ تبدیل کرو",
+ "prefs-email": "ای میل دے آپشن",
"prefs-rendering": "شکل و صورت",
"saveprefs": "بچاؤ",
+ "prefs-editing": "لکھائی",
"searchresultshead": "ڳولو",
"stub-threshold-sample-link": "نمونہ",
"stub-threshold-disabled": "غیر فعال",
"prefs-emailconfirm-label": "ای میل دی تصدیق",
"youremail": "ای میل",
"username": "{{GENDER:$1|ورتݨ آلا ناں}}:",
+ "group-membership-link-with-expiry": "$1 ($2 تائیں)",
"prefs-registration": "رجسٹریشن ویلہ:",
"yourrealname": "اصلی ناں:",
"yourlanguage": "زبان",
"prefs-displaywatchlist": "ݙکھاوݨ دے اختیارات",
"prefs-tokenwatchlist": "ٹوکن",
"prefs-diffs": "فرق",
+ "userrights": "حقوق صارف",
+ "userrights-lookup-user": "ورتُو چُݨو",
"userrights-user-editname": "ورتݨ آلا ناں درج کرو:",
+ "userrights-groupsmember": "دا رکن ہے:",
"userrights-reason": "سبب:",
+ "userrights-expiry-current": "مکسی $1",
+ "userrights-expiry-none": "لامحدود",
"userrights-expiry": "مُکسی:",
"userrights-expiry-othertime": "ٻیا ویلا:",
"group": "گروپ:",
"group-user": "ورتݨ آلے",
"group-bot": "بوٹ",
"group-sysop": "منتظمین",
+ "group-bureaucrat": "بیوروکریٹ",
"group-all": "(سارے)",
"group-user-member": "{{GENDER:$1|ورتݨ آلا}}",
+ "group-bot-member": "{{GENDER:$1|بوٹ}}",
"grouppage-bot": "{{ns:project}}:بوٹ",
"grouppage-sysop": "{{ns:project}}:ایڈمنسٹریٹر",
+ "right-read": "ورقے پڑھو",
+ "right-edit": "ورقے وچ لکھو",
"right-move": "ورقے ٹورو",
"right-movefile": "فائلاں ٹورو",
"right-upload": "فائلاں چڑھاؤ",
"right-editmyoptions": "آپݨیاں ذاتی ترجیحاں لکھو",
"grant-group-email": "ای میل بھیجو",
"grant-createaccount": "کھاتے کھولو",
+ "grant-uploadfile": "نویاں فائلاں اپ لوڈ کرو",
"grant-basic": "بنیادی حقوق",
"newuserlogpage": "کھاتہ بݨاوݨ آلی لاگ",
"rightslog": "ورتݨ والے دے حقاں دی لاگ",
"doubleredirects": "Dvojne preusmeritve",
"doubleredirectstext": "Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.\nVsaka vrstica vsebuje povezavo do prve in druge preusmeritve, kakor tudi do cilja druge preusmeritve, ki je po navadi »prava« ciljna stran, na katero naj bi kazala prva preusmeritev.\n<del>Prečrtani</del> vnosi so bili razrešeni.",
"double-redirect-fixed-move": "Stran [[$1]] smo premaknili.\nSamodejno smo jo posodobili in sedaj se preusmerja na [[$2]].",
- "double-redirect-fixed-maintenance": "Samodejno popravljanje dvojne preusmeritve z [[$1]] na [[$2]] v vzdrževalnem delu.",
+ "double-redirect-fixed-maintenance": "Samodejno popravljanje dvojne preusmeritve z [[$1]] na [[$2]] v vzdrževalnem delu",
"double-redirect-fixer": "Popravljalec preusmeritev",
"brokenredirects": "Pretrgane preusmeritve",
"brokenredirectstext": "Naslednje preusmeritve kažejo na neobstoječe strani:",
"restrictionsfield-badip": "Neveljaven IP-naslov ali obseg: $1",
"restrictionsfield-label": "Dovoljeni IP-obsegi:",
"restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite:\n<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Napaka: $1",
+ "edit-error-long": "Napake:\n\n$1",
"revid": "redakcija $1",
"pageid": "ID strani $1",
"rawhtml-notallowed": "Oznak <html> ni možno uporabljati izven normalnih strani.",
"Zoranzoki21",
"Obsuser",
"Prevodim",
- "Acamicamacaraca"
+ "Acamicamacaraca",
+ "BokicaK"
]
},
"tog-underline": "Подвлачење веза:",
"june-date": "$1 јун",
"july-date": "$1 јул",
"august-date": "$1 август",
- "september-date": "$1 Ñ\81емпÑ\82ембаÑ\80",
+ "september-date": "$1 септембар",
"october-date": "$1 окотобар",
"november-date": "$1 новембар",
"december-date": "$1 децембар",
"userlogin-reauth": "Морате се поново пријавити да би верификовали да сте {{GENDER:$1|$1}}.",
"userlogin-createanother": "Отвори још један налог",
"createacct-emailrequired": "Имејл адреса",
- "createacct-emailoptional": "Ð\98меÑ\98л адÑ\80еÑ\81а (опÑ\86ионо)",
+ "createacct-emailoptional": "Ð\90дÑ\80еÑ\81а е-поÑ\88Ñ\82е (необавезно)",
"createacct-email-ph": "Унесите Вашу имејл адресу",
"createacct-another-email-ph": "Унесите имејл адресу",
"createaccountmail": "Користите привремену, случајно створену лозинку и пошаљите на наведену имејл адресу",
- "createacct-realname": "Ð\9fÑ\80аво име (опÑ\86ионо)",
+ "createacct-realname": "Ð\9fÑ\80аво име (необавезно)",
"createacct-reason": "Разлог",
"createacct-reason-ph": "Зашто правите још један налог?",
"createacct-submit": "Отвори налог",
"eauthentsent": "На наведену имејл адресу је послат потврдни код.\nПре него што пошаљемо даљње поруке, пратите упутства с имејла да бисте потврдили да сте Ви отворили налог.",
"throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
"mailerror": "Грешка при слању поруке: $1",
- "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу ИП адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога}} претходни $2, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове ИП адресе тренутно не могу отворити више налога.",
+ "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу IP адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога}} претходни $2, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове IP адресе тренутно не могу отворити више налога.",
"emailauthenticated": "Ваша имејл адреса је потврђена $2 у $3.",
"emailnotauthenticated": "Ваша имејл адреса још није потврђена.\nИмејл неће бити послат ни у једном од следећих случајева.",
"noemailprefs": "Унесите имејл адресу како би ове могућности радиле.",
"subject-preview": "Преглед теме:",
"previewerrortext": "Догодила се грешка приликом приказивања ваших измена.",
"blockedtitle": "Корисник је блокиран",
- "blockedtext": "<strong>Ваше корисничко име или ИП адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи имејл овом кориснику“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварању било каквих упита.",
- "autoblockedtext": "Ваша ИП адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи имејл овом кориснику“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
+ "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи имејл овом кориснику“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана IP адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварању било каквих упита.",
+ "autoblockedtext": "Ваша IP адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи имејл овом кориснику“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана IP адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
"blockednoreason": "разлог није наведен",
"whitelistedittext": "За уређивање странице је потребно да будете $1.",
"confirmedittext": "Морате да потврдите своју имејл адресу пре уређивања страница.\nПоставите и потврдите имејл адресу преко [[Special:Preferences|подешавања]].",
"continue-editing": "Иди на уређивачки оквир",
"previewconflict": "Овај преглед осликава како ће текст у текстуалном оквиру изгледати.",
"session_fail_preview": "Извињавамо се! Нисмо могли да обрадимо Вашу измену због губитка података сесије.\n\nМожда сте одјављени. <strong>Проверите да ли сте пријављени и покушајте поново</strong>.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите, те проверите да ли су на Вашем претраживачу дозвољени колачићи са овог сајта.",
- "session_fail_preview_html": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\n<em>Будући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.</em>\n\n<strong>Ако сте покушали да направите праву измену, покушајте поново.<strong>\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли Ваш претраживач дозвољава колачиће са овог сајта.",
+ "session_fail_preview_html": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\n<em>Будући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.</em>\n\n<strong>Ако сте покушали да направите праву измену, покушајте поново.<strong>\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли Ваш прегледач дозвољава колачиће са овог сајта.",
"token_suffix_mismatch": "'''Ваша измена је одбачена јер је ваш прегледач убацио знакове интерпункције у новчић уређивања.\nТо се понекад догађа када се користи неисправан посредник.'''",
"edit_form_incomplete": "<strong>Неки делови обрасца за уређивање нису стигли до сервера. Проверите да ли су ваше измене непромењене и покушајте поново.</strong>",
"editing": "Уређујете $1",
"undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]])",
"undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
"cantcreateaccount-text": "Отварање налога с ове ИП адресе (<strong>$1</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
- "cantcreateaccount-range-text": "Отварање налога са ИП адреса у распону <strong>$1</strong>, који укључује и вашу ИП адресу (<strong>$4</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
+ "cantcreateaccount-range-text": "Отварање налога са IP адреса у распону <strong>$1</strong>, који укључује и вашу IP адресу (<strong>$4</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
"viewpagelogs": "Погледај дневнике ове странице",
"nohistory": "Не постоји историја измена ове странице.",
"currentrev": "Текућа измена",
"last": "разл",
"page_first": "прва",
"page_last": "последња",
- "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> = разлика с тренутном изменом, <strong>({{int:last}})</strong> = разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> = мала измена",
+ "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> = разлика с тренутном изменом, <strong>({{int:last}})</strong> = разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> = мања измена",
"history-fieldset-title": "Преглед измена",
"history-show-deleted": "Само обрисане измене",
"histfirst": "најстарије",
"rcfilters-filter-categorization-label": "Измјене категорија",
"rcfilters-filter-categorization-description": "Записи о страницама додатим или уклоњеним из категорија.",
"rcfilters-filter-logactions-label": "Радње забележене у дневницима",
- "rcfilters-filter-logactions-description": "Административне акције, стварање налога, брисање страница, отпремања…",
+ "rcfilters-filter-logactions-description": "Административне радње, стварање налога, брисање страница, отпремања…",
"rcfilters-hideminor-conflicts-typeofchange-global": "Филтер за „мање” измене је у сукобу са једним или више филтера типа измена, зато што одређени типови измена не могу да се означе као „мање”. Сукобљени филтери су означени у подручју Активни филтери, изнад.",
"rcfilters-hideminor-conflicts-typeofchange": "Одређени типови измена не могу да се означе као „мање”, тако да је овај филтер у сукобу са следећим филтерима типа измена: $1",
"rcfilters-typeofchange-conflicts-hideminor": "Овај филтер типа измене је у сукобу са филтером за „мање” измене. Одређени типови измена не могу да се означе као „мање”.",
"img-auth-nologinnWL": "Нисте пријављени и „$1” није на списку дозвољених.",
"img-auth-nofile": "Датотека „$1“ не постоји.",
"img-auth-isdir": "Покушавате да приступите фасцикли „$1“.\nДозвољен је само приступ датотекама.",
- "img-auth-streaming": "Учитавање „$1“.",
+ "img-auth-streaming": "Учитавам „$1“...",
"img-auth-public": "Сврха img_auth.php је да прослеђује датотеке из приватних викија.\nОвај вики је постављен као јавни.\nРади сигурности, img_auth.php је онемогућен.",
"img-auth-noread": "Корисник нема приступ за читање „$1“.",
"http-invalid-url": "Неисправна адреса: $1",
"nopagetext": "Тражена страница не постоји.",
"pager-newer-n": "{{PLURAL:$1|новији 1|новија $1|новијих $1}}",
"pager-older-n": "{{PLURAL:$1|старији 1|старија $1|старијих $1}}",
- "suppress": "РевизиÑ\98а",
+ "suppress": "Ð\98змена",
"querypage-disabled": "Ова посебна страница је онемогућена ради побољшања перформанси.",
"apihelp": "API помоћ",
"apihelp-no-such-module": "Модул „$1“ није пронађен.",
"apisandbox-submit": "Пошаљи захтев",
"apisandbox-reset": "Очисти",
"apisandbox-retry": "Покушај поново",
- "apisandbox-loading": "Учитавање информација за API модул \"$1\"",
+ "apisandbox-loading": "Учитавам информације за API модул „$1”...",
"apisandbox-load-error": "Дошло је до грешке приликом учитавања информација за API модул \"$1\": $2",
"apisandbox-no-parameters": "Овај API модул нема параметре.",
"apisandbox-helpurls": "Линкови за помоћ",
"block": "Блокирај корисника",
"unblock": "Деблокирање корисника",
"blockip": "Блокирај {{GENDER:$1|корисника|корисницу}}",
- "blockiptext": "Користите доњи образац да бисте забранили приступ за писање с одређене ИП адресе или корисничког имена.\nОво би требало да вршите само ради спречавања вандализма, у складу са [[{{MediaWiki:Policy-url}}|смерницама]].\nИзаберите конкретан разлог испод (пример: навођење конкретних страница које су вандализоване). Можете блокирати опсеге ИП адреса помоћу [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] синтаксе, највећи дозвољени опсег за IPv4 је /$1 односно /$2 за IPv6.",
+ "blockiptext": "Користите доњи образац да бисте забранили приступ за писање с одређене IP адресе или корисничког имена.\nОво би требало да вршите само ради спречавања вандализма, у складу са [[{{MediaWiki:Policy-url}}|смерницама]].\nИзаберите конкретан разлог испод (пример: навођење конкретних страница које су вандализоване). Можете блокирати опсеге IP адреса помоћу [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] синтаксе, највећи дозвољени опсег за IPv4 је /$1 односно /$2 за IPv6.",
"ipaddressorusername": "ИП адреса или корисничко име:",
"ipbexpiry": "Истиче:",
"ipbreason": "Разлог:",
"ipb-disableusertalk": "Онемогући кориснику да уређује своју страницу за разговор",
"ipb-change-block": "Поново блокирај корисника с овим поставкама",
"ipb-confirm": "Потврди блокирање",
- "badipaddress": "Неисправна ИП адреса",
+ "badipaddress": "Неисправна IP адреса",
"blockipsuccesssub": "Блокирање је успело",
"blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана|блокиран}}.<br />\nБлокирања можете да погледате [[Special:BlockList|овде]].",
"ipb-blockingself": "Овом радњом ћете блокирати себе! Јесте ли сигурни да то желите?",
"upload-disallowed-here": "Du kan inte skriva över denna fil.",
"filerevert": "Återställ $1",
"filerevert-legend": "Återställ fil",
- "filerevert-intro": "Du återställer '''[[Media:$1|$1]]''' till [$4 versionen från $2 kl. $3].",
+ "filerevert-intro": "Du håller på att återställa filen <strong>[[Media:$1|$1]]</strong> till [$4 versionen från $2 kl. $3].",
"filerevert-comment": "Anledning:",
"filerevert-defaultcomment": "Återställd till versionen från $1, kl. $2 ($3)",
"filerevert-submit": "Återställ",
"restrictionsfield-badip": "Ogiltig IP-adress eller intervall: $1",
"restrictionsfield-label": "Tillåtna IP-intervall:",
"restrictionsfield-help": "En IP-adress eller CIDR-intervall per rad. För att aktivera allting, använd<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
+ "edit-error-short": "Fel: $1",
+ "edit-error-long": "Fel:\n\n$1",
"revid": "sidversion $1",
"pageid": "sid-ID $1",
"rawhtml-notallowed": "<html>-taggar kan inte användas utanför normala sidor.",
"grant-group-watchlist-interaction": "โต้ตอบกับรายการเฝ้าดูของคุณ",
"grant-group-email": "ส่งอีเมล",
"grant-group-customization": "การปรับแต่งและการตั้งค่า",
+ "grant-group-administration": "ดำเนินปฏิบัติการบริหาร",
"grant-group-private-information": "เข้าถึงข้อมูลส่วนตัวเกี่ยวกับตัวคุณ",
"grant-group-other": "กิจกรรมเบ็ดเตล็ด",
"grant-blockusers": "บล็อกและปลดบล็อกผู้ใช้ต่าง ๆ",
"rcfilters-activefilters": "ตัวกรองที่ทำงาน",
"rcfilters-advancedfilters": "ตัวกรองขั้นสูง",
"rcfilters-limit-title": "ผลลัพธ์ที่แสดง",
- "rcfilters-limit-and-date-label": "$1 การเปลี่ยนแปลง $2",
+ "rcfilters-limit-and-date-label": "$1 การเปลี่ยนแปลง, $2",
"rcfilters-date-popup-title": "ระยะเวลาที่ค้นหา",
"rcfilters-days-title": "วันล่าสุด",
"rcfilters-hours-title": "ชั่วโมงล่าสุด",
"rcfilters-preference-help": "ย้อนกลับการออกแบบอินเตอร์เฟซใหม่ปี 2560 และอุปกรณ์ทั้งหมดที่เพิ่มเข้ามาหลังจากนั้น",
"rcfilters-filter-showlinkedfrom-label": "แสดงการเปลี่ยนแปลงในหน้าที่ลิงก์มาจาก",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>หน้าที่ลิงก์มา</strong>จากหน้าที่เลือก",
- "rcfilters-filter-showlinkedto-label": "à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\99à¹\89าà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8cมา",
+ "rcfilters-filter-showlinkedto-label": "à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\99à¹\89าà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8cà¹\84à¸\9b",
"rcfilters-filter-showlinkedto-option-label": "<strong>หน้าที่ลิงก์ไป</strong>หน้าที่เลือก",
"rcfilters-target-page-placeholder": "กรอกชื่อหน้า (หรือหมวดหมู่)",
"rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$3, $4</strong> (แสดงมากสุด <strong>$1</strong>)",
"backend-fail-notexists": "ไม่มีไฟล์ $1",
"backend-fail-hashes": "ไม่สามารถดึง hash ของไฟล์ เพื่อใช้เปรียบเทียบ",
"backend-fail-delete": "ไม่สามารถลบไฟล์ \"$1\"",
- "backend-fail-describe": "ไม่สามารถเปลี่ยน metadata ของไฟล์ \"$1\"",
+ "backend-fail-describe": "ไม่สามารถเปลี่ยนข้อมูลอภิพันธุ์ของไฟล์ \"$1\"",
"backend-fail-alreadyexists": "มีไฟล์ \"$1\" อยู่แล้ว",
"backend-fail-store": "ไม่สามารถเก็บไฟล์ \"$1\" ที่ \"$2\" ได้",
"backend-fail-copy": "ไม่สามารถคัดลอกไฟล์ \"$1\" ไปยัง \"$2\" ได้",
"sunday-at": "วันอาทิตย์เมื่อ $1 น.",
"yesterday-at": "เมื่อวานเมื่อ $1 น.",
"bad_image_list": "รูปแบบแสดงต่อไปนี้:\n\nเฉพาะรายการที่แสดง (ในแถวขึ้นต้นด้วย *) โดยลิงก์แรกของแต่ละแถวเป็นลิงก์ไปยังภาพที่เสีย\nโดยลิงก์ถัดไปเป็นข้อยกเว้น เช่น บทความที่ภาพถูกจัดในบรรทัดเดียวกับส่วนข้อความ",
- "metadata": "à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¹\81à¸\99à¸\9a",
+ "metadata": "à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸à¸ ิà¸\9eัà¸\99à¸\98ุà¹\8c",
"metadata-help": "ไฟล์นี้มีสารสนเทศเพิ่มเติม อาจเพิ่มจากกล้องถ่ายรูปดิจิทัลหรือสแกนเนอร์ที่ใช้เพื่อสร้างหรือแปลงภาพเป็นดิจิทัล\nหากไฟล์นี้ถูกดัดแปรจากสถานะต้นฉบับ รายละเอียดบางอย่างอาจไม่สะท้อนไฟล์ที่ถูกดัดแปลอย่างสมบูรณ์",
"metadata-expand": "แสดงรายละเอียดขยาย",
"metadata-collapse": "ซ่อนรายละเอียดขยาย",
- "metadata-fields": "à¹\80à¸\82à¸\95à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¹\80มà¸\97าà¹\80à¸\94à¸\95าà¸\82à¸à¸\87ภาà¸\9eà¸\94ัà¸\87à¸\97ีà¹\88à¹\81สà¸\94à¸\87รายà¸\81ารà¹\84วà¹\89à¹\83à¸\99à¸\82à¹\89à¸à¸\84วามà¸\99ีà¹\89 à¸\88ะà¸\96ูà¸\81รวมà¸\9aà¸\99หà¸\99à¹\89าภาà¸\9eà¹\80มืà¹\88à¸à¸\95าราà¸\87à¹\80มà¸\97าà¹\80à¸\94à¸\95าà¸\96ูà¸\81ยุà¸\9a เขตข้อมูลอื่น ๆ จะถูกซ่อนโดยปริยาย\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+ "metadata-fields": "à¹\80à¸\82à¸\95à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸à¸ ิà¸\9eัà¸\99à¸\98ุà¹\8cà¸\82à¸à¸\87ภาà¸\9eà¸\94ัà¸\87à¸\97ีà¹\88à¹\81สà¸\94à¸\87รายà¸\81ารà¹\84วà¹\89à¹\83à¸\99à¸\82à¹\89à¸à¸\84วามà¸\99ีà¹\89 à¸\88ะà¸\96ูà¸\81รวมà¸\9aà¸\99หà¸\99à¹\89าภาà¸\9eà¹\80มืà¹\88à¸à¸\95าราà¸\87à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸à¸ ิà¸\9eัà¸\99à¸\98ุà¹\8cà¸\96ูà¸\81ยุà¸\9a \nเขตข้อมูลอื่น ๆ จะถูกซ่อนโดยปริยาย\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"exif-imagewidth": "ความกว้าง",
"exif-imagelength": "ความสูง",
"exif-bitspersample": "บิตต่อคอมโพเนนต์",
"version-version": "($1)",
"version-no-ext-name": "[ไม่มีชื่อ]",
"version-license": "สัญญาอนุญาตมีเดียวิกิ",
+ "version-ext-license": "ใบอนุญาต",
+ "version-ext-colheader-name": "ส่วนขยาย",
+ "version-skin-colheader-name": "สกิน",
+ "version-ext-colheader-version": "รุ่น",
+ "version-ext-colheader-license": "ใบอนุญาต",
+ "version-ext-colheader-description": "คำอธิบาย",
+ "version-ext-colheader-credits": "ผู้ประพันธ์",
+ "version-license-title": "ใบอนุญาตสำหรับ $1",
+ "version-license-not-found": "ไม่พบสารสนเทศใบอนุญาตลงรายละเอียดสำหรับส่วนขยายนี้",
+ "version-credits-title": "ข้อความให้เกียรติเจ้าของงานสำหรับ $1",
+ "version-credits-not-found": "ไม่พบสารสนเทศข้อความให้เกียรติเจ้าของงานลงรายละเอียดสำหรับส่วนขยายนี้",
"version-poweredby-credits": "วิกินี้จัดทำโดย '''[https://www.mediawiki.org/ MediaWiki]''', สงวนลิขสิทธิ์ © 2001-$1 โดย $2",
"version-poweredby-others": "ผู้อื่น",
"version-poweredby-translators": "ผู้แปล translatewiki.net",
- "version-license-info": "มีเดียวิกิเป็นซอฟต์แวร์เสรี คุณสามารถแจกจ่าย และ/หรือ แก้ไขได้ภายใต้เงื่อนไขแห่งสัญญาอนุญาตสาธารณะทั่วไปของกนูตามที่เผยแพร่โดยมูลนิธิซอฟต์แวร์เสรี ไม่ว่ารุ่นที่ 2 แห่งสัญญาอนุญาต หรือรุ่นภายหลังอื่นใด (ตามที่คุณเลือก)\n\nมีเดียวิกิมีถูกแจกจ่ายด้วยหวังว่าจะเป็นประโยชน์ แต่ไม่มีการรับประกันใด ๆ ทั้งสิ้น ไม่มีแม้การรับประกันโดยนัยเพื่อการค้า หรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ดูรายละเอียดเพิ่มเติมที่สัญญาอนุญาตสาธารณะทั่วไปของกนู\n\nคุณควรได้รับ[{{SERVER}}{{SCRIPTPATH}}/COPYING สำเนาของสัญญาอนุญาตสาธารณะทั่วไปของกนู]พร้อมกับโปรแกรมนี้ หากไม่พบ กรุณาเขียนจดหมายถึงบริษัทมูลนิธิซอฟต์แวร์เสรี ที่อยู่ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA หรือ[//www.gnu.org/licenses/old-licenses/gpl-2.0.html อ่านออนไลน์]",
+ "version-credits-summary": "เราใคร่ขอตระหนักถึงบุคคลเหล่านี้สำหรับการเข้ามีส่วนร่วมต่อ[[Special:Version|มีเดียวิกิ]]",
+ "version-license-info": "มีเดียวิกิเป็นซอฟต์แวร์เสรี คุณสามารถแจกจ่าย และ/หรือ แก้ไขได้ภายใต้เงื่อนไขแห่งสัญญาอนุญาตสาธารณะทั่วไปของกนูตามที่มูลนิธิซอฟต์แวร์เสรีเผยแพร่ ไม่ว่ารุ่นที่ 2 แห่งสัญญาอนุญาตฯ หรือรุ่นภายหลังอื่นใด (ตามที่คุณเลือก)\n\nมีเดียวิกิแจกจ่ายด้วยหวังว่าจะเป็นประโยชน์ แต่<em>ไม่มีการรับประกันใด ๆ ทั้งสิ้น</em> ไม่มีแม้คำรับรองแสดงเจตนาเป็นนัยเพื่อ<strong>การค้า</strong>หรือ<strong>ความเหมาะสมสำหรับความมุ่งหมายเฉพาะ</strong> ดูรายละเอียดเพิ่มเติมที่สัญญาอนุญาตสาธารณะทั่วไปของกนู\n\nคุณควรได้รับ[{{SERVER}}{{SCRIPTPATH}}/COPYING สำเนาของสัญญาอนุญาตสาธารณะทั่วไปของกนู]พร้อมกับโปรแกรมนี้ หากไม่พบ กรุณาเขียนถึงบริษัทมูลนิธิซอฟต์แวร์เสรี จำกัด ที่อยู่ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA หรือ[//www.gnu.org/licenses/old-licenses/gpl-2.0.html อ่านออนไลน์]",
"version-software": "ซอฟต์แวร์ที่ติดตั้ง",
"version-software-product": "ผลิตภัณฑ์",
"version-software-version": "รุ่น",
+ "version-entrypoints": "ยูอาร์แอลจุดเข้า",
+ "version-entrypoints-header-entrypoint": "จุดเข้า",
+ "version-entrypoints-header-url": "ยูอาร์แอล",
"version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath เส้นทางบทความ]",
"version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath เส้นทางสคริปต์]",
+ "version-libraries": "คลังที่ติดตั้ง",
+ "version-libraries-library": "คลัง",
+ "version-libraries-version": "รุ่น",
+ "version-libraries-license": "ใบอนุญาต",
+ "version-libraries-description": "คำอธิบาย",
+ "version-libraries-authors": "ผู้ประพันธ์",
"redirect": "การเปลี่ยนทางตามชื่อไฟล์ รหัสประจำผู้ใช้ หน้า รุ่นหรือปูม",
"redirect-summary": "หน้าพิเศษนี้เปลี่ยนทางไปยังไฟล์ (ระบุเป็นชื่อไฟล์) หน้า (ระบุเป็นรหัสรุ่นหรือรหัสหน้า) หรือหน้าผู้ใช้ (ระบุเป็นรหัสผู้ใช้ตัวเลข) การใช้งาน: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] หรือ [[{{#Special:Redirect}}/logid/186]]",
"redirect-submit": "ไป",
"mw-widgets-dateinput-placeholder-month": "TTTT-BB",
"date-range-from": "Mula sa petsang:",
"randomrootpage": "Alin mang pinag-ugatang/pinagmulang pahina",
+ "edit-error-long": "Mga kamalian:",
"gotointerwiki-invalid": "Di-wasto ang tinukoy na pamagat."
}
"tag-filter": "[[Special:Tags|Etiket]] süzgeci:",
"tag-filter-submit": "Süzgeç",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiket|Etiketler}}]]: $2)",
+ "tag-mw-new-redirect": "Yeni yönlendirme",
+ "tag-mw-removed-redirect": "Yönlendirme kaldırıldı",
+ "tag-mw-changed-redirect-target": "Yönlendirme hedefi değiştirildi",
"tags-title": "Etiketler",
"tags-intro": "Bu sayfa, yazılımın bir değişikliği işaretleyebileceği etiketleri ve bunların anlamlarını listeler.",
"tags-tag": "Etiket adı",
"nolicense": "Відсутнє",
"licenses-edit": "Редагувати параметри ліцензії",
"license-nopreview": "(Попередній перегляд недоступний)",
- "upload_source_url": "(введіть правильну, публічно доступну інтернет-адресу)",
- "upload_source_file": " (файл на вашому комп'ютері)",
+ "upload_source_url": "(файл, розміщений за правильною, публічно доступною інтернет-адресою)",
+ "upload_source_file": "(файл на вашому комп'ютері)",
"listfiles-delete": "видалити",
"listfiles-summary": "Ця спеціальна сторінка показує всі завантажені файли.",
"listfiles_search_for": "Пошук по назві зображення:",
"pageswithprop-legend": "Сторінки з перевизначеними властивостями",
"pageswithprop-text": "Тут перераховані сторінки, у яких були вручну перевизначені окремі властивості.",
"pageswithprop-prop": "Назва властивості:",
- "pageswithprop-reverse": "Сортувати у зворотньому порядку",
+ "pageswithprop-reverse": "Сортувати у зворотному порядку",
"pageswithprop-sortbyvalue": "Сортувати за значенням властивості",
"pageswithprop-submit": "Перейти",
"pageswithprop-prophidden-long": "довге значення текстової властивості приховано ($1)",
"restrictionsfield-badip": "Недійсна IP-адреса або діапазон: $1",
"restrictionsfield-label": "Дозволені діапазони IP-адрес:",
"restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Помилка: $1",
+ "edit-error-long": "Помилки:\n\n$1",
"revid": "версія $1",
"pageid": "ID сторінки $1",
"rawhtml-notallowed": "Теги <html> не можна використовувати за межами звичайних сторінок.",
"Abuaneeqa",
"Saraiki",
"BukhariSaeed",
- "Zainab Meher"
+ "Zainab Meher",
+ "Sayam Asjad"
]
},
"tog-underline": "ربط کی خط کشیدگی:",
"mergehistory-fail-no-change": "ضم تاریخچہ نے کسی بھی نسخے کو ضم نہیں کیا۔ براہ کرم صفحہ اور وقت کے پیرامیٹر کو دوبارہ جانچ لیں۔",
"mergehistory-fail-permission": "ناکافی اختیارات برائے ضم تاریخچہ۔",
"mergehistory-fail-self-merge": "ماخذ و مقصود صفحات یکساں ہیں۔",
+ "mergehistory-fail-timestamps-overlap": "ماخذ کی نظر ثانیوں کی منزل پر نظر ثانی کرنے کے بعد اوورپپ.",
"mergehistory-fail-toobig": "تاریخچے کو ضم نہیں کیا جا سکتا، کیونکہ {{PLURAL:$1|نسخے|نسخوں}} کی مقررہ حد $1 سے تجاوز کرنا ہوگا۔",
"mergehistory-no-source": "مآخذ صفحہ $1 موجود نہیں.",
"mergehistory-no-destination": "مقصود صفحہ $1 موجود نہیں.",
"userrights-editusergroup": "حلقہ ہائے {{GENDER:$1|صارف}} میں ترمیم کریں",
"userrights-viewusergroup": "جائزہ {{GENDER:$1|صارف}} گروہان",
"saveusergroups": "حلقہ ہائے {{GENDER:$1|صارف}} کو محفوظ کریں",
- "userrights-groupsmember": "رکنِ:",
- "userrights-groupsmember-auto": "اعتبارÛ\8c صارÙ\81 در",
+ "userrights-groupsmember": "رکن:",
+ "userrights-groupsmember-auto": "ضÙ\85Ù\86Û\8c رکÙ\86:",
"userrights-groups-help": "آپ ان حلقوں میں تبدیلی کرسکتے ہیں جن سے صارف متعلق ہے: \n* نشان زد خانہ کا مطلب یہ ہے کہ صارف کا تعلق اس گروہ سے ہے۔ \n* غیر نشان زد خانہ کا مطلب یہ ہے کہ صارف کا تعلق اس گروہ سے نہیں ہے۔ \n* یہ # علامت اس بات کا اشارہ ہے کہ آپ اس گروہ کو نہیں ہٹا سکتے جسے ایک مرتبہ آپ نے شامل کردیا ہو۔",
"userrights-reason": "وجہ:",
"userrights-no-interwiki": "دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.",
"userrights-expiry-options": "1 دن:1 day,1 ہفتہ:1 week,1 مہینہ:1 month,3 مہینے:3 months,6 مہینے:6 months,1 سال:1 year",
"userrights-invalid-expiry": "گروہ «$1» کا وقت اختتام درست نہیں ہے۔",
"userrights-expiry-in-past": "گروہ «$1» کا وقت اختتام بیت چکا ہے۔",
+ "userrights-cannot-shorten-expiry": "آپ \"$1\" گروپ میں رکنیت ختم کرنے کے لۓ آگے بڑھا سکتے ہیں. صرف اس صارف کو اس گروہ کو شامل کرنے اور ہٹانے کی اجازت کے لۓ اختتامی وقت آگے بڑھا سکتا ہے.",
"userrights-conflict": "اختیارات کی تبدیلی میں تنازع! براہ کرم نظر ثانی کریں اور اپنی تبدیلیوں کی تصدیق کریں۔",
"group": "حلقہ:",
"group-user": "صارفین",
"rcfilters-preference-help": "سنہ 2017ء کے انٹرفیس کو واپس لایا گیا ہے اور تمام آلات کو شامل کیا گیا ہے۔",
"rcfilters-filter-showlinkedfrom-label": "سے منسلک صفحات پر تبدیلیاں دکھائیں",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>صفحات سے منسلک</strong> چنندہ صفحہ",
+ "rcfilters-filter-showlinkedto-label": "صفحات",
+ "rcfilters-filter-showlinkedto-option-label": "منتخب کردہ صفحہ <strong> صفحات سے منسلک صفحات </ strong>",
"rcfilters-target-page-placeholder": "ایک صفحہ کا نام (یا زمرہ) درج کریں",
"rcnotefrom": "ذیل میں <strong>$2</strong> سے کی گئی {{PLURAL:$5|تبدیلی|تبدیلیاں}} <strong>$1</strong> تک دکھائی جا رہی ہیں۔",
"rclistfromreset": "انتخاب تاریخ کی ترتیب نو",
"upload-scripted-dtd": "SVG فائل کو اپلوڈ نہیں کیا جاسکتا جس ميں ایک غیر معیاری DTD کا اظہار ہو۔",
"uploaded-script-svg": "اپلوڈ کردہ SVG فائل میں scriptable عنصر \"$1\" ملا۔",
"uploaded-hostile-svg": "اپلوڈ کردہ ایس وی جی فائل کے اسٹائل عنصر میں غیر محفوظ سی ایس ایس دریافت ہوئی ہے۔",
+ "uploaded-event-handler-on-svg": "ایونٹ ہینڈلر صفات <code> $1 = \"$2\" </code> کو ترتیب دینے کی اجازت نہیں ہے کہ SVG فائلوں میں.",
+ "uploaded-setting-href-svg": "والدین \"عنصر\" ٹیگ کا استعمال کرتے ہوئے \"href\" شامل کرنے کے لئے والدین عنصر کو منسوب کیا جاتا ہے.",
"uploadscriptednamespace": "اس ایس وی جی فائل میں غیر قانونی نام فضا \"<nowiki>$1</nowiki>\" موجود ہے۔",
"uploadinvalidxml": "اپلوڈ کردہ فائل میں موجود ایکس ایم ایل کا تجزیہ نہیں کیا جا سکا۔",
"uploadvirus": "اس فائل میں وائرس موجود ہے!\nتفصیلات: $1",
"backend-fail-maxsize": "فائل $1 کی معلومات نہیں لکھی جا سکی کیونکہ اس کا حجم {{PLURAL:$2|ایک بائٹ|$2 بائٹ}} سے زیادہ ہے۔",
"backend-fail-readonly": "فی الحال ذخیرہ کا پس منظر $1 فقط خواندگی حالت میں ہے۔ اس کی وجہ حسب ذیل ہے:\n\n\n<em>«$2»</em>",
"backend-fail-synced": "اس وقت فائل $1 داخلی ذخیرہ کے پس منظر کے اندر ناپائیدار حالت میں ہے۔",
+ "filejournal-fail-dbconnect": "\"$1\" اسٹوریج بیک اپ کے لئے جرنل ڈیٹا بیس سے منسلک نہیں ہوسکتا.",
+ "filejournal-fail-dbquery": "\"$1\" اسٹوریج بیک اپ کے لئے جرنل ڈیٹا بیس کو اپ ڈیٹ نہیں کیا جا سکا.",
"lockmanager-notlocked": "«$1» کو کھولا نہیں جا سکا؛ کیونکہ یہ مقفل نہیں ہے۔",
"lockmanager-fail-closelock": "«$1» کا فائل لاک بند نہیں کیا جا سکا۔",
"lockmanager-fail-deletelock": "«$1» کا فائل لاک حذف نہیں کیا جا سکا۔",
"lockmanager-fail-acquirelock": "«$1» کا قفل حاصل نہیں کیا جا سکا۔",
"lockmanager-fail-openlock": "«$1» کا فائل لاک کھولا نہیں جا سکا۔",
"lockmanager-fail-releaselock": "«$1» کا قفل کھولا نہ جا سکا۔",
+ "lockmanager-fail-db-bucket": "$1 بالٹی میں کافی تالا ڈیٹا بیس سے رابطہ نہیں کیا جا سکا.",
"lockmanager-fail-db-release": "$1 ڈیٹابیس سے قفل نہیں ہٹائے جا سکے۔",
"lockmanager-fail-svr-acquire": "$1 سرور کے قفل حاصل نہیں کیے جا سکے۔",
"lockmanager-fail-svr-release": "$1 سرور کے قفل ہٹائے نہیں جا سکے۔",
"zip-file-open-error": "مواد کی جانچ کے لیے زپ فائل کھولنے کے دوران میں کوئی نقص واقع ہوا۔",
"zip-wrong-format": "یہ زپ فائل نہیں تھی۔",
+ "zip-bad": "فائل ایک بدعنوانی یا دوسری صورت میں غیر قابل رسائی زپ فائل ہے.\nیہ سیکورٹی کیلئے مناسب طریقے سے جانچ نہیں کیا جا سکتا.",
"uploadstash": "پوشیدہ اپلوڈ کریں",
"uploadstash-summary": "اس صفحہ کے ذریعہ ان فائلوں تک رسائی حاصل ہوگی جو اپلوڈ ہو چکی ہیں یا ہو رہی ہیں لیکن اب تک ویکی پر شائع نہیں ہوئیں۔ یہ فائلیں محض اپلوڈ کنندہ صارفین ہی کو نظر آتی ہیں۔",
"uploadstash-clear": "پوشیدہ فائلوں کو صاف کریں",
"uploadstash-bad-path-invalid": "راہ درست نہیں ہے۔",
"uploadstash-bad-path-unknown-type": "نامعلوم قسم \"$1\"",
"uploadstash-bad-path-unrecognized-thumb-name": "غیر معروف نام تصغیر",
+ "uploadstash-file-not-found": "اسکرین میں کلیدی \"$1\" نہیں مل سکا.",
+ "uploadstash-file-not-found-missing-content-type": "لاپتہ مواد کی قسم ہیڈر.",
"uploadstash-no-extension": "توسیع نہیں ہے۔",
"uploadstash-zero-length": "فائل کا طول صفر ہے۔",
"invalid-chunk-offset": "آفسیٹ کا قطعہ نادرست ہے",
"pageswithprop-legend": "صفحات مع خاصیت صفحہ",
"pageswithprop-text": "اس صفحہ میں ان تمام صفحات کی فہرست موجود ہے جس کسی مخصوص خاصیت صفحہ کو استعمال کر رہے ہیں۔",
"pageswithprop-prop": "نام خاصیت:",
+ "pageswithprop-reverse": "ریورس آرڈر میں ترتیب دیں",
+ "pageswithprop-sortbyvalue": "پراپرٹی کی قیمت کی طرف سے ترتیب دیں",
"pageswithprop-submit": "ٹھیک",
"pageswithprop-prophidden-long": "طویل متن کی خاصیت کی پوشیدہ قدر ($1)",
"pageswithprop-prophidden-binary": "ثنائی خاصیت کی پوشیدہ قدر ($1)",
"apisandbox-sending-request": "اے پی آئی درخواست بھیجی جا رہی ہے۔۔۔",
"apisandbox-loading-results": "اے پی آئی کے نتائج موصول ہو رہے ہیں۔۔۔",
"apisandbox-results-error": "اے پی آئی کوئری کا جواب لوڈ ہونے کے دوران میں نقص واقع ہوا: $1",
+ "apisandbox-request-selectformat-label": "درخواست کے اعداد و شمار کے طور پر دکھائیں:",
"apisandbox-request-url-label": "درخواست کا ربط:",
"apisandbox-request-json-label": "JSON درخواست:",
"apisandbox-request-time": "درخواست کا وقت: {{PLURAL:$1|$1 ملی سیکنڈ}}",
"restrictionsfield-badip": "Địa chỉ hoặc dải IP không hợp lệ: $1.",
"restrictionsfield-label": "Các dải IP được cho phép:",
"restrictionsfield-help": "Mỗi dòng một địa chỉ IP hoặc dải CIDR. Để kích hoạt tất cả mọi địa chỉ IP, sử dụng:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Lỗi: $1",
+ "edit-error-long": "Lỗi:\n\n$1",
"revid": "phiên bản $1",
"pageid": "số trang $1",
"rawhtml-notallowed": "Không thể sử dụng thẻ <html> bên ngoài trang bình thường.",
"special-characters-group-thai": "Thai",
"special-characters-group-lao": "Lao",
"special-characters-group-khmer": "Khmer",
- "randomrootpage": "Ojúewé ìtẹ́dìí àrìnàkò"
+ "randomrootpage": "Ojúewé ìtẹ́dìí àrìnàkò",
+ "edit-error-short": "Àṣìṣe: $1",
+ "edit-error-long": "Àwọn àsìṣe:\n\n\n$1"
}
"resetpass-validity-soft": "您的密码无效:$1\n\n请选择一个新密码,或单击“{{int:authprovider-resetpass-skip-label}}”以稍后重置。",
"passwordreset": "重置密码",
"passwordreset-text-one": "请完成此表单来通过电子邮件接收临时密码。",
- "passwordreset-text-many": "{{PLURAL:$1|å\9c¨æ¤é\94®å\85¥æ\82¨å¸\8cæ\9c\9bæ\8e¥æ\94¶ä¸´æ\97¶å¯\86ç \81ç\9a\84é\82®ä»¶å\9c°å\9d\80。}}",
+ "passwordreset-text-many": "{{PLURAL:$1|å¡«å\86\99å\85¶ä¸ä¸\80个å\97段以é\80\9aè¿\87ç\94µå\90é\82®ä»¶æ\8e¥æ\94¶ä¸´æ\97¶å¯\86ç \81。}}",
"passwordreset-disabled": "此Wiki已经禁用密码重置。",
"passwordreset-emaildisabled": "此Wiki上无法使用邮件功能。",
"passwordreset-username": "用户名:",
"doubleredirects": "双重重定向",
"doubleredirectstext": "本页面列出重定向至其他重定向页面的页面。每行含有第一及第二重定向的链接和第二重定向的目标(这通常是第一重定向应该指向的“实际”目标页面)。<del>带删除线的</del>条目已经被解决。",
"double-redirect-fixed-move": "[[$1]]已被移动。它已自动更新,并且现在重定向至[[$2]]。",
- "double-redirect-fixed-maintenance": "在维护工作中自动修复双重重定向自[[$1]]至[[$2]]。",
+ "double-redirect-fixed-maintenance": "在维护工作中自动修复双重重定向自[[$1]]至[[$2]]",
"double-redirect-fixer": "重定向修复器",
"brokenredirects": "受损重定向",
"brokenredirectstext": "以下重定向链接至不存在的页面:",
"restrictionsfield-badip": "无效的IP地址或段:$1",
"restrictionsfield-label": "允许的IP段:",
"restrictionsfield-help": "每行一个IP地址或CIDR段。要启用任何地址或地址段,可使用:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "错误:$1",
+ "edit-error-long": "错误:\n\n$1",
"revid": "修订版本$1",
"pageid": "页面ID$1",
"rawhtml-notallowed": "<html>标签不能在一般页面以外使用。",
"resetpass-validity-soft": "您的密碼無效:$1 \n\n請現在設定您的新密碼,或點選 \"{{int:authprovider-resetpass-skip-label}}\" 稍後再重設。",
"passwordreset": "重新設定密碼",
"passwordreset-text-one": "完成此表單,透過電子郵件傳送臨時密碼以重新設定您的密碼。",
- "passwordreset-text-many": "{{PLURAL:$1|請完成此表單以透過電子郵件接收臨時密碼。}}",
+ "passwordreset-text-many": "{{PLURAL:$1|填寫其中一個欄位以透過電子郵件接收臨時密碼。}}",
"passwordreset-disabled": "此 Wiki 已停用重設密碼。",
"passwordreset-emaildisabled": "此 Wiki 已停用電子郵件功能。",
"passwordreset-username": "使用者名稱:",
"doubleredirects": "雙重的重新導向",
"doubleredirectstext": "此頁列出重新導向至另一個重新導向頁面的頁面。每一列都包含第一次和第二次重新導向頁面的連結,以及第二次重新導向之後的目標,第二次重新導向之後的目標通常是「實際」的目標頁面,也是第一個重新導向頁面應該指向的頁面。\n<del>刪節線</del> 代表該項目的問題已經解決。",
"double-redirect-fixed-move": "[[$1]] 已完成移動。\n此頁面已自動更新並重新導向至 [[$2]]。",
- "double-redirect-fixed-maintenance": "在維護作業時自動修正雙重的重新導向自 [[$1]] 至 [[$2]]。",
+ "double-redirect-fixed-maintenance": "在維護作業時自動修正雙重的重新導向自 [[$1]] 至 [[$2]]",
"double-redirect-fixer": "重新導向修正者",
"brokenredirects": "損壞的重新導向",
"brokenredirectstext": "以下的重新導向頁面連結的頁面不存在:",
"checkbox-none": "無",
"checkbox-invert": "反向選擇",
"allpages": "所有頁面",
- "nextpage": "下一頁 ($1)",
- "prevpage": "上一頁 ($1)",
+ "nextpage": "下一頁($1)",
+ "prevpage": "上一頁($1)",
"allpagesfrom": "顯示頁面開始於:",
"allpagesto": "顯示頁面結束於:",
"allarticles": "所有頁面",
"whatlinkshere-hidetrans": "$1 引用",
"whatlinkshere-hidelinks": "$1 連結",
"whatlinkshere-hideimages": "$1 檔案連結",
- "whatlinkshere-filters": "搜尋",
+ "whatlinkshere-filters": "篩選器",
"whatlinkshere-submit": "前往",
"autoblockid": "自動封鎖 #$1",
"block": "封鎖使用者",
"allmessagescurrent": "目前的訊息文字",
"allmessagestext": "此處列出所有在 MediaWiki 命名空間中系統訊息。\n若您想參與官方的 MediaWiki 在地化,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki 在地化] 與 [https://translatewiki.net translatewiki.net]。",
"allmessagesnotsupportedDB": "已停用 <strong>$wgUseDatabaseMessages</strong> 設定,無法使用此頁面。",
- "allmessages-filter-legend": "搜尋",
+ "allmessages-filter-legend": "篩選",
"allmessages-filter": "依修改狀況搜尋:",
"allmessages-filter-unmodified": "未修改",
"allmessages-filter-all": "全部",
"newimages": "新檔圖庫",
"imagelisttext": "以下為 <strong>$1</strong> 清單,$2 排序。",
"newimages-summary": "此特殊頁面中顯示最新上傳的檔案。",
- "newimages-legend": "搜尋",
+ "newimages-legend": "篩選",
"newimages-label": "檔案名稱 (或部份檔名):",
"newimages-user": "IP 位址或使用者名稱",
"newimages-newbies": "僅顯示新帳號的貢獻",
"external_image_whitelist": " #請勿修改本行文字<pre>\n#請於下方填寫正規表示法 (只需 // 之間的內容)\n#將會檢查外部連結的圖片是否符合這些條件\n#符合條件的連結會以圖片顯示,否則只顯示連結\n#以 # 開頭的行會被做為註解\n#此條件不區分大小寫\n\n#請將所有正規表示法輸入在此行上方,請勿修改本行文字</pre>",
"tags": "有效變更標籤",
"tag-filter": "[[Special:Tags|標籤]]搜尋:",
- "tag-filter-submit": "搜尋",
+ "tag-filter-submit": "篩選器",
"tag-list-wrapper": "([[Special:Tags|$1 個標籤]]:$2)",
"tag-mw-contentmodelchange": "內容模型變更",
"tag-mw-contentmodelchange-description": "編輯 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel 更改頁面的內容模型]。",
"restrictionsfield-badip": "無效的 IP 位址或範圍:$1",
"restrictionsfield-label": "允許的 IP 範圍:",
"restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "錯誤:$1",
+ "edit-error-long": "錯誤:\n\n$1",
"revid": "修訂 $1",
"pageid": "頁面 ID $1",
"rawhtml-notallowed": "<html> 標籤無法在一般頁面之外使用。",
}
}
-stream_wrapper_register( 'mediawiki.compress.7z', 'SevenZipStream' );
+stream_wrapper_register( 'mediawiki.compress.7z', SevenZipStream::class );
if ( $count < 2 ) {
return false; // sanity
}
- if ( $bt[0]['class'] !== 'Maintenance' || $bt[0]['function'] !== 'shouldExecute' ) {
+ if ( $bt[0]['class'] !== self::class || $bt[0]['function'] !== 'shouldExecute' ) {
return false; // last call should be to this function
}
$includeFuncs = [ 'require_once', 'require', 'include', 'include_once' ];
$this->fatalError( $err, intval( $die ) );
}
$this->outputChanneled( false );
- if ( PHP_SAPI == 'cli' || PHP_SAPI == 'phpdbg' ) {
+ if (
+ ( PHP_SAPI == 'cli' || PHP_SAPI == 'phpdbg' ) &&
+ !defined( 'MW_PHPUNIT_TEST' )
+ ) {
fwrite( STDERR, $err . "\n" );
} else {
print $err;
"must exist and be readable in the source directory.\n" .
"Use --conf to specify it." );
}
+ if ( isset( $this->mOptions['server'] ) ) {
+ $_SERVER['SERVER_NAME'] = $this->mOptions['server'];
+ }
$wgCommandLineMode = true;
return $settingsFile;
}
}
-$maintClass = 'AddRFCAndPMIDInterwiki';
+$maintClass = AddRFCAndPMIDInterwiki::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'AddSite';
+$maintClass = AddSite::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "AttachLatest";
+$maintClass = AttachLatest::class;
require_once RUN_MAINTENANCE_IF_MAIN;
$this->stderr = fopen( "php://stderr", "wt" );
// Built-in output and filter plugins
- $this->registerOutput( 'file', 'DumpFileOutput' );
- $this->registerOutput( 'gzip', 'DumpGZipOutput' );
- $this->registerOutput( 'bzip2', 'DumpBZip2Output' );
- $this->registerOutput( 'dbzip2', 'DumpDBZip2Output' );
- $this->registerOutput( '7zip', 'Dump7ZipOutput' );
-
- $this->registerFilter( 'latest', 'DumpLatestFilter' );
- $this->registerFilter( 'notalk', 'DumpNotalkFilter' );
- $this->registerFilter( 'namespace', 'DumpNamespaceFilter' );
+ $this->registerOutput( 'file', DumpFileOutput::class );
+ $this->registerOutput( 'gzip', DumpGZipOutput::class );
+ $this->registerOutput( 'bzip2', DumpBZip2Output::class );
+ $this->registerOutput( 'dbzip2', DumpDBZip2Output::class );
+ $this->registerOutput( '7zip', Dump7ZipOutput::class );
+
+ $this->registerFilter( 'latest', DumpLatestFilter::class );
+ $this->registerFilter( 'notalk', DumpNotalkFilter::class );
+ $this->registerFilter( 'namespace', DumpNamespaceFilter::class );
// These three can be specified multiple times
$this->addOption( 'plugin', 'Load a dump plugin class. Specify as <class>[:<file>].',
+++ /dev/null
-This directory hold several benchmarking scripts used as a proof of speed
-or to track PHP performances over time.
-
-To get somehow accurate result, you might want to bound the PHP process
-to a specific CPU with `taskset` and raise its priority with `nice`. Example:
-
- $ taskset 1 nice -n-10 php bench_wfIsWindows.php
-
-australia-untidy.html.gz contains representative input text for
-benchmarkTidy.php. It needs to be decompressed before use.
--- /dev/null
+This directory hold several benchmarking scripts used track performances of
+MediaWiki and/or PHP.
+
+## Consistency
+
+On Linux, use of `taskset` and `nice` can help get more consistent results.
+
+For example:
+
+ $ taskset 1 nice -n-10 php bench_wfIsWindows.php
+
+## Fixtures
+
+* australia-untidy.html.gz: Representative input text for benchmarkTidy.php.
+ It needs to be decompressed before use.
}
}
-$maintClass = 'BenchHttpHttps';
+$maintClass = BenchHttpHttps::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'BenchWikimediaBaseConvert';
+$maintClass = BenchWikimediaBaseConvert::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'BenchmarkDeleteTruncate';
+$maintClass = BenchmarkDeleteTruncate::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'BenchIfSwitch';
+$maintClass = BenchIfSwitch::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'BenchStrtrStrReplace';
+$maintClass = BenchStrtrStrReplace::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'BenchUtf8TitleCheck';
+$maintClass = BenchUtf8TitleCheck::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'BenchWfIsWindows';
+$maintClass = BenchWfIsWindows::class;
require_once RUN_MAINTENANCE_IF_MAIN;
$this->bench( [
"minify ($filename)" => [
- 'function' => [ 'CSSMin', 'minify' ],
+ 'function' => [ CSSMin::class, 'minify' ],
'args' => [ $css ]
],
"remap ($filename)" => [
- 'function' => [ 'CSSMin', 'remap' ],
+ 'function' => [ CSSMin::class, 'remap' ],
'args' => [ $css, dirname( $file ), 'https://example.org/test/', true ]
],
] );
}
}
-$maintClass = 'BenchmarkCSSMin';
+$maintClass = BenchmarkCSSMin::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'BenchmarkHooks';
+$maintClass = BenchmarkHooks::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'BenchmarkJSMinPlus';
+$maintClass = BenchmarkJSMinPlus::class;
require_once RUN_MAINTENANCE_IF_MAIN;
public function __construct() {
parent::__construct();
$this->addDescription( 'Benchmarks HashBagOStuff and MapCacheLRU.' );
- $this->addOption( 'construct', 'Run construct only', false, false );
- $this->addOption( 'fill', 'Run fill only', false, false );
+ $this->addOption( 'method', 'One of "construct" or "set". Default: [All]', false, true );
}
public function execute() {
// 1000 keys (1...500, 500...1)
$keys = array_merge( $exampleKeys, array_reverse( $exampleKeys ) );
- $fill = $this->hasOption( 'fill' ) || !$this->hasOption( 'construct' );
- $construct = $this->hasOption( 'construct' ) || !$this->hasOption( 'fill' );
+ $method = $this->getOption( 'method' );
$benches = [];
- if ( $construct ) {
- $benches['HashBagOStuff-construct'] = [
+ if ( !$method || $method === 'construct' ) {
+ $benches['HashBagOStuff::__construct'] = [
'function' => function () use ( $max ) {
$obj = new HashBagOStuff( [ 'maxKeys' => $max ] );
},
];
- $benches['MapCacheLRU-construct'] = [
+ $benches['MapCacheLRU::__construct'] = [
'function' => function () use ( $max ) {
$obj = new MapCacheLRU( $max );
},
];
}
- if ( $fill ) {
- // For the fill bechmark, ensure object creation is not measured.
+ if ( !$method || $method === 'set' ) {
+ // For the set bechmark, do object creation in setup (not measured)
$hObj = null;
- $benches['HashBagOStuff-fill'] = [
+ $benches['HashBagOStuff::set'] = [
'setup' => function () use ( &$hObj, $max ) {
$hObj = new HashBagOStuff( [ 'maxKeys' => $max ] );
},
}
];
$mObj = null;
- $benches['MapCacheLRU-fill'] = [
+ $benches['MapCacheLRU::set'] = [
'setup' => function () use ( &$mObj, $max ) {
$mObj = new MapCacheLRU( $max );
},
}
}
-$maintClass = 'BenchmarkParse';
+$maintClass = BenchmarkParse::class;
require RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "BenchmarkPurge";
+$maintClass = BenchmarkPurge::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'BenchmarkTidy';
+$maintClass = BenchmarkTidy::class;
require RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ChangePassword";
+$maintClass = ChangePassword::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CheckBadRedirects";
+$maintClass = CheckBadRedirects::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CheckComposerLockUpToDate';
+$maintClass = CheckComposerLockUpToDate::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CheckImages";
+$maintClass = CheckImages::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CheckLess';
+$maintClass = CheckLess::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CheckUsernames";
+$maintClass = CheckUsernames::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CleanupAncientTables";
+$maintClass = CleanupAncientTables::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CleanupBlocks";
+$maintClass = CleanupBlocks::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CapsCleanup";
+$maintClass = CapsCleanup::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CleanupEmptyCategories';
+$maintClass = CleanupEmptyCategories::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ImageCleanup";
+$maintClass = ImageCleanup::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CleanupInvalidDbKeys';
+$maintClass = CleanupInvalidDbKeys::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CleanupPreferences'; // Tells it to run the class
+$maintClass = CleanupPreferences::class; // Tells it to run the class
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CleanupRemovedModules';
+$maintClass = CleanupRemovedModules::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CleanupSpam";
+$maintClass = CleanupSpam::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "TitleCleanup";
+$maintClass = TitleCleanup::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "UploadStashCleanup";
+$maintClass = UploadStashCleanup::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CleanupUsersWithNoId";
+$maintClass = CleanupUsersWithNoId::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "WatchlistCleanup";
+$maintClass = WatchlistCleanup::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ClearInterwikiCache";
+$maintClass = ClearInterwikiCache::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CommandLineInc';
+$maintClass = CommandLineInc::class;
require RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CompareParserCache";
+$maintClass = CompareParserCache::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CompareParsers";
+$maintClass = CompareParsers::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
protected function getAllGlobals() {
- $processor = new ReflectionClass( 'ExtensionProcessor' );
+ $processor = new ReflectionClass( ExtensionProcessor::class );
$settings = $processor->getProperty( 'globalSettings' );
$settings->setAccessible( true );
return array_merge( $settings->getValue(), $this->formerGlobals );
}
}
-$maintClass = 'ConvertExtensionToRegistration';
+$maintClass = ConvertExtensionToRegistration::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ConvertLinks";
+$maintClass = ConvertLinks::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ConvertUserOptions";
+$maintClass = ConvertUserOptions::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CopyFileBackend';
+$maintClass = CopyFileBackend::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CopyJobQueue';
+$maintClass = CopyJobQueue::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CreateAndPromote";
+$maintClass = CreateAndPromote::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "GenerateCommonPassword";
+$maintClass = GenerateCommonPassword::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DeleteArchivedFiles";
+$maintClass = DeleteArchivedFiles::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DeleteArchivedRevisions";
+$maintClass = DeleteArchivedRevisions::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DeleteBatch";
+$maintClass = DeleteBatch::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DeleteDefaultMessages";
+$maintClass = DeleteDefaultMessages::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DeleteEqualMessages";
+$maintClass = DeleteEqualMessages::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DeleteOldRevisions";
+$maintClass = DeleteOldRevisions::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DeleteOrphanedRevisions";
+$maintClass = DeleteOrphanedRevisions::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DeleteSelfExternals";
+$maintClass = DeleteSelfExternals::class;
require_once RUN_MAINTENANCE_IF_MAIN;
// Wasn't included from the file scope, halt execution (probably wanted the class)
// If a class is using commandLine.inc (old school maintenance), they definitely
// cannot be included and will proceed with execution
-if ( !Maintenance::shouldExecute() && $maintClass != 'CommandLineInc' ) {
+if ( !Maintenance::shouldExecute() && $maintClass != CommandLineInc::class ) {
return;
}
&& ( $wgLocalisationCacheConf['store'] == 'db'
|| ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) )
) {
- $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+ $wgLocalisationCacheConf['storeClass'] = LCStoreNull::class;
}
}
}
}
-$maintClass = 'DumpBackup';
+$maintClass = DumpBackup::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DumpCategoriesAsRdf";
+$maintClass = DumpCategoriesAsRdf::class;
require_once RUN_MAINTENANCE_IF_MAIN;
if ( $this->getDbType() == Maintenance::DB_NONE ) {
global $wgUseDatabaseMessages, $wgLocalisationCacheConf, $wgHooks;
$wgUseDatabaseMessages = false;
- $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+ $wgLocalisationCacheConf['storeClass'] = LCStoreNull::class;
$wgHooks['InterwikiLoadPrefix'][] = 'DumpIterator::disableInterwikis';
}
}
}
}
-$maintClass = "SearchDump";
+$maintClass = SearchDump::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DumpLinks";
+$maintClass = DumpLinks::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'TextPassDumper';
+$maintClass = TextPassDumper::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "UploadDumper";
+$maintClass = UploadDumper::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "EditCLI";
+$maintClass = EditCLI::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "EraseArchivedFile";
+$maintClass = EraseArchivedFile::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
-$maintClass = 'ExportSites';
+$maintClass = ExportSites::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "FetchText";
+$maintClass = FetchText::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "TestFileOpPerformance";
+$maintClass = TestFileOpPerformance::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'FindDeprecated';
+$maintClass = FindDeprecated::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'FindHooks';
+$maintClass = FindHooks::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'FindMissingFiles';
+$maintClass = FindMissingFiles::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'FindOrphanedFiles';
+$maintClass = FindOrphanedFiles::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'FixDefaultJsonContentPages';
+$maintClass = FixDefaultJsonContentPages::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "FixDoubleRedirects";
+$maintClass = FixDoubleRedirects::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "FixExtLinksProtocolRelative";
+$maintClass = FixExtLinksProtocolRelative::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "FixTimestamps";
+$maintClass = FixTimestamps::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "FixUserRegistration";
+$maintClass = FixUserRegistration::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'MaintenanceFormatInstallDoc';
+$maintClass = MaintenanceFormatInstallDoc::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "GenerateJsonI18n";
+$maintClass = GenerateJsonI18n::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "GenerateSitemap";
+$maintClass = GenerateSitemap::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "GetConfiguration";
+$maintClass = GetConfiguration::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "GetLagTimes";
+$maintClass = GetLagTimes::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "GetSlaveServer";
+$maintClass = GetSlaveServer::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "GetTextMaint";
+$maintClass = GetTextMaint::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'HHVMMakeRepo';
+$maintClass = HHVMMakeRepo::class;
require RUN_MAINTENANCE_IF_MAIN;
exit( $ret );
}
}
-$maintClass = 'RunHipHopServer';
+$maintClass = RunHipHopServer::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'BackupReader';
+$maintClass = BackupReader::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
-$maintClass = 'ImportImages';
+$maintClass = ImportImages::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'ImportSiteScripts';
+$maintClass = ImportSiteScripts::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'ImportSites';
+$maintClass = ImportSites::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ImportTextFiles";
+$maintClass = ImportTextFiles::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "InitEditCount";
+$maintClass = InitEditCount::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "InitSiteStats";
+$maintClass = InitSiteStats::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'InitUserPreference'; // Tells it to run the class
+$maintClass = InitUserPreference::class; // Tells it to run the class
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CommandLineInstaller';
+$maintClass = CommandLineInstaller::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "InvalidateUserSesssions";
+$maintClass = InvalidateUserSesssions::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "JSParseHelper";
+$maintClass = JSParseHelper::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DatabaseLag";
+$maintClass = DatabaseLag::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "AllTrans";
+$maintClass = AllTrans::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DateFormats";
+$maintClass = DateFormats::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "Digit2Html";
+$maintClass = Digit2Html::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DumpMessages";
+$maintClass = DumpMessages::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'GenerateCollationData';
+$maintClass = GenerateCollationData::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'GenerateNormalizerDataAr';
+$maintClass = GenerateNormalizerDataAr::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'GenerateNormalizerDataMl';
+$maintClass = GenerateNormalizerDataMl::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "LangMemUsage";
+$maintClass = LangMemUsage::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'ListVariants';
+$maintClass = ListVariants::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "MakeTestEdits";
+$maintClass = MakeTestEdits::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ManageJobs";
+$maintClass = ManageJobs::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "McTest";
+$maintClass = McTest::class;
require_once RUN_MAINTENANCE_IF_MAIN;
define( 'MW_NO_EXTENSION_MESSAGES', 1 );
require_once __DIR__ . '/Maintenance.php';
-$maintClass = 'MergeMessageFileList';
+$maintClass = MergeMessageFileList::class;
$mmfl = false;
/**
}
}
-$maintClass = "MigrateArchiveText";
+$maintClass = MigrateArchiveText::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "MigrateComments";
+$maintClass = MigrateComments::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'MigrateFileRepoLayout';
+$maintClass = MigrateFileRepoLayout::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "MigrateUserGroup";
+$maintClass = MigrateUserGroup::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'MinifyScript';
+$maintClass = MinifyScript::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "MoveBatch";
+$maintClass = MoveBatch::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'MWDocGen';
+$maintClass = MWDocGen::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "NamespaceConflictChecker";
+$maintClass = NamespaceConflictChecker::class;
require_once RUN_MAINTENANCE_IF_MAIN;
$dbw->query( "DELETE FROM $tbl_pag WHERE page_id = $id" );
$this->commitTransaction( $dbw, __METHOD__ );
// Delete revisions as appropriate
- $child = $this->runChild( 'NukePage', 'nukePage.php' );
+ $child = $this->runChild( NukePage::class, 'nukePage.php' );
$child->deleteRevisions( $revs );
$this->purgeRedundantText( true );
$n_deleted++;
}
}
-$maintClass = "NukeNS";
+$maintClass = NukeNS::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "NukePage";
+$maintClass = NukePage::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "AlterSharedConstraints";
+$maintClass = AlterSharedConstraints::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "Orphans";
+$maintClass = Orphans::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PageExists";
+$maintClass = PageExists::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "CLIParser";
+$maintClass = CLIParser::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PatchSql";
+$maintClass = PatchSql::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateBacklinkNamespace";
+$maintClass = PopulateBacklinkNamespace::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateCategory";
+$maintClass = PopulateCategory::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'PopulateContentModel';
+$maintClass = PopulateContentModel::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateFilearchiveSha1";
+$maintClass = PopulateFilearchiveSha1::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateImageSha1";
+$maintClass = PopulateImageSha1::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateIpChanges";
+$maintClass = PopulateIpChanges::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateLogSearch";
+$maintClass = PopulateLogSearch::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateLogUsertext";
+$maintClass = PopulateLogUsertext::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'PopulatePPSortKey';
+$maintClass = PopulatePPSortKey::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateParentId";
+$maintClass = PopulateParentId::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateRecentChangesSource";
+$maintClass = PopulateRecentChangesSource::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateRevisionLength";
+$maintClass = PopulateRevisionLength::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PopulateRevisionSha1";
+$maintClass = PopulateRevisionSha1::class;
require_once RUN_MAINTENANCE_IF_MAIN;
} elseif ( isset( $wgParserConf['preprocessorClass'] ) ) {
$name = $wgParserConf['preprocessorClass'];
} else {
- $name = 'Preprocessor_DOM';
+ $name = Preprocessor_DOM::class;
}
$wgParser->firstCallInit();
}
}
-$maintClass = "PreprocessDump";
+$maintClass = PreprocessDump::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "Protect";
+$maintClass = Protect::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PruneFileCache";
+$maintClass = PruneFileCache::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PurgeChangedFiles";
+$maintClass = PurgeChangedFiles::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PurgeChangedPages";
+$maintClass = PurgeChangedPages::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PurgeExpiredUserrights";
+$maintClass = PurgeExpiredUserrights::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PurgeList";
+$maintClass = PurgeList::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'PurgeModuleDeps';
+$maintClass = PurgeModuleDeps::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PurgeOldText";
+$maintClass = PurgeOldText::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "PurgePage";
+$maintClass = PurgePage::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'PurgeParserCache';
+$maintClass = PurgeParserCache::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ReassignEdits";
+$maintClass = ReassignEdits::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "RebuildFileCache";
+$maintClass = RebuildFileCache::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'ImageBuilder';
+$maintClass = ImageBuilder::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "RebuildLocalisationCache";
+$maintClass = RebuildLocalisationCache::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
-$maintClass = "RebuildSitesCache";
+$maintClass = RebuildSitesCache::class;
require_once RUN_MAINTENANCE_IF_MAIN;
if ( $this->getDB( DB_REPLICA )->getType() != 'postgres' ) {
$this->output( "** Rebuilding fulltext search index (if you abort "
. "this will break searching; run this script again to fix):\n" );
- $rebuildText = $this->runChild( 'RebuildTextIndex', 'rebuildtextindex.php' );
+ $rebuildText = $this->runChild( RebuildTextIndex::class, 'rebuildtextindex.php' );
$rebuildText->execute();
}
// Rebuild RC
$this->output( "\n\n** Rebuilding recentchanges table:\n" );
- $rebuildRC = $this->runChild( 'RebuildRecentchanges', 'rebuildrecentchanges.php' );
+ $rebuildRC = $this->runChild( RebuildRecentchanges::class, 'rebuildrecentchanges.php' );
$rebuildRC->execute();
// Rebuild link tables
$this->output( "\n\n** Rebuilding links tables -- this can take a long time. "
. "It should be safe to abort via ctrl+C if you get bored.\n" );
- $rebuildLinks = $this->runChild( 'RefreshLinks', 'refreshLinks.php' );
+ $rebuildLinks = $this->runChild( RefreshLinks::class, 'refreshLinks.php' );
$rebuildLinks->execute();
$this->output( "Done.\n" );
}
}
-$maintClass = "RebuildAll";
+$maintClass = RebuildAll::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "RebuildMessages";
+$maintClass = RebuildMessages::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "RebuildRecentchanges";
+$maintClass = RebuildRecentchanges::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "RebuildTextIndex";
+$maintClass = RebuildTextIndex::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'RecountCategories';
+$maintClass = RecountCategories::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'RefreshFileHeaders';
+$maintClass = RefreshFileHeaders::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'RefreshImageMetadata';
+$maintClass = RefreshImageMetadata::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'RefreshLinks';
+$maintClass = RefreshLinks::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'RemoveInvalidEmails';
+$maintClass = RemoveInvalidEmails::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "RemoveUnusedAccounts";
+$maintClass = RemoveUnusedAccounts::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "RenameDbPrefix";
+$maintClass = RenameDbPrefix::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DumpRenderer";
+$maintClass = DumpRenderer::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'ResetUserEmail';
+$maintClass = ResetUserEmail::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ResetUserTokens";
+$maintClass = ResetUserTokens::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'RollbackEdits';
+$maintClass = RollbackEdits::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "BatchedQueryRunner";
+$maintClass = BatchedQueryRunner::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "RunJobs";
+$maintClass = RunJobs::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
-$maintClass = 'MediaWikiShell';
+$maintClass = MediaWikiShell::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ShowJobs";
+$maintClass = ShowJobs::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ShowSiteStats";
+$maintClass = ShowSiteStats::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "MwSql";
+$maintClass = MwSql::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "SqliteMaintenance";
+$maintClass = SqliteMaintenance::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'CompressOld';
+$maintClass = CompressOld::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "DumpRev";
+$maintClass = DumpRev::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'FixT22757';
+$maintClass = FixT22757::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "OrphanStats";
+$maintClass = OrphanStats::class;
require_once RUN_MAINTENANCE_IF_MAIN;
$GLOBALS['wgDebugLogPrefix'] = "RCT {$this->replicaId}: ";
}
$this->pageBlobClass = function_exists( 'xdiff_string_bdiff' ) ?
- 'DiffHistoryBlob' : 'ConcatenatedGzipHistoryBlob';
- $this->orphanBlobClass = 'ConcatenatedGzipHistoryBlob';
+ DiffHistoryBlob::class : ConcatenatedGzipHistoryBlob::class;
+ $this->orphanBlobClass = ConcatenatedGzipHistoryBlob::class;
}
function debug( $msg ) {
}
}
-$maintClass = 'StorageTypeStats';
+$maintClass = StorageTypeStats::class;
require_once RUN_MAINTENANCE_IF_MAIN;
$limit = 1000;
$untilHappy = true;
}
-$type = isset( $options['type'] ) ? $options['type'] : 'ConcatenatedGzipHistoryBlob';
+$type = isset( $options['type'] ) ? $options['type'] : ConcatenatedGzipHistoryBlob::class;
$dbr = $this->getDB( DB_REPLICA );
$revQuery = Revision::getQueryInfo( [ 'page', 'text' ] );
}
}
-$maintClass = "SyncFileBackend";
+$maintClass = SyncFileBackend::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'TidyUpBug37714';
+$maintClass = TidyUpBug37714::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "Undelete";
+$maintClass = Undelete::class;
require_once RUN_MAINTENANCE_IF_MAIN;
// Check external dependencies are up to date
if ( !$this->hasOption( 'skip-external-dependencies' ) ) {
- $composerLockUpToDate = $this->runChild( 'CheckComposerLockUpToDate' );
+ $composerLockUpToDate = $this->runChild( CheckComposerLockUpToDate::class );
$composerLockUpToDate->execute();
} else {
$this->output(
# This needs to be disabled early since extensions will try to use the l10n
# cache from $wgExtensionFunctions (T22471)
$wgLocalisationCacheConf = [
- 'class' => 'LocalisationCache',
- 'storeClass' => 'LCStoreNull',
+ 'class' => LocalisationCache::class,
+ 'storeClass' => LCStoreNull::class,
'storeDirectory' => false,
'manualRecache' => false,
];
}
}
-$maintClass = 'UpdateMediaWiki';
+$maintClass = UpdateMediaWiki::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "UpdateArticleCount";
+$maintClass = UpdateArticleCount::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "UpdateCollation";
+$maintClass = UpdateCollation::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "UpdateDoubleWidthSearch";
+$maintClass = UpdateDoubleWidthSearch::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'UpdateExtensionJsonSchema';
+$maintClass = UpdateExtensionJsonSchema::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "UpdateRestrictions";
+$maintClass = UpdateRestrictions::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "UpdateSearchIndex";
+$maintClass = UpdateSearchIndex::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "UpdateSpecialPages";
+$maintClass = UpdateSpecialPages::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'UserOptionsMaintenance';
+$maintClass = UserOptionsMaintenance::class;
require RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = 'ValidateRegistrationFile';
+$maintClass = ValidateRegistrationFile::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "ViewCLI";
+$maintClass = ViewCLI::class;
require_once RUN_MAINTENANCE_IF_MAIN;
}
}
-$maintClass = "WrapOldPasswords";
+$maintClass = WrapOldPasswords::class;
require_once RUN_MAINTENANCE_IF_MAIN;
'styles' => 'resources/src/mediawiki.special/mediawiki.special.pagesWithProp.css',
],
'mediawiki.special.preferences' => [
+ 'targets' => [ 'desktop', 'mobile' ],
'scripts' => [
'resources/src/mediawiki.special/mediawiki.special.preferences.confirmClose.js',
'resources/src/mediawiki.special/mediawiki.special.preferences.convertmessagebox.js',
],
],
'mediawiki.special.preferences.styles' => [
+ 'targets' => [ 'desktop', 'mobile' ],
'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.styles.css',
],
'mediawiki.special.recentchanges' => [
'jquery.spinner',
'mediawiki.jqueryMsg',
'mediawiki.api',
+ 'mediawiki.api.parse',
'mediawiki.libs.jpegmeta',
'mediawiki.Title',
'mediawiki.util',
if ( color && Array.isArray( color ) && color.length === 3 ) {
return color;
}
+ if ( typeof color !== 'string' ) {
+ return undefined;
+ }
// Look for rgb(num,num,num)
// eslint-disable-next-line no-cond-assign
}
// Otherwise, we're most likely dealing with a named color
- return $.colorUtil.colors[ $.trim( color ).toLowerCase() ];
+ return $.colorUtil.colors[ color.trim().toLowerCase() ];
},
/**
if ( rowIndex !== lastRowIndex ) {
lastRowIndex = rowIndex;
cellIndex = $( rows[ rowIndex ] ).data( 'columnToCell' )[ column ];
- nodeValue = $.trim( getElementSortKey( rows[ rowIndex ].cells[ cellIndex ] ) );
+ nodeValue = getElementSortKey( rows[ rowIndex ].cells[ cellIndex ] ).trim();
}
} else {
nodeValue = '';
/**
* Converts sort objects [ { Integer: String }, ... ] to the internally used nested array
- * structure [ [ Integer , Integer ], ... ]
+ * structure [ [ Integer, Integer ], ... ]
*
* @param {Array} sortObjects List of sort objects.
* @return {Array} List of internal sort definitions.
*/
function convertSortList( sortObjects ) {
var sortList = [];
- $.each( sortObjects, function ( i, sortObject ) {
+ sortObjects.forEach( function ( sortObject ) {
$.each( sortObject, function ( columnIndex, order ) {
var orderIndex = ( order === 'desc' ) ? 1 : 0;
sortList.push( [ parseInt( columnIndex, 10 ), orderIndex ] );
},
format: function ( s ) {
var tsc;
- s = $.trim( s.toLowerCase() );
+ s = s.toLowerCase().trim();
if ( ts.collationRegex ) {
tsc = ts.collationTable;
s = s.replace( ts.collationRegex, function ( match ) {
return ts.rgx.url[ 0 ].test( s );
},
format: function ( s ) {
- return $.trim( s.replace( ts.rgx.url[ 1 ], '' ) );
+ return s.replace( ts.rgx.url[ 1 ], '' ).trim();
},
type: 'text'
} );
},
format: function ( s ) {
var match, y;
- s = $.trim( s.toLowerCase() );
+ s = s.toLowerCase().trim();
if ( ( match = s.match( ts.dateRegex[ 0 ] ) ) !== null ) {
if ( mw.config.get( 'wgDefaultDateFormat' ) === 'mdy' || mw.config.get( 'wgPageContentLanguage' ) === 'en' ) {
ts.addParser( {
id: 'number',
is: function ( s ) {
- return $.tablesorter.numberRegex.test( $.trim( s ) );
+ return $.tablesorter.numberRegex.test( s.trim() );
},
format: function ( s ) {
return $.tablesorter.formatDigit( s );
rvdifftotext: $textbox.textSelection( 'getContents' ),
rvdifftotextpst: true,
rvprop: '',
- rvsection: section === '' ? undefined : section
+ rvsection: section === '' ? undefined : section,
+ uselang: mw.config.get( 'wgUserLanguage' )
} );
// Wait for the summary before showing the diff so the page doesn't jump twice
parseRequest = api.post( postData );
parseRequest.done( function ( response ) {
- var li, newList, $displaytitle, $content, $parent, $list;
+ var newList, $displaytitle, $content, $parent, $list;
if ( response.parse.jsconfigvars ) {
mw.config.set( response.parse.jsconfigvars );
}
$( '.catlinks[data-mw="interface"]' ).replaceWith( $content );
}
if ( response.parse.templates ) {
- newList = [];
- $.each( response.parse.templates, function ( i, template ) {
- li = $( '<li>' )
+ newList = response.parse.templates.map( function ( template ) {
+ return $( '<li>' )
.append( $( '<a>' )
.attr( {
href: mw.util.getUrl( template.title ),
} )
.text( template.title )
);
- newList.push( li );
} );
$editform.find( '.templatesUsed .mw-editfooter-list' ).detach().empty().append( newList ).appendTo( '.templatesUsed' );
$( '.limitreport' ).html( response.parse.limitreporthtml );
}
if ( response.parse.langlinks && mw.config.get( 'skin' ) === 'vector' ) {
- newList = [];
- $.each( response.parse.langlinks, function ( i, langlink ) {
+ newList = response.parse.langlinks.map( function ( langlink ) {
var bcp47 = mw.language.bcp47( langlink.lang );
- li = $( '<li>' )
+ return $( '<li>' )
.addClass( 'interlanguage-link interwiki-' + langlink.lang )
.append( $( '<a>' )
.attr( {
} )
.text( langlink.autonym )
);
- newList.push( li );
} );
$list = $( '#p-lang ul' );
$parent = $list.parent();
expiryWidget = infuseOrNull( 'mw-input-wpExpiry' );
function updateBlockOptions() {
- var blocktarget = $.trim( blockTargetWidget.getValue() ),
+ var blocktarget = blockTargetWidget.getValue().trim(),
isEmpty = blocktarget === '',
isIp = mw.util.isIPAddress( blocktarget, true ),
isIpRange = isIp && blocktarget.match( /\/\d+$/ ),
currentApiPromise = undefined;
}
- password = $.trim( password );
+ password = password.trim();
if ( password === '' ) {
self.setErrors( [] );
timeout: function () {
var $spinnerDestCheck, title;
- if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
+ if ( !ajaxUploadDestCheck || this.nameToCheck.trim() === '' ) {
return;
}
$spinnerDestCheck = $.createSpinner().insertAfter( '#wpDestFile' );
formatversion: 2,
action: 'query',
// If title is empty, user input is invalid, the API call will produce details about why
- titles: title ? title.getPrefixedText() : this.nameToCheck,
+ titles: [ title ? title.getPrefixedText() : this.nameToCheck ],
prop: 'imageinfo',
iiprop: 'uploadwarning',
errorformat: 'html',
$spinner = $.createSpinner().insertAfter( $element );
- ( new mw.Api() ).get( {
- formatversion: 2,
- action: 'parse',
- text: '{{' + template + '}}',
+ ( new mw.Api() ).parse( '{{' + template + '}}', {
title: $( '#wpDestFile' ).val() || 'File:Sample.jpg',
prop: 'text',
pst: true,
},
processResult: function ( result, template, $previewContainer ) {
- this.responseCache[ template ] = result.parse.text;
+ this.responseCache[ template ] = result;
this.showPreview( this.responseCache[ template ], $previewContainer );
},
}
// fillDestFile setup
- $.each( mw.config.get( 'wgUploadSourceIds' ), function ( index, sourceId ) {
+ mw.config.get( 'wgUploadSourceIds' ).forEach( function ( sourceId ) {
$( '#' + sourceId ).change( function () {
var path, slash, backslash, fname;
if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
var apiPromise,
d = $.Deferred();
- if ( $.trim( $usernameInput.val() ) === '' ) {
+ if ( $usernameInput.val().trim() === '' ) {
d.resolve( { valid: true, messages: [] } );
return d.promise();
}
buttons = slice.call( arguments );
}
if ( isReady ) {
- $.each( buttons, function () {
- insertButton( this );
+ buttons.forEach( function ( button ) {
+ insertButton( button );
} );
} else {
// Push each button into the queue
*/
( function ( $, mw ) {
+ var hasOwn = Object.prototype.hasOwnProperty;
+
/**
* @class mw.widgets.PageExistenceCache
* @private
queue = this.existenceCheckQueue;
this.existenceCheckQueue = {};
titles = Object.keys( queue ).filter( function ( title ) {
- if ( cache.existenceCache.hasOwnProperty( title ) ) {
+ if ( hasOwn.call( cache.existenceCache, title ) ) {
queue[ title ].resolve( cache.existenceCache[ title ] );
}
- return !cache.existenceCache.hasOwnProperty( title );
+ return !hasOwn.call( cache.existenceCache, title );
} );
if ( !titles.length ) {
return;
} );
titles.forEach( function ( title ) {
var normalizedTitle = title;
- while ( normalized[ normalizedTitle ] ) {
+ while ( hasOwn.call( normalized, normalizedTitle ) ) {
normalizedTitle = normalized[ normalizedTitle ];
}
cache.existenceCache[ title ] = pages[ normalizedTitle ];
*/
PageExistenceCache.prototype.checkPageExistence = function ( title ) {
var key = title.getPrefixedText();
- if ( !this.existenceCheckQueue[ key ] ) {
+ if ( !hasOwn.call( this.existenceCheckQueue, key ) ) {
this.existenceCheckQueue[ key ] = $.Deferred();
}
this.processExistenceCheckQueueDebounced();
* @license The MIT License (MIT); see LICENSE.txt
*/
( function ( $, mw ) {
- var NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
+ var hasOwn = Object.prototype.hasOwnProperty,
+ NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
/**
* Category selector widget. Displays an OO.ui.CapsuleMultiselectWidget
promises = [],
deferred = $.Deferred();
- if ( $.trim( input ) === '' ) {
+ if ( input.trim() === '' ) {
deferred.resolve( [] );
return deferred.promise();
}
cacheKey = input + searchType.toString();
// Check cache
- if ( this.searchCache[ cacheKey ] !== undefined ) {
+ if ( hasOwn.call( this.searchCache, cacheKey ) ) {
return this.searchCache[ cacheKey ];
}
* @license The MIT License (MIT); see LICENSE.txt
*/
( function ( $, mw ) {
+ var hasOwn = Object.prototype.hasOwnProperty;
/**
* Mixin for title widgets
titles.push( suggestionPage.title );
}
- redirects = redirectsTo[ suggestionPage.title ] || [];
+ redirects = hasOwn.call( redirectsTo, suggestionPage.title ) ? redirectsTo[ suggestionPage.title ] : [];
for ( i = 0, len = redirects.length; i < len; i++ ) {
pageData[ redirects[ i ] ] = {
missing: false,
// mismatch where normalisation would make them matching (T50476)
pageExistsExact = (
- Object.prototype.hasOwnProperty.call( pageData, this.getQueryValue() ) &&
+ hasOwn.call( pageData, this.getQueryValue() ) &&
(
!pageData[ this.getQueryValue() ].missing ||
pageData[ this.getQueryValue() ].known
);
pageExists = pageExistsExact || (
titleObj &&
- Object.prototype.hasOwnProperty.call( pageData, titleObj.getPrefixedText() ) &&
+ hasOwn.call( pageData, titleObj.getPrefixedText() ) &&
(
!pageData[ titleObj.getPrefixedText() ].missing ||
pageData[ titleObj.getPrefixedText() ].known
}
for ( i = 0, len = titles.length; i < len; i++ ) {
- page = pageData[ titles[ i ] ] || {};
+ page = hasOwn.call( pageData, titles[ i ] ) ? pageData[ titles[ i ] ] : {};
items.push( this.createOptionWidget( this.getOptionWidgetData( titles[ i ], page ) ) );
}
*/
isCategory: function ( title ) {
var apiPromise = this.get( {
+ formatversion: 2,
prop: 'categoryinfo',
titles: String( title )
} );
return apiPromise
.then( function ( data ) {
- var exists = false;
- if ( data.query && data.query.pages ) {
- $.each( data.query.pages, function ( id, page ) {
- if ( page.categoryinfo ) {
- exists = true;
- }
- } );
- }
- return exists;
+ return !!data.query.pages[ 0 ].categoryinfo;
} )
.promise( { abort: apiPromise.abort } );
},
getCategoriesByPrefix: function ( prefix ) {
// Fetch with allpages to only get categories that have a corresponding description page.
var apiPromise = this.get( {
+ formatversion: 2,
list: 'allpages',
apprefix: prefix,
apnamespace: mw.config.get( 'wgNamespaceIds' ).category
return apiPromise
.then( function ( data ) {
- var texts = [];
- if ( data.query && data.query.allpages ) {
- $.each( data.query.allpages, function ( i, category ) {
- texts.push( new mw.Title( category.title ).getMainText() );
- } );
- }
- return texts;
+ return data.query.allpages.map( function ( category ) {
+ return new mw.Title( category.title ).getMainText();
+ } );
} )
.promise( { abort: apiPromise.abort } );
},
*/
getCategories: function ( title ) {
var apiPromise = this.get( {
+ formatversion: 2,
prop: 'categories',
titles: String( title )
} );
return apiPromise
.then( function ( data ) {
- var titles = false;
- if ( data.query && data.query.pages ) {
- $.each( data.query.pages, function ( id, page ) {
- if ( page.categories ) {
- if ( titles === false ) {
- titles = [];
- }
- $.each( page.categories, function ( i, cat ) {
- titles.push( new mw.Title( cat.title ) );
- } );
- }
- } );
+ var page = data.query.pages[ 0 ];
+
+ if ( !page.categories ) {
+ return false;
}
- return titles;
+ return page.categories.map( function ( cat ) {
+ return new mw.Title( cat.title );
+ } );
} )
.promise( { abort: apiPromise.abort } );
}
}, options ) ).then( function ( data ) {
var result = {};
- $.each( data.query.allmessages, function ( i, obj ) {
+ data.query.allmessages.forEach( function ( obj ) {
if ( !obj.missing ) {
result[ obj.name ] = obj.content;
}
{
formatversion: 2,
action: 'watch',
- titles: Array.isArray( pages ) ? pages.join( '|' ) : String( pages )
+ titles: Array.isArray( pages ) ? pages : String( pages )
},
addParams
)
oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen|mw-htmlform-dropdown)/g, '' ),
$select = $( '<select>' ),
dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
- oldClass = $.trim( oldClass );
+ oldClass = oldClass.trim();
$select.attr( {
name: name,
multiple: 'multiple',
* @param {string[]} categories Array of categories to which this upload will be added.
*/
ForeignStructuredUpload.prototype.addCategories = function ( categories ) {
- var i, category;
-
- for ( i = 0; i < categories.length; i++ ) {
- category = categories[ i ];
- this.categories.push( category );
- }
+ // The length of the array must be less than 10000.
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push#Merging_two_arrays
+ Array.prototype.push.apply( this.categories, categories );
};
/**
* @return {string}
*/
ForeignStructuredUpload.prototype.getDescriptions = function () {
- var i, desc, templateCalls = [];
-
- for ( i = 0; i < this.descriptions.length; i++ ) {
- desc = this.descriptions[ i ];
- templateCalls.push(
- this.config.format.description
- .replace( '$LANGUAGE', desc.language )
- .replace( '$TEXT', desc.text )
- );
- }
-
- return templateCalls.join( '\n' );
+ return this.descriptions.map( function ( desc ) {
+ return this.config.format.description
+ .replace( '$LANGUAGE', desc.language )
+ .replace( '$TEXT', desc.text );
+ } ).join( '\n' );
};
/**
* @return {string}
*/
ForeignStructuredUpload.prototype.getCategories = function () {
- var i, cat, categoryLinks = [];
-
if ( this.categories.length === 0 ) {
return this.config.format.uncategorized;
}
- for ( i = 0; i < this.categories.length; i++ ) {
- cat = this.categories[ i ];
- categoryLinks.push( '[[Category:' + cat + ']]' );
- }
-
- return categoryLinks.join( '\n' );
+ return this.categories.map( function ( cat ) {
+ return '[[Category:' + cat + ']]';
+ } ).join( '\n' );
};
/**
namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
// Normalise additional whitespace
- title = $.trim( title.replace( /\s/g, ' ' ) );
+ title = title.replace( /\s/g, ' ' ).trim();
// Process initial colon
if ( title !== '' && title[ 0 ] === ':' ) {
ext = parts.pop();
// Remove whitespace of the name part (that W/O extension)
- title = $.trim( parts.join( '.' ) );
+ title = parts.join( '.' ).trim();
// Cut, if too long and append file extension
title = trimFileNameToByteLength( title, ext );
} else {
// Missing file extension
- title = $.trim( parts.join( '.' ) );
+ title = parts.join( '.' ).trim();
// Name has no file extension and a fallback wasn't provided either
return null;
$( '<p>' ).msg( 'filepageexists', 'File:' + warnings[ 'page-exists' ] ),
{ recoverable: false }
) );
- } else if ( warnings.duplicate !== undefined ) {
- $.each( warnings.duplicate, function ( i, filename ) {
+ } else if ( Array.isArray( warnings.duplicate ) ) {
+ warnings.duplicate.forEach( function ( filename ) {
var $a = $( '<a>' ).text( filename ),
href = mw.Title.makeTitle( mw.config.get( 'wgNamespaceIds' ).file, filename ).getUrl( {} );
* @return {string} Localized namespace name
*/
ns: function ( nodes ) {
- var ns = $.trim( textify( nodes[ 0 ] ) );
+ var ns = textify( nodes[ 0 ] ).trim();
if ( !/^\d+$/.test( ns ) ) {
ns = mw.config.get( 'wgNamespaceIds' )[ ns.replace( / /g, '_' ).toLowerCase() ];
}
compile: function ( src ) {
return {
render: function () {
- return $( $.parseHTML( $.trim( src ) ) );
+ return $( $.parseHTML( src.trim() ) );
}
};
}
$wgMainStash = 'hash';
// Use memory job queue
$wgJobTypeConf = [
- 'default' => [ 'class' => 'JobQueueMemory', 'order' => 'fifo' ],
+ 'default' => [ 'class' => JobQueueMemory::class, 'order' => 'fifo' ],
];
$wgUseDatabaseMessages = false; # Set for future resets
// Assume UTC for testing purposes
$wgLocaltimezone = 'UTC';
- $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+ $wgLocalisationCacheConf['storeClass'] = LCStoreNull::class;
// Do not bother updating search tables
- $wgSearchType = 'SearchEngineDummy';
+ $wgSearchType = SearchEngineDummy::class;
// Generic MediaWiki\Session\SessionManager configuration for tests
// We use CookieSessionProvider because things might be expecting
# tests/phpunit/maintenance
'MediaWiki\Tests\Maintenance\DumpTestCase' => "$testDir/phpunit/maintenance/DumpTestCase.php",
+ 'MediaWiki\Tests\Maintenance\MaintenanceBaseTestCase' => "$testDir/phpunit/maintenance/MaintenanceBaseTestCase.php",
# tests/phpunit/media
'FakeDimensionFile' => "$testDir/phpunit/includes/media/FakeDimensionFile.php",
use Wikimedia\TestingAccessWrapper;
-class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
+abstract class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
protected static $httpEngine;
protected $oldHttpEngine;
// Set up null lock managers
$setup['wgLockManagers'] = [ [
'name' => 'fsLockManager',
- 'class' => 'NullLockManager',
+ 'class' => NullLockManager::class,
], [
'name' => 'nullLockManager',
- 'class' => 'NullLockManager',
+ 'class' => NullLockManager::class,
] ];
$reset = function () {
LockManagerGroup::destroySingletons();
return new RepoGroup(
[
- 'class' => 'MockLocalRepo',
+ 'class' => MockLocalRepo::class,
'name' => 'local',
'url' => 'http://example.com/images',
'hashLevels' => 2,
</ul>
!! end
+!! test
+Gallery (without px units)
+!! wikitext
+<gallery widths="70" heights="40">
+File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional">
+ <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+ <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+ <div class="gallerytext">
+ </div>
+ </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"widths":"70","heights":"40"},"body":{"extsrc":"\nFile:Foobar.jpg\n"}}'>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><figure-inline typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="8" width="70"/></a></figure-inline></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
+!! test
+Gallery (with invalid units)
+!! wikitext
+<gallery widths="70em" heights="40em">
+File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional">
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+ <div class="gallerytext">
+ </div>
+ </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"widths":"70em","heights":"40em"},"body":{"extsrc":"\nFile:Foobar.jpg\n"}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><figure-inline typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></figure-inline></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
!! test
Gallery with link that has fragment
!! options
* to this black-list to inhibit them from being reported.
*/
'suppress_issue_types' => [
- // approximate error count: 1
- "PhanAccessMethodProtected",
// approximate error count: 29
"PhanCommentParamOnEmptyParamList",
// approximate error count: 33
* which we can't allow, as that would open a new connection for mysql.
* Replace with a HashBag. They would not be going to persist anyway.
*/
- $hashCache = [ 'class' => 'HashBagOStuff', 'reportDupes' => false ];
+ $hashCache = [ 'class' => HashBagOStuff::class, 'reportDupes' => false ];
$objectCaches = [
CACHE_DB => $hashCache,
CACHE_ACCEL => $hashCache,
$defaultOverrides->set( 'ObjectCaches', $objectCaches );
$defaultOverrides->set( 'MainCacheType', CACHE_NONE );
- $defaultOverrides->set( 'JobTypeConf', [ 'default' => [ 'class' => 'JobQueueMemory' ] ] );
+ $defaultOverrides->set( 'JobTypeConf', [ 'default' => [ 'class' => JobQueueMemory::class ] ] );
// Use a fast hash algorithm to hash passwords.
$defaultOverrides->set( 'PasswordDefault', 'A' );
'skin' => $options['skin'],
'target' => 'phpunit',
] );
- $ctx = $this->getMockBuilder( 'ResourceLoaderContext' )
+ $ctx = $this->getMockBuilder( ResourceLoaderContext::class )
->setConstructorArgs( [ $resourceLoader, $request ] )
->setMethods( [ 'getDirection' ] )
->getMock();
|| ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory )
)
) {
- $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+ $wgLocalisationCacheConf['storeClass'] = LCStoreNull::class;
}
}
] );
/** @var PHPUnit_Framework_MockObject_MockObject|User $userMock */
- $userMock = $this->getMock( 'User', [ 'getEditCount' ] );
+ $userMock = $this->getMock( User::class, [ 'getEditCount' ] );
if ( $requirement > 0 ) {
$userMock->expects( $this->once() )
->method( 'getEditCount' )
);
$this->assertInstanceOf(
- 'Block',
+ Block::class,
$userBlock,
"'$username' block block object should be existent"
);
$ep->importFormData( $req );
$this->setExpectedException(
- 'MWException',
+ MWException::class,
'This content model is not supported: testing'
);
<?php
-/** tests for includes/Html.php */
class HtmlTest extends MediaWikiTestCase {
'name' => 'AnotherName',
'licenses' => $str,
] );
- $this->assertThat( $lc, $this->isInstanceOf( 'Licenses' ) );
+ $this->assertThat( $lc, $this->isInstanceOf( Licenses::class ) );
}
}
* @covers ListToggle::__construct
*/
public function testConstruct() {
- $output = $this->getMockBuilder( 'OutputPage' )
+ $output = $this->getMockBuilder( OutputPage::class )
->setMethods( null )
->disableOriginalConstructor()
->getMock();
$listToggle = new ListToggle( $output );
- $this->assertInstanceOf( 'ListToggle', $listToggle );
+ $this->assertInstanceOf( ListToggle::class, $listToggle );
$this->assertContains( 'mediawiki.checkboxtoggle', $output->getModules() );
$this->assertContains( 'mediawiki.checkboxtoggle.styles', $output->getModuleStyles() );
}
* @covers ListToggle::getHTML
*/
public function testGetHTML() {
- $output = $this->createMock( 'OutputPage' );
+ $output = $this->createMock( OutputPage::class );
$output->expects( $this->any() )
->method( 'msg' )
->will( $this->returnCallback( function ( $key ) {
* @file
*/
-/**
- * Test class for MWNamespace.
- * @todo FIXME: this test file is a mess
- */
class MWNamespaceTest extends MediaWikiTestCase {
+
protected function setUp() {
parent::setUp();
] );
}
-# ### START OF TESTS #########################################################
-
/**
* @todo Write more texts, handle $wgAllowImageMoving setting
* @covers MWNamespace::isMovable
*/
public function testIsMovable() {
$this->assertFalse( MWNamespace::isMovable( NS_SPECIAL ) );
- # @todo FIXME: Write more tests!!
}
/**
$this->assertNull( MWNamespace::getAssociated( NS_SPECIAL ) );
}
- /**
- * @todo Implement testExists().
- */
- /*
- public function testExists() {
- // Remove the following lines when you implement this test.
- $this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
- );
- }
- */
-
/**
* Test MWNamespace::equals
* Note if we add a namespace registration system with keys like 'MAIN'
);
}
- /**
- * @todo Implement testGetCanonicalNamespaces().
- */
- /*
- public function testGetCanonicalNamespaces() {
- // Remove the following lines when you implement this test.
- $this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
- );
- }
- */
- /**
- * @todo Implement testGetCanonicalName().
- */
- /*
- public function testGetCanonicalName() {
- // Remove the following lines when you implement this test.
- $this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
- );
- }
- */
- /**
- * @todo Implement testGetCanonicalIndex().
- */
- /*
- public function testGetCanonicalIndex() {
- // Remove the following lines when you implement this test.
- $this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
- );
- }
- */
-
- /**
- * @todo Implement testGetValidNamespaces().
- */
- /*
- public function testGetValidNamespaces() {
- // Remove the following lines when you implement this test.
- $this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
- );
- }
- */
-
public function provideHasTalkNamespace() {
return [
[ NS_MEDIA, false ],
$expectedOutput, // The expected output
$desc // Description
) {
- $user = $this->createMock( 'User' );
+ $user = $this->createMock( User::class );
$user->expects( $this->any() )
->method( 'getOption' )
->with( 'timecorrection' )
$expectedOutput, // The expected output
$desc // Description
) {
- $user = $this->createMock( 'User' );
+ $user = $this->createMock( User::class );
$user->expects( $this->any() )
->method( 'getOption' )
->with( 'timecorrection' )
<?php
+
+use Mediawiki\Http\HttpRequestFactory;
use MediaWiki\Interwiki\InterwikiLookup;
use MediaWiki\Linker\LinkRenderer;
use MediaWiki\Linker\LinkRendererFactory;
use MediaWiki\Shell\CommandFactory;
use MediaWiki\Storage\BlobStore;
use MediaWiki\Storage\BlobStoreFactory;
+use MediaWiki\Storage\RevisionLookup;
use MediaWiki\Storage\RevisionStore;
use MediaWiki\Storage\SqlBlobStore;
public function testGetInstance() {
$services = MediaWikiServices::getInstance();
- $this->assertInstanceOf( 'MediaWiki\\MediaWikiServices', $services );
+ $this->assertInstanceOf( MediaWikiServices::class, $services );
}
public function testForceGlobalInstance() {
$newServices = $this->newMediaWikiServices();
$oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
- $this->assertInstanceOf( 'MediaWiki\\MediaWikiServices', $oldServices );
+ $this->assertInstanceOf( MediaWikiServices::class, $oldServices );
$this->assertNotSame( $oldServices, $newServices );
$theServices = MediaWikiServices::getInstance();
$newServices = $this->newMediaWikiServices();
$oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
- $lbFactory = $this->getMockBuilder( 'LBFactorySimple' )
+ $lbFactory = $this->getMockBuilder( \Wikimedia\Rdbms\LBFactorySimple::class )
->disableOriginalConstructor()
->getMock();
'Test',
function () use ( &$serviceCounter ) {
$serviceCounter++;
- $service = $this->createMock( 'MediaWiki\Services\DestructibleService' );
+ $service = $this->createMock( MediaWiki\Services\DestructibleService::class );
$service->expects( $this->once() )->method( 'destroy' );
return $service;
}
$services->defineService(
'Test',
function () {
- $service = $this->createMock( 'MediaWiki\Services\DestructibleService' );
+ $service = $this->createMock( MediaWiki\Services\DestructibleService::class );
$service->expects( $this->never() )->method( 'destroy' );
return $service;
}
'SearchEngineConfig' => [ 'SearchEngineConfig', SearchEngineConfig::class ],
'SkinFactory' => [ 'SkinFactory', SkinFactory::class ],
'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', Wikimedia\Rdbms\LBFactory::class ],
- 'DBLoadBalancer' => [ 'DBLoadBalancer', 'LoadBalancer' ],
+ 'DBLoadBalancer' => [ 'DBLoadBalancer', Wikimedia\Rdbms\LoadBalancer::class ],
'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
'WatchedItemQueryService' => [ 'WatchedItemQueryService', WatchedItemQueryService::class ],
'CryptRand' => [ 'CryptRand', CryptRand::class ],
'BlobStore' => [ 'BlobStore', BlobStore::class ],
'_SqlBlobStore' => [ '_SqlBlobStore', SqlBlobStore::class ],
'RevisionStore' => [ 'RevisionStore', RevisionStore::class ],
+ 'RevisionLookup' => [ 'RevisionLookup', RevisionLookup::class ],
+ 'HttpRequestFactory' => [ 'HttpRequestFactory', HttpRequestFactory::class ],
];
}
public function testIsValidMergeRevisionLimit() {
$limit = MergeHistory::REVISION_LIMIT;
- $mh = $this->getMockBuilder( 'MergeHistory' )
+ $mh = $this->getMockBuilder( MergeHistory::class )
->setMethods( [ 'getRevisionCount' ] )
->setConstructorArgs( [
Title::newFromText( 'Test' ),
$this->assertSame( $params, $message->getParams() );
$this->assertEquals( $expectedLang, $message->getLanguage() );
- $messageSpecifier = $this->getMockForAbstractClass( 'MessageSpecifier' );
+ $messageSpecifier = $this->getMockForAbstractClass( MessageSpecifier::class );
$messageSpecifier->expects( $this->any() )
->method( 'getKey' )->will( $this->returnValue( $key ) );
$messageSpecifier->expects( $this->any() )
* @covers ::wfMessage
*/
public function testWfMessage() {
- $this->assertInstanceOf( 'Message', wfMessage( 'mainpage' ) );
- $this->assertInstanceOf( 'Message', wfMessage( 'i-dont-exist-evar' ) );
+ $this->assertInstanceOf( Message::class, wfMessage( 'mainpage' ) );
+ $this->assertInstanceOf( Message::class, wfMessage( 'i-dont-exist-evar' ) );
}
/**
* @covers Message::newFromKey
*/
public function testNewFromKey() {
- $this->assertInstanceOf( 'Message', Message::newFromKey( 'mainpage' ) );
- $this->assertInstanceOf( 'Message', Message::newFromKey( 'i-dont-exist-evar' ) );
+ $this->assertInstanceOf( Message::class, Message::newFromKey( 'mainpage' ) );
+ $this->assertInstanceOf( Message::class, Message::newFromKey( 'i-dont-exist-evar' ) );
}
/**
$msg = unserialize( serialize( $msg ) );
$this->assertSame( '(<a>foo</a>)', $msg->parse() );
$title = TestingAccessWrapper::newFromObject( $msg )->title;
- $this->assertInstanceOf( 'Title', $title );
+ $this->assertInstanceOf( Title::class, $title );
$this->assertSame( 'Testing', $title->getFullText() );
$msg = new Message( 'mainpage' );
'wgResourceLoaderDebug' => false,
'wgLoadScript' => 'http://127.0.0.1:8080/w/load.php',
] );
- $class = new ReflectionClass( 'OutputPage' );
+ $class = new ReflectionClass( OutputPage::class );
$method = $class->getMethod( 'makeResourceLoaderLink' );
$method->setAccessible( true );
$ctx = new RequestContext();
$ctx = new RequestContext();
$ctx->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'fallback' ) );
$ctx->setLanguage( 'en' );
- $outputPage = $this->getMockBuilder( 'OutputPage' )
+ $outputPage = $this->getMockBuilder( OutputPage::class )
->setConstructorArgs( [ $ctx ] )
->setMethods( [ 'isUserCssPreview', 'buildCssLinksArray' ] )
->getMock();
*/
public function testVaryHeaders( $calls, $vary, $key ) {
// get rid of default Vary fields
- $outputPage = $this->getMockBuilder( 'OutputPage' )
+ $outputPage = $this->getMockBuilder( OutputPage::class )
->setConstructorArgs( [ new RequestContext() ] )
->setMethods( [ 'getCacheVaryCookies' ] )
->getMock();
'page_title' => 'Test2'
]
] );
- $outputPage = $this->getMockBuilder( 'OutputPage' )
+ $outputPage = $this->getMockBuilder( OutputPage::class )
->setConstructorArgs( [ new RequestContext() ] )
->setMethods( [ 'addCategoryLinksToLBAndGetResult' ] )
->getMock();
'wgCapitalLinkOverrides' => [ self::NS_NONCAP => false ],
] );
- $this->originalHandlers = TestingAccessWrapper::newFromClass( 'Hooks' )->handlers;
- TestingAccessWrapper::newFromClass( 'Hooks' )->handlers = [];
+ $this->originalHandlers = TestingAccessWrapper::newFromClass( Hooks::class )->handlers;
+ TestingAccessWrapper::newFromClass( Hooks::class )->handlers = [];
// Clear caches so that our new namespace appears
MWNamespace::clearCaches();
parent::tearDown();
- TestingAccessWrapper::newFromClass( 'Hooks' )->handlers = $this->originalHandlers;
+ TestingAccessWrapper::newFromClass( Hooks::class )->handlers = $this->originalHandlers;
SpecialPageFactory::resetList();
}
public function provideGetContentHandler() {
// NOTE: we expect the help namespace to always contain wikitext
return [
- [ 'hello world', 'Help:Hello', null, null, 'WikitextContentHandler' ],
- [ 'hello world', 'User:hello/there.css', null, null, 'CssContentHandler' ],
- [ serialize( 'hello world' ), 'Dummy:Hello', null, null, 'DummyContentHandlerForTesting' ],
+ [ 'hello world', 'Help:Hello', null, null, WikitextContentHandler::class ],
+ [ 'hello world', 'User:hello/there.css', null, null, CssContentHandler::class ],
+ [ serialize( 'hello world' ), 'Dummy:Hello', null, null, DummyContentHandlerForTesting::class ],
];
}
*/
public function testTitleObjectStringConversion() {
$title = Title::newFromText( "text" );
- $this->assertInstanceOf( 'Title', $title, "Title creation" );
+ $this->assertInstanceOf( Title::class, $title, "Title creation" );
$this->assertEquals( "Text", $title, "Automatic string conversion" );
$title = Title::newFromText( "text", NS_MEDIA );
* @covers Status::newFatal
*/
public function testNewFatalWithMessage() {
- $message = $this->getMockBuilder( 'Message' )
+ $message = $this->getMockBuilder( Message::class )
->disableOriginalConstructor()
->getMock();
}
protected function getMockMessage( $key = 'key', $params = [] ) {
- $message = $this->getMockBuilder( 'Message' )
+ $message = $this->getMockBuilder( Message::class )
->disableOriginalConstructor()
->getMock();
$message->expects( $this->atLeastOnce() )
* @covers Status::cleanParams
*/
public function testCleanParams( $cleanCallback, $params, $expected ) {
- $method = new ReflectionMethod( 'Status', 'cleanParams' );
+ $method = new ReflectionMethod( Status::class, 'cleanParams' );
$method->setAccessible( true );
$status = new Status();
$status->cleanCallback = $cleanCallback;
Status $status, $expectedParams = [], $expectedKey, $expectedWrapper
) {
$message = $status->getMessage( null, null, 'qqx' );
- $this->assertInstanceOf( 'Message', $message );
+ $this->assertInstanceOf( Message::class, $message );
$this->assertEquals( $expectedParams, self::sanitizedMessageParams( $message ),
'Message::getParams' );
$this->assertEquals( $expectedKey, $message->getKey(), 'Message::getKey' );
$message = $status->getMessage( 'wrapper-short', 'wrapper-long' );
- $this->assertInstanceOf( 'Message', $message );
+ $this->assertInstanceOf( Message::class, $message );
$this->assertEquals( $expectedWrapper, $message->getKey(), 'Message::getKey with wrappers' );
$this->assertCount( 1, $message->getParams(), 'Message::getParams with wrappers' );
$message = $status->getMessage( 'wrapper' );
- $this->assertInstanceOf( 'Message', $message );
+ $this->assertInstanceOf( Message::class, $message );
$this->assertEquals( 'wrapper', $message->getKey(), 'Message::getKey with wrappers' );
$this->assertCount( 1, $message->getParams(), 'Message::getParams with wrappers' );
$message = $status->getMessage( false, 'wrapper' );
- $this->assertInstanceOf( 'Message', $message );
+ $this->assertInstanceOf( Message::class, $message );
$this->assertEquals( 'wrapper', $message->getKey(), 'Message::getKey with wrappers' );
$this->assertCount( 1, $message->getParams(), 'Message::getParams with wrappers' );
}
* @covers Status::getErrorMessage
*/
public function testGetErrorMessage() {
- $method = new ReflectionMethod( 'Status', 'getErrorMessage' );
+ $method = new ReflectionMethod( Status::class, 'getErrorMessage' );
$method->setAccessible( true );
$status = new Status();
$key = 'foo';
/** @var Message $message */
$message = $method->invoke( $status, array_merge( [ $key ], $params ) );
- $this->assertInstanceOf( 'Message', $message );
+ $this->assertInstanceOf( Message::class, $message );
$this->assertEquals( $key, $message->getKey() );
$this->assertEquals( $params, $message->getParams() );
}
* @covers Status::getErrorMessageArray
*/
public function testGetErrorMessageArray() {
- $method = new ReflectionMethod( 'Status', 'getErrorMessageArray' );
+ $method = new ReflectionMethod( Status::class, 'getErrorMessageArray' );
$method->setAccessible( true );
$status = new Status();
$key = 'foo';
$this->assertInternalType( 'array', $messageArray );
$this->assertCount( 2, $messageArray );
foreach ( $messageArray as $message ) {
- $this->assertInstanceOf( 'Message', $message );
+ $this->assertInstanceOf( Message::class, $message );
$this->assertEquals( $key, $message->getKey() );
$this->assertEquals( $params, $message->getParams() );
}
[ 'gzip', 'object' ],
'2®Àþ2',
];
+ yield 'T184749 (windows-1252 encoding), string in string out' => [
+ 'windows-1252',
+ iconv( 'utf-8', 'windows-1252', "sammansättningar" ),
+ [],
+ 'sammansättningar',
+ ];
+ yield 'T184749 (windows-1252 encoding), string in string out with gzip' => [
+ 'windows-1252',
+ gzdeflate( iconv( 'utf-8', 'windows-1252', "sammansättningar" ) ),
+ [ 'gzip' ],
+ 'sammansättningar',
+ ];
}
/**
public function provideBlobs() {
yield [ '' ];
yield [ 'someText' ];
+ yield [ "sammansättningar" ];
}
/**
$this->assertSame( $blob, $store->getBlob( $address ) );
}
+ /**
+ * @dataProvider provideBlobs
+ * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
+ * @covers \MediaWiki\Storage\SqlBlobStore::getBlob
+ */
+ public function testSimpleStoreGetBlobSimpleRoundtripWindowsLegacyEncoding( $blob ) {
+ $store = $this->getBlobStore( 'windows-1252' );
+ $address = $store->storeBlob( $blob );
+ $this->assertSame( $blob, $store->getBlob( $address ) );
+ }
+
+ /**
+ * @dataProvider provideBlobs
+ * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
+ * @covers \MediaWiki\Storage\SqlBlobStore::getBlob
+ */
+ public function testSimpleStoreGetBlobSimpleRoundtripWindowsLegacyEncodingGzip( $blob ) {
+ $store = $this->getBlobStore( 'windows-1252', true );
+ $address = $store->storeBlob( $blob );
+ $this->assertSame( $blob, $store->getBlob( $address ) );
+ }
+
}
$this->assertEquals( 'rrr', $tp->processTemplate( 'recurse', $data ) );
$tp->enableRecursivePartials( false );
- $this->setExpectedException( 'Exception' );
+ $this->setExpectedException( Exception::class );
$tp->processTemplate( 'recurse', $data );
}
use MediaWikiCoversValidator;
private function getMockResultWrapper( $row = null, $numRows = 1 ) {
- $resultWrapper = $this->getMockBuilder( 'ResultWrapper' )
+ $resultWrapper = $this->getMockBuilder( Wikimedia\Rdbms\ResultWrapper::class )
->disableOriginalConstructor();
$resultWrapper = $resultWrapper->getMock();
$this->assertEquals( $resultWrapper, $object->res );
$this->assertSame( 0, $object->key );
- $this->assertInstanceOf( 'Title', $object->current );
+ $this->assertInstanceOf( Title::class, $object->current );
$this->assertEquals( $namespace, $object->current->mNamespace );
$this->assertEquals( $title, $object->current->mTextform );
}
$title = 'foo';
$row = $this->getRowWithTitle( $namespace, $title );
$object = $this->getTitleArrayFromResult( $this->getMockResultWrapper( $row ) );
- $this->assertInstanceOf( 'Title', $object->current() );
+ $this->assertInstanceOf( Title::class, $object->current() );
$this->assertEquals( $namespace, $object->current->mNamespace );
$this->assertEquals( $title, $object->current->mTextform );
}
*/
public function testGetOtherPage( $text, $expected ) {
if ( $expected === null ) {
- $this->setExpectedException( 'MWException' );
+ $this->setExpectedException( MWException::class );
}
$title = Title::newFromText( $text );
*/
public function testSecureAndSplitValid( $text ) {
$this->secureAndSplitGlobals();
- $this->assertInstanceOf( 'Title', Title::newFromText( $text ), "Valid: $text" );
+ $this->assertInstanceOf( Title::class, Title::newFromText( $text ), "Valid: $text" );
}
/**
$this->setContentLang( $contLang );
$title = Title::newFromText( $titleText );
- $this->assertInstanceOf( 'Title', $title,
+ $this->assertInstanceOf( Title::class, $title,
"Test must be passed a valid title text, you gave '$titleText'"
);
$this->assertEquals( $expected,
protected function mockWebRequest( $data = [] ) {
// Cannot use PHPUnit getMockBuilder() as it does not support
// overriding protected properties afterwards
- $reflection = new ReflectionClass( 'WebRequest' );
+ $reflection = new ReflectionClass( WebRequest::class );
$req = $reflection->newInstanceWithoutConstructor();
$prop = $reflection->getProperty( 'data' );
* @covers Xml::expandAttributes
*/
public function testExpandAttributesException() {
- $this->setExpectedException( 'MWException' );
+ $this->setExpectedException( MWException::class );
Xml::expandAttributes( 'string' );
}
'disabled' => false,
'view' => true,
'edit' => true,
- 'revisiondelete' => 'SpecialPageAction',
+ 'revisiondelete' => SpecialPageAction::class,
'dummy' => true,
'string' => 'NamedDummyAction',
'declared' => 'NonExistingClassName',
$generator = new MockApiQueryBase( 'generator' );
$manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
- $this->assertSame( 'ApiMain', $manager->getSource() );
+ $this->assertSame( ApiMain::class, $manager->getSource() );
$this->assertSame( false, $manager->isGeneratorDone() );
$this->assertSame( $allModules, $manager->getRunModules() );
$manager->addContinueParam( $allModules[0], 'm1continue', [ 1, 2 ] );
public function testCheckDirectApiEditingDisallowed_forNonTextContent() {
$this->setExpectedException(
- 'ApiUsageException',
+ ApiUsageException::class,
'Direct editing via API is not supported for content model ' .
'testing used by Dummy:ApiEditPageTest_nonTextPageEdit'
);
libxml_use_internal_errors( true );
$sxe = simplexml_load_string( $req->getContent() );
$this->assertNotInternalType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
+ $this->assertThat( $sxe, $this->isInstanceOf( SimpleXMLElement::class ) );
$this->assertNotInternalType( "null", $sxe->login[0] );
$a = $sxe->login[0]->attributes()->result[0];
$priv = TestingAccessWrapper::newFromObject( $api );
$priv->mInternalMode = false;
- $module = $this->getMockBuilder( 'ApiBase' )
+ $module = $this->getMockBuilder( ApiBase::class )
->setConstructorArgs( [ $api, 'mock' ] )
->setMethods( [ 'getConditionalRequestData' ] )
->getMockForAbstractClass();
$priv = TestingAccessWrapper::newFromObject( $api );
$priv->mInternalMode = false;
- $module = $this->getMockBuilder( 'ApiBase' )
+ $module = $this->getMockBuilder( ApiBase::class )
->setConstructorArgs( [ $api, 'mock' ] )
->setMethods( [ 'getConditionalRequestData' ] )
->getMockForAbstractClass();
)->inLanguage( 'en' )->useDatabase( false )->text();
$dbex = new DBQueryError(
- $this->createMock( 'IDatabase' ),
+ $this->createMock( \Wikimedia\Rdbms\IDatabase::class ),
'error', 1234, 'SELECT 1', __METHOD__ );
$dbtrace = wfMessage( 'api-exception-trace',
get_class( $dbex ),
'plain class' => [
'login',
'action',
- 'ApiLogin',
+ ApiLogin::class,
null,
],
'with factory' => [
'login',
'action',
- 'ApiLogin',
+ ApiLogin::class,
[ $this, 'newApiLogin' ],
],
'with closure' => [
'logout',
'action',
- 'ApiLogout',
+ ApiLogout::class,
function ( ApiMain $main, $action ) {
return new ApiLogout( $main, $action );
},
'simple' => [
[
- 'login' => 'ApiLogin',
- 'logout' => 'ApiLogout',
+ 'login' => ApiLogin::class,
+ 'logout' => ApiLogout::class,
],
'action',
],
'with factories' => [
[
'login' => [
- 'class' => 'ApiLogin',
+ 'class' => ApiLogin::class,
'factory' => [ $this, 'newApiLogin' ],
],
'logout' => [
- 'class' => 'ApiLogout',
+ 'class' => ApiLogout::class,
'factory' => function ( ApiMain $main, $action ) {
return new ApiLogout( $main, $action );
},
public function getModuleProvider() {
$modules = [
- 'feedrecentchanges' => 'ApiFeedRecentChanges',
- 'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
+ 'feedrecentchanges' => ApiFeedRecentChanges::class,
+ 'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
'login' => [
- 'class' => 'ApiLogin',
+ 'class' => ApiLogin::class,
'factory' => [ $this, 'newApiLogin' ],
],
'logout' => [
- 'class' => 'ApiLogout',
+ 'class' => ApiLogout::class,
'factory' => function ( ApiMain $main, $action ) {
return new ApiLogout( $main, $action );
},
'legacy entry' => [
$modules,
'feedrecentchanges',
- 'ApiFeedRecentChanges',
+ ApiFeedRecentChanges::class,
],
'just a class' => [
$modules,
'feedcontributions',
- 'ApiFeedContributions',
+ ApiFeedContributions::class,
],
'with factory' => [
$modules,
'login',
- 'ApiLogin',
+ ApiLogin::class,
],
'with closure' => [
$modules,
'logout',
- 'ApiLogout',
+ ApiLogout::class,
],
];
}
*/
public function testGetModule_null() {
$modules = [
- 'login' => 'ApiLogin',
- 'logout' => 'ApiLogout',
+ 'login' => ApiLogin::class,
+ 'logout' => ApiLogout::class,
];
$moduleManager = $this->getModuleManager();
*/
public function testGetNames() {
$fooModules = [
- 'login' => 'ApiLogin',
- 'logout' => 'ApiLogout',
+ 'login' => ApiLogin::class,
+ 'logout' => ApiLogout::class,
];
$barModules = [
- 'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
- 'feedrecentchanges' => [ 'class' => 'ApiFeedRecentChanges' ],
+ 'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+ 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
];
$moduleManager = $this->getModuleManager();
*/
public function testGetNamesWithClasses() {
$fooModules = [
- 'login' => 'ApiLogin',
- 'logout' => 'ApiLogout',
+ 'login' => ApiLogin::class,
+ 'logout' => ApiLogout::class,
];
$barModules = [
- 'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
- 'feedrecentchanges' => [ 'class' => 'ApiFeedRecentChanges' ],
+ 'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+ 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
];
$moduleManager = $this->getModuleManager();
$allNamesWithClasses = $moduleManager->getNamesWithClasses();
$allModules = array_merge( $fooModules, [
- 'feedcontributions' => 'ApiFeedContributions',
- 'feedrecentchanges' => 'ApiFeedRecentChanges',
+ 'feedcontributions' => ApiFeedContributions::class,
+ 'feedrecentchanges' => ApiFeedRecentChanges::class,
] );
$this->assertArrayEquals( $allModules, $allNamesWithClasses );
}
*/
public function testGetModuleGroup() {
$fooModules = [
- 'login' => 'ApiLogin',
- 'logout' => 'ApiLogout',
+ 'login' => ApiLogin::class,
+ 'logout' => ApiLogout::class,
];
$barModules = [
- 'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
- 'feedrecentchanges' => [ 'class' => 'ApiFeedRecentChanges' ],
+ 'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+ 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
];
$moduleManager = $this->getModuleManager();
*/
public function testGetGroups() {
$fooModules = [
- 'login' => 'ApiLogin',
- 'logout' => 'ApiLogout',
+ 'login' => ApiLogin::class,
+ 'logout' => ApiLogout::class,
];
$barModules = [
- 'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
- 'feedrecentchanges' => [ 'class' => 'ApiFeedRecentChanges' ],
+ 'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+ 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
];
$moduleManager = $this->getModuleManager();
*/
public function testGetClassName() {
$fooModules = [
- 'login' => 'ApiLogin',
- 'logout' => 'ApiLogout',
+ 'login' => ApiLogin::class,
+ 'logout' => ApiLogout::class,
];
$barModules = [
- 'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
- 'feedrecentchanges' => [ 'class' => 'ApiFeedRecentChanges' ],
+ 'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+ 'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
];
$moduleManager = $this->getModuleManager();
$moduleManager->addModules( $barModules, 'bar' );
$this->assertEquals(
- 'ApiLogin',
+ ApiLogin::class,
$moduleManager->getClassName( 'login' )
);
$this->assertEquals(
- 'ApiLogout',
+ ApiLogout::class,
$moduleManager->getClassName( 'logout' )
);
$this->assertEquals(
- 'ApiFeedContributions',
+ ApiFeedContributions::class,
$moduleManager->getClassName( 'feedcontributions' )
);
$this->assertEquals(
- 'ApiFeedRecentChanges',
+ ApiFeedRecentChanges::class,
$moduleManager->getClassName( 'feedrecentchanges' )
);
$this->assertFalse(
}
private function replaceSearchEngineConfig() {
- $config = $this->getMockBuilder( 'SearchEngineConfig' )
+ $config = $this->getMockBuilder( SearchEngineConfig::class )
->disableOriginalConstructor()
->getMock();
$this->setService( 'SearchEngineConfig', $config );
}
private function replaceSearchEngine() {
- $engine = $this->getMockBuilder( 'SearchEngine' )
+ $engine = $this->getMockBuilder( SearchEngine::class )
->disableOriginalConstructor()
->getMock();
- $engineFactory = $this->getMockBuilder( 'SearchEngineFactory' )
+ $engineFactory = $this->getMockBuilder( SearchEngineFactory::class )
->disableOriginalConstructor()
->getMock();
$engineFactory->expects( $this->any() )
protected function setUp() {
parent::setUp();
- $this->mUserMock = $this->getMockBuilder( 'User' )
+ $this->mUserMock = $this->getMockBuilder( User::class )
->disableOriginalConstructor()
->getMock();
*/
public static function provideGeneralEncoding() {
$options = [
- 'class' => 'ApiFormatRaw',
+ 'class' => ApiFormatRaw::class,
'factory' => function ( ApiMain $main ) {
return new ApiFormatRaw( $main, new ApiFormatJson( $main, 'json' ) );
}
'{"mime":"text/plain","text":"some text","error":"some error"}',
[],
[
- 'class' => 'ApiFormatRaw',
+ 'class' => ApiFormatRaw::class,
'factory' => function ( ApiMain $main ) use ( &$apiMain ) {
$apiMain = $main;
$printer = new ApiFormatRaw( $main, new ApiFormatJson( $main, 'json' ) );
<?php
/**
- *
- * Created on Feb 6, 2013
- *
* Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on Jan 1, 2013
- *
* Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
<?php
/**
- * Created on Feb 10, 2013
- *
* Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
$provider = $this->getMockForAbstractClass( AbstractAuthenticationProvider::class );
$providerPriv = TestingAccessWrapper::newFromObject( $provider );
- $obj = $this->getMockForAbstractClass( 'Psr\Log\LoggerInterface' );
+ $obj = $this->getMockForAbstractClass( \Psr\Log\LoggerInterface::class );
$provider->setLogger( $obj );
$this->assertSame( $obj, $providerPriv->logger, 'setLogger' );
$provider->setManager( $obj );
$this->assertSame( $obj, $providerPriv->manager, 'setManager' );
- $obj = $this->getMockForAbstractClass( 'Config' );
+ $obj = $this->getMockForAbstractClass( \Config::class );
$provider->setConfig( $obj );
$this->assertSame( $obj, $providerPriv->config, 'setConfig' );
$providerPriv = TestingAccessWrapper::newFromObject( $provider );
$obj = $providerPriv->getPasswordFactory();
- $this->assertInstanceOf( 'PasswordFactory', $obj );
+ $this->assertInstanceOf( \PasswordFactory::class, $obj );
$this->assertSame( $obj, $providerPriv->getPasswordFactory() );
}
$providerPriv = TestingAccessWrapper::newFromObject( $provider );
$obj = $providerPriv->getPassword( null );
- $this->assertInstanceOf( 'Password', $obj );
+ $this->assertInstanceOf( \Password::class, $obj );
$obj = $providerPriv->getPassword( 'invalid' );
- $this->assertInstanceOf( 'Password', $obj );
+ $this->assertInstanceOf( \Password::class, $obj );
}
public function testGetNewPasswordExpiry() {
if ( $canChangeUser !== null ) {
$methods[] = 'canChangeUser';
}
- $provider = $this->getMockBuilder( 'DummySessionProvider' )
+ $provider = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( $methods )
->getMock();
$provider->expects( $this->any() )->method( '__toString' )
$p->expects( $this->atMost( 1 ) )->method( 'postAuthentication' )
->willReturnCallback( function ( $user, $response ) use ( $constraint, $p ) {
if ( $user !== null ) {
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertSame( 'UTSysop', $user->getName() );
}
$this->assertInstanceOf( AuthenticationResponse::class, $response );
->willReturnCallback( function ( $user, $creator, $response )
use ( $constraint, $p, $username )
{
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertSame( $username, $user->getName() );
$this->assertSame( 'UTSysop', $creator->getName() );
$this->assertInstanceOf( AuthenticationResponse::class, $response );
// Set up lots of mocks...
$mock = $this->getMockForAbstractClass(
- "MediaWiki\\Auth\\PrimaryAuthenticationProvider", []
+ \MediaWiki\Auth\PrimaryAuthenticationProvider::class, []
);
$mock->expects( $this->any() )->method( 'getUniqueId' )
->will( $this->returnValue( 'primary' ) );
// Test addToDatabase fails
$session->clear();
- $user = $this->getMockBuilder( 'User' )
+ $user = $this->getMockBuilder( \User::class )
->setMethods( [ 'addToDatabase' ] )->getMock();
$user->expects( $this->once() )->method( 'addToDatabase' )
->will( $this->returnValue( \Status::newFatal( 'because' ) ) );
$backoffKey = wfMemcKey( 'AuthManager', 'autocreate-failed', md5( $username ) );
$this->assertFalse( $cache->get( $backoffKey ), 'sanity check' );
$session->clear();
- $user = $this->getMockBuilder( 'User' )
+ $user = $this->getMockBuilder( \User::class )
->setMethods( [ 'addToDatabase' ] )->getMock();
$user->expects( $this->once() )->method( 'addToDatabase' )
->will( $this->throwException( new \Exception( 'Excepted' ) ) );
// Test addToDatabase fails because the user already exists.
$session->clear();
- $user = $this->getMockBuilder( 'User' )
+ $user = $this->getMockBuilder( \User::class )
->setMethods( [ 'addToDatabase' ] )->getMock();
$user->expects( $this->once() )->method( 'addToDatabase' )
->will( $this->returnCallback( function () use ( $username, &$user ) {
$p->postCalled = false;
$p->expects( $this->atMost( 1 ) )->method( 'postAccountLink' )
->willReturnCallback( function ( $user, $response ) use ( $constraint, $p ) {
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertSame( 'UTSysop', $user->getName() );
$this->assertInstanceOf( AuthenticationResponse::class, $response );
$this->assertThat( $response->status, $constraint );
);
}
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
public function testOnUserSaveSettings() {
$user = \User::newFromName( 'UTSysop' );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'updateExternalDB' )
->with( $this->identicalTo( $user ) );
public function testOnUserGroupsChanged() {
$user = \User::newFromName( 'UTSysop' );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'updateExternalDBGroups' )
->with(
public function testOnUserLoggedIn() {
$user = \User::newFromName( 'UTSysop' );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->exactly( 2 ) )->method( 'updateUser' )
->with( $this->identicalTo( $user ) );
$provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
\Hooks::run( 'UserLoggedIn', [ $user ] );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'updateUser' )
->will( $this->returnCallback( function ( &$user ) {
public function testOnLocalUserCreated() {
$user = \User::newFromName( 'UTSysop' );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->exactly( 2 ) )->method( 'initUser' )
->with( $this->identicalTo( $user ), $this->identicalTo( false ) );
$provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
\Hooks::run( 'LocalUserCreated', [ $user, false ] );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'initUser' )
->will( $this->returnCallback( function ( &$user ) {
}
public function testGetUniqueId() {
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
$this->assertSame(
* @param bool $allowPasswordChange
*/
public function testGetAuthenticationRequests( $action, $response, $allowPasswordChange ) {
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->any() )->method( 'allowPasswordChange' )
->will( $this->returnValue( $allowPasswordChange ) );
$req->action = AuthManager::ACTION_LOGIN;
$reqs = [ PasswordAuthenticationRequest::class => $req ];
- $plugin = $this->getMockBuilder( 'AuthPlugin' )
+ $plugin = $this->getMockBuilder( \AuthPlugin::class )
->setMethods( [ 'authenticate' ] )
->getMock();
$plugin->expects( $this->never() )->method( 'authenticate' );
$req->username = 'foo';
$req->password = 'bar';
- $plugin = $this->getMockBuilder( 'AuthPlugin' )
+ $plugin = $this->getMockBuilder( \AuthPlugin::class )
->setMethods( [ 'userExists', 'authenticate' ] )
->getMock();
$plugin->expects( $this->once() )->method( 'userExists' )
$provider->beginPrimaryAuthentication( $reqs )
);
- $plugin = $this->getMockBuilder( 'AuthPlugin' )
+ $plugin = $this->getMockBuilder( \AuthPlugin::class )
->setMethods( [ 'userExists', 'authenticate' ] )
->getMock();
$plugin->expects( $this->once() )->method( 'userExists' )
$provider->beginPrimaryAuthentication( $reqs )
);
- $pluginUser = $this->getMockBuilder( 'AuthPluginUser' )
+ $pluginUser = $this->getMockBuilder( \AuthPluginUser::class )
->setMethods( [ 'isLocked' ] )
->disableOriginalConstructor()
->getMock();
$pluginUser->expects( $this->once() )->method( 'isLocked' )
->will( $this->returnValue( true ) );
- $plugin = $this->getMockBuilder( 'AuthPlugin' )
+ $plugin = $this->getMockBuilder( \AuthPlugin::class )
->setMethods( [ 'userExists', 'getUserInstance', 'authenticate' ] )
->getMock();
$plugin->expects( $this->once() )->method( 'userExists' )
$provider->beginPrimaryAuthentication( $reqs )
);
- $plugin = $this->getMockBuilder( 'AuthPlugin' )
+ $plugin = $this->getMockBuilder( \AuthPlugin::class )
->setMethods( [ 'userExists', 'authenticate' ] )
->getMock();
$plugin->expects( $this->once() )->method( 'userExists' )
$provider->beginPrimaryAuthentication( $reqs )
);
- $plugin = $this->getMockBuilder( 'AuthPlugin' )
+ $plugin = $this->getMockBuilder( \AuthPlugin::class )
->setMethods( [ 'userExists', 'authenticate', 'strict' ] )
->getMock();
$plugin->expects( $this->once() )->method( 'userExists' )
$this->assertSame( AuthenticationResponse::FAIL, $ret->status );
$this->assertSame( 'wrongpassword', $ret->message->getKey() );
- $plugin = $this->getMockBuilder( 'AuthPlugin' )
+ $plugin = $this->getMockBuilder( \AuthPlugin::class )
->setMethods( [ 'userExists', 'authenticate', 'strictUserAuth' ] )
->getMock();
$plugin->expects( $this->once() )->method( 'userExists' )
$this->assertSame( AuthenticationResponse::FAIL, $ret->status );
$this->assertSame( 'wrongpassword', $ret->message->getKey() );
- $plugin = $this->getMockBuilder( 'AuthPlugin' )
+ $plugin = $this->getMockBuilder( \AuthPlugin::class )
->setMethods( [ 'domainList', 'validDomain', 'setDomain', 'userExists', 'authenticate' ] )
->getMock();
$plugin->expects( $this->any() )->method( 'domainList' )
}
public function testTestUserExists() {
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'userExists' )
->with( $this->equalTo( 'Foo' ) )
$this->assertTrue( $provider->testUserExists( 'foo' ) );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'userExists' )
->with( $this->equalTo( 'Foo' ) )
}
public function testTestUserCanAuthenticate() {
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'userExists' )
->with( $this->equalTo( 'Foo' ) )
$provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
$this->assertFalse( $provider->testUserCanAuthenticate( 'foo' ) );
- $pluginUser = $this->getMockBuilder( 'AuthPluginUser' )
+ $pluginUser = $this->getMockBuilder( \AuthPluginUser::class )
->disableOriginalConstructor()
->getMock();
$pluginUser->expects( $this->once() )->method( 'isLocked' )
->will( $this->returnValue( true ) );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'userExists' )
->with( $this->equalTo( 'Foo' ) )
->will( $this->returnValue( true ) );
$plugin->expects( $this->once() )->method( 'getUserInstance' )
->with( $this->callback( function ( $user ) {
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertEquals( 'Foo', $user->getName() );
return true;
} ) )
$provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
$this->assertFalse( $provider->testUserCanAuthenticate( 'foo' ) );
- $pluginUser = $this->getMockBuilder( 'AuthPluginUser' )
+ $pluginUser = $this->getMockBuilder( \AuthPluginUser::class )
->disableOriginalConstructor()
->getMock();
$pluginUser->expects( $this->once() )->method( 'isLocked' )
->will( $this->returnValue( false ) );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'userExists' )
->with( $this->equalTo( 'Foo' ) )
->will( $this->returnValue( true ) );
$plugin->expects( $this->once() )->method( 'getUserInstance' )
->with( $this->callback( function ( $user ) {
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertEquals( 'Foo', $user->getName() );
return true;
} ) )
}
public function testProviderRevokeAccessForUser() {
- $plugin = $this->getMockBuilder( 'AuthPlugin' )
+ $plugin = $this->getMockBuilder( \AuthPlugin::class )
->setMethods( [ 'userExists', 'setPassword' ] )
->getMock();
$plugin->expects( $this->once() )->method( 'userExists' )->willReturn( true );
$provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
$provider->providerRevokeAccessForUser( 'foo' );
- $plugin = $this->getMockBuilder( 'AuthPlugin' )
+ $plugin = $this->getMockBuilder( \AuthPlugin::class )
->setMethods( [ 'domainList', 'userExists', 'setPassword' ] )
->getMock();
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [ 'D1', 'D2', 'D3' ] );
}
public function testProviderAllowsPropertyChange() {
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->any() )->method( 'allowPropChange' )
->will( $this->returnCallback( function ( $prop ) {
*/
public function testProviderAllowsAuthenticationDataChange( $type, $allow, $expect ) {
$domains = $type instanceof PasswordDomainAuthenticationRequest ? [ 'foo', 'bar' ] : [];
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( $domains );
$plugin->expects( $allow === null ? $this->never() : $this->once() )
->method( 'allowPasswordChange' )->will( $this->returnValue( $allow ) );
}
public function testProviderChangeAuthenticationData() {
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->never() )->method( 'setPassword' );
$provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
$req->username = 'foo';
$req->password = 'bar';
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'setPassword' )
->with( $this->callback( function ( $u ) {
$provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
$provider->providerChangeAuthenticationData( $req );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )->method( 'setPassword' )
->with( $this->callback( function ( $u ) {
$this->assertSame( 'authmanager-authplugin-setpass-failed-message', $e->msg );
}
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )
->will( $this->returnValue( [ 'Domain1', 'Domain2' ] ) );
$plugin->expects( $this->any() )->method( 'validDomain' )
* @param string $expect
*/
public function testAccountCreationType( $can, $expect ) {
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->once() )
->method( 'canCreateAccounts' )->will( $this->returnValue( $can ) );
public function testTestForAccountCreation() {
$user = \User::newFromName( 'foo' );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
$this->assertEquals(
$req->action = AuthManager::ACTION_CREATE;
$reqs = [ PasswordAuthenticationRequest::class => $req ];
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->any() )->method( 'canCreateAccounts' )
->will( $this->returnValue( false ) );
);
}
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->any() )->method( 'canCreateAccounts' )
->will( $this->returnValue( true ) );
$req->username = 'foo';
$req->password = 'bar';
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->any() )->method( 'canCreateAccounts' )
->will( $this->returnValue( true ) );
$provider->beginPrimaryAccountCreation( $user, $user, $reqs )
);
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
$plugin->expects( $this->any() )->method( 'canCreateAccounts' )
->will( $this->returnValue( true ) );
$this->assertSame( AuthenticationResponse::FAIL, $ret->status );
$this->assertSame( 'authmanager-authplugin-create-fail', $ret->message->getKey() );
- $plugin = $this->createMock( 'AuthPlugin' );
+ $plugin = $this->createMock( \AuthPlugin::class );
$plugin->expects( $this->any() )->method( 'canCreateAccounts' )
->will( $this->returnValue( true ) );
$plugin->expects( $this->any() )->method( 'domainList' )
$ret = $mock->describeCredentials();
$this->assertInternalType( 'array', $ret );
$this->assertArrayHasKey( 'provider', $ret );
- $this->assertInstanceOf( 'Message', $ret['provider'] );
+ $this->assertInstanceOf( \Message::class, $ret['provider'] );
$this->assertArrayHasKey( 'account', $ret );
- $this->assertInstanceOf( 'Message', $ret['account'] );
+ $this->assertInstanceOf( \Message::class, $ret['account'] );
}
public function testLoadRequestsFromSubmission() {
$this->assertType( 'array', $data, "Field $field" );
$this->assertArrayHasKey( 'type', $data, "Field $field" );
$this->assertArrayHasKey( 'label', $data, "Field $field" );
- $this->assertInstanceOf( 'Message', $data['label'], "Field $field, label" );
+ $this->assertInstanceOf( \Message::class, $data['label'], "Field $field, label" );
if ( $data['type'] !== 'null' ) {
$this->assertArrayHasKey( 'help', $data, "Field $field" );
- $this->assertInstanceOf( 'Message', $data['help'], "Field $field, help" );
+ $this->assertInstanceOf( \Message::class, $data['help'], "Field $field, help" );
}
if ( isset( $data['optional'] ) ) {
$this->assertArrayHasKey( 'options', $data, "Field $field" );
$this->assertType( 'array', $data['options'], "Field $field, options" );
foreach ( $data['options'] as $val => $msg ) {
- $this->assertInstanceOf( 'Message', $msg, "Field $field, option $val" );
+ $this->assertInstanceOf( \Message::class, $msg, "Field $field, option $val" );
}
break;
case 'checkbox':
);
$status = $provider->testUserForCreation( $blockedUser, AuthManager::AUTOCREATE_SOURCE_SESSION );
- $this->assertInstanceOf( 'StatusValue', $status );
+ $this->assertInstanceOf( \StatusValue::class, $status );
$this->assertFalse( $status->isOK() );
$this->assertTrue( $status->hasMessage( 'cantcreateaccount-text' ) );
$status = $provider->testUserForCreation( $blockedUser, false );
- $this->assertInstanceOf( 'StatusValue', $status );
+ $this->assertInstanceOf( \StatusValue::class, $status );
$this->assertFalse( $status->isOK() );
$this->assertTrue( $status->hasMessage( 'cantcreateaccount-text' ) );
}
$this->assertEquals( AuthenticationResponse::FAIL, $ret->status );
$status = $provider->testUserForCreation( $newuser, AuthManager::AUTOCREATE_SOURCE_SESSION );
- $this->assertInstanceOf( 'StatusValue', $status );
+ $this->assertInstanceOf( \StatusValue::class, $status );
$this->assertFalse( $status->isOK() );
$this->assertTrue( $status->hasMessage( 'cantcreateaccount-range-text' ) );
$status = $provider->testUserForCreation( $newuser, false );
- $this->assertInstanceOf( 'StatusValue', $status );
+ $this->assertInstanceOf( \StatusValue::class, $status );
$this->assertFalse( $status->isOK() );
$this->assertTrue( $status->hasMessage( 'cantcreateaccount-range-text' ) );
}
public function testBeginSecondaryAccountCreation() {
$authManager = new AuthManager( new \FauxRequest(), new \HashConfig() );
- $creator = $this->getMockBuilder( 'User' )->getMock();
- $userWithoutEmail = $this->getMockBuilder( 'User' )->getMock();
+ $creator = $this->getMockBuilder( \User::class )->getMock();
+ $userWithoutEmail = $this->getMockBuilder( \User::class )->getMock();
$userWithoutEmail->expects( $this->any() )->method( 'getEmail' )->willReturn( '' );
$userWithoutEmail->expects( $this->any() )->method( 'getInstanceForUpdate' )->willReturnSelf();
$userWithoutEmail->expects( $this->never() )->method( 'sendConfirmationMail' );
- $userWithEmailError = $this->getMockBuilder( 'User' )->getMock();
+ $userWithEmailError = $this->getMockBuilder( \User::class )->getMock();
$userWithEmailError->expects( $this->any() )->method( 'getEmail' )->willReturn( 'foo@bar.baz' );
$userWithEmailError->expects( $this->any() )->method( 'getInstanceForUpdate' )->willReturnSelf();
$userWithEmailError->expects( $this->any() )->method( 'sendConfirmationMail' )
->willReturn( \Status::newFatal( 'fail' ) );
- $userExpectsConfirmation = $this->getMockBuilder( 'User' )->getMock();
+ $userExpectsConfirmation = $this->getMockBuilder( \User::class )->getMock();
$userExpectsConfirmation->expects( $this->any() )->method( 'getEmail' )
->willReturn( 'foo@bar.baz' );
$userExpectsConfirmation->expects( $this->any() )->method( 'getInstanceForUpdate' )
->willReturnSelf();
$userExpectsConfirmation->expects( $this->once() )->method( 'sendConfirmationMail' )
->willReturn( \Status::newGood() );
- $userNotExpectsConfirmation = $this->getMockBuilder( 'User' )->getMock();
+ $userNotExpectsConfirmation = $this->getMockBuilder( \User::class )->getMock();
$userNotExpectsConfirmation->expects( $this->any() )->method( 'getEmail' )
->willReturn( 'foo@bar.baz' );
$userNotExpectsConfirmation->expects( $this->any() )->method( 'getInstanceForUpdate' )
* @return LegacyHookPreAuthenticationProvider
*/
protected function getProvider() {
- $request = $this->getMockBuilder( 'FauxRequest' )
+ $request = $this->getMockBuilder( \FauxRequest::class )
->setMethods( [ 'getIP' ] )->getMock();
$request->expects( $this->any() )->method( 'getIP' )->will( $this->returnValue( '127.0.0.42' ) );
if ( $msgForLoginUserMigrated !== null ) {
$h->will( $this->returnCallback(
function ( $user, &$msg ) use ( $username, $msgForLoginUserMigrated ) {
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertSame( $username, $user->getName() );
$msg = $msgForLoginUserMigrated;
return false;
} else {
$h->will( $this->returnCallback(
function ( $user, &$msg ) use ( $username ) {
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertSame( $username, $user->getName() );
return true;
}
function ( $user, $pass, &$abort, &$msg )
use ( $username, $password, $abortForAbortLogin, $msgForAbortLogin )
{
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertSame( $username, $user->getName() );
if ( $password !== null ) {
$this->assertSame( $password, $pass );
} else {
$h2->will( $this->returnCallback(
function ( $user, $pass, &$abort, &$msg ) use ( $username, $password ) {
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertSame( $username, $user->getName() );
if ( $password !== null ) {
$this->assertSame( $password, $pass );
if ( $failMsg === null ) {
$this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
} else {
- $this->assertInstanceOf( 'StatusValue', $status, 'should fail (type)' );
+ $this->assertInstanceOf( \StatusValue::class, $status, 'should fail (type)' );
$this->assertFalse( $status->isOk(), 'should fail (ok)' );
$errors = $status->getErrors();
$this->assertEquals( $failMsg, $errors[0]['message'], 'should fail (message)' );
->will( $this->returnCallback( function ( $user, &$error, &$abortStatus )
use ( $msg, $status )
{
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertSame( 'User', $user->getName() );
$error = $msg;
$abortStatus = $status;
$this->hook( 'AbortNewAccount', $this->never() );
$this->hook( 'AbortAutoAccount', $this->once() )
->will( $this->returnCallback( function ( $user, &$abortError ) use ( $testUser, $error ) {
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( \User::class, $user );
$this->assertSame( $testUser->getName(), $user->getName() );
$abortError = $error;
return $error === null;
if ( $failMsg === null ) {
$this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
} else {
- $this->assertInstanceOf( 'StatusValue', $status, 'should fail (type)' );
+ $this->assertInstanceOf( \StatusValue::class, $status, 'should fail (type)' );
$this->assertFalse( $status->isOk(), 'should fail (ok)' );
$errors = $status->getErrors();
$this->assertEquals( $failMsg, $errors[0]['message'], 'should fail (message)' );
$ret = $req->describeCredentials();
$this->assertInternalType( 'array', $ret );
$this->assertArrayHasKey( 'provider', $ret );
- $this->assertInstanceOf( 'Message', $ret['provider'] );
+ $this->assertInstanceOf( \Message::class, $ret['provider'] );
$this->assertSame( 'authmanager-provider-password', $ret['provider']->getKey() );
$this->assertArrayHasKey( 'account', $ret );
- $this->assertInstanceOf( 'Message', $ret['account'] );
+ $this->assertInstanceOf( \Message::class, $ret['account'] );
$this->assertSame( [ 'UTSysop' ], $ret['account']->getParams() );
}
}
$ret = $req->describeCredentials();
$this->assertInternalType( 'array', $ret );
$this->assertArrayHasKey( 'provider', $ret );
- $this->assertInstanceOf( 'Message', $ret['provider'] );
+ $this->assertInstanceOf( \Message::class, $ret['provider'] );
$this->assertSame( 'authmanager-provider-password-domain', $ret['provider']->getKey() );
$this->assertArrayHasKey( 'account', $ret );
- $this->assertInstanceOf( 'Message', $ret['account'] );
+ $this->assertInstanceOf( \Message::class, $ret['account'] );
$this->assertSame( 'authmanager-account-password-domain', $ret['account']->getKey() );
$this->assertSame( [ 'UTSysop', 'd2' ], $ret['account']->getParams() );
}
$ret = $req->describeCredentials();
$this->assertInternalType( 'array', $ret );
$this->assertArrayHasKey( 'provider', $ret );
- $this->assertInstanceOf( 'Message', $ret['provider'] );
+ $this->assertInstanceOf( \Message::class, $ret['provider'] );
$this->assertSame( 'authmanager-provider-temporarypassword', $ret['provider']->getKey() );
$this->assertArrayHasKey( 'account', $ret );
- $this->assertInstanceOf( 'Message', $ret['account'] );
+ $this->assertInstanceOf( \Message::class, $ret['account'] );
$this->assertSame( [ 'UTSysop' ], $ret['account']->getParams() );
}
}
$user = \User::newFromName( 'RandomUser' );
$creator = \User::newFromName( $creatorname );
if ( $hook ) {
- $mock = $this->getMockBuilder( 'stdClass' )
+ $mock = $this->getMockBuilder( stdClass::class )
->setMethods( [ 'onExemptFromAccountCreationThrottle' ] )
->getMock();
$mock->expects( $this->any() )->method( 'onExemptFromAccountCreationThrottle' )
*/
protected function getMockLocalisationCache() {
global $IP;
- $lc = $this->getMockBuilder( 'LocalisationCache' )
+ $lc = $this->getMockBuilder( \LocalisationCache::class )
->setConstructorArgs( [ [ 'store' => 'detect' ] ] )
->setMethods( [ 'getMessagesDirs' ] )
->getMock();
public function setUp() {
parent::setUp();
self::$notifyCallCounter = 0;
- self::$mockRecentChange = self::getMock( 'RecentChange' );
+ self::$mockRecentChange = self::getMock( RecentChange::class );
$this->setContentLang( 'qqx' );
}
}
protected function getSpecialPage() {
- return $this->getMockBuilder( 'ChangesListSpecialPage' )
+ return $this->getMockBuilder( ChangesListSpecialPage::class )
->setConstructorArgs( [
'ChangesListSpecialPage',
'',
* @dataProvider provideModifyQuery
*/
protected function modifyQueryHelper( $groupDefinition, $input ) {
- $ctx = $this->createMock( 'IContextSource' );
- $dbr = $this->createMock( 'IDatabase' );
+ $ctx = $this->createMock( IContextSource::class );
+ $dbr = $this->createMock( Wikimedia\Rdbms\IDatabase::class );
$tables = $fields = $conds = $query_options = $join_conds = [];
$group = new ChangesListStringOptionsFilterGroup( $groupDefinition );
);
$cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
- $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+ $this->assertInstanceOf( RCCacheEntry::class, $cacheEntry );
$this->assertEquals( false, $cacheEntry->watched, 'watched' );
$this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
);
$cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
- $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+ $this->assertInstanceOf( RCCacheEntry::class, $cacheEntry );
$this->assertEquals( false, $cacheEntry->watched, 'watched' );
$this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
);
$cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
- $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+ $this->assertInstanceOf( RCCacheEntry::class, $cacheEntry );
$this->assertEquals( false, $cacheEntry->watched, 'watched' );
$this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
$this->collation = new CustomUppercaseCollation( [
'D',
'C',
+ 'Cs',
'B'
], Language::factory( 'en' ) );
[ '💩 ', 'C', 'Test relocated to end' ],
[ 'c', 'b', 'lowercase' ],
[ 'x', 'z', 'lowercase original' ],
+ [ 'Cz', 'Cs', 'digraphs' ],
[ 'C50D', 'C100', 'Numbers' ]
];
}
[ 'afdsa', 'A' ],
[ "\xF3\xB3\x80\x80Foo", 'D' ],
[ "\xF3\xB3\x80\x81Foo", 'C' ],
- [ "\xF3\xB3\x80\x82Foo", 'B' ],
- [ "\xF3\xB3\x80\x83Foo", "\xF3\xB3\x80\x83" ],
+ [ "\xF3\xB3\x80\x82Foo", 'Cs' ],
+ [ "\xF3\xB3\x80\x83Foo", 'B' ],
+ [ "\xF3\xB3\x80\x84Foo", "\xF3\xB3\x80\x84" ],
+ [ 'C', 'C' ],
+ [ 'Cz', 'C' ],
+ [ 'Cs', 'Cs' ],
+ [ 'CS', 'Cs' ],
+ [ 'cs', 'Cs' ],
];
}
}
public function testGivenNonString_normalizeThrowsInvalidArgumentException( $nonString ) {
$normalizer = new ComposerVersionNormalizer();
- $this->setExpectedException( 'InvalidArgumentException' );
+ $this->setExpectedException( InvalidArgumentException::class );
$normalizer->normalizeSuffix( $nonString );
}
*/
public function testRegisterInvalid() {
$factory = new ConfigFactory();
- $this->setExpectedException( 'InvalidArgumentException' );
+ $this->setExpectedException( InvalidArgumentException::class );
$factory->register( 'invalid', 'Invalid callback' );
}
$this->assertNotSame( $bar, $newBar, 'don\'t salvage if callbacks differ' );
// the new factory doesn't have quux defined, so the quux instance should not be salvaged
- $this->setExpectedException( 'ConfigException' );
+ $this->setExpectedException( ConfigException::class );
$newFactory->makeConfig( 'quux' );
}
$factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
$conf = $factory->makeConfig( 'unittest' );
- $this->assertInstanceOf( 'Config', $conf );
+ $this->assertInstanceOf( Config::class, $conf );
$this->assertSame( $conf, $factory->makeConfig( 'unittest' ) );
}
$factory = new ConfigFactory();
$factory->register( '*', 'GlobalVarConfig::newInstance' );
$conf = $factory->makeConfig( 'unittest' );
- $this->assertInstanceOf( 'Config', $conf );
+ $this->assertInstanceOf( Config::class, $conf );
}
/**
*/
public function testMakeConfigWithNoBuilders() {
$factory = new ConfigFactory();
- $this->setExpectedException( 'ConfigException' );
+ $this->setExpectedException( ConfigException::class );
$factory->makeConfig( 'nobuilderregistered' );
}
$factory->register( 'unittest', function () {
return true; // Not a Config object
} );
- $this->setExpectedException( 'UnexpectedValueException' );
+ $this->setExpectedException( UnexpectedValueException::class );
$factory->makeConfig( 'unittest' );
}
// NOTE: the global config factory returned here has been overwritten
// for operation in test mode. It may not reflect LocalSettings.
$factory = MediaWikiServices::getInstance()->getConfigFactory();
- $this->assertInstanceOf( 'Config', $factory->makeConfig( 'main' ) );
+ $this->assertInstanceOf( Config::class, $factory->makeConfig( 'main' ) );
}
}
*/
public function testNewInstance() {
$config = GlobalVarConfig::newInstance();
- $this->assertInstanceOf( 'GlobalVarConfig', $config );
+ $this->assertInstanceOf( GlobalVarConfig::class, $config );
$this->maybeStashGlobal( 'wgBaz' );
$GLOBALS['wgBaz'] = 'somevalue';
// Check prefix is set to 'wg'
$this->maybeStashGlobal( $var );
$GLOBALS[$var] = $rand;
$config = new GlobalVarConfig( $prefix );
- $this->assertInstanceOf( 'GlobalVarConfig', $config );
+ $this->assertInstanceOf( GlobalVarConfig::class, $config );
$this->assertEquals( $rand, $config->get( 'GlobalVarConfigTest' ) );
}
public function testGet( $name, $prefix, $expected ) {
$config = new GlobalVarConfig( $prefix );
if ( $expected === false ) {
- $this->setExpectedException( 'ConfigException', 'GlobalVarConfig::get: undefined option:' );
+ $this->setExpectedException( ConfigException::class, 'GlobalVarConfig::get: undefined option:' );
}
$this->assertEquals( $config->get( $name ), $expected );
}
*/
public function testNewInstance() {
$conf = HashConfig::newInstance();
- $this->assertInstanceOf( 'HashConfig', $conf );
+ $this->assertInstanceOf( HashConfig::class, $conf );
}
/**
*/
public function testConstructor() {
$conf = new HashConfig();
- $this->assertInstanceOf( 'HashConfig', $conf );
+ $this->assertInstanceOf( HashConfig::class, $conf );
// Test passing arguments to the constructor
$conf2 = new HashConfig( [
'one' => '1',
] );
$this->assertEquals( '1', $conf->get( 'one' ) );
- $this->setExpectedException( 'ConfigException', 'HashConfig::get: undefined option' );
+ $this->setExpectedException( ConfigException::class, 'HashConfig::get: undefined option' );
$conf->get( 'two' );
}
$this->assertEquals( 'bar', $multi->get( 'foo' ) );
$this->assertEquals( 'foo', $multi->get( 'bar' ) );
- $this->setExpectedException( 'ConfigException', 'MultiConfig::get: undefined option:' );
+ $this->setExpectedException( ConfigException::class, 'MultiConfig::get: undefined option:' );
$multi->get( 'notset' );
}
12312 => 'testing',
],
'wgContentHandlers' => [
- CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler',
- CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler',
- CONTENT_MODEL_JSON => 'JsonContentHandler',
- CONTENT_MODEL_CSS => 'CssContentHandler',
- CONTENT_MODEL_TEXT => 'TextContentHandler',
- 'testing' => 'DummyContentHandlerForTesting',
+ CONTENT_MODEL_WIKITEXT => WikitextContentHandler::class,
+ CONTENT_MODEL_JAVASCRIPT => JavaScriptContentHandler::class,
+ CONTENT_MODEL_JSON => JsonContentHandler::class,
+ CONTENT_MODEL_CSS => CssContentHandler::class,
+ CONTENT_MODEL_TEXT => TextContentHandler::class,
+ 'testing' => DummyContentHandlerForTesting::class,
'testing-callbacks' => function ( $modelId ) {
return new DummyContentHandlerForTesting( $modelId );
}
$this->assertNull( $text );
}
- /*
- public static function makeContent( $text, Title $title, $modelId = null, $format = null ) {}
- */
-
public static function dataMakeContent() {
return [
[ 'hallo', 'Help:Test', null, null, CONTENT_MODEL_WIKITEXT, 'hallo', false ],
$this->assertSame( $tag, 'mw-contentmodelchange' );
}
- /*
- public function testSupportsSections() {
- $this->markTestIncomplete( "not yet implemented" );
- }
- */
-
/**
* @covers ContentHandler::supportsCategories
*/
public function provideGetModelForID() {
return [
- [ CONTENT_MODEL_WIKITEXT, 'WikitextContentHandler' ],
- [ CONTENT_MODEL_JAVASCRIPT, 'JavaScriptContentHandler' ],
- [ CONTENT_MODEL_JSON, 'JsonContentHandler' ],
- [ CONTENT_MODEL_CSS, 'CssContentHandler' ],
- [ CONTENT_MODEL_TEXT, 'TextContentHandler' ],
- [ 'testing', 'DummyContentHandlerForTesting' ],
- [ 'testing-callbacks', 'DummyContentHandlerForTesting' ],
+ [ CONTENT_MODEL_WIKITEXT, WikitextContentHandler::class ],
+ [ CONTENT_MODEL_JAVASCRIPT, JavaScriptContentHandler::class ],
+ [ CONTENT_MODEL_JSON, JsonContentHandler::class ],
+ [ CONTENT_MODEL_CSS, CssContentHandler::class ],
+ [ CONTENT_MODEL_TEXT, TextContentHandler::class ],
+ [ 'testing', DummyContentHandlerForTesting::class ],
+ [ 'testing-callbacks', DummyContentHandlerForTesting::class ],
];
}
}
private function newSearchEngine() {
- $searchEngine = $this->getMockBuilder( 'SearchEngine' )
+ $searchEngine = $this->getMockBuilder( SearchEngine::class )
->getMock();
$searchEngine->expects( $this->any() )
* @covers ContentHandler::getDataForSearchIndex
*/
public function testDataIndexFields() {
- $mockEngine = $this->createMock( 'SearchEngine' );
+ $mockEngine = $this->createMock( SearchEngine::class );
$title = Title::newFromText( 'Not_Main_Page', NS_MAIN );
$page = new WikiPage( $title );
] );
$ch = new CssContentHandler();
$content = $ch->makeRedirectContent( Title::newFromText( $title ) );
- $this->assertInstanceOf( 'CssContent', $content );
+ $this->assertInstanceOf( CssContent::class, $content );
$this->assertEquals( $expected, $content->serialize( CONTENT_FORMAT_CSS ) );
}
}
public function testIndexMapping() {
- $mockEngine = $this->createMock( 'SearchEngine' );
+ $mockEngine = $this->createMock( SearchEngine::class );
$mockEngine->expects( $this->atLeastOnce() )
->method( 'makeSearchFieldMapping' )
->willReturnCallback( function ( $name, $type ) {
$mockField =
- $this->getMockBuilder( 'SearchIndexFieldDefinition' )
+ $this->getMockBuilder( SearchIndexFieldDefinition::class )
->setMethods( [ 'getMapping' ] )
->setConstructorArgs( [ $name, $type ] )
->getMock();
'file_text' => 1,
];
foreach ( $map as $name => $field ) {
- $this->assertInstanceOf( 'SearchIndexField', $field );
+ $this->assertInstanceOf( SearchIndexField::class, $field );
$this->assertEquals( $name, $field->getName() );
unset( $expect[$name] );
}
] );
$ch = new JavaScriptContentHandler();
$content = $ch->makeRedirectContent( Title::newFromText( $title ) );
- $this->assertInstanceOf( 'JavaScriptContent', $content );
+ $this->assertInstanceOf( JavaScriptContent::class, $content );
$this->assertEquals( $expected, $content->serialize( CONTENT_FORMAT_JAVASCRIPT ) );
}
}
private function getMockTitle() {
- return $this->getMockBuilder( 'Title' )
+ return $this->getMockBuilder( Title::class )
->disableOriginalConstructor()
->getMock();
}
private function getMockUser() {
- return $this->getMockBuilder( 'User' )
+ return $this->getMockBuilder( User::class )
->disableOriginalConstructor()
->getMock();
}
private function getMockParserOptions() {
- return $this->getMockBuilder( 'ParserOptions' )
+ return $this->getMockBuilder( ParserOptions::class )
->disableOriginalConstructor()
->getMock();
}
public function testFillParserOutput( $data, $expected ) {
$obj = new JsonContent( FormatJson::encode( $data ) );
$parserOutput = $obj->getParserOutput( $this->getMockTitle(), null, null, true );
- $this->assertInstanceOf( 'ParserOutput', $parserOutput );
+ $this->assertInstanceOf( ParserOutput::class, $parserOutput );
$this->assertEquals( $expected, $parserOutput->getText() );
}
}
public function testFieldsForIndex() {
$handler = new TextContentHandler();
- $mockEngine = $this->createMock( 'SearchEngine' );
+ $mockEngine = $this->createMock( SearchEngine::class );
$mockEngine->expects( $this->atLeastOnce() )
->method( 'makeSearchFieldMapping' )
->willReturnCallback( function ( $name, $type ) {
$mockField =
- $this->getMockBuilder( 'SearchIndexFieldDefinition' )
+ $this->getMockBuilder( SearchIndexFieldDefinition::class )
->setConstructorArgs( [ $name, $type ] )
->getMock();
$mockField->expects( $this->atLeastOnce() )->method( 'getMapping' )->willReturn( [
$fields = $handler->getFieldsForSearchIndex( $mockEngine );
$mappedFields = [];
foreach ( $fields as $name => $field ) {
- $this->assertInstanceOf( 'SearchIndexField', $field );
+ $this->assertInstanceOf( SearchIndexField::class, $field );
/**
* @var $field SearchIndexField
*/
if ( $expectedNative === false ) {
$this->assertFalse( $converted, "conversion to $model was expected to fail!" );
} else {
- $this->assertInstanceOf( 'Content', $converted );
+ $this->assertInstanceOf( Content::class, $converted );
$this->assertEquals( $expectedNative, $converted->getNativeData() );
}
}
$this->assertSame( $expected, $tag );
}
- /**
- * @todo Text case requires database, should be done by a test class in the Database group
- */
- /*
- public function testGetAutoDeleteReason( Title $title, &$hasHistory ) {}
- */
-
- /**
- * @todo Text case requires database, should be done by a test class in the Database group
- */
- /*
- public function testGetUndoContent( Revision $current, Revision $undo,
- Revision $undoafter = null
- ) {
- }
- */
-
/**
* @covers WikitextContentHandler::getDataForSearchIndex
*/
public function testDataIndexFieldsFile() {
- $mockEngine = $this->createMock( 'SearchEngine' );
+ $mockEngine = $this->createMock( SearchEngine::class );
$title = Title::newFromText( 'Somefile.jpg', NS_FILE );
$page = new WikiPage( $title );
[ "WikitextContentTest_testGetSecondaryDataUpdates_1",
CONTENT_MODEL_WIKITEXT, "hello ''world''\n",
[
- 'LinksUpdate' => [
+ LinksUpdate::class => [
'mRecursive' => true,
'mLinks' => []
]
[ "WikitextContentTest_testGetSecondaryDataUpdates_2",
CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
[
- 'LinksUpdate' => [
+ LinksUpdate::class => [
'mRecursive' => true,
'mLinks' => [
[ 'World_test_21344' => 0 ]
return [
[ "WikitextContentTest_testGetSecondaryDataUpdates_1",
CONTENT_MODEL_WIKITEXT, "hello ''world''\n",
- [ 'LinksDeletionUpdate' => [] ]
+ [ LinksDeletionUpdate::class => [] ]
],
[ "WikitextContentTest_testGetSecondaryDataUpdates_2",
CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
- [ 'LinksDeletionUpdate' => [] ]
+ [ LinksDeletionUpdate::class => [] ]
],
// @todo more...?
];
use Wikimedia\Rdbms\Blob;
use Wikimedia\Rdbms\Database;
use Wikimedia\Rdbms\DatabaseSqlite;
+use Wikimedia\Rdbms\ResultWrapper;
class DatabaseSqliteMock extends DatabaseSqlite {
private $lastQuery;
$db = DatabaseSqlite::newStandaloneInstance( ':memory:' );
$databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
- $this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Database creation" );
+ $this->assertInstanceOf( ResultWrapper::class, $databaseCreation, "Database creation" );
$insertion = $db->insert( 'a', [ 'a_1' => 10 ], __METHOD__ );
$this->assertTrue( $insertion, "Insertion worked" );
$db = DatabaseSqlite::newStandaloneInstance( ':memory:' );
$databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
- $this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Failed to create table a" );
+ $this->assertInstanceOf( ResultWrapper::class, $databaseCreation, "Failed to create table a" );
$res = $db->select( 'a', '*' );
$this->assertEquals( 0, $db->numFields( $res ), "expects to get 0 fields for an empty table" );
$insertion = $db->insert( 'a', [ 'a_1' => 10 ], __METHOD__ );
use Wikimedia\Rdbms\LBFactorySimple;
use Wikimedia\Rdbms\LBFactoryMulti;
+use Wikimedia\Rdbms\LoadBalancer;
use Wikimedia\Rdbms\ChronologyProtector;
+use Wikimedia\Rdbms\DatabaseMysqli;
use Wikimedia\Rdbms\MySQLMasterPos;
use Wikimedia\Rdbms\DatabaseDomain;
* @dataProvider getLBFactoryClassProvider
*/
public function testGetLBFactoryClass( $expected, $deprecated ) {
- $mockDB = $this->getMockBuilder( 'DatabaseMysqli' )
+ $mockDB = $this->getMockBuilder( DatabaseMysqli::class )
->disableOriginalConstructor()
->getMock();
$factory = new LBFactorySimple( [
'servers' => $servers,
- 'loadMonitorClass' => 'LoadMonitorNull'
+ 'loadMonitorClass' => LoadMonitorNull::class
] );
$lb = $factory->getMainLB();
'test-db1' => $wgDBserver,
'test-db2' => $wgDBserver
],
- 'loadMonitorClass' => 'LoadMonitorNull'
+ 'loadMonitorClass' => LoadMonitorNull::class
] );
$lb = $factory->getMainLB();
$now = microtime( true );
// Master DB 1
- $mockDB1 = $this->getMockBuilder( 'DatabaseMysqli' )
+ $mockDB1 = $this->getMockBuilder( DatabaseMysqli::class )
->disableOriginalConstructor()
->getMock();
$mockDB1->method( 'writesOrCallbacksPending' )->willReturn( true );
$mockDB1->method( 'lastDoneWrites' )->willReturn( $now );
$mockDB1->method( 'getMasterPos' )->willReturn( $m1Pos );
// Load balancer for master DB 1
- $lb1 = $this->getMockBuilder( 'LoadBalancer' )
+ $lb1 = $this->getMockBuilder( LoadBalancer::class )
->disableOriginalConstructor()
->getMock();
$lb1->method( 'getConnection' )->willReturn( $mockDB1 );
$lb1->method( 'getMasterPos' )->willReturn( $m1Pos );
$lb1->method( 'getServerName' )->with( 0 )->willReturn( 'master1' );
// Master DB 2
- $mockDB2 = $this->getMockBuilder( 'DatabaseMysqli' )
+ $mockDB2 = $this->getMockBuilder( DatabaseMysqli::class )
->disableOriginalConstructor()
->getMock();
$mockDB2->method( 'writesOrCallbacksPending' )->willReturn( true );
$mockDB2->method( 'lastDoneWrites' )->willReturn( $now );
$mockDB2->method( 'getMasterPos' )->willReturn( $m2Pos );
// Load balancer for master DB 2
- $lb2 = $this->getMockBuilder( 'LoadBalancer' )
+ $lb2 = $this->getMockBuilder( LoadBalancer::class )
->disableOriginalConstructor()
->getMock();
$lb2->method( 'getConnection' )->willReturn( $mockDB2 );
// (b) Second HTTP request
// Load balancer for master DB 1
- $lb1 = $this->getMockBuilder( 'LoadBalancer' )
+ $lb1 = $this->getMockBuilder( LoadBalancer::class )
->disableOriginalConstructor()
->getMock();
$lb1->method( 'getServerCount' )->willReturn( 2 );
$lb1->expects( $this->once() )
->method( 'waitFor' )->with( $this->equalTo( $m1Pos ) );
// Load balancer for master DB 2
- $lb2 = $this->getMockBuilder( 'LoadBalancer' )
+ $lb2 = $this->getMockBuilder( LoadBalancer::class )
->disableOriginalConstructor()
->getMock();
$lb2->method( 'getServerCount' )->willReturn( 2 );
'hostsByName' => [
'test-db1' => $wgDBserver,
],
- 'loadMonitorClass' => 'LoadMonitorNull',
+ 'loadMonitorClass' => LoadMonitorNull::class,
'localDomain' => new DatabaseDomain( $wgDBname, null, $wgDBprefix )
] );
}
} catch ( \Wikimedia\Rdbms\DBConnectionError $e ) {
// expected
}
- $this->assertInstanceOf( '\Wikimedia\Rdbms\DBConnectionError', $e );
+ $this->assertInstanceOf( \Wikimedia\Rdbms\DBConnectionError::class, $e );
$this->assertFalse( $db->isOpen() );
} else {
\MediaWiki\suppressWarnings();
$lb = new LoadBalancer( [
'servers' => $servers,
'localDomain' => new DatabaseDomain( $wgDBname, null, $this->dbPrefix() ),
- 'loadMonitorClass' => 'LoadMonitorNull'
+ 'loadMonitorClass' => LoadMonitorNull::class
] );
$dbw = $lb->getConnection( DB_MASTER );
MWDebug::appendDebugInfoToApiResult( $context, $result );
- $this->assertInstanceOf( 'ApiResult', $result );
+ $this->assertInstanceOf( ApiResult::class, $result );
$data = $result->getResultData();
$expectedKeys = [ 'mwVersion', 'phpEngine', 'phpVersion', 'gitRevision', 'gitBranch',
* @return FauxRequest
*/
private function newApiRequest( array $params, $requestUrl ) {
- $request = $this->getMockBuilder( 'FauxRequest' )
+ $request = $this->getMockBuilder( FauxRequest::class )
->setMethods( [ 'getRequestURL' ] )
->setConstructorArgs( [
$params
[ $this->anything(), $this->anything(), [ 'lines' ] ]
] );
- $formatter = $this->createMock( 'Monolog\Formatter\FormatterInterface' );
+ $formatter = $this->createMock( \Monolog\Formatter\FormatterInterface::class );
$formatter->expects( $this->any() )
->method( 'format' )
->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) );
->method( 'send' )
->will( $this->returnValue( true ) );
- $formatter = $this->createMock( 'Monolog\Formatter\FormatterInterface' );
+ $formatter = $this->createMock( \Monolog\Formatter\FormatterInterface::class );
$formatter->expects( $this->any() )
->method( 'format' )
->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) );
}
private function getMockDiff( $edits ) {
- $diff = $this->getMockBuilder( 'Diff' )
+ $diff = $this->getMockBuilder( Diff::class )
->disableOriginalConstructor()
->getMock();
$diff->expects( $this->any() )
}
private function getMockDiffOp( $type = null, $orig = [], $closing = [] ) {
- $diffOp = $this->getMockBuilder( 'DiffOp' )
+ $diffOp = $this->getMockBuilder( DiffOp::class )
->disableOriginalConstructor()
->getMock();
$diffOp->expects( $this->any() )
}
private function getMockWgOut() {
- $mock = $this->getMockBuilder( 'OutputPage' )
+ $mock = $this->getMockBuilder( OutputPage::class )
->disableOriginalConstructor()
->getMock();
$mock->expects( $this->once() )
class ErrorPageErrorTest extends MediaWikiTestCase {
private function getMockMessage() {
- $mockMessage = $this->getMockBuilder( 'Message' )
+ $mockMessage = $this->getMockBuilder( Message::class )
->disableOriginalConstructor()
->getMock();
$mockMessage->expects( $this->once() )
$title = 'Foo';
$params = [ 'Baz' ];
- $mock = $this->getMockBuilder( 'OutputPage' )
+ $mock = $this->getMockBuilder( OutputPage::class )
->disableOriginalConstructor()
->getMock();
$mock->expects( $this->once() )
}
private function getMockLanguage() {
- return $this->getMockBuilder( 'Language' )
+ return $this->getMockBuilder( Language::class )
->disableOriginalConstructor()
->getMock();
}
public static function provideExceptionClasses() {
return [
- [ 'Exception' ],
- [ 'MWException' ],
+ [ Exception::class ],
+ [ MWException::class ],
];
}
*/
public static function provideJsonSerializedKeys() {
$testCases = [];
- foreach ( [ 'Exception', 'MWException' ] as $exClass ) {
+ foreach ( [ Exception::class, MWException::class ] as $exClass ) {
$exTests = [
[ 'string', $exClass, 'id' ],
[ 'string', $exClass, 'file' ],
}
private function getMockWgOut() {
- $mock = $this->getMockBuilder( 'OutputPage' )
+ $mock = $this->getMockBuilder( OutputPage::class )
->disableOriginalConstructor()
->getMock();
$mock->expects( $this->once() )
'backends' => [
[
'name' => 'localmultitesting1',
- 'class' => 'FSFileBackend',
+ 'class' => FSFileBackend::class,
'containerPaths' => [
'unittest-cont1' => "{$tmpDir}/localtestingmulti1-cont1",
'unittest-cont2' => "{$tmpDir}/localtestingmulti1-cont2" ],
],
[
'name' => 'localmultitesting2',
- 'class' => 'FSFileBackend',
+ 'class' => FSFileBackend::class,
'containerPaths' => [
'unittest-cont1' => "{$tmpDir}/localtestingmulti2-cont1",
'unittest-cont2' => "{$tmpDir}/localtestingmulti2-cont2" ],
$status = Status::newGood();
$sl = $this->backend->getScopedFileLocks( $paths, LockManager::LOCK_EX, $status );
- $this->assertInstanceOf( 'ScopedLock', $sl,
+ $this->assertInstanceOf( ScopedLock::class, $sl,
"Scoped locking of files succeeded ($backendName)." );
$this->assertEquals( [], $status->getErrors(),
"Scoped locking of files succeeded ($backendName)." );
$be = TestingAccessWrapper::newFromObject( new MemoryFileBackend(
[
'name' => 'testing',
- 'class' => 'MemoryFileBackend',
+ 'class' => MemoryFileBackend::class,
'wikiId' => 'meow',
'mimeCallback' => $mimeCallback
]
'backends' => [
[ // backend 0
'name' => 'multitesting0',
- 'class' => 'MemoryFileBackend',
+ 'class' => MemoryFileBackend::class,
'isMultiMaster' => false,
'readAffinity' => true
],
[ // backend 1
'name' => 'multitesting1',
- 'class' => 'MemoryFileBackend',
+ 'class' => MemoryFileBackend::class,
'isMultiMaster' => true
]
]
'backends' => [
[ // backend 0
'name' => 'multitesting0',
- 'class' => 'MemoryFileBackend',
+ 'class' => MemoryFileBackend::class,
'isMultiMaster' => false
],
[ // backend 1
'name' => 'multitesting1',
- 'class' => 'MemoryFileBackend',
+ 'class' => MemoryFileBackend::class,
'isMultiMaster' => true
]
],
$this->backend = TestingAccessWrapper::newFromObject(
new SwiftFileBackend( [
'name' => 'local-swift-testing',
- 'class' => 'SwiftFileBackend',
+ 'class' => SwiftFileBackend::class,
'wikiId' => 'unit-testing',
'lockManager' => LockManagerGroup::singleton()->get( 'fsLockManager' ),
'swiftAuthUrl' => 'http://127.0.0.1:8080/auth', // unused
}
protected function getMocks() {
- $dbMock = $this->getMockBuilder( 'DatabaseMysqli' )
+ $dbMock = $this->getMockBuilder( Wikimedia\Rdbms\DatabaseMysqli::class )
->disableOriginalClone()
->disableOriginalConstructor()
->getMock();
- $backendMock = $this->getMockBuilder( 'FSFileBackend' )
+ $backendMock = $this->getMockBuilder( FSFileBackend::class )
->setConstructorArgs( [ [
'name' => $this->backendName,
'wikiId' => wfWikiID()
] ] )
->getMock();
- $wrapperMock = $this->getMockBuilder( 'FileBackendDBRepoWrapper' )
+ $wrapperMock = $this->getMockBuilder( FileBackendDBRepoWrapper::class )
->setMethods( [ 'getDB' ] )
->setConstructorArgs( [ [
'backend' => $backendMock,
'containerPaths' => []
] )
] );
- $this->assertInstanceOf( 'FileRepo', $f );
+ $this->assertInstanceOf( FileRepo::class, $f );
}
}
]
] );
- $dbMock = $this->getMockBuilder( 'DatabaseMysqli' )
+ $dbMock = $this->getMockBuilder( Wikimedia\Rdbms\DatabaseMysqli::class )
->disableOriginalConstructor()
->getMock();
new FakeResultWrapper( [] ) // filearchive
) );
- $repoMock = $this->getMockBuilder( 'LocalRepo' )
+ $repoMock = $this->getMockBuilder( LocalRepo::class )
->setMethods( [ 'getMasterDB' ] )
->setConstructorArgs( [ [
'name' => 'migratefilerepolayouttest',
->method( 'getMasterDB' )
->will( $this->returnValue( $dbMock ) );
- $this->migratorMock = $this->getMockBuilder( 'MigrateFileRepoLayout' )
+ $this->migratorMock = $this->getMockBuilder( MigrateFileRepoLayout::class )
->setMethods( [ 'getRepo' ] )->getMock();
$this->migratorMock
->expects( $this->any() )
function testForEachForeignRepo() {
$this->setUpForeignRepo();
- $fakeCallback = $this->createMock( 'RepoGroupTestHelper' );
+ $fakeCallback = $this->createMock( RepoGroupTestHelper::class );
$fakeCallback->expects( $this->once() )->method( 'callback' );
RepoGroup::singleton()->forEachForeignRepo(
[ $fakeCallback, 'callback' ], [ [] ] );
$this->setMwGlobals( 'wgForeignFileRepos', [] );
RepoGroup::destroySingleton();
FileBackendGroup::destroySingleton();
- $fakeCallback = $this->createMock( 'RepoGroupTestHelper' );
+ $fakeCallback = $this->createMock( RepoGroupTestHelper::class );
$fakeCallback->expects( $this->never() )->method( 'callback' );
RepoGroup::singleton()->forEachForeignRepo(
[ $fakeCallback, 'callback' ], [ [] ] );
private function setUpForeignRepo() {
global $wgUploadDirectory;
$this->setMwGlobals( 'wgForeignFileRepos', [ [
- 'class' => 'ForeignAPIRepo',
+ 'class' => ForeignAPIRepo::class,
'name' => 'wikimediacommons',
'backend' => 'wikimediacommons-backend',
'apibase' => 'https://commons.wikimedia.org/w/api.php',
$this->setMwGlobals( 'wgThumbnailBuckets', $data['buckets'] );
$this->setMwGlobals( 'wgThumbnailMinimumBucketDistance', $data['minimumBucketDistance'] );
- $fileMock = $this->getMockBuilder( 'File' )
+ $fileMock = $this->getMockBuilder( File::class )
->setConstructorArgs( [ 'fileMock', false ] )
->setMethods( [ 'getWidth' ] )
->getMockForAbstractClass();
* @covers File::getThumbnailSource
*/
public function testGetThumbnailSource( $data ) {
- $backendMock = $this->getMockBuilder( 'FSFileBackend' )
+ $backendMock = $this->getMockBuilder( FSFileBackend::class )
->setConstructorArgs( [ [ 'name' => 'backendMock', 'wikiId' => wfWikiID() ] ] )
->getMock();
- $repoMock = $this->getMockBuilder( 'FileRepo' )
+ $repoMock = $this->getMockBuilder( FileRepo::class )
->setConstructorArgs( [ [ 'name' => 'repoMock', 'backend' => $backendMock ] ] )
->setMethods( [ 'fileExists', 'getLocalReference' ] )
->getMock();
->method( 'getLocalReference' )
->will( $this->returnValue( $fsFile ) );
- $handlerMock = $this->getMockBuilder( 'BitmapHandler' )
+ $handlerMock = $this->getMockBuilder( BitmapHandler::class )
->setMethods( [ 'supportsBucketing' ] )->getMock();
$handlerMock->expects( $this->any() )
->method( 'supportsBucketing' )
->will( $this->returnValue( $data['supportsBucketing'] ) );
- $fileMock = $this->getMockBuilder( 'File' )
+ $fileMock = $this->getMockBuilder( File::class )
->setConstructorArgs( [ 'fileMock', $repoMock ] )
->setMethods( [ 'getThumbnailBucket', 'getLocalRefPath', 'getHandler' ] )
->getMockForAbstractClass();
public function testGenerateBucketsIfNeeded( $data ) {
$this->setMwGlobals( 'wgThumbnailBuckets', $data['buckets'] );
- $backendMock = $this->getMockBuilder( 'FSFileBackend' )
+ $backendMock = $this->getMockBuilder( FSFileBackend::class )
->setConstructorArgs( [ [ 'name' => 'backendMock', 'wikiId' => wfWikiID() ] ] )
->getMock();
- $repoMock = $this->getMockBuilder( 'FileRepo' )
+ $repoMock = $this->getMockBuilder( FileRepo::class )
->setConstructorArgs( [ [ 'name' => 'repoMock', 'backend' => $backendMock ] ] )
->setMethods( [ 'fileExists', 'getLocalReference' ] )
->getMock();
- $fileMock = $this->getMockBuilder( 'File' )
+ $fileMock = $this->getMockBuilder( File::class )
->setConstructorArgs( [ 'fileMock', $repoMock ] )
->setMethods( [ 'getWidth', 'getBucketThumbPath', 'makeTransformTmpFile',
'generateAndSaveThumb', 'getHandler' ] )
->getMockForAbstractClass();
- $handlerMock = $this->getMockBuilder( 'JpegHandler' )
+ $handlerMock = $this->getMockBuilder( JpegHandler::class )
->setMethods( [ 'supportsBucketing' ] )->getMock();
$handlerMock->expects( $this->any() )
->method( 'supportsBucketing' )
->method( 'getHandler' )
->will( $this->returnValue( $handlerMock ) );
- $reflectionMethod = new ReflectionMethod( 'File', 'generateBucketsIfNeeded' );
+ $reflectionMethod = new ReflectionMethod( File::class, 'generateBucketsIfNeeded' );
$reflectionMethod->setAccessible( true );
$fileMock->expects( $this->any() )
$file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
$this->assertThat(
$file,
- $this->isInstanceOf( 'LocalFile' ),
+ $this->isInstanceOf( LocalFile::class ),
'wfLocalFile() returns LocalFile for valid Titles'
);
}
try {
new HTMLCheckMatrix( [] );
} catch ( MWException $e ) {
- $this->assertInstanceOf( 'HTMLFormFieldRequiredOptionsException', $e );
+ $this->assertInstanceOf( HTMLFormFieldRequiredOptionsException::class, $e );
return;
}
$this->assertFalse( $lookup->fetch( 'xyz' ), 'unknown prefix' );
$interwiki = $lookup->fetch( 'de' );
- $this->assertInstanceOf( 'Interwiki', $interwiki );
+ $this->assertInstanceOf( Interwiki::class, $interwiki );
$this->assertSame( $interwiki, $lookup->fetch( 'de' ), 'in-process caching' );
$this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
$this->assertTrue( $lookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
$interwiki = $lookup->fetch( 'de' );
- $this->assertInstanceOf( 'Interwiki', $interwiki );
+ $this->assertInstanceOf( Interwiki::class, $interwiki );
$this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
$this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
$interwiki = $lookup->fetch( 'zz' );
- $this->assertInstanceOf( 'Interwiki', $interwiki );
+ $this->assertInstanceOf( Interwiki::class, $interwiki );
$this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
$this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
$this->assertTrue( $lookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
$interwiki = $lookup->fetch( 'de' );
- $this->assertInstanceOf( 'Interwiki', $interwiki );
+ $this->assertInstanceOf( Interwiki::class, $interwiki );
$this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
$this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
$interwiki = $lookup->fetch( 'zz' );
- $this->assertInstanceOf( 'Interwiki', $interwiki );
+ $this->assertInstanceOf( Interwiki::class, $interwiki );
$this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
$this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
$this->assertFalse( $interwikiLookup->fetch( 'xyz' ), 'unknown prefix' );
$interwiki = $interwikiLookup->fetch( 'de' );
- $this->assertInstanceOf( 'Interwiki', $interwiki );
+ $this->assertInstanceOf( Interwiki::class, $interwiki );
$this->assertSame( $interwiki, $interwikiLookup->fetch( 'de' ), 'in-process caching' );
$this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
*/
private function newJobQueue() {
return JobQueue::factory( [
- 'class' => 'JobQueueMemory',
+ 'class' => JobQueueMemory::class,
'wiki' => wfWikiID(),
'type' => 'null',
] );
public function testJobFromSpecInternal() {
$queue = $this->newJobQueue();
$job = $queue->jobFromSpecInternal( $this->newJobSpecification() );
- $this->assertInstanceOf( 'Job', $job );
+ $this->assertInstanceOf( Job::class, $job );
$this->assertSame( 'null', $job->getType() );
$this->assertArrayHasKey( 'customParameter', $job->getParams() );
$this->assertSame( 'Custom title', $job->getTitle()->getText() );
}
$baseConfig = $wgJobTypeConf[$name];
} else {
- $baseConfig = [ 'class' => 'JobQueueDBSingle' ];
+ $baseConfig = [ 'class' => JobQueueDBSingle::class ];
}
$baseConfig['type'] = 'null';
$baseConfig['wiki'] = wfWikiID();
$j = $queue->pop();
// Make sure ack() of the twin did not delete the sibling data
- $this->assertType( 'NullJob', $j );
+ $this->assertType( NullJob::class, $j );
}
/**
}
public function provideTestToString() {
- $mockToStringObj = $this->getMockBuilder( 'stdClass' )
+ $mockToStringObj = $this->getMockBuilder( stdClass::class )
->setMethods( [ '__toString' ] )->getMock();
$mockToStringObj->expects( $this->any() )
->method( '__toString' )
public function getMockJob( $params ) {
$mock = $this->getMockForAbstractClass(
- 'Job',
+ Job::class,
[ 'someCommand', new Title(), $params ],
'SomeJob'
);
$this->assertJson( $json );
$st = FormatJson::parse( $json );
- $this->assertInstanceOf( 'Status', $st );
+ $this->assertInstanceOf( Status::class, $st );
$this->assertTrue( $st->isGood() );
$this->assertEquals( $expected, $st->getValue() );
$st = FormatJson::parse( $json, FormatJson::FORCE_ASSOC );
- $this->assertInstanceOf( 'Status', $st );
+ $this->assertInstanceOf( Status::class, $st );
$this->assertTrue( $st->isGood() );
$this->assertEquals( $value, $st->getValue() );
}
}
$st = FormatJson::parse( $value, FormatJson::TRY_FIXING );
- $this->assertInstanceOf( 'Status', $st );
+ $this->assertInstanceOf( Status::class, $st );
if ( $expected === false ) {
$this->assertFalse( $st->isOK(), 'Expected isOK() == false' );
} else {
*/
public function testParseErrors( $value ) {
$st = FormatJson::parse( $value );
- $this->assertInstanceOf( 'Status', $st );
+ $this->assertInstanceOf( Status::class, $st );
$this->assertFalse( $st->isOK() );
}
*/
public function testParseStripComments( $json, $expect ) {
$st = FormatJson::parse( $json, FormatJson::STRIP_COMMENTS );
- $this->assertInstanceOf( 'Status', $st );
+ $this->assertInstanceOf( Status::class, $st );
$this->assertTrue( $st->isGood() );
$this->assertEquals( $expect, $st->getValue() );
}
* @dataProvider provideToString
*/
public function testToString( $params, $expected ) {
- $class = new ReflectionClass( 'DeferredStringifier' );
+ $class = new ReflectionClass( DeferredStringifier::class );
$ds = $class->newInstanceArgs( $params );
$this->assertEquals( $expected, (string)$ds );
}
* way as the original underlying callable.
*/
public function testReturnValuePassedThrough() {
- $mock = $this->getMockBuilder( 'stdClass' )
+ $mock = $this->getMockBuilder( stdClass::class )
->setMethods( [ 'reverse' ] )->getMock();
$mock->expects( $this->any() )
->method( 'reverse' )
* @requires function apc_store/apcu_store
*/
public function testCallableMemoized() {
- $observer = $this->getMockBuilder( 'stdClass' )
+ $observer = $this->getMockBuilder( stdClass::class )
->setMethods( [ 'computeSomething' ] )->getMock();
$observer->expects( $this->once() )
->method( 'computeSomething' )
*/
public function testClosureExpansionDisabled() {
$obj = ObjectFactory::getObjectFromSpec( [
- 'class' => 'ObjectFactoryTestFixture',
+ 'class' => ObjectFactoryTestFixture::class,
'args' => [
function () {
return 'wrapped';
*/
public function testClosureExpansionEnabled() {
$obj = ObjectFactory::getObjectFromSpec( [
- 'class' => 'ObjectFactoryTestFixture',
+ 'class' => ObjectFactoryTestFixture::class,
'args' => [
function () {
return 'wrapped';
$this->assertSame( 'wrapped', $obj->setterArgs[0] );
$obj = ObjectFactory::getObjectFromSpec( [
- 'class' => 'ObjectFactoryTestFixture',
+ 'class' => ObjectFactoryTestFixture::class,
'args' => [ function () {
return 'unwrapped';
}, ],
*/
public function testGetObjectFromClass( $args ) {
$obj = ObjectFactory::getObjectFromSpec( [
- 'class' => 'ObjectFactoryTestFixture',
+ 'class' => ObjectFactoryTestFixture::class,
'args' => $args,
] );
$this->assertSame( $args, $obj->args );
* @covers Xhprof::enable
*/
public function testEnable() {
- $xhprof = new ReflectionClass( 'Xhprof' );
+ $xhprof = new ReflectionClass( Xhprof::class );
$enabled = $xhprof->getProperty( 'enabled' );
$enabled->setAccessible( true );
$enabled->setValue( true );
$this->assertEquals( count( $ids ), $calls, "Values cached" );
// Mock the BagOStuff to assure only one getMulti() call given process caching
- $localBag = $this->getMockBuilder( 'HashBagOStuff' )
+ $localBag = $this->getMockBuilder( HashBagOStuff::class )
->setMethods( [ 'getMulti' ] )->getMock();
$localBag->expects( $this->exactly( 1 ) )->method( 'getMulti' )->willReturn( [
WANObjectCache::VALUE_KEY_PREFIX . 'k1' => 'val-id1',
}
public function testMcRouterSupport() {
- $localBag = $this->getMockBuilder( 'EmptyBagOStuff' )
+ $localBag = $this->getMockBuilder( EmptyBagOStuff::class )
->setMethods( [ 'set', 'delete' ] )->getMock();
$localBag->expects( $this->never() )->method( 'set' );
$localBag->expects( $this->never() )->method( 'delete' );
use Wikimedia\Rdbms\DatabaseDomain;
use Wikimedia\Rdbms\MySQLMasterPos;
use Wikimedia\Rdbms\DatabaseMysqlBase;
+use Wikimedia\Rdbms\DatabaseMysqli;
use Wikimedia\Rdbms\Database;
/**
}
private function getMockForViews() {
- $db = $this->getMockBuilder( 'DatabaseMysqli' )
+ $db = $this->getMockBuilder( DatabaseMysqli::class )
->disableOriginalConstructor()
->setMethods( [ 'fetchRow', 'query' ] )
->getMock();
* @covers Wikimedia\Rdbms\DatabaseMysqlBase::getLagFromPtHeartbeat
*/
public function testPtHeartbeat( $lag ) {
- $db = $this->getMockBuilder( 'DatabaseMysqli' )
+ $db = $this->getMockBuilder( DatabaseMysqli::class )
->disableOriginalConstructor()
->setMethods( [
'getLagDetectionMethod', 'getHeartbeatData', 'getMasterServerInfo' ] )
$this->setMwGlobals( [
'wgLogTypes' => [ 'phpunit' ],
- 'wgLogActionsHandlers' => [ 'phpunit/test' => 'LogFormatter',
- 'phpunit/param' => 'LogFormatter' ],
+ 'wgLogActionsHandlers' => [ 'phpunit/test' => LogFormatter::class,
+ 'phpunit/param' => LogFormatter::class ],
'wgUser' => User::newFromName( 'Testuser' ),
] );
// Register LogHandler, see $wgNewUserLog in Setup.php
$this->mergeMwGlobalArrayValue( 'wgLogActionsHandlers', [
- 'newusers/newusers' => 'NewUsersLogFormatter',
- 'newusers/create' => 'NewUsersLogFormatter',
- 'newusers/create2' => 'NewUsersLogFormatter',
- 'newusers/byemail' => 'NewUsersLogFormatter',
- 'newusers/autocreate' => 'NewUsersLogFormatter',
+ 'newusers/newusers' => NewUsersLogFormatter::class,
+ 'newusers/create' => NewUsersLogFormatter::class,
+ 'newusers/create2' => NewUsersLogFormatter::class,
+ 'newusers/byemail' => NewUsersLogFormatter::class,
+ 'newusers/autocreate' => NewUsersLogFormatter::class,
] );
}
$this->setMwGlobals( 'wgHooks', [] );
// Register LogHandler, see $wgPageLanguageUseDB in Setup.php
$this->mergeMwGlobalArrayValue( 'wgLogActionsHandlers', [
- 'pagelang/pagelang' => 'PageLangLogFormatter',
+ 'pagelang/pagelang' => PageLangLogFormatter::class,
] );
}
*/
public function testConstructor() {
$ma = new MailAddress( 'foo@bar.baz', 'UserName', 'Real name' );
- $this->assertInstanceOf( 'MailAddress', $ma );
+ $this->assertInstanceOf( MailAddress::class, $ma );
}
/**
if ( wfIsWindows() ) {
$this->markTestSkipped( 'This test only works on non-Windows platforms' );
}
- $user = $this->createMock( 'User' );
+ $user = $this->createMock( User::class );
$user->expects( $this->any() )->method( 'getName' )->will(
$this->returnValue( 'UserName' )
);
);
$ma = MailAddress::newFromUser( $user );
- $this->assertInstanceOf( 'MailAddress', $ma );
+ $this->assertInstanceOf( MailAddress::class, $ma );
$this->setMwGlobals( 'wgEnotifUseRealName', true );
$this->assertEquals( 'Real name <foo@bar.baz>', $ma->toString() );
$this->setMwGlobals( 'wgEnotifUseRealName', false );
$file = new FakeDimensionFile( [ 4000, 4000 ] );
$handler = new BitmapHandler;
$params = [ 'width' => '3700' ]; // Still bigger than max size.
- $this->assertEquals( 'TransformTooBigImageAreaError',
+ $this->assertEquals( TransformTooBigImageAreaError::class,
get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
}
$file->mustRender = true;
$handler = new BitmapHandler;
$params = [ 'width' => '5000' ]; // Still bigger than max size.
- $this->assertEquals( 'TransformTooBigImageAreaError',
+ $this->assertEquals( TransformTooBigImageAreaError::class,
get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
}
*/
public function testResolveMultivalueValue( $input, $output ) {
$formatMetadata = new FormatMetadata();
- $class = new ReflectionClass( 'FormatMetadata' );
+ $class = new ReflectionClass( FormatMetadata::class );
$method = $class->getMethod( 'resolveMultivalueValue' );
$method->setAccessible( true );
$actualInput = $method->invoke( $formatMetadata, $input );
$this->assertEquals( $expected, $meta['Copyright']['x-default'] );
}
- /**
- * Test extraction of pHYs tags, which can tell what the
- * actual resolution of the image is (aka in dots per meter).
- */
- /*
- public function testPngPhysTag() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'Png-native-test.png' );
-
- $this->assertArrayHasKey( 'text', $meta );
- $meta = $meta['text'];
-
- $this->assertEquals( '2835/100', $meta['XResolution'] );
- $this->assertEquals( '2835/100', $meta['YResolution'] );
- $this->assertEquals( 3, $meta['ResolutionUnit'] ); // 3 = cm
- }
- */
-
/**
* Given a normal static PNG, check the animation metadata returned.
*/
* @covers MemcachedBagOStuff::validateKeyEncoding
*/
public function testValidateKeyEncodingThrowsException( $key ) {
- $this->setExpectedException( 'Exception' );
+ $this->setExpectedException( Exception::class );
$this->cache->validateKeyEncoding( $key );
}
private function setCacheConfig( $arr = [] ) {
$defaults = [
- CACHE_NONE => [ 'class' => 'EmptyBagOStuff' ],
- CACHE_DB => [ 'class' => 'SqlBagOStuff' ],
+ CACHE_NONE => [ 'class' => EmptyBagOStuff::class ],
+ CACHE_DB => [ 'class' => SqlBagOStuff::class ],
CACHE_ANYTHING => [ 'factory' => 'ObjectCache::newAnything' ],
// Mock ACCEL with 'hash' as being installed.
// This makes tests deterministic regardless of APC.
- CACHE_ACCEL => [ 'class' => 'HashBagOStuff' ],
- 'hash' => [ 'class' => 'HashBagOStuff' ],
+ CACHE_ACCEL => [ 'class' => HashBagOStuff::class ],
+ 'hash' => [ 'class' => HashBagOStuff::class ],
];
$this->setMwGlobals( 'wgObjectCaches', $arr + $defaults );
}
$this->setCacheConfig( [
// Mock APC not being installed (T160519, T147161)
- CACHE_ACCEL => [ 'class' => 'EmptyBagOStuff' ]
+ CACHE_ACCEL => [ 'class' => EmptyBagOStuff::class ]
] );
$this->assertInstanceOf(
$this->setCacheConfig( [
// Mock APC not being installed (T160519, T147161)
- CACHE_ACCEL => [ 'class' => 'EmptyBagOStuff' ]
+ CACHE_ACCEL => [ 'class' => EmptyBagOStuff::class ]
] );
$this->assertInstanceOf(
public function setUp() {
parent::setUp();
$this->client =
- $this->getMockBuilder( 'MultiHttpClient' )
+ $this->getMockBuilder( MultiHttpClient::class )
->setConstructorArgs( [ [] ] )
->setMethods( [ 'run' ] )
->getMock();
protected function setUp() {
parent::setUp();
- $cache = $this->getMockBuilder( 'RedisBagOStuff' )
+ $cache = $this->getMockBuilder( RedisBagOStuff::class )
->disableOriginalConstructor()
->getMock();
$this->cache = TestingAccessWrapper::newFromObject( $cache );
);
$page = new WikiPage( $page->getTitle() );
- $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
+ $this->assertEquals( JavaScriptContentHandler::class, get_class( $page->getContentHandler() ) );
}
}
# sanity check, because this test seems to fail for no reason for some people.
$c = $page->getContent();
- $this->assertEquals( 'WikitextContent', get_class( $c ) );
+ $this->assertEquals( WikitextContent::class, get_class( $c ) );
# now, test the actual redirect
$t = $page->getRedirectTarget();
public function testWikiPageFactory() {
$title = Title::makeTitle( NS_FILE, 'Someimage.png' );
$page = WikiPage::factory( $title );
- $this->assertEquals( 'WikiFilePage', get_class( $page ) );
+ $this->assertEquals( WikiFilePage::class, get_class( $page ) );
$title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' );
$page = WikiPage::factory( $title );
- $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
+ $this->assertEquals( WikiCategoryPage::class, get_class( $page ) );
$title = Title::makeTitle( NS_MAIN, 'SomePage' );
$page = WikiPage::factory( $title );
- $this->assertEquals( 'WikiPage', get_class( $page ) );
+ $this->assertEquals( WikiPage::class, get_class( $page ) );
}
/**
* @dataProvider getDateCondProvider
*/
public function testGetDateCond( $inputYear, $inputMonth, $inputDay, $expected ) {
- $pager = $this->getMockForAbstractClass( 'RangeChronologicalPager' );
+ $pager = $this->getMockForAbstractClass( RangeChronologicalPager::class );
$this->assertEquals(
$expected,
wfTimestamp( TS_MW, $pager->getDateCond( $inputYear, $inputMonth, $inputDay ) )
* @dataProvider getDateRangeCondProvider
*/
public function testGetDateRangeCond( $start, $end, $expected ) {
- $pager = $this->getMockForAbstractClass( 'RangeChronologicalPager' );
+ $pager = $this->getMockForAbstractClass( RangeChronologicalPager::class );
$this->assertArrayEquals( $expected, $pager->getDateRangeCond( $start, $end ) );
}
* @dataProvider getDateRangeCondInvalidProvider
*/
public function testGetDateRangeCondInvalid( $start, $end ) {
- $pager = $this->getMockForAbstractClass( 'RangeChronologicalPager' );
+ $pager = $this->getMockForAbstractClass( RangeChronologicalPager::class );
$this->assertEquals( null, $pager->getDateRangeCond( $start, $end ) );
}
* @covers ReverseChronologicalPager::getDateCond
*/
public function testGetDateCond() {
- $pager = $this->getMockForAbstractClass( 'ReverseChronologicalPager' );
+ $pager = $this->getMockForAbstractClass( ReverseChronologicalPager::class );
$timestamp = MWTimestamp::getInstance();
$db = wfGetDB( DB_MASTER );
--- /dev/null
+<?php
+/**
+ * @group Database
+ * @covers CoreParserFunctions
+ */
+class CoreParserFunctionsTest extends MediaWikiTestCase {
+
+ public function testGender() {
+ $user = User::createNew( '*Female' );
+ $user->setOption( 'gender', 'female' );
+ $user->saveSettings();
+
+ $msg = ( new RawMessage( '{{GENDER:*Female|m|f|o}}' ) )->parse();
+ $this->assertEquals( $msg, 'f', 'Works unescaped' );
+ $escapedName = wfEscapeWikiText( '*Female' );
+ $msg2 = ( new RawMessage( '{{GENDER:' . $escapedName . '|m|f|o}}' ) )
+ ->parse();
+ $this->assertEquals( $msg, 'f', 'Works escaped' );
+ }
+
+}
protected $mPreprocessors;
protected static $classNames = [
- 'Preprocessor_DOM',
- 'Preprocessor_Hash'
+ Preprocessor_DOM::class,
+ Preprocessor_Hash::class
];
protected function setUp() {
class BcryptPasswordTest extends PasswordTestCase {
protected function getTypeConfigs() {
return [ 'bcrypt' => [
- 'class' => 'BcryptPassword',
+ 'class' => BcryptPassword::class,
'cost' => 9,
] ];
}
protected function getTypeConfigs() {
return [
'both' => [
- 'class' => 'EncryptedPassword',
+ 'class' => EncryptedPassword::class,
'underlying' => 'pbkdf2',
'secrets' => [
md5( 'secret1' ),
'cipher' => 'aes-256-cbc',
],
'secret1' => [
- 'class' => 'EncryptedPassword',
+ 'class' => EncryptedPassword::class,
'underlying' => 'pbkdf2',
'secrets' => [
md5( 'secret1' ),
'cipher' => 'aes-256-cbc',
],
'secret2' => [
- 'class' => 'EncryptedPassword',
+ 'class' => EncryptedPassword::class,
'underlying' => 'pbkdf2',
'secrets' => [
md5( 'secret2' ),
'cipher' => 'aes-256-cbc',
],
'pbkdf2' => [
- 'class' => 'Pbkdf2Password',
+ 'class' => Pbkdf2Password::class,
'algo' => 'sha256',
'cost' => '10',
'length' => '64',
protected function getTypeConfigs() {
return [
'testLargeLayeredTop' => [
- 'class' => 'LayeredParameterizedPassword',
+ 'class' => LayeredParameterizedPassword::class,
'types' => [
'testLargeLayeredBottom',
'testLargeLayeredBottom',
],
],
'testLargeLayeredBottom' => [
- 'class' => 'Pbkdf2Password',
+ 'class' => Pbkdf2Password::class,
'algo' => 'sha512',
'cost' => 1024,
'length' => 512,
],
'testLargeLayeredFinal' => [
- 'class' => 'BcryptPassword',
+ 'class' => BcryptPassword::class,
'cost' => 5,
]
];
class MWOldPasswordTest extends PasswordTestCase {
protected function getTypeConfigs() {
return [ 'A' => [
- 'class' => 'MWOldPassword',
+ 'class' => MWOldPassword::class,
] ];
}
class MWSaltedPasswordTest extends PasswordTestCase {
protected function getTypeConfigs() {
return [ 'B' => [
- 'class' => 'MWSaltedPassword',
+ 'class' => MWSaltedPassword::class,
] ];
}
class PasswordFactoryTest extends MediaWikiTestCase {
public function testRegister() {
$pf = new PasswordFactory;
- $pf->register( 'foo', [ 'class' => 'InvalidPassword' ] );
+ $pf->register( 'foo', [ 'class' => InvalidPassword::class ] );
$this->assertArrayHasKey( 'foo', $pf->getTypes() );
}
public function testSetDefaultType() {
$pf = new PasswordFactory;
- $pf->register( '1', [ 'class' => 'InvalidPassword' ] );
- $pf->register( '2', [ 'class' => 'InvalidPassword' ] );
+ $pf->register( '1', [ 'class' => InvalidPassword::class ] );
+ $pf->register( '2', [ 'class' => InvalidPassword::class ] );
$pf->setDefaultType( '1' );
$this->assertSame( '1', $pf->getDefaultType() );
$pf->setDefaultType( '2' );
public function testInit() {
$config = new HashConfig( [
'PasswordConfig' => [
- 'foo' => [ 'class' => 'InvalidPassword' ],
+ 'foo' => [ 'class' => InvalidPassword::class ],
],
'PasswordDefault' => 'foo'
] );
public function testNewFromCiphertext() {
$pf = new PasswordFactory;
- $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+ $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
$pw = $pf->newFromCiphertext( ':B:salt:d529e941509eb9e9b9cfaeae1fe7ca23' );
$this->assertInstanceOf( MWSaltedPassword::class, $pw );
}
*/
public function testNewFromCiphertextErrors( $hash ) {
$pf = new PasswordFactory;
- $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+ $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
$pf->newFromCiphertext( $hash );
}
public function testNewFromType() {
$pf = new PasswordFactory;
- $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+ $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
$pw = $pf->newFromType( 'B' );
$this->assertInstanceOf( MWSaltedPassword::class, $pw );
}
*/
public function testNewFromTypeError() {
$pf = new PasswordFactory;
- $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+ $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
$pf->newFromType( 'bogus' );
}
public function testNewFromPlaintext() {
$pf = new PasswordFactory;
- $pf->register( 'A', [ 'class' => 'MWOldPassword' ] );
- $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+ $pf->register( 'A', [ 'class' => MWOldPassword::class ] );
+ $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
$pf->setDefaultType( 'A' );
- $this->assertInstanceOf( 'InvalidPassword', $pf->newFromPlaintext( null ) );
- $this->assertInstanceOf( 'MWOldPassword', $pf->newFromPlaintext( 'password' ) );
- $this->assertInstanceOf( 'MWSaltedPassword',
+ $this->assertInstanceOf( InvalidPassword::class, $pf->newFromPlaintext( null ) );
+ $this->assertInstanceOf( MWOldPassword::class, $pf->newFromPlaintext( 'password' ) );
+ $this->assertInstanceOf( MWSaltedPassword::class,
$pf->newFromPlaintext( 'password', $pf->newFromType( 'B' ) ) );
}
public function testNeedsUpdate() {
$pf = new PasswordFactory;
- $pf->register( 'A', [ 'class' => 'MWOldPassword' ] );
- $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+ $pf->register( 'A', [ 'class' => MWOldPassword::class ] );
+ $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
$pf->setDefaultType( 'A' );
$this->assertFalse( $pf->needsUpdate( $pf->newFromType( 'A' ) ) );
}
public function testNewInvalidPassword() {
- $this->assertInstanceOf( 'InvalidPassword', PasswordFactory::newInvalidPassword() );
+ $this->assertInstanceOf( InvalidPassword::class, PasswordFactory::newInvalidPassword() );
}
}
$passwordFactory = new PasswordFactory();
$invalid = $passwordFactory->newFromPlaintext( null );
- $this->assertInstanceOf( 'InvalidPassword', $invalid );
+ $this->assertInstanceOf( InvalidPassword::class, $invalid );
}
}
protected function getTypeConfigs() {
return [
'pbkdf2' => [
- 'class' => 'Pbkdf2Password',
+ 'class' => Pbkdf2Password::class,
'algo' => 'sha256',
'cost' => '10000',
'length' => '128',
class Pbkdf2PasswordTest extends PasswordTestCase {
protected function getTypeConfigs() {
return [ 'pbkdf2' => [
- 'class' => 'Pbkdf2Password',
+ 'class' => Pbkdf2Password::class,
'algo' => 'sha256',
'cost' => '10000',
'length' => '128',
'maxqueue' => 100,
];
- $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+ $poolCounter = $this->getMockBuilder( PoolCounterAbstractMock::class )
->setConstructorArgs( [ $poolCounterConfig, 'testCounter', 'someKey' ] )
// don't mock anything - the proper syntax would be setMethods(null), but due
// to a PHPUnit bug that does not work with getMockForAbstractClass()
->setMethods( [ 'idontexist' ] )
->getMockForAbstractClass();
- $this->assertInstanceOf( 'PoolCounter', $poolCounter );
+ $this->assertInstanceOf( PoolCounter::class, $poolCounter );
}
public function testConstructWithSlots() {
'maxqueue' => 100,
];
- $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+ $poolCounter = $this->getMockBuilder( PoolCounterAbstractMock::class )
->setConstructorArgs( [ $poolCounterConfig, 'testCounter', 'key' ] )
->setMethods( [ 'idontexist' ] ) // don't mock anything
->getMockForAbstractClass();
- $this->assertInstanceOf( 'PoolCounter', $poolCounter );
+ $this->assertInstanceOf( PoolCounter::class, $poolCounter );
}
public function testHashKeyIntoSlots() {
- $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+ $poolCounter = $this->getMockBuilder( PoolCounterAbstractMock::class )
// don't mock anything - the proper syntax would be setMethods(null), but due
// to a PHPUnit bug that does not work with getMockForAbstractClass()
->setMethods( [ 'idontexist' ] )
* @covers MachineReadableRCFeedFormatter::getLine
*/
public function testNotify() {
- $feed = $this->getMockBuilder( 'RCFeedEngine' )
- ->setConstructorArgs( [ [ 'formatter' => 'JSONRCFeedFormatter' ] ] )
+ $feed = $this->getMockBuilder( RCFeedEngine::class )
+ ->setConstructorArgs( [ [ 'formatter' => JSONRCFeedFormatter::class ] ] )
->setMethods( [ 'send' ] )
->getMock();
'wgRCFeeds' => [
'myfeed' => [
'uri' => 'test://localhost:1234',
- 'formatter' => 'JSONRCFeedFormatter',
+ 'formatter' => JSONRCFeedFormatter::class,
],
],
'wgRCEngines' => [
public function testExtractCredits() {
$processor = new ExtensionProcessor();
$processor->extractInfo( $this->dir, self::$default, 1 );
- $this->setExpectedException( 'Exception' );
+ $this->setExpectedException( Exception::class );
$processor->extractInfo( $this->dir, self::$default, 1 );
}
'autoloaderPaths' => []
];
$registry = new ExtensionRegistry();
- $class = new ReflectionClass( 'ExtensionRegistry' );
+ $class = new ReflectionClass( ExtensionRegistry::class );
$method = $class->getMethod( 'exportExtractedData' );
$method->setAccessible( true );
$method->invokeArgs( $registry, [ $info ] );
],
],
],
+ [
+ 'global is null before',
+ [
+ 'NullGlobal' => null,
+ ],
+ [
+ 'NullGlobal' => 'not-null'
+ ],
+ [
+ 'NullGlobal' => null
+ ],
+ ],
];
}
}
],
] );
- $this->setExpectedException( 'UnexpectedValueException' );
+ $this->setExpectedException( UnexpectedValueException::class );
$checker->checkArray( [
'FakeExtension' => [
'FakeDependency' => 'not really valid',
parent::setUp();
// MediaWiki tests defaults $wgMainWANCache to CACHE_NONE.
// Use hash instead so that caching is observed
- $this->wanCache = $this->getMockBuilder( 'WANObjectCache' )
+ $this->wanCache = $this->getMockBuilder( WANObjectCache::class )
->setConstructorArgs( [ [
'cache' => new HashBagOStuff(),
'pool' => 'test',
}
protected function makeBlobStore( $methods = null, $rl = null ) {
- $blobStore = $this->getMockBuilder( 'MessageBlobStore' )
+ $blobStore = $this->getMockBuilder( MessageBlobStore::class )
->setConstructorArgs( [ $rl ] )
->setMethods( $methods )
->getMock();
return [
[
[
- 'class' => 'ResourceLoaderImageModule',
+ 'class' => ResourceLoaderImageModule::class,
'prefix' => 'oo-ui-icon',
'variants' => self::$commonImageVariants,
'images' => self::$commonImageData,
],
[
[
- 'class' => 'ResourceLoaderImageModule',
+ 'class' => ResourceLoaderImageModule::class,
'selectorWithoutVariant' => '.mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
'selectorWithVariant' =>
'.mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
}
private function getImageMock( ResourceLoaderContext $context, $dataUriReturnValue ) {
- $image = $this->getMockBuilder( 'ResourceLoaderImage' )
+ $image = $this->getMockBuilder( ResourceLoaderImage::class )
->disableOriginalConstructor()
->getMock();
$image->method( 'getDataUri' )
* @covers ResourceLoaderModule::expandRelativePaths
*/
public function testPlaceholderize() {
- $getRelativePaths = new ReflectionMethod( 'ResourceLoaderModule', 'getRelativePaths' );
+ $getRelativePaths = new ReflectionMethod( ResourceLoaderModule::class, 'getRelativePaths' );
$getRelativePaths->setAccessible( true );
- $expandRelativePaths = new ReflectionMethod( 'ResourceLoaderModule', 'expandRelativePaths' );
+ $expandRelativePaths = new ReflectionMethod( ResourceLoaderModule::class, 'expandRelativePaths' );
$expandRelativePaths->setAccessible( true );
$this->setMwGlobals( [
*/
public function testNonDefaultSkin() {
$module = new ResourceLoaderOOUIImageModule( [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'name' => 'icons',
'rootPath' => 'tests/phpunit/data/resourceloader/oouiimagemodule',
] );
function () {
}
);
- $r = new ReflectionMethod( 'ExtensionRegistry', 'exportExtractedData' );
+ $r = new ReflectionMethod( ExtensionRegistry::class, 'exportExtractedData' );
$r->setAccessible( true );
$r->invoke( ExtensionRegistry::getInstance(), [
'globals' => [],
'msg' => 'Version falls back gracefully if getVersionHash throws',
'modules' => [
'test.fail' => (
- ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+ ( $mock = $this->getMockBuilder( ResourceLoaderTestModule::class )
->setMethods( [ 'getVersionHash' ] )->getMock() )
&& $mock->method( 'getVersionHash' )->will(
$this->throwException( new Exception )
'msg' => 'Use version from getVersionHash',
'modules' => [
'test.version' => (
- ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+ ( $mock = $this->getMockBuilder( ResourceLoaderTestModule::class )
->setMethods( [ 'getVersionHash' ] )->getMock() )
&& $mock->method( 'getVersionHash' )->willReturn( '1234567' )
) ? $mock : $mock
'msg' => 'Re-hash version from getVersionHash if too long',
'modules' => [
'test.version' => (
- ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+ ( $mock = $this->getMockBuilder( ResourceLoaderTestModule::class )
->setMethods( [ 'getVersionHash' ] )->getMock() )
&& $mock->method( 'getVersionHash' )->willReturn( '12345678' )
) ? $mock : $mock
*/
public function testRegisterInvalidName() {
$resourceLoader = new EmptyResourceLoader();
- $this->setExpectedException( 'MWException', "name 'test!invalid' is invalid" );
+ $this->setExpectedException( MWException::class, "name 'test!invalid' is invalid" );
$resourceLoader->register( 'test!invalid', new ResourceLoaderTestModule() );
}
*/
public function testRegisterInvalidType() {
$resourceLoader = new EmptyResourceLoader();
- $this->setExpectedException( 'MWException', 'ResourceLoader module info type error' );
+ $this->setExpectedException( MWException::class, 'ResourceLoader module info type error' );
$resourceLoader->register( 'test', new stdClass() );
}
*/
public function testAddSourceDupe() {
$rl = new ResourceLoader;
- $this->setExpectedException( 'MWException', 'ResourceLoader duplicate source addition error' );
+ $this->setExpectedException(
+ MWException::class, 'ResourceLoader duplicate source addition error'
+ );
$rl->addSource( 'foo', 'https://example.org/w/load.php' );
$rl->addSource( 'foo', 'https://example.com/w/load.php' );
}
*/
public function testAddSourceInvalid() {
$rl = new ResourceLoader;
- $this->setExpectedException( 'MWException', 'with no "loadScript" key' );
+ $this->setExpectedException( MWException::class, 'with no "loadScript" key' );
$rl->addSource( 'foo', [ 'x' => 'https://example.org/w/load.php' ] );
}
ResourceLoader::clearCache();
$this->setMwGlobals( 'wgResourceLoaderDebug', true );
- $rl = TestingAccessWrapper::newFromClass( 'ResourceLoader' );
+ $rl = TestingAccessWrapper::newFromClass( ResourceLoader::class );
$this->assertEquals(
$case['expected'],
$rl->makeLoaderImplementScript(
* @covers ResourceLoader::makeLoaderImplementScript
*/
public function testMakeLoaderImplementScriptInvalid() {
- $this->setExpectedException( 'MWException', 'Invalid scripts error' );
- $rl = TestingAccessWrapper::newFromClass( 'ResourceLoader' );
+ $this->setExpectedException( MWException::class, 'Invalid scripts error' );
+ $rl = TestingAccessWrapper::newFromClass( ResourceLoader::class );
$rl->makeLoaderImplementScript(
'test', // name
123, // scripts
'foo' => self::getSimpleModuleMock( 'foo();' ),
'ferry' => self::getFailFerryMock(),
'bar' => self::getSimpleModuleMock( 'bar();' ),
- 'startup' => [ 'class' => 'ResourceLoaderStartUpModule' ],
+ 'startup' => [ 'class' => ResourceLoaderStartUpModule::class ],
] );
$context = $this->getResourceLoaderContext(
[
*/
public function testConstructor( $params ) {
$module = new ResourceLoaderWikiModule( $params );
- $this->assertInstanceOf( 'ResourceLoaderWikiModule', $module );
+ $this->assertInstanceOf( ResourceLoaderWikiModule::class, $module );
}
public static function provideConstructor() {
* @dataProvider provideIsKnownEmpty
*/
public function testIsKnownEmpty( $titleInfo, $group, $expected ) {
- $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+ $module = $this->getMockBuilder( ResourceLoaderWikiModule::class )
->setMethods( [ 'getTitleInfo', 'getGroup' ] )
->getMock();
$module->expects( $this->any() )
$module->expects( $this->any() )
->method( 'getGroup' )
->will( $this->returnValue( $group ) );
- $context = $this->getMockBuilder( 'ResourceLoaderContext' )
+ $context = $this->getMockBuilder( ResourceLoaderContext::class )
->disableOriginalConstructor()
->getMock();
$this->assertEquals( $expected, $module->isKnownEmpty( $context ) );
];
$expected = $titleInfo;
- $module = $this->getMockBuilder( 'TestResourceLoaderWikiModule' )
+ $module = $this->getMockBuilder( TestResourceLoaderWikiModule::class )
->setMethods( [ 'getPages' ] )
->getMock();
$module->method( 'getPages' )->willReturn( $pages );
// Can't mock static methods
$module::$returnFetchTitleInfo = $titleInfo;
- $context = $this->getMockBuilder( 'ResourceLoaderContext' )
+ $context = $this->getMockBuilder( ResourceLoaderContext::class )
->disableOriginalConstructor()
->getMock();
];
$expected = $titleInfo;
- $module = $this->getMockBuilder( 'TestResourceLoaderWikiModule' )
+ $module = $this->getMockBuilder( TestResourceLoaderWikiModule::class )
->setMethods( [ 'getPages' ] )
->getMock();
$module->method( 'getPages' )->willReturn( $pages );
$titleInfo = [];
// Set up objects
- $module = $this->getMockBuilder( 'TestResourceLoaderWikiModule' )
+ $module = $this->getMockBuilder( TestResourceLoaderWikiModule::class )
->setMethods( [ 'getPages' ] ) ->getMock();
$module->method( 'getPages' )->willReturn( $pages );
$module::$returnFetchTitleInfo = $titleInfo;
*/
public function testGetContent( $expected, $title ) {
$context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
- $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+ $module = $this->getMockBuilder( ResourceLoaderWikiModule::class )
->setMethods( [ 'getContentObj' ] ) ->getMock();
$module->expects( $this->any() )
->method( 'getContentObj' )->willReturn( null );
public function testGetContentForRedirects() {
// Set up context and module object
$context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
- $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+ $module = $this->getMockBuilder( ResourceLoaderWikiModule::class )
->setMethods( [ 'getPages', 'getContentObj' ] )
->getMock();
$module->expects( $this->any() )
$this->search = MediaWikiServices::getInstance()->newSearchEngine();
$this->search->setNamespaces( [] );
- $this->originalHandlers = TestingAccessWrapper::newFromClass( 'Hooks' )->handlers;
- TestingAccessWrapper::newFromClass( 'Hooks' )->handlers = [];
+ $this->originalHandlers = TestingAccessWrapper::newFromClass( Hooks::class )->handlers;
+ TestingAccessWrapper::newFromClass( Hooks::class )->handlers = [];
SpecialPageFactory::resetList();
}
public function tearDown() {
parent::tearDown();
- TestingAccessWrapper::newFromClass( 'Hooks' )->handlers = $this->originalHandlers;
+ TestingAccessWrapper::newFromClass( Hooks::class )->handlers = $this->originalHandlers;
SpecialPageFactory::resetList();
}
* @covers PrefixSearch::searchBackend
*/
public function testSearchBackend( array $case ) {
- $search = $stub = $this->getMockBuilder( 'SearchEngine' )
+ $search = $stub = $this->getMockBuilder( SearchEngine::class )
->setMethods( [ 'completionSearchBackend' ] )->getMock();
$return = SearchSuggestionSet::fromStrings( $case['provision'] );
/**
* @var $mockEngine SearchEngine
*/
- $mockEngine = $this->getMockBuilder( 'SearchEngine' )
+ $mockEngine = $this->getMockBuilder( SearchEngine::class )
->setMethods( [ 'makeSearchFieldMapping' ] )->getMock();
$mockFieldBuilder = function ( $name, $type ) {
$mockField =
- $this->getMockBuilder( 'SearchIndexFieldDefinition' )->setConstructorArgs( [
+ $this->getMockBuilder( SearchIndexFieldDefinition::class )->setConstructorArgs( [
$name,
$type
] )->getMock();
$fields = $mockEngine->getSearchIndexFields();
$this->assertArrayHasKey( 'language', $fields );
$this->assertArrayHasKey( 'category', $fields );
- $this->assertInstanceOf( 'SearchIndexField', $fields['testField'] );
+ $this->assertInstanceOf( SearchIndexField::class, $fields['testField'] );
$mapping = $fields['testField']->getMapping( $mockEngine );
$this->assertArrayHasKey( 'testData', $mapping );
}
public function addAugmentors( &$setAugmentors, &$rowAugmentors ) {
- $setAugmentor = $this->createMock( 'ResultSetAugmentor' );
+ $setAugmentor = $this->createMock( ResultSetAugmentor::class );
$setAugmentor->expects( $this->once() )
->method( 'augmentAll' )
->willReturnCallback( function ( SearchResultSet $resultSet ) {
} );
$setAugmentors['testSet'] = $setAugmentor;
- $rowAugmentor = $this->createMock( 'ResultAugmentor' );
+ $rowAugmentor = $this->createMock( ResultAugmentor::class );
$rowAugmentor->expects( $this->exactly( 2 ) )
->method( 'augment' )
->willReturnCallback( function ( SearchResult $result ) {
$name = 'TestService92834576';
- $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
+ $this->setExpectedException( MediaWiki\Services\NoSuchServiceException::class );
$services->getService( $name );
}
$name = 'TestService92834576';
- $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
+ $this->setExpectedException( MediaWiki\Services\NoSuchServiceException::class );
$services->peekService( $name );
}
return $theService;
} );
- $this->setExpectedException( 'MediaWiki\Services\ServiceAlreadyDefinedException' );
+ $this->setExpectedException( MediaWiki\Services\ServiceAlreadyDefinedException::class );
$services->defineService( $name, function () use ( $theService ) {
return $theService;
];
// loading the same file twice should fail, because
- $this->setExpectedException( 'MediaWiki\Services\ServiceAlreadyDefinedException' );
+ $this->setExpectedException( MediaWiki\Services\ServiceAlreadyDefinedException::class );
$services->loadWiringFiles( $wiringFiles );
}
$theService = new stdClass();
$name = 'TestService92834576';
- $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
+ $this->setExpectedException( MediaWiki\Services\NoSuchServiceException::class );
$services->redefineService( $name, function () use ( $theService ) {
return $theService;
// create the service, so it can no longer be redefined
$services->getService( $name );
- $this->setExpectedException( 'MediaWiki\Services\CannotReplaceActiveServiceException' );
+ $this->setExpectedException( MediaWiki\Services\CannotReplaceActiveServiceException::class );
$services->redefineService( $name, function () use ( $theService ) {
return $theService;
public function testDisableService() {
$services = $this->newServiceContainer( [ 'Foo' ] );
- $destructible = $this->getMockBuilder( 'MediaWiki\Services\DestructibleService' )
+ $destructible = $this->getMockBuilder( MediaWiki\Services\DestructibleService::class )
->getMock();
$destructible->expects( $this->once() )
->method( 'destroy' );
$this->assertContains( 'Bar', $services->getServiceNames() );
$this->assertContains( 'Qux', $services->getServiceNames() );
- $this->setExpectedException( 'MediaWiki\Services\ServiceDisabledException' );
+ $this->setExpectedException( MediaWiki\Services\ServiceDisabledException::class );
$services->getService( 'Qux' );
}
$theService = new stdClass();
$name = 'TestService92834576';
- $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
+ $this->setExpectedException( MediaWiki\Services\NoSuchServiceException::class );
$services->redefineService( $name, function () use ( $theService ) {
return $theService;
public function testDestroy() {
$services = $this->newServiceContainer();
- $destructible = $this->getMockBuilder( 'MediaWiki\Services\DestructibleService' )
+ $destructible = $this->getMockBuilder( MediaWiki\Services\DestructibleService::class )
->getMock();
$destructible->expects( $this->once() )
->method( 'destroy' );
// destroy the container
$services->destroy();
- $this->setExpectedException( 'MediaWiki\Services\ContainerDisabledException' );
+ $this->setExpectedException( MediaWiki\Services\ContainerDisabledException::class );
$services->getService( 'Bar' );
}
public function testNewSessionInfoForRequest() {
$provider = $this->getProvider();
$user = static::getTestSysop()->getUser();
- $request = $this->getMockBuilder( 'FauxRequest' )
+ $request = $this->getMockBuilder( \FauxRequest::class )
->setMethods( [ 'getIP' ] )->getMock();
$request->expects( $this->any() )->method( 'getIP' )
->will( $this->returnValue( '127.0.0.1' ) );
$provider->setLogger( $logger );
$user = static::getTestSysop()->getUser();
- $request = $this->getMockBuilder( 'FauxRequest' )
+ $request = $this->getMockBuilder( \FauxRequest::class )
->setMethods( [ 'getIP' ] )->getMock();
$request->expects( $this->any() )->method( 'getIP' )
->will( $this->returnValue( '127.0.0.1' ) );
], $logger->getBuffer() );
$logger->clearBuffer();
- $request2 = $this->getMockBuilder( 'FauxRequest' )
+ $request2 = $this->getMockBuilder( \FauxRequest::class )
->setMethods( [ 'getIP' ] )->getMock();
$request2->expects( $this->any() )->method( 'getIP' )
->will( $this->returnValue( '10.0.0.1' ) );
);
$msg = $provider->whyNoSession();
- $this->assertInstanceOf( 'Message', $msg );
+ $this->assertInstanceOf( \Message::class, $msg );
$this->assertSame( 'sessionprovider-nocookies', $msg->getKey() );
}
);
TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
- $mock = $this->getMockBuilder( 'stdClass' )
+ $mock = $this->getMockBuilder( stdClass::class )
->setMethods( [ 'onUserSetCookies' ] )
->getMock();
$mock->expects( $this->never() )->method( 'onUserSetCookies' );
}
protected function getSentRequest() {
- $sentResponse = $this->getMockBuilder( 'FauxResponse' )
+ $sentResponse = $this->getMockBuilder( \FauxResponse::class )
->setMethods( [ 'headersSent', 'setCookie', 'header' ] )->getMock();
$sentResponse->expects( $this->any() )->method( 'headersSent' )
->will( $this->returnValue( true ) );
$sentResponse->expects( $this->never() )->method( 'setCookie' );
$sentResponse->expects( $this->never() )->method( 'header' );
- $sentRequest = $this->getMockBuilder( 'FauxRequest' )
+ $sentRequest = $this->getMockBuilder( \FauxRequest::class )
->setMethods( [ 'response' ] )->getMock();
$sentRequest->expects( $this->any() )->method( 'response' )
->will( $this->returnValue( $sentResponse ) );
TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
// Anonymous user
- $mock = $this->getMockBuilder( 'stdClass' )
+ $mock = $this->getMockBuilder( stdClass::class )
->setMethods( [ 'onUserSetCookies' ] )->getMock();
$mock->expects( $this->never() )->method( 'onUserSetCookies' );
$this->mergeMwGlobalArrayValue( 'wgHooks', [ 'UserSetCookies' => [ $mock ] ] );
$this->assertFalse( $provider->canChangeUser() );
$msg = $provider->whyNoSession();
- $this->assertInstanceOf( 'Message', $msg );
+ $this->assertInstanceOf( \Message::class, $msg );
$this->assertSame( 'sessionprovider-nocookies', $msg->getKey() );
}
}
protected function getSentRequest() {
- $sentResponse = $this->getMockBuilder( 'FauxResponse' )
+ $sentResponse = $this->getMockBuilder( \FauxResponse::class )
->setMethods( [ 'headersSent', 'setCookie', 'header' ] )
->getMock();
$sentResponse->expects( $this->any() )->method( 'headersSent' )
$sentResponse->expects( $this->never() )->method( 'setCookie' );
$sentResponse->expects( $this->never() )->method( 'header' );
- $sentRequest = $this->getMockBuilder( 'FauxRequest' )
+ $sentRequest = $this->getMockBuilder( \FauxRequest::class )
->setMethods( [ 'response' ] )->getMock();
$sentRequest->expects( $this->any() )->method( 'response' )
->will( $this->returnValue( $sentResponse ) );
$data = [ 'foo' => 'bar' ];
$ex = new MetadataMergeException();
- $this->assertInstanceOf( 'UnexpectedValueException', $ex );
+ $this->assertInstanceOf( \UnexpectedValueException::class, $ex );
$this->assertSame( [], $ex->getContext() );
$ex2 = new MetadataMergeException( 'Message', 42, $ex, $data );
$reset[] = $this->getResetter( $rProp );
$this->setMwGlobals( [
- 'wgSessionProviders' => [ [ 'class' => 'DummySessionProvider' ] ],
+ 'wgSessionProviders' => [ [ 'class' => \DummySessionProvider::class ] ],
'wgObjectCacheSessionExpiry' => 2,
] );
$this->assertSame( self::SESSIONID, $backend->getId() );
$this->assertSame( $id, $backend->getSessionId() );
$this->assertSame( $this->provider, $backend->getProvider() );
- $this->assertInstanceOf( 'User', $backend->getUser() );
+ $this->assertInstanceOf( User::class, $backend->getUser() );
$this->assertSame( 'UTSysop', $backend->getUser()->getName() );
$this->assertSame( $info->wasPersisted(), $backend->isPersistent() );
$this->assertSame( $info->wasRemembered(), $backend->shouldRememberUser() );
$this->assertSame( self::SESSIONID, $backend->getId() );
$this->assertSame( $id, $backend->getSessionId() );
$this->assertSame( $this->provider, $backend->getProvider() );
- $this->assertInstanceOf( 'User', $backend->getUser() );
+ $this->assertInstanceOf( User::class, $backend->getUser() );
$this->assertTrue( $backend->getUser()->isAnon() );
$this->assertSame( $info->wasPersisted(), $backend->isPersistent() );
$this->assertSame( $info->wasRemembered(), $backend->shouldRememberUser() );
public function testResetId() {
$id = session_id();
- $builder = $this->getMockBuilder( 'DummySessionProvider' )
+ $builder = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'persistsSessionId', 'sessionIdWasReset' ] );
$this->provider = $builder->getMock();
}
public function testPersist() {
- $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+ $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'persistSession' ] )->getMock();
$this->provider->expects( $this->once() )->method( 'persistSession' );
$backend = $this->getBackend();
}
public function testUnpersist() {
- $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+ $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'unpersistSession' ] )->getMock();
$this->provider->expects( $this->once() )->method( 'unpersistSession' );
$backend = $this->getBackend();
public function testSetUser() {
$user = static::getTestSysop()->getUser();
- $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+ $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'canChangeUser' ] )->getMock();
$this->provider->expects( $this->any() )->method( 'canChangeUser' )
->will( $this->returnValue( false ) );
->setMethods( [ 'onSessionMetadata' ] )->getMock();
$neverHook->expects( $this->never() )->method( 'onSessionMetadata' );
- $builder = $this->getMockBuilder( 'DummySessionProvider' )
+ $builder = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'persistSession', 'unpersistSession' ] );
$neverProvider = $builder->getMock();
$testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ];
// Not persistent
- $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+ $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'persistSession' ] )->getMock();
$this->provider->expects( $this->never() )->method( 'persistSession' );
$this->onSessionMetadataCalled = false;
$this->assertNotEquals( 0, $wrap->expires );
// Persistent
- $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+ $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'persistSession' ] )->getMock();
$this->provider->expects( $this->atLeastOnce() )->method( 'persistSession' );
$this->onSessionMetadataCalled = false;
$this->assertNotEquals( 0, $wrap->expires );
// Not persistent, not expiring
- $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+ $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'persistSession' ] )->getMock();
$this->provider->expects( $this->never() )->method( 'persistSession' );
$this->onSessionMetadataCalled = false;
}
public function testGetAllowedUserRights() {
- $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+ $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'getAllowedUserRights' ] )
->getMock();
$this->provider->expects( $this->any() )->method( 'getAllowedUserRights' )
'SessionCacheType' => 'testSessionStore',
'ObjectCacheSessionExpiry' => 100,
'SessionProviders' => [
- [ 'class' => 'DummySessionProvider' ],
+ [ 'class' => \DummySessionProvider::class ],
]
] );
$this->logger = new \TestLogger( false, function ( $m ) {
$id2 = '';
$idEmpty = 'empty-session-------------------';
- $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+ $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods(
[ 'provideSessionInfo', 'newSessionInfo', '__toString', 'describe', 'unpersistSession' ]
);
// Failure to create an empty session
$manager = $this->getManager();
- $provider = $this->getMockBuilder( 'DummySessionProvider' )
+ $provider = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'provideSessionInfo', 'newSessionInfo', '__toString' ] )
->getMock();
$provider->expects( $this->any() )->method( 'provideSessionInfo' )
$pmanager = TestingAccessWrapper::newFromObject( $manager );
$request = new \FauxRequest();
- $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+ $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'provideSessionInfo', 'newSessionInfo', '__toString' ] );
$expectId = null;
$user = User::newFromName( 'UTSysop' );
$manager = $this->getManager();
- $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+ $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'invalidateSessionsForUser', '__toString' ] );
$provider1 = $providerBuilder->getMock();
public function testGetVaryHeaders() {
$manager = $this->getManager();
- $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+ $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'getVaryHeaders', '__toString' ] );
$provider1 = $providerBuilder->getMock();
public function testGetVaryCookies() {
$manager = $this->getManager();
- $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+ $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'getVaryCookies', '__toString' ] );
$provider1 = $providerBuilder->getMock();
$manager = TestingAccessWrapper::newFromObject( $realManager );
$this->config->set( 'SessionProviders', [
- [ 'class' => 'DummySessionProvider' ],
+ [ 'class' => \DummySessionProvider::class ],
] );
$providers = $manager->getProviders();
$this->assertArrayHasKey( 'DummySessionProvider', $providers );
$this->assertSame( $realManager, $provider->getManager() );
$this->config->set( 'SessionProviders', [
- [ 'class' => 'DummySessionProvider' ],
- [ 'class' => 'DummySessionProvider' ],
+ [ 'class' => \DummySessionProvider::class ],
+ [ 'class' => \DummySessionProvider::class ],
] );
$manager->sessionProviders = null;
try {
$manager = TestingAccessWrapper::newFromObject( $this->getManager() );
$manager->setLogger( new \Psr\Log\NullLogger() );
- $mock = $this->getMockBuilder( 'stdClass' )
+ $mock = $this->getMockBuilder( stdClass::class )
->setMethods( [ 'shutdown' ] )->getMock();
$mock->expects( $this->once() )->method( 'shutdown' );
public function testPreventSessionsForUser() {
$manager = $this->getManager();
- $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+ $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
->setMethods( [ 'preventSessionsForUser', '__toString' ] );
$provider1 = $providerBuilder->getMock();
$this->assertSame( $user->getId(), $userinfo->getId() );
$this->assertSame( $user->getName(), $userinfo->getName() );
$this->assertSame( $user->getToken( true ), $userinfo->getToken() );
- $this->assertInstanceOf( 'User', $userinfo->getUser() );
+ $this->assertInstanceOf( User::class, $userinfo->getUser() );
$userinfo2 = $userinfo->verified();
$this->assertNotSame( $userinfo2, $userinfo );
$this->assertSame( "<-:{$user->getId()}:{$user->getName()}>", (string)$userinfo );
$this->assertSame( $user->getId(), $userinfo2->getId() );
$this->assertSame( $user->getName(), $userinfo2->getName() );
$this->assertSame( $user->getToken( true ), $userinfo2->getToken() );
- $this->assertInstanceOf( 'User', $userinfo2->getUser() );
+ $this->assertInstanceOf( User::class, $userinfo2->getUser() );
$this->assertSame( $userinfo2, $userinfo2->verified() );
$this->assertSame( "<+:{$user->getId()}:{$user->getName()}>", (string)$userinfo2 );
$this->assertSame( $user->getId(), $userinfo->getId() );
$this->assertSame( $user->getName(), $userinfo->getName() );
$this->assertSame( $user->getToken( true ), $userinfo->getToken() );
- $this->assertInstanceOf( 'User', $userinfo->getUser() );
+ $this->assertInstanceOf( User::class, $userinfo->getUser() );
$userinfo2 = $userinfo->verified();
$this->assertNotSame( $userinfo2, $userinfo );
$this->assertSame( "<-:{$user->getId()}:{$user->getName()}>", (string)$userinfo );
$this->assertSame( $user->getId(), $userinfo2->getId() );
$this->assertSame( $user->getName(), $userinfo2->getName() );
$this->assertSame( $user->getToken( true ), $userinfo2->getToken() );
- $this->assertInstanceOf( 'User', $userinfo2->getUser() );
+ $this->assertInstanceOf( User::class, $userinfo2->getUser() );
$this->assertSame( $userinfo2, $userinfo2->verified() );
$this->assertSame( "<+:{$user->getId()}:{$user->getName()}>", (string)$userinfo2 );
$this->assertSame( $user->getId(), $userinfo->getId() );
$this->assertSame( $user->getName(), $userinfo->getName() );
$this->assertSame( '', $userinfo->getToken() );
- $this->assertInstanceOf( 'User', $userinfo->getUser() );
+ $this->assertInstanceOf( User::class, $userinfo->getUser() );
$userinfo2 = $userinfo->verified();
$this->assertNotSame( $userinfo2, $userinfo );
$this->assertSame( "<-:{$user->getId()}:{$user->getName()}>", (string)$userinfo );
$this->assertSame( $user->getId(), $userinfo2->getId() );
$this->assertSame( $user->getName(), $userinfo2->getName() );
$this->assertSame( '', $userinfo2->getToken() );
- $this->assertInstanceOf( 'User', $userinfo2->getUser() );
+ $this->assertInstanceOf( User::class, $userinfo2->getUser() );
$this->assertSame( $userinfo2, $userinfo2->verified() );
$this->assertSame( "<+:{$user->getId()}:{$user->getName()}>", (string)$userinfo2 );
$sites = $store->getSites();
- $this->assertInstanceOf( 'SiteList', $sites );
+ $this->assertInstanceOf( SiteList::class, $sites );
/**
* @var Site $site
*/
foreach ( $sites as $site ) {
- $this->assertInstanceOf( 'Site', $site );
+ $this->assertInstanceOf( Site::class, $site );
}
foreach ( $testSites as $site ) {
$this->assertTrue( $store->saveSites( $sites ) );
$site = $store->getSite( 'ertrywuutr' );
- $this->assertInstanceOf( 'Site', $site );
+ $this->assertInstanceOf( Site::class, $site );
$this->assertEquals( 'en', $site->getLanguageCode() );
$site = $store->getSite( 'sdfhxujgkfpth' );
- $this->assertInstanceOf( 'Site', $site );
+ $this->assertInstanceOf( Site::class, $site );
$this->assertEquals( 'nl', $site->getLanguageCode() );
}
* @covers CachingSiteStore::reset
*/
public function testReset() {
- $dbSiteStore = $this->getMockBuilder( 'SiteStore' )
+ $dbSiteStore = $this->getMockBuilder( SiteStore::class )
->disableOriginalConstructor()
->getMock();
$sites = $store->getSites();
- $this->assertInstanceOf( 'SiteList', $sites );
+ $this->assertInstanceOf( SiteList::class, $sites );
/**
* @var Site $site
*/
foreach ( $sites as $site ) {
- $this->assertInstanceOf( 'Site', $site );
+ $this->assertInstanceOf( Site::class, $site );
}
foreach ( $expectedSites as $site ) {
$this->assertTrue( $store->saveSites( $sites ) );
$site = $store->getSite( 'ertrywuutr' );
- $this->assertInstanceOf( 'Site', $site );
+ $this->assertInstanceOf( Site::class, $site );
$this->assertEquals( 'en', $site->getLanguageCode() );
$this->assertTrue( is_int( $site->getInternalId() ) );
$this->assertTrue( $site->getInternalId() >= 0 );
$site = $store->getSite( 'sdfhxujgkfpth' );
- $this->assertInstanceOf( 'Site', $site );
+ $this->assertInstanceOf( Site::class, $site );
$this->assertEquals( 'nl', $site->getLanguageCode() );
$this->assertTrue( is_int( $site->getInternalId() ) );
$this->assertTrue( $site->getInternalId() >= 0 );
}
private function getSiteLookup( SiteList $sites ) {
- $siteLookup = $this->getMockBuilder( 'SiteLookup' )
+ $siteLookup = $this->getMockBuilder( SiteLookup::class )
->disableOriginalConstructor()
->getMock();
use MediaWikiCoversValidator;
public function testConstructor_InvalidArgument() {
- $this->setExpectedException( 'InvalidArgumentException' );
+ $this->setExpectedException( InvalidArgumentException::class );
new SiteExporter( 'Foo' );
}
}
private function newSiteStore( SiteList $sites ) {
- $store = $this->getMockBuilder( 'SiteStore' )->getMock();
+ $store = $this->getMockBuilder( SiteStore::class )->getMock();
$store->expects( $this->once() )
->method( 'saveSites' )
use MediaWikiCoversValidator;
private function newSiteImporter( array $expectedSites, $errorCount ) {
- $store = $this->getMockBuilder( 'SiteStore' )->getMock();
+ $store = $this->getMockBuilder( SiteStore::class )->getMock();
$store->expects( $this->once() )
->method( 'saveSites' )
->method( 'getSites' )
->will( $this->returnValue( new SiteList() ) );
- $errorHandler = $this->getMockBuilder( 'Psr\Log\LoggerInterface' )->getMock();
+ $errorHandler = $this->getMockBuilder( Psr\Log\LoggerInterface::class )->getMock();
$errorHandler->expects( $this->exactly( $errorCount ) )
->method( 'error' );
}
public function testImportFromXML_malformed() {
- $this->setExpectedException( 'Exception' );
+ $this->setExpectedException( Exception::class );
- $store = $this->getMockBuilder( 'SiteStore' )->getMock();
+ $store = $this->getMockBuilder( SiteStore::class )->getMock();
$importer = new SiteImporter( $store );
$importer->importFromXML( 'THIS IS NOT XML' );
}
* @covers Site::unserialize
*/
public function testSerialization( Site $site ) {
- $this->assertInstanceOf( 'Serializable', $site );
+ $this->assertInstanceOf( Serializable::class, $site );
$serialization = serialize( $site );
$newInstance = unserialize( $serialization );
- $this->assertInstanceOf( 'Site', $newInstance );
+ $this->assertInstanceOf( Site::class, $newInstance );
$this->assertEquals( $serialization, serialize( $newInstance ) );
}
}
private function getSiteLookup( SiteList $sites ) {
- $siteLookup = $this->getMockBuilder( 'SiteLookup' )
+ $siteLookup = $this->getMockBuilder( SiteLookup::class )
->disableOriginalConstructor()
->getMock();
return new SkinFallback();
} );
$this->assertTrue( true ); // No exception thrown
- $this->setExpectedException( 'InvalidArgumentException' );
+ $this->setExpectedException( InvalidArgumentException::class );
$factory->register( 'invalid', 'Invalid', 'Invalid callback' );
}
*/
public function testMakeSkinWithNoBuilders() {
$factory = new SkinFactory();
- $this->setExpectedException( 'SkinException' );
+ $this->setExpectedException( SkinException::class );
$factory->makeSkin( 'nobuilderregistered' );
}
$factory->register( 'unittest', 'Unittest', function () {
return true; // Not a Skin object
} );
- $this->setExpectedException( 'UnexpectedValueException' );
+ $this->setExpectedException( UnexpectedValueException::class );
$factory->makeSkin( 'unittest' );
}
} );
$skin = $factory->makeSkin( 'testfallback' );
- $this->assertInstanceOf( 'Skin', $skin );
- $this->assertInstanceOf( 'SkinFallback', $skin );
+ $this->assertInstanceOf( Skin::class, $skin );
+ $this->assertInstanceOf( SkinFallback::class, $skin );
$this->assertEquals( 'fallback', $skin->getSkinName() );
}
* @dataProvider makeListItemProvider
*/
public function testMakeListItem( $expected, $key, $item, $options, $message ) {
- $template = $this->getMockForAbstractClass( 'BaseTemplate' );
+ $template = $this->getMockForAbstractClass( BaseTemplate::class );
$this->assertEquals(
$expected,
SpecialPageFactory::resetList();
$page = SpecialPageFactory::getPage( 'testdummy' );
- $this->assertInstanceOf( 'SpecialPage', $page );
+ $this->assertInstanceOf( SpecialPage::class, $page );
$page2 = SpecialPageFactory::getPage( 'testdummy' );
$this->assertEquals( $shouldReuseInstance, $page2 === $page, "Should re-use instance:" );
* @covers SpecialPageFactory::getNames
*/
public function testGetNames() {
- $this->mergeMwGlobalArrayValue( 'wgSpecialPages', [ 'testdummy' => 'SpecialAllPages' ] );
+ $this->mergeMwGlobalArrayValue( 'wgSpecialPages', [ 'testdummy' => SpecialAllPages::class ] );
SpecialPageFactory::resetList();
$names = SpecialPageFactory::getNames();
$specialPage->getContext()->setUser( $user );
$specialPage->getContext()->setLanguage( Language::factory( 'en' ) );
- $this->setExpectedException( 'UserNotLoggedIn', $expected );
+ $this->setExpectedException( UserNotLoggedIn::class, $expected );
// $specialPage->requireLogin( [ $reason [, $title ] ] )
call_user_func_array(
/** List query pages that can not be tested automatically */
protected $manualTest = [
- 'LinkSearchPage'
+ LinkSearchPage::class
];
/**
* https://bugs.mysql.com/bug.php?id=10327
*/
protected $reopensTempTable = [
- 'BrokenRedirects',
+ BrokenRedirects::class,
];
/**
}
public function testNotLoggedIn_throwsException() {
- $this->setExpectedException( 'UserNotLoggedIn' );
+ $this->setExpectedException( UserNotLoggedIn::class );
$this->executeSpecialPage();
}
// Set a low limit
$this->setMwGlobals( 'wgMaxSigChars', 2 );
- $user = $this->createMock( 'User' );
+ $user = $this->createMock( User::class );
$user->expects( $this->any() )
->method( 'isAnon' )
->will( $this->returnValue( false ) );
);
$mockSearchEngine = $this->mockSearchEngine( $searchResults );
- $search = $this->getMockBuilder( 'SpecialSearch' )
+ $search = $this->getMockBuilder( SpecialSearch::class )
->setMethods( [ 'getSearchEngine' ] )
->getMock();
$search->expects( $this->any() )
}
protected function mockSearchEngine( $results ) {
- $mock = $this->getMockBuilder( 'SearchEngine' )
+ $mock = $this->getMockBuilder( SearchEngine::class )
->setMethods( [ 'searchText', 'searchTitle' ] )
->getMock();
*/
public function testGetQueryInfo( $msgContent, $expected ) {
$msg = new RawMessage( $msgContent );
- $mockContext = $this->getMockBuilder( 'RequestContext' )->getMock();
+ $mockContext = $this->getMockBuilder( RequestContext::class )->getMock();
$mockContext->method( 'msg' )->willReturn( $msg );
$special = new UncategorizedCategoriesPage();
$special->setContext( $mockContext );
}
public function testNotLoggedIn_throwsException() {
- $this->setExpectedException( 'UserNotLoggedIn' );
+ $this->setExpectedException( UserNotLoggedIn::class );
$this->executeSpecialPage();
}
}
public function testUnknownNamespaceError() {
- $this->setExpectedException( 'MWException' );
+ $this->setExpectedException( MWException::class );
$title = new ForeignTitle( null, 'this', 'that' );
$title->getNamespaceId();
}
* @return GenderCache
*/
private function getGenderCache() {
- $genderCache = $this->getMockBuilder( 'GenderCache' )
+ $genderCache = $this->getMockBuilder( GenderCache::class )
->disableOriginalConstructor()
->getMock();
* @dataProvider provideParseTitle_invalid
*/
public function testParseTitle_invalid( $text ) {
- $this->setExpectedException( 'MalformedTitleException' );
+ $this->setExpectedException( MalformedTitleException::class );
$codec = $this->makeCodec( 'en' );
$codec->parseTitle( $text, NS_MAIN );
* @dataProvider failureProvider
*/
public function testFailures( Title $rootPage ) {
- $this->setExpectedException( 'MWException' );
+ $this->setExpectedException( MWException::class );
new SubpageImportTitleFactory( $rootPage );
}
}
* @dataProvider badConstructorProvider
*/
public function testConstructionErrors( $ns, $text, $fragment, $interwiki ) {
- $this->setExpectedException( 'InvalidArgumentException' );
+ $this->setExpectedException( InvalidArgumentException::class );
new TitleValue( $ns, $text, $fragment, $interwiki );
}
$stash->stashFile( $this->tmpFile );
$this->fail( 'Expected UploadStashFileException not thrown' );
} catch ( UploadStashFileException $e ) {
- $this->assertInstanceOf( 'ILocalizedException', $e );
+ $this->assertInstanceOf( ILocalizedException::class, $e );
} catch ( Exception $e ) {
$this->fail( 'Unexpected exception class ' . get_class( $e ) );
}
$this->testUser = $this->getMutableTestUser();
$this->testUserName = $this->testUser->getUser()->getName();
- $mock1 = $this->getMockForAbstractClass( 'CentralIdLookup' );
+ $mock1 = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock1->expects( $this->any() )->method( 'isAttached' )
->will( $this->returnValue( true ) );
$mock1->expects( $this->any() )->method( 'lookupUserNames' )
->will( $this->returnValue( [ $this->testUserName => 42, 'UTDummy' => 43, 'UTInvalid' => 0 ] ) );
$mock1->expects( $this->never() )->method( 'lookupCentralIds' );
- $mock2 = $this->getMockForAbstractClass( 'CentralIdLookup' );
+ $mock2 = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock2->expects( $this->any() )->method( 'isAttached' )
->will( $this->returnValue( false ) );
$mock2->expects( $this->any() )->method( 'lookupUserNames' )
public function testBasics() {
$user = $this->testUser->getUser();
$bp = BotPassword::newFromUser( $user, 'BotPassword' );
- $this->assertInstanceOf( 'BotPassword', $bp );
+ $this->assertInstanceOf( BotPassword::class, $bp );
$this->assertTrue( $bp->isSaved() );
$this->assertSame( 42, $bp->getUserCentralId() );
$this->assertSame( 'BotPassword', $bp->getAppId() );
'user' => $user,
'appId' => 'DoesNotExist'
] );
- $this->assertInstanceOf( 'BotPassword', $bp );
+ $this->assertInstanceOf( BotPassword::class, $bp );
$this->assertFalse( $bp->isSaved() );
$this->assertSame( 42, $bp->getUserCentralId() );
$this->assertSame( 'DoesNotExist', $bp->getAppId() );
'restrictions' => MWRestrictions::newFromJson( '{"IPAddresses":["127.0.0.0/8"]}' ),
'grants' => [ 'test' ],
] );
- $this->assertInstanceOf( 'BotPassword', $bp );
+ $this->assertInstanceOf( BotPassword::class, $bp );
$this->assertFalse( $bp->isSaved() );
$this->assertSame( 43, $bp->getUserCentralId() );
$this->assertSame( 'DoesNotExist2', $bp->getAppId() );
'centralId' => 45,
'appId' => 'DoesNotExist'
] );
- $this->assertInstanceOf( 'BotPassword', $bp );
+ $this->assertInstanceOf( BotPassword::class, $bp );
$this->assertFalse( $bp->isSaved() );
$this->assertSame( 45, $bp->getUserCentralId() );
$this->assertSame( 'DoesNotExist', $bp->getAppId() );
'user' => $user,
'appId' => 'BotPassword'
] );
- $this->assertInstanceOf( 'BotPassword', $bp );
+ $this->assertInstanceOf( BotPassword::class, $bp );
$this->assertFalse( $bp->isSaved() );
$this->assertNull( BotPassword::newUnsaved( [
$bp = TestingAccessWrapper::newFromObject( BotPassword::newFromCentralId( 42, 'BotPassword' ) );
$password = $bp->getPassword();
- $this->assertInstanceOf( 'Password', $password );
+ $this->assertInstanceOf( Password::class, $password );
$this->assertTrue( $password->equals( 'foobaz' ) );
$bp->centralId = 44;
$password = $bp->getPassword();
- $this->assertInstanceOf( 'InvalidPassword', $password );
+ $this->assertInstanceOf( InvalidPassword::class, $password );
$bp = TestingAccessWrapper::newFromObject( BotPassword::newFromCentralId( 42, 'BotPassword' ) );
$dbw = wfGetDB( DB_MASTER );
__METHOD__
);
$password = $bp->getPassword();
- $this->assertInstanceOf( 'InvalidPassword', $password );
+ $this->assertInstanceOf( InvalidPassword::class, $password );
}
public function testInvalidateAllPasswordsForUser() {
$bp1 = TestingAccessWrapper::newFromObject( BotPassword::newFromCentralId( 42, 'BotPassword' ) );
$bp2 = TestingAccessWrapper::newFromObject( BotPassword::newFromCentralId( 43, 'BotPassword' ) );
- $this->assertNotInstanceOf( 'InvalidPassword', $bp1->getPassword(), 'sanity check' );
- $this->assertNotInstanceOf( 'InvalidPassword', $bp2->getPassword(), 'sanity check' );
+ $this->assertNotInstanceOf( InvalidPassword::class, $bp1->getPassword(), 'sanity check' );
+ $this->assertNotInstanceOf( InvalidPassword::class, $bp2->getPassword(), 'sanity check' );
BotPassword::invalidateAllPasswordsForUser( $this->testUserName );
- $this->assertInstanceOf( 'InvalidPassword', $bp1->getPassword() );
- $this->assertNotInstanceOf( 'InvalidPassword', $bp2->getPassword() );
+ $this->assertInstanceOf( InvalidPassword::class, $bp1->getPassword() );
+ $this->assertNotInstanceOf( InvalidPassword::class, $bp2->getPassword() );
$bp = TestingAccessWrapper::newFromObject( BotPassword::newFromCentralId( 42, 'BotPassword' ) );
- $this->assertInstanceOf( 'InvalidPassword', $bp->getPassword() );
+ $this->assertInstanceOf( InvalidPassword::class, $bp->getPassword() );
}
public function testRemoveAllPasswordsForUser() {
);
// Failed restriction
- $request = $this->getMockBuilder( 'FauxRequest' )
+ $request = $this->getMockBuilder( FauxRequest::class )
->setMethods( [ 'getIP' ] )
->getMock();
$request->expects( $this->any() )->method( 'getIP' )
'sanity check'
);
$status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', $request );
- $this->assertInstanceOf( 'Status', $status );
+ $this->assertInstanceOf( Status::class, $status );
$this->assertTrue( $status->isGood() );
$session = $status->getValue();
$this->assertInstanceOf( MediaWiki\Session\Session::class, $session );
$this->assertFalse( $bp->save( 'update', $passwordHash ) );
$this->assertTrue( $bp->save( 'insert', $passwordHash ) );
$bp2 = BotPassword::newFromCentralId( 42, 'TestSave', BotPassword::READ_LATEST );
- $this->assertInstanceOf( 'BotPassword', $bp2 );
+ $this->assertInstanceOf( BotPassword::class, $bp2 );
$this->assertEquals( $bp->getUserCentralId(), $bp2->getUserCentralId() );
$this->assertEquals( $bp->getAppId(), $bp2->getAppId() );
$this->assertEquals( $bp->getToken(), $bp2->getToken() );
$this->assertEquals( $bp->getGrants(), $bp2->getGrants() );
$pw = TestingAccessWrapper::newFromObject( $bp )->getPassword();
if ( $password === null ) {
- $this->assertInstanceOf( 'InvalidPassword', $pw );
+ $this->assertInstanceOf( InvalidPassword::class, $pw );
} else {
$this->assertTrue( $pw->equals( $password ) );
}
$this->assertTrue( $bp->save( 'update' ) );
$this->assertNotEquals( $token, $bp->getToken() );
$bp2 = BotPassword::newFromCentralId( 42, 'TestSave', BotPassword::READ_LATEST );
- $this->assertInstanceOf( 'BotPassword', $bp2 );
+ $this->assertInstanceOf( BotPassword::class, $bp2 );
$this->assertEquals( $bp->getToken(), $bp2->getToken() );
$pw = TestingAccessWrapper::newFromObject( $bp )->getPassword();
if ( $password === null ) {
- $this->assertInstanceOf( 'InvalidPassword', $pw );
+ $this->assertInstanceOf( InvalidPassword::class, $pw );
} else {
$this->assertTrue( $pw->equals( $password ) );
}
class CentralIdLookupTest extends MediaWikiTestCase {
public function testFactory() {
- $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+ $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$this->setMwGlobals( [
'wgCentralIdLookupProviders' => [
- 'local' => [ 'class' => 'LocalIdLookup' ],
- 'local2' => [ 'class' => 'LocalIdLookup' ],
+ 'local' => [ 'class' => LocalIdLookup::class ],
+ 'local2' => [ 'class' => LocalIdLookup::class ],
'mock' => [ 'factory' => function () use ( $mock ) {
return $mock;
} ],
- 'bad' => [ 'class' => 'stdClass' ],
+ 'bad' => [ 'class' => stdClass::class ],
],
'wgCentralIdLookupProvider' => 'mock',
] );
$local = CentralIdLookup::factory( 'local' );
$this->assertNotSame( $mock, $local );
- $this->assertInstanceOf( 'LocalIdLookup', $local );
+ $this->assertInstanceOf( LocalIdLookup::class, $local );
$this->assertSame( $local, CentralIdLookup::factory( 'local' ) );
$this->assertSame( 'local', $local->getProviderId() );
$local2 = CentralIdLookup::factory( 'local2' );
$this->assertNotSame( $local, $local2 );
- $this->assertInstanceOf( 'LocalIdLookup', $local2 );
+ $this->assertInstanceOf( LocalIdLookup::class, $local2 );
$this->assertSame( 'local2', $local2->getProviderId() );
$this->assertNull( CentralIdLookup::factory( 'unconfigured' ) );
public function testCheckAudience() {
$mock = TestingAccessWrapper::newFromObject(
- $this->getMockForAbstractClass( 'CentralIdLookup' )
+ $this->getMockForAbstractClass( CentralIdLookup::class )
);
$user = static::getTestSysop()->getUser();
$this->assertSame( $user, $mock->checkAudience( $user ) );
$user = $mock->checkAudience( CentralIdLookup::AUDIENCE_PUBLIC );
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( User::class, $user );
$this->assertSame( 0, $user->getId() );
$this->assertNull( $mock->checkAudience( CentralIdLookup::AUDIENCE_RAW ) );
}
public function testNameFromCentralId() {
- $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+ $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->expects( $this->once() )->method( 'lookupCentralIds' )
->with(
$this->equalTo( [ 15 => null ] ),
* @param bool $succeeds
*/
public function testLocalUserFromCentralId( $name, $succeeds ) {
- $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+ $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->expects( $this->any() )->method( 'isAttached' )
->will( $this->returnValue( true ) );
$mock->expects( $this->once() )->method( 'lookupCentralIds' )
42, CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST
);
if ( $succeeds ) {
- $this->assertInstanceOf( 'User', $user );
+ $this->assertInstanceOf( User::class, $user );
$this->assertSame( $name, $user->getName() );
} else {
$this->assertNull( $user );
}
- $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+ $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->expects( $this->any() )->method( 'isAttached' )
->will( $this->returnValue( false ) );
$mock->expects( $this->once() )->method( 'lookupCentralIds' )
}
public function testCentralIdFromName() {
- $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+ $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->expects( $this->once() )->method( 'lookupUserNames' )
->with(
$this->equalTo( [ 'FooBar' => 0 ] ),
}
public function testCentralIdFromLocalUser() {
- $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+ $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->expects( $this->any() )->method( 'isAttached' )
->will( $this->returnValue( true ) );
$mock->expects( $this->once() )->method( 'lookupUserNames' )
)
);
- $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+ $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->expects( $this->any() )->method( 'isAttached' )
->will( $this->returnValue( false ) );
$mock->expects( $this->never() )->method( 'lookupUserNames' );
class UserArrayFromResultTest extends MediaWikiTestCase {
private function getMockResultWrapper( $row = null, $numRows = 1 ) {
- $resultWrapper = $this->getMockBuilder( 'ResultWrapper' )
+ $resultWrapper = $this->getMockBuilder( Wikimedia\Rdbms\ResultWrapper::class )
->disableOriginalConstructor();
$resultWrapper = $resultWrapper->getMock();
$this->assertEquals( $resultWrapper, $object->res );
$this->assertSame( 0, $object->key );
- $this->assertInstanceOf( 'User', $object->current );
+ $this->assertInstanceOf( User::class, $object->current );
$this->assertEquals( $username, $object->current->mName );
}
$username = 'addshore';
$userRow = $this->getRowWithUsername( $username );
$object = $this->getUserArrayFromResult( $this->getMockResultWrapper( $userRow ) );
- $this->assertInstanceOf( 'User', $object->current() );
+ $this->assertInstanceOf( User::class, $object->current() );
$this->assertEquals( $username, $object->current()->mName );
}
$this->assertContains( 'nukeworld', $rights );
// Add a Session that limits rights
- $mock = $this->getMockBuilder( stdclass::class )
+ $mock = $this->getMockBuilder( stdClass::class )
->setMethods( [ 'getAllowedUserRights', 'deregisterSession', 'getSessionId' ] )
->getMock();
$mock->method( 'getAllowedUserRights' )->willReturn( [ 'test', 'writetest' ] );
protected function mockDb() {
// @TODO: mock from Database
// FIXME: the constructor normally sets mAtomicLevels and mSrvCache
- $databaseMysql = $this->getMockBuilder( 'DatabaseMysqli' )
+ $databaseMysql = $this->getMockBuilder( Wikimedia\Rdbms\DatabaseMysqli::class )
->disableOriginalConstructor()
->getMock();
$databaseMysql->expects( $this->any() )
*/
public function testNewDefault() {
$ret = MWRestrictions::newDefault();
- $this->assertInstanceOf( 'MWRestrictions', $ret );
+ $this->assertInstanceOf( MWRestrictions::class, $ret );
$this->assertSame(
'{"IPAddresses":["0.0.0.0/0","::/0"]}',
$ret->toJson()
public function testArray( $data, $expect ) {
if ( $expect === true ) {
$ret = MWRestrictions::newFromArray( $data );
- $this->assertInstanceOf( 'MWRestrictions', $ret );
+ $this->assertInstanceOf( MWRestrictions::class, $ret );
$this->assertSame( $data, $ret->toArray() );
} else {
try {
public function testJson( $json, $expect ) {
if ( is_array( $expect ) ) {
$ret = MWRestrictions::newFromJson( $json );
- $this->assertInstanceOf( 'MWRestrictions', $ret );
+ $this->assertInstanceOf( MWRestrictions::class, $ret );
$this->assertSame( $expect, $ret->toArray() );
$this->assertSame( $json, $ret->toJson( false ) );
public function provideCheck() {
$ret = [];
- $mockBuilder = $this->getMockBuilder( 'FauxRequest' )
+ $mockBuilder = $this->getMockBuilder( FauxRequest::class )
->setMethods( [ 'getIP' ] );
foreach ( self::provideCheckIP() as $checkIP ) {
* @covers UIDGenerator::newTimestampedUID88
*/
public function testTimestampedUID( $method, $digitlen, $bits, $tbits, $hostbits ) {
- $id = call_user_func( [ 'UIDGenerator', $method ] );
+ $id = call_user_func( [ UIDGenerator::class, $method ] );
$this->assertEquals( true, ctype_digit( $id ), "UID made of digit characters" );
$this->assertLessThanOrEqual( $digitlen, strlen( $id ),
"UID has the right number of digits" );
$ids = [];
for ( $i = 0; $i < 300; $i++ ) {
- $ids[] = call_user_func( [ 'UIDGenerator', $method ] );
+ $ids[] = call_user_func( [ UIDGenerator::class, $method ] );
}
$lastId = array_shift( $ids );
$this->getMockNonAnonUserWithId( 1 ),
new TitleValue( 0, 'SomeDbKey' )
);
- $this->assertInstanceOf( 'WatchedItem', $watchedItem );
+ $this->assertInstanceOf( WatchedItem::class, $watchedItem );
$this->assertEquals( 1, $watchedItem->getUser()->getId() );
$this->assertEquals( 'SomeDbKey', $watchedItem->getLinkTarget()->getDBkey() );
$this->assertEquals( 0, $watchedItem->getLinkTarget()->getNamespace() );
$this->getMockNonAnonUserWithId( 1 ),
new TitleValue( 0, 'SomeDbKey' )
);
- $this->assertInstanceOf( 'WatchedItem', $watchedItem );
+ $this->assertInstanceOf( WatchedItem::class, $watchedItem );
$this->assertEquals( 1, $watchedItem->getUser()->getId() );
$this->assertEquals( 'SomeDbKey', $watchedItem->getLinkTarget()->getDBkey() );
$this->assertEquals( 0, $watchedItem->getLinkTarget()->getNamespace() );
$this->assertInternalType( 'array', $watchedItems );
$this->assertCount( 2, $watchedItems );
foreach ( $watchedItems as $watchedItem ) {
- $this->assertInstanceOf( 'WatchedItem', $watchedItem );
+ $this->assertInstanceOf( WatchedItem::class, $watchedItem );
}
$this->assertEquals(
new WatchedItem( $user, new TitleValue( 0, 'Foo1' ), '20151212010101' ),
$this->getMockReadOnlyMode()
);
- $this->setExpectedException( 'InvalidArgumentException' );
+ $this->setExpectedException( InvalidArgumentException::class );
$store->getWatchedItemsForUser(
$this->getMockNonAnonUserWithId( 1 ),
[ 'sort' => 'foo' ]
--- /dev/null
+<?php
+
+namespace MediaWiki\Tests\Maintenance;
+
+use Maintenance;
+use MediaWikiTestCase;
+use Wikimedia\TestingAccessWrapper;
+
+abstract class MaintenanceBaseTestCase extends MediaWikiTestCase {
+
+ /**
+ * The main Maintenance instance that is used for testing, wrapped and mockable.
+ *
+ * @var Maintenance
+ */
+ protected $maintenance;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->maintenance = $this->createMaintenance();
+ }
+
+ /**
+ * Do a little stream cleanup to prevent output in case the child class
+ * hasn't tested the capture buffer.
+ */
+ protected function tearDown() {
+ if ( $this->maintenance ) {
+ $this->maintenance->cleanupChanneled();
+ }
+
+ // This is smelly, but maintenance scripts usually produce output, so
+ // we anticipate and ignore with a regex that will catch everything.
+ //
+ // If you call $this->expectOutputRegex in your subclass, this guard
+ // won't be triggered, and your specific pattern will be respected.
+ if ( !$this->hasExpectationOnOutput() ) {
+ $this->expectOutputRegex( '/.*/' );
+ }
+
+ parent::tearDown();
+ }
+
+ /**
+ * @return string Class name
+ *
+ * Subclasses must implement this in order to use the $this->maintenance
+ * variable. Normally, it will be set like:
+ * return PopulateDatabaseMaintenance::class;
+ *
+ * If you need to change the way your maintenance class is constructed,
+ * override createMaintenance.
+ */
+ abstract protected function getMaintenanceClass();
+
+ /**
+ * Called by setUp to initialize $this->maintenance.
+ *
+ * @return object The Maintenance instance to test.
+ */
+ protected function createMaintenance() {
+ $className = $this->getMaintenanceClass();
+ $obj = new $className();
+
+ // We use TestingAccessWrapper in order to access protected internals
+ // such as `output()`.
+ return TestingAccessWrapper::newFromObject( $obj );
+ }
+
+ /**
+ * Asserts the output before and after simulating shutdown
+ *
+ * This function simulates shutdown of self::maintenance.
+ *
+ * @param string $preShutdownOutput Expected output before simulating shutdown
+ * @param bool $expectNLAppending Whether or not shutdown simulation is expected
+ * to add a newline to the output. If false, $preShutdownOutput is the
+ * expected output after shutdown simulation. Otherwise,
+ * $preShutdownOutput with an appended newline is the expected output
+ * after shutdown simulation.
+ */
+ protected function assertOutputPrePostShutdown( $preShutdownOutput, $expectNLAppending ) {
+ $this->assertEquals( $preShutdownOutput, $this->getActualOutput(),
+ "Output before shutdown simulation" );
+
+ $this->maintenance->cleanupChanneled();
+
+ $postShutdownOutput = $preShutdownOutput . ( $expectNLAppending ? "\n" : "" );
+ $this->expectOutputString( $postShutdownOutput );
+ }
+
+}
use Maintenance;
use MediaWiki\MediaWikiServices;
-use MediaWikiTestCase;
-
-/**
- * Makes parts of Maintenance class API visible for testing, and makes up for a
- * stream closing hack in Maintenance.php.
- *
- * This class is solely used for being able to test Maintenance right now
- * without having to apply major refactorings to fix some design issues in
- * Maintenance.php. Before adding more functions here, please consider whether
- * this approach is correct, or a refactoring Maintenance to separate concerns
- * is more appropriate.
- *
- * Upon refactoring, keep in mind that besides the maintenance scripts themselves
- * and tests right here, some extensions including Extension:Maintenance make
- * use of the Maintenance class.
- *
- * Due to a hack in Maintenance.php using register_shutdown_function, be sure to
- * call simulateShutdown on MaintenanceFixup instance before a test ends.
- *
- * FIXME:
- * It would be great if we were able to use PHPUnit's getMockForAbstractClass
- * instead of the MaintenanceFixup hack below. However, we cannot do so
- * without changing method visibility and without working around hacks in
- * Maintenance.php
- *
- * For the same reason, we cannot just use FakeMaintenance.
- */
-class MaintenanceFixup extends Maintenance {
-
- // --- Making up for the register_shutdown_function hack in Maintenance.php
-
- /**
- * The test case that generated this instance.
- *
- * This member is motivated by allowing the destructor to check whether or not
- * the test failed, in order to avoid unnecessary nags about omitted shutdown
- * simulation.
- * But as it is already available, we also usi it to flagging tests as failed
- *
- * @var MediaWikiTestCase
- */
- private $testCase;
-
- /**
- * shutdownSimulated === true if simulateShutdown has done its work
- *
- * @var bool
- */
- private $shutdownSimulated = false;
-
- /**
- * Simulates what Maintenance wants to happen at script's end.
- */
- public function simulateShutdown() {
- if ( $this->shutdownSimulated ) {
- $this->testCase->fail( __METHOD__ . " called more than once" );
- }
-
- // The cleanup action.
- $this->outputChanneled( false );
-
- // Bookkeeping that we simulated the clean up.
- $this->shutdownSimulated = true;
- }
-
- // Note that the "public" here does not change visibility
- public function outputChanneled( $msg, $channel = null ) {
- if ( $this->shutdownSimulated ) {
- if ( $msg !== false ) {
- $this->testCase->fail( "Already past simulated shutdown, but msg is "
- . "not false. Did the hack in Maintenance.php change? Please "
- . "adapt the test case or Maintenance.php" );
- }
-
- // The current call is the one registered via register_shutdown_function.
- // We can safely ignore it, as we simulated this one via simulateShutdown
- // before (if we did not, the destructor of this instance will warn about
- // it)
- return;
- }
-
- call_user_func_array( [ "parent", __FUNCTION__ ], func_get_args() );
- }
-
- /**
- * Safety net around register_shutdown_function of Maintenance.php
- */
- public function __destruct() {
- if ( !$this->shutdownSimulated ) {
- // Someone generated a MaintenanceFixup instance without calling
- // simulateShutdown. We'd have to raise a PHPUnit exception to correctly
- // flag this illegal usage. However, we are already in a destruktor, which
- // would trigger undefined behavior. Hence, we can only report to the
- // error output :( Hopefully people read the PHPUnit output.
- $name = $this->testCase->getName();
- fwrite( STDERR, "ERROR! Instance of " . __CLASS__ . " for test $name "
- . "destructed without calling simulateShutdown method. Call "
- . "simulateShutdown on the instance before it gets destructed." );
- }
-
- // The following guard is required, as PHP does not offer default destructors :(
- if ( is_callable( "parent::__destruct" ) ) {
- parent::__destruct();
- }
- }
-
- public function __construct( MediaWikiTestCase $testCase ) {
- parent::__construct();
- $this->testCase = $testCase;
- }
-
- // --- Making protected functions visible for test
-
- public function output( $out, $channel = null ) {
- // Just to make PHP not nag about signature mismatches, we copied
- // Maintenance::output signature. However, we do not use (or rely on)
- // those variables. Instead we pass to Maintenance::output whatever we
- // receive at runtime.
- return call_user_func_array( [ "parent", __FUNCTION__ ], func_get_args() );
- }
-
- public function addOption( $name, $description, $required = false,
- $withArg = false, $shortName = false, $multiOccurance = false
- ) {
- return call_user_func_array( [ "parent", __FUNCTION__ ], func_get_args() );
- }
-
- public function getOption( $name, $default = null ) {
- return call_user_func_array( [ "parent", __FUNCTION__ ], func_get_args() );
- }
-
- // --- Requirements for getting instance of abstract class
-
- public function execute() {
- $this->testCase->fail( __METHOD__ . " called unexpectedly" );
- }
-}
+use Wikimedia\TestingAccessWrapper;
/**
* @covers Maintenance
*/
-class MaintenanceTest extends MediaWikiTestCase {
+class MaintenanceTest extends MaintenanceBaseTestCase {
/**
- * The main Maintenance instance that is used for testing.
- *
- * @var MaintenanceFixup
+ * @see MaintenanceBaseTestCase::getMaintenanceClass
*/
- private $m;
-
- protected function setUp() {
- parent::setUp();
- $this->m = new MaintenanceFixup( $this );
- }
-
- protected function tearDown() {
- if ( $this->m ) {
- $this->m->simulateShutdown();
- $this->m = null;
- }
- parent::tearDown();
+ protected function getMaintenanceClass() {
+ return Maintenance::class;
}
/**
- * asserts the output before and after simulating shutdown
+ * @see MaintenanceBaseTestCase::createMaintenance
*
- * This function simulates shutdown of self::m.
- *
- * @param string $preShutdownOutput Expected output before simulating shutdown
- * @param bool $expectNLAppending Whether or not shutdown simulation is expected
- * to add a newline to the output. If false, $preShutdownOutput is the
- * expected output after shutdown simulation. Otherwise,
- * $preShutdownOutput with an appended newline is the expected output
- * after shutdown simulation.
+ * Note to extension authors looking for a model to follow: This function
+ * is normally not needed in a maintenance test, it's only overridden here
+ * because Maintenance is abstract.
*/
- private function assertOutputPrePostShutdown( $preShutdownOutput, $expectNLAppending ) {
- $this->assertEquals( $preShutdownOutput, $this->getActualOutput(),
- "Output before shutdown simulation" );
-
- $this->m->simulateShutdown();
- $this->m = null;
+ protected function createMaintenance() {
+ $className = $this->getMaintenanceClass();
+ $obj = $this->getMockForAbstractClass( $className );
- $postShutdownOutput = $preShutdownOutput . ( $expectNLAppending ? "\n" : "" );
- $this->expectOutputString( $postShutdownOutput );
+ return TestingAccessWrapper::newFromObject( $obj );
}
// Although the following tests do not seem to be too consistent (compare for
// test.*Intermittent.* tests), the objective of these tests is not to describe
// consistent behavior, but rather currently existing behavior.
- function testOutputEmpty() {
- $this->m->output( "" );
- $this->assertOutputPrePostShutdown( "", false );
- }
-
- function testOutputString() {
- $this->m->output( "foo" );
- $this->assertOutputPrePostShutdown( "foo", false );
- }
-
- function testOutputStringString() {
- $this->m->output( "foo" );
- $this->m->output( "bar" );
- $this->assertOutputPrePostShutdown( "foobar", false );
- }
-
- function testOutputStringNL() {
- $this->m->output( "foo\n" );
- $this->assertOutputPrePostShutdown( "foo\n", false );
- }
-
- function testOutputStringNLNL() {
- $this->m->output( "foo\n\n" );
- $this->assertOutputPrePostShutdown( "foo\n\n", false );
- }
-
- function testOutputStringNLString() {
- $this->m->output( "foo\nbar" );
- $this->assertOutputPrePostShutdown( "foo\nbar", false );
- }
-
- function testOutputStringNLStringNL() {
- $this->m->output( "foo\nbar\n" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputStringNLStringNLLinewise() {
- $this->m->output( "foo\n" );
- $this->m->output( "bar\n" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputStringNLStringNLArbitrary() {
- $this->m->output( "" );
- $this->m->output( "foo" );
- $this->m->output( "" );
- $this->m->output( "\n" );
- $this->m->output( "ba" );
- $this->m->output( "" );
- $this->m->output( "r\n" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputStringNLStringNLArbitraryAgain() {
- $this->m->output( "" );
- $this->m->output( "foo" );
- $this->m->output( "" );
- $this->m->output( "\nb" );
- $this->m->output( "a" );
- $this->m->output( "" );
- $this->m->output( "r\n" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputWNullChannelEmpty() {
- $this->m->output( "", null );
- $this->assertOutputPrePostShutdown( "", false );
- }
-
- function testOutputWNullChannelString() {
- $this->m->output( "foo", null );
- $this->assertOutputPrePostShutdown( "foo", false );
- }
-
- function testOutputWNullChannelStringString() {
- $this->m->output( "foo", null );
- $this->m->output( "bar", null );
- $this->assertOutputPrePostShutdown( "foobar", false );
- }
-
- function testOutputWNullChannelStringNL() {
- $this->m->output( "foo\n", null );
- $this->assertOutputPrePostShutdown( "foo\n", false );
- }
-
- function testOutputWNullChannelStringNLNL() {
- $this->m->output( "foo\n\n", null );
- $this->assertOutputPrePostShutdown( "foo\n\n", false );
- }
-
- function testOutputWNullChannelStringNLString() {
- $this->m->output( "foo\nbar", null );
- $this->assertOutputPrePostShutdown( "foo\nbar", false );
- }
-
- function testOutputWNullChannelStringNLStringNL() {
- $this->m->output( "foo\nbar\n", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputWNullChannelStringNLStringNLLinewise() {
- $this->m->output( "foo\n", null );
- $this->m->output( "bar\n", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputWNullChannelStringNLStringNLArbitrary() {
- $this->m->output( "", null );
- $this->m->output( "foo", null );
- $this->m->output( "", null );
- $this->m->output( "\n", null );
- $this->m->output( "ba", null );
- $this->m->output( "", null );
- $this->m->output( "r\n", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputWNullChannelStringNLStringNLArbitraryAgain() {
- $this->m->output( "", null );
- $this->m->output( "foo", null );
- $this->m->output( "", null );
- $this->m->output( "\nb", null );
- $this->m->output( "a", null );
- $this->m->output( "", null );
- $this->m->output( "r\n", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputWChannelString() {
- $this->m->output( "foo", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo", true );
- }
-
- function testOutputWChannelStringNL() {
- $this->m->output( "foo\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo", true );
- }
-
- function testOutputWChannelStringNLNL() {
- // If this test fails, note that output takes strings with double line
- // endings (although output's implementation in this situation calls
- // outputChanneled with a string ending in a nl ... which is not allowed
- // according to the documentation of outputChanneled)
- $this->m->output( "foo\n\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\n", true );
- }
-
- function testOutputWChannelStringNLString() {
- $this->m->output( "foo\nbar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", true );
- }
-
- function testOutputWChannelStringNLStringNL() {
- $this->m->output( "foo\nbar\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", true );
- }
-
- function testOutputWChannelStringNLStringNLLinewise() {
- $this->m->output( "foo\n", "bazChannel" );
- $this->m->output( "bar\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", true );
- }
-
- function testOutputWChannelStringNLStringNLArbitrary() {
- $this->m->output( "", "bazChannel" );
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "", "bazChannel" );
- $this->m->output( "\n", "bazChannel" );
- $this->m->output( "ba", "bazChannel" );
- $this->m->output( "", "bazChannel" );
- $this->m->output( "r\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", true );
- }
-
- function testOutputWChannelStringNLStringNLArbitraryAgain() {
- $this->m->output( "", "bazChannel" );
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "", "bazChannel" );
- $this->m->output( "\nb", "bazChannel" );
- $this->m->output( "a", "bazChannel" );
- $this->m->output( "", "bazChannel" );
- $this->m->output( "r\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", true );
- }
-
- function testOutputWMultipleChannelsChannelChange() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "bar", "bazChannel" );
- $this->m->output( "qux", "quuxChannel" );
- $this->m->output( "corge", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", true );
- }
-
- function testOutputWMultipleChannelsChannelChangeNL() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "bar\n", "bazChannel" );
- $this->m->output( "qux\n", "quuxChannel" );
- $this->m->output( "corge", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", true );
- }
-
- function testOutputWAndWOChannelStringStartWO() {
- $this->m->output( "foo" );
- $this->m->output( "bar", "bazChannel" );
- $this->m->output( "qux" );
- $this->m->output( "quux", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar\nquxquux", true );
- }
-
- function testOutputWAndWOChannelStringStartW() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "bar" );
- $this->m->output( "qux", "bazChannel" );
- $this->m->output( "quux" );
- $this->assertOutputPrePostShutdown( "foo\nbarqux\nquux", false );
- }
-
- function testOutputWChannelTypeSwitch() {
- $this->m->output( "foo", 1 );
- $this->m->output( "bar", 1.0 );
- $this->assertOutputPrePostShutdown( "foo\nbar", true );
- }
-
- function testOutputIntermittentEmpty() {
- $this->m->output( "foo" );
- $this->m->output( "" );
- $this->m->output( "bar" );
- $this->assertOutputPrePostShutdown( "foobar", false );
- }
-
- function testOutputIntermittentFalse() {
- $this->m->output( "foo" );
- $this->m->output( false );
- $this->m->output( "bar" );
- $this->assertOutputPrePostShutdown( "foobar", false );
- }
-
- function testOutputIntermittentFalseAfterOtherChannel() {
- $this->m->output( "qux", "quuxChannel" );
- $this->m->output( "foo" );
- $this->m->output( false );
- $this->m->output( "bar" );
- $this->assertOutputPrePostShutdown( "qux\nfoobar", false );
- }
-
- function testOutputWNullChannelIntermittentEmpty() {
- $this->m->output( "foo", null );
- $this->m->output( "", null );
- $this->m->output( "bar", null );
- $this->assertOutputPrePostShutdown( "foobar", false );
- }
-
- function testOutputWNullChannelIntermittentFalse() {
- $this->m->output( "foo", null );
- $this->m->output( false, null );
- $this->m->output( "bar", null );
- $this->assertOutputPrePostShutdown( "foobar", false );
- }
-
- function testOutputWChannelIntermittentEmpty() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "", "bazChannel" );
- $this->m->output( "bar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", true );
- }
-
- function testOutputWChannelIntermittentFalse() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( false, "bazChannel" );
- $this->m->output( "bar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", true );
- }
-
- // Note that (per documentation) outputChanneled does take strings that end
- // in \n, hence we do not test such strings.
-
- function testOutputChanneledEmpty() {
- $this->m->outputChanneled( "" );
- $this->assertOutputPrePostShutdown( "\n", false );
- }
-
- function testOutputChanneledString() {
- $this->m->outputChanneled( "foo" );
- $this->assertOutputPrePostShutdown( "foo\n", false );
- }
-
- function testOutputChanneledStringString() {
- $this->m->outputChanneled( "foo" );
- $this->m->outputChanneled( "bar" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputChanneledStringNLString() {
- $this->m->outputChanneled( "foo\nbar" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputChanneledStringNLStringNLArbitraryAgain() {
- $this->m->outputChanneled( "" );
- $this->m->outputChanneled( "foo" );
- $this->m->outputChanneled( "" );
- $this->m->outputChanneled( "\nb" );
- $this->m->outputChanneled( "a" );
- $this->m->outputChanneled( "" );
- $this->m->outputChanneled( "r" );
- $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", false );
- }
-
- function testOutputChanneledWNullChannelEmpty() {
- $this->m->outputChanneled( "", null );
- $this->assertOutputPrePostShutdown( "\n", false );
- }
-
- function testOutputChanneledWNullChannelString() {
- $this->m->outputChanneled( "foo", null );
- $this->assertOutputPrePostShutdown( "foo\n", false );
- }
-
- function testOutputChanneledWNullChannelStringString() {
- $this->m->outputChanneled( "foo", null );
- $this->m->outputChanneled( "bar", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputChanneledWNullChannelStringNLString() {
- $this->m->outputChanneled( "foo\nbar", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputChanneledWNullChannelStringNLStringNLArbitraryAgain() {
- $this->m->outputChanneled( "", null );
- $this->m->outputChanneled( "foo", null );
- $this->m->outputChanneled( "", null );
- $this->m->outputChanneled( "\nb", null );
- $this->m->outputChanneled( "a", null );
- $this->m->outputChanneled( "", null );
- $this->m->outputChanneled( "r", null );
- $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", false );
- }
-
- function testOutputChanneledWChannelString() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo", true );
- }
-
- function testOutputChanneledWChannelStringNLString() {
- $this->m->outputChanneled( "foo\nbar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", true );
- }
-
- function testOutputChanneledWChannelStringString() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "bar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", true );
- }
-
- function testOutputChanneledWChannelStringNLStringNLArbitraryAgain() {
- $this->m->outputChanneled( "", "bazChannel" );
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "", "bazChannel" );
- $this->m->outputChanneled( "\nb", "bazChannel" );
- $this->m->outputChanneled( "a", "bazChannel" );
- $this->m->outputChanneled( "", "bazChannel" );
- $this->m->outputChanneled( "r", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", true );
- }
-
- function testOutputChanneledWMultipleChannelsChannelChange() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "bar", "bazChannel" );
- $this->m->outputChanneled( "qux", "quuxChannel" );
- $this->m->outputChanneled( "corge", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", true );
- }
-
- function testOutputChanneledWMultipleChannelsChannelChangeEnclosedNull() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "bar", null );
- $this->m->outputChanneled( "qux", null );
- $this->m->outputChanneled( "corge", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", true );
- }
-
- function testOutputChanneledWMultipleChannelsChannelAfterNullChange() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "bar", null );
- $this->m->outputChanneled( "qux", null );
- $this->m->outputChanneled( "corge", "quuxChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", true );
- }
-
- function testOutputChanneledWAndWOChannelStringStartWO() {
- $this->m->outputChanneled( "foo" );
- $this->m->outputChanneled( "bar", "bazChannel" );
- $this->m->outputChanneled( "qux" );
- $this->m->outputChanneled( "quux", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux", true );
- }
-
- function testOutputChanneledWAndWOChannelStringStartW() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "bar" );
- $this->m->outputChanneled( "qux", "bazChannel" );
- $this->m->outputChanneled( "quux" );
- $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux\n", false );
- }
-
- function testOutputChanneledWChannelTypeSwitch() {
- $this->m->outputChanneled( "foo", 1 );
- $this->m->outputChanneled( "bar", 1.0 );
- $this->assertOutputPrePostShutdown( "foo\nbar", true );
- }
-
- function testOutputChanneledWOChannelIntermittentEmpty() {
- $this->m->outputChanneled( "foo" );
- $this->m->outputChanneled( "" );
- $this->m->outputChanneled( "bar" );
- $this->assertOutputPrePostShutdown( "foo\n\nbar\n", false );
- }
-
- function testOutputChanneledWOChannelIntermittentFalse() {
- $this->m->outputChanneled( "foo" );
- $this->m->outputChanneled( false );
- $this->m->outputChanneled( "bar" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputChanneledWNullChannelIntermittentEmpty() {
- $this->m->outputChanneled( "foo", null );
- $this->m->outputChanneled( "", null );
- $this->m->outputChanneled( "bar", null );
- $this->assertOutputPrePostShutdown( "foo\n\nbar\n", false );
- }
-
- function testOutputChanneledWNullChannelIntermittentFalse() {
- $this->m->outputChanneled( "foo", null );
- $this->m->outputChanneled( false, null );
- $this->m->outputChanneled( "bar", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
- }
-
- function testOutputChanneledWChannelIntermittentEmpty() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "", "bazChannel" );
- $this->m->outputChanneled( "bar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", true );
+ /**
+ * @dataProvider provideOutputData
+ */
+ function testOutput( $outputs, $expected, $extraNL ) {
+ foreach ( $outputs as $data ) {
+ if ( is_array( $data ) ) {
+ list( $msg, $channel ) = $data;
+ } else {
+ $msg = $data;
+ $channel = null;
+ }
+ $this->maintenance->output( $msg, $channel );
+ }
+ $this->assertOutputPrePostShutdown( $expected, $extraNL );
+ }
+
+ public function provideOutputData() {
+ return [
+ [ [ "" ], "", false ],
+ [ [ "foo" ], "foo", false ],
+ [ [ "foo", "bar" ], "foobar", false ],
+ [ [ "foo\n" ], "foo\n", false ],
+ [ [ "foo\n\n" ], "foo\n\n", false ],
+ [ [ "foo\nbar" ], "foo\nbar", false ],
+ [ [ "foo\nbar\n" ], "foo\nbar\n", false ],
+ [ [ "foo\n", "bar\n" ], "foo\nbar\n", false ],
+ [ [ "", "foo", "", "\n", "ba", "", "r\n" ], "foo\nbar\n", false ],
+ [ [ "", "foo", "", "\nb", "a", "", "r\n" ], "foo\nbar\n", false ],
+ [ [ [ "foo", "bazChannel" ] ], "foo", true ],
+ [ [ [ "foo\n", "bazChannel" ] ], "foo", true ],
+
+ // If this test fails, note that output takes strings with double line
+ // endings (although output's implementation in this situation calls
+ // outputChanneled with a string ending in a nl ... which is not allowed
+ // according to the documentation of outputChanneled)
+ [ [ [ "foo\n\n", "bazChannel" ] ], "foo\n", true ],
+ [ [ [ "foo\nbar", "bazChannel" ] ], "foo\nbar", true ],
+ [ [ [ "foo\nbar\n", "bazChannel" ] ], "foo\nbar", true ],
+ [
+ [
+ [ "foo\n", "bazChannel" ],
+ [ "bar\n", "bazChannel" ],
+ ],
+ "foobar",
+ true
+ ],
+ [
+ [
+ [ "", "bazChannel" ],
+ [ "foo", "bazChannel" ],
+ [ "", "bazChannel" ],
+ [ "\n", "bazChannel" ],
+ [ "ba", "bazChannel" ],
+ [ "", "bazChannel" ],
+ [ "r\n", "bazChannel" ],
+ ],
+ "foobar",
+ true
+ ],
+ [
+ [
+ [ "", "bazChannel" ],
+ [ "foo", "bazChannel" ],
+ [ "", "bazChannel" ],
+ [ "\nb", "bazChannel" ],
+ [ "a", "bazChannel" ],
+ [ "", "bazChannel" ],
+ [ "r\n", "bazChannel" ],
+ ],
+ "foo\nbar",
+ true
+ ],
+ [
+ [
+ [ "foo", "bazChannel" ],
+ [ "bar", "bazChannel" ],
+ [ "qux", "quuxChannel" ],
+ [ "corge", "bazChannel" ],
+ ],
+ "foobar\nqux\ncorge",
+ true
+ ],
+ [
+ [
+ [ "foo", "bazChannel" ],
+ [ "bar\n", "bazChannel" ],
+ [ "qux\n", "quuxChannel" ],
+ [ "corge", "bazChannel" ],
+ ],
+ "foobar\nqux\ncorge",
+ true
+ ],
+ [
+ [
+ [ "foo", null ],
+ [ "bar", "bazChannel" ],
+ [ "qux", null ],
+ [ "quux", "bazChannel" ],
+ ],
+ "foobar\nquxquux",
+ true
+ ],
+ [
+ [
+ [ "foo", "bazChannel" ],
+ [ "bar", null ],
+ [ "qux", "bazChannel" ],
+ [ "quux", null ],
+ ],
+ "foo\nbarqux\nquux",
+ false
+ ],
+ [
+ [
+ [ "foo", 1 ],
+ [ "bar", 1.0 ],
+ ],
+ "foo\nbar",
+ true
+ ],
+ [ [ "foo", "", "bar" ], "foobar", false ],
+ [ [ "foo", false, "bar" ], "foobar", false ],
+ [
+ [
+ [ "qux", "quuxChannel" ],
+ "foo",
+ false,
+ "bar"
+ ],
+ "qux\nfoobar",
+ false
+ ],
+ [
+ [
+ [ "foo", "bazChannel" ],
+ [ "", "bazChannel" ],
+ [ "bar", "bazChannel" ],
+ ],
+ "foobar",
+ true
+ ],
+ [
+ [
+ [ "foo", "bazChannel" ],
+ [ false, "bazChannel" ],
+ [ "bar", "bazChannel" ],
+ ],
+ "foobar",
+ true
+ ],
+ ];
}
- function testOutputChanneledWChannelIntermittentFalse() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( false, "bazChannel" );
- $this->m->outputChanneled( "bar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", true );
+ /**
+ * @dataProvider provideOutputChanneledData
+ */
+ function testOutputChanneled( $outputs, $expected, $extraNL ) {
+ foreach ( $outputs as $data ) {
+ if ( is_array( $data ) ) {
+ list( $msg, $channel ) = $data;
+ } else {
+ $msg = $data;
+ $channel = null;
+ }
+ $this->maintenance->outputChanneled( $msg, $channel );
+ }
+ $this->assertOutputPrePostShutdown( $expected, $extraNL );
+ }
+
+ public function provideOutputChanneledData() {
+ return [
+ [ [ "" ], "\n", false ],
+ [ [ "foo" ], "foo\n", false ],
+ [ [ "foo", "bar" ], "foo\nbar\n", false ],
+ [ [ "foo\nbar" ], "foo\nbar\n", false ],
+ [ [ "", "foo", "", "\nb", "a", "", "r" ], "\nfoo\n\n\nb\na\n\nr\n", false ],
+ [ [ [ "foo", "bazChannel" ] ], "foo", true ],
+ [
+ [
+ [ "foo\nbar", "bazChannel" ]
+ ],
+ "foo\nbar",
+ true
+ ],
+ [
+ [
+ [ "foo", "bazChannel" ],
+ [ "bar", "bazChannel" ],
+ ],
+ "foobar",
+ true
+ ],
+ [
+ [
+ [ "", "bazChannel" ],
+ [ "foo", "bazChannel" ],
+ [ "", "bazChannel" ],
+ [ "\nb", "bazChannel" ],
+ [ "a", "bazChannel" ],
+ [ "", "bazChannel" ],
+ [ "r", "bazChannel" ],
+ ],
+ "foo\nbar",
+ true
+ ],
+ [
+ [
+ [ "foo", "bazChannel" ],
+ [ "bar", "bazChannel" ],
+ [ "qux", "quuxChannel" ],
+ [ "corge", "bazChannel" ],
+ ],
+ "foobar\nqux\ncorge",
+ true
+ ],
+ [
+ [
+ [ "foo", "bazChannel" ],
+ [ "bar", "bazChannel" ],
+ [ "qux", "quuxChannel" ],
+ [ "corge", "bazChannel" ],
+ ],
+ "foobar\nqux\ncorge",
+ true
+ ],
+ [
+ [
+ [ "foo", "bazChannel" ],
+ [ "bar", null ],
+ [ "qux", null ],
+ [ "corge", "bazChannel" ],
+ ],
+ "foo\nbar\nqux\ncorge",
+ true
+ ],
+ [
+ [
+ [ "foo", null ],
+ [ "bar", "bazChannel" ],
+ [ "qux", null ],
+ [ "quux", "bazChannel" ],
+ ],
+ "foo\nbar\nqux\nquux",
+ true
+ ],
+ [
+ [
+ [ "foo", "bazChannel" ],
+ [ "bar", null ],
+ [ "qux", "bazChannel" ],
+ [ "quux", null ],
+ ],
+ "foo\nbar\nqux\nquux\n",
+ false
+ ],
+ [
+ [
+ [ "foo", 1 ],
+ [ "bar", 1.0 ],
+ ],
+ "foo\nbar",
+ true
+ ],
+ [ [ "foo", "", "bar" ], "foo\n\nbar\n", false ],
+ [ [ "foo", false, "bar" ], "foo\nbar\n", false ],
+ ];
}
function testCleanupChanneledClean() {
- $this->m->cleanupChanneled();
+ $this->maintenance->cleanupChanneled();
$this->assertOutputPrePostShutdown( "", false );
}
function testCleanupChanneledAfterOutput() {
- $this->m->output( "foo" );
- $this->m->cleanupChanneled();
+ $this->maintenance->output( "foo" );
+ $this->maintenance->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo", false );
}
function testCleanupChanneledAfterOutputWNullChannel() {
- $this->m->output( "foo", null );
- $this->m->cleanupChanneled();
+ $this->maintenance->output( "foo", null );
+ $this->maintenance->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo", false );
}
function testCleanupChanneledAfterOutputWChannel() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->cleanupChanneled();
+ $this->maintenance->output( "foo", "bazChannel" );
+ $this->maintenance->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo\n", false );
}
function testCleanupChanneledAfterNLOutput() {
- $this->m->output( "foo\n" );
- $this->m->cleanupChanneled();
+ $this->maintenance->output( "foo\n" );
+ $this->maintenance->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo\n", false );
}
function testCleanupChanneledAfterNLOutputWNullChannel() {
- $this->m->output( "foo\n", null );
- $this->m->cleanupChanneled();
+ $this->maintenance->output( "foo\n", null );
+ $this->maintenance->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo\n", false );
}
function testCleanupChanneledAfterNLOutputWChannel() {
- $this->m->output( "foo\n", "bazChannel" );
- $this->m->cleanupChanneled();
+ $this->maintenance->output( "foo\n", "bazChannel" );
+ $this->maintenance->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo\n", false );
}
function testCleanupChanneledAfterOutputChanneledWOChannel() {
- $this->m->outputChanneled( "foo" );
- $this->m->cleanupChanneled();
+ $this->maintenance->outputChanneled( "foo" );
+ $this->maintenance->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo\n", false );
}
function testCleanupChanneledAfterOutputChanneledWNullChannel() {
- $this->m->outputChanneled( "foo", null );
- $this->m->cleanupChanneled();
+ $this->maintenance->outputChanneled( "foo", null );
+ $this->maintenance->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo\n", false );
}
function testCleanupChanneledAfterOutputChanneledWChannel() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->cleanupChanneled();
+ $this->maintenance->outputChanneled( "foo", "bazChannel" );
+ $this->maintenance->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo\n", false );
}
function testMultipleMaintenanceObjectsInteractionOutput() {
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
- $this->m->output( "foo" );
+ $this->maintenance->output( "foo" );
$m2->output( "bar" );
$this->assertEquals( "foobar", $this->getActualOutput(),
"Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foobar", false );
}
function testMultipleMaintenanceObjectsInteractionOutputWNullChannel() {
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
- $this->m->output( "foo", null );
+ $this->maintenance->output( "foo", null );
$m2->output( "bar", null );
$this->assertEquals( "foobar", $this->getActualOutput(),
"Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foobar", false );
}
function testMultipleMaintenanceObjectsInteractionOutputWChannel() {
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
- $this->m->output( "foo", "bazChannel" );
+ $this->maintenance->output( "foo", "bazChannel" );
$m2->output( "bar", "bazChannel" );
$this->assertEquals( "foobar", $this->getActualOutput(),
"Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foobar\n", true );
}
function testMultipleMaintenanceObjectsInteractionOutputWNullChannelNL() {
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
- $this->m->output( "foo\n", null );
+ $this->maintenance->output( "foo\n", null );
$m2->output( "bar\n", null );
$this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
"Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
}
function testMultipleMaintenanceObjectsInteractionOutputWChannelNL() {
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
- $this->m->output( "foo\n", "bazChannel" );
+ $this->maintenance->output( "foo\n", "bazChannel" );
$m2->output( "bar\n", "bazChannel" );
$this->assertEquals( "foobar", $this->getActualOutput(),
"Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foobar\n", true );
}
function testMultipleMaintenanceObjectsInteractionOutputChanneled() {
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
- $this->m->outputChanneled( "foo" );
+ $this->maintenance->outputChanneled( "foo" );
$m2->outputChanneled( "bar" );
$this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
"Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
}
function testMultipleMaintenanceObjectsInteractionOutputChanneledWNullChannel() {
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
- $this->m->outputChanneled( "foo", null );
+ $this->maintenance->outputChanneled( "foo", null );
$m2->outputChanneled( "bar", null );
$this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
"Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
}
function testMultipleMaintenanceObjectsInteractionOutputChanneledWChannel() {
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
- $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->maintenance->outputChanneled( "foo", "bazChannel" );
$m2->outputChanneled( "bar", "bazChannel" );
$this->assertEquals( "foobar", $this->getActualOutput(),
"Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foobar\n", true );
}
function testMultipleMaintenanceObjectsInteractionCleanupChanneledWChannel() {
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
- $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->maintenance->outputChanneled( "foo", "bazChannel" );
$m2->outputChanneled( "bar", "bazChannel" );
$this->assertEquals( "foobar", $this->getActualOutput(),
"Output before first cleanup" );
- $this->m->cleanupChanneled();
+ $this->maintenance->cleanupChanneled();
$this->assertEquals( "foobar\n", $this->getActualOutput(),
"Output after first cleanup" );
$m2->cleanupChanneled();
$this->assertEquals( "foobar\n\n", $this->getActualOutput(),
"Output after second cleanup" );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
$this->assertOutputPrePostShutdown( "foobar\n\n", false );
}
* @covers Maintenance::getConfig
*/
public function testGetConfig() {
- $this->assertInstanceOf( 'Config', $this->m->getConfig() );
+ $this->assertInstanceOf( 'Config', $this->maintenance->getConfig() );
$this->assertSame(
MediaWikiServices::getInstance()->getMainConfig(),
- $this->m->getConfig()
+ $this->maintenance->getConfig()
);
}
*/
public function testSetConfig() {
$conf = $this->createMock( 'Config' );
- $this->m->setConfig( $conf );
- $this->assertSame( $conf, $this->m->getConfig() );
+ $this->maintenance->setConfig( $conf );
+ $this->assertSame( $conf, $this->maintenance->getConfig() );
}
function testParseArgs() {
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
+
// Create an option with an argument allowed to be specified multiple times
$m2->addOption( 'multi', 'This option does stuff', false, true, false, true );
$m2->loadWithArgv( [ '--multi', 'this1', '--multi', 'this2' ] );
$this->assertEquals( [ [ 'multi', 'this1' ], [ 'multi', 'this2' ] ],
$m2->orderedOptions );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
- $m2 = new MaintenanceFixup( $this );
+ $m2 = $this->createMaintenance();
$m2->addOption( 'multi', 'This option does stuff', false, false, false, true );
$m2->loadWithArgv( [ '--multi', '--multi' ] );
$this->assertEquals( [ 1, 1 ], $m2->getOption( 'multi' ) );
$this->assertEquals( [ [ 'multi', 1 ], [ 'multi', 1 ] ], $m2->orderedOptions );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
+
+ $m2 = $this->createMaintenance();
- $m2 = new MaintenanceFixup( $this );
// Create an option with an argument allowed to be specified multiple times
$m2->addOption( 'multi', 'This option doesn\'t actually support multiple occurrences' );
$m2->loadWithArgv( [ '--multi=yo' ] );
$this->assertEquals( 'yo', $m2->getOption( 'multi' ) );
$this->assertEquals( [ [ 'multi', 'yo' ] ], $m2->orderedOptions );
- $m2->simulateShutdown();
+ $m2->cleanupChanneled();
}
}
];
// The mock itself
- $prefetchMock = $this->getMockBuilder( 'BaseDump' )
+ $prefetchMock = $this->getMockBuilder( BaseDump::class )
->setMethods( [ 'prefetch' ] )
->disableOriginalConstructor()
->getMock();
*/
private function checkMessage( $msg, $what ) {
$msg = ApiBase::makeMessage( $msg, self::getMain()->getContext() );
- $this->assertInstanceOf( 'Message', $msg, "$what message" );
+ $this->assertInstanceOf( Message::class, $msg, "$what message" );
$this->assertTrue( $msg->exists(), "$what message {$msg->getKey()} exists" );
}
$tmpGlobals['wgStylePath'] = '/skins';
$tmpGlobals['wgThumbnailScriptPath'] = false;
$tmpGlobals['wgLocalFileRepo'] = [
- 'class' => 'LocalRepo',
+ 'class' => LocalRepo::class,
'name' => 'local',
'url' => 'http://example.com/images',
'hashLevels' => 2,
$logger2 = LoggerFactory::getInstance( 'foo' );
$this->assertNotSame( $logger1, $logger2 );
- $this->assertInstanceOf( '\Psr\Log\LoggerInterface', $logger2 );
+ $this->assertInstanceOf( \Psr\Log\LoggerInterface::class, $logger2 );
}
/**
--- /dev/null
+'use strict';
+const Page = require( './page' );
+
+class DeletePage extends Page {
+
+ get reason() { return browser.element( '#wpReason' ); }
+ get watch() { return browser.element( '#wpWatch' ); }
+ get submit() { return browser.element( '#wpConfirmB' ); }
+ get displayedContent() { return browser.element( '#mw-content-text' ); }
+
+ open( name ) {
+ super.open( name + '&action=delete' );
+ }
+
+ delete( name, reason ) {
+ this.open( name );
+ this.reason.setValue( reason );
+ this.submit.click();
+ }
+
+ apiDelete( name, reason ) {
+ const url = require( 'url' ), // https://nodejs.org/docs/latest/api/url.html
+ baseUrl = url.parse( browser.options.baseUrl ), // http://webdriver.io/guide/testrunner/browserobject.html
+ Bot = require( 'nodemw' ), // https://github.com/macbre/nodemw
+ client = new Bot( {
+ protocol: baseUrl.protocol,
+ server: baseUrl.hostname,
+ port: baseUrl.port,
+ path: baseUrl.path,
+ username: browser.options.username,
+ password: browser.options.password,
+ debug: false
+ } );
+
+ return new Promise( ( resolve, reject ) => {
+ client.logIn( function ( err ) {
+ if ( err ) {
+ console.log( err );
+ return reject( err );
+ }
+ client.delete( name, reason, function ( err ) {
+ if ( err ) {
+ return reject( err );
+ }
+ resolve();
+ } );
+ } );
+ } );
+ }
+
+}
+module.exports = new DeletePage();
--- /dev/null
+'use strict';
+const Page = require( './page' );
+
+class RestorePage extends Page {
+
+ get reason() { return browser.element( '#wpComment' ); }
+ get submit() { return browser.element( '#mw-undelete-submit' ); }
+ get displayedContent() { return browser.element( '#mw-content-text' ); }
+
+ open( name ) {
+ browser.url( '/index.php?title=Special:Undelete/' + name );
+ }
+
+ restore( name, reason ) {
+ this.open( name );
+ this.reason.setValue( reason );
+ this.submit.click();
+ }
+
+}
+module.exports = new RestorePage();
this.loginButton.click();
}
+ loginAdmin() {
+ this.login( browser.options.username, browser.options.password );
+ }
+
}
module.exports = new UserLoginPage();
--- /dev/null
+'use strict';
+const Page = require( './page' );
+
+class UserMessagePage extends Page {
+ get usermessage() { return browser.element( 'div.usermessage' ); }
+}
+module.exports = new UserMessagePage();
'use strict';
const assert = require( 'assert' ),
+ DeletePage = require( '../pageobjects/delete.page' ),
+ RestorePage = require( '../pageobjects/restore.page' ),
EditPage = require( '../pageobjects/edit.page' ),
HistoryPage = require( '../pageobjects/history.page' ),
UserLoginPage = require( '../pageobjects/userlogin.page' );
} );
+ it( 'should be re-creatable', function () {
+ let initialContent = getTestString();
+
+ // create
+ browser.call( function () {
+ return EditPage.apiEdit( name, initialContent );
+ } );
+
+ // delete
+ browser.call( function () {
+ return DeletePage.apiDelete( name, 'delete prior to recreate' );
+ } );
+
+ // create
+ EditPage.edit( name, content );
+
+ // check
+ assert.equal( EditPage.heading.getText(), name );
+ assert.equal( EditPage.displayedContent.getText(), content );
+
+ } );
+
it( 'should be editable', function () {
// create
} );
+ it( 'should be deletable', function () {
+
+ // login
+ UserLoginPage.loginAdmin();
+
+ // create
+ browser.call( function () {
+ return EditPage.apiEdit( name, content );
+ } );
+
+ // delete
+ DeletePage.delete( name, content + '-deletereason' );
+
+ // check
+ assert.equal(
+ DeletePage.displayedContent.getText(),
+ '"' + name + '" has been deleted. See deletion log for a record of recent deletions.\nReturn to Main Page.'
+ );
+
+ } );
+
+ it( 'should be restorable', function () {
+
+ // login
+ UserLoginPage.loginAdmin();
+
+ // create
+ browser.call( function () {
+ return EditPage.apiEdit( name, content );
+ } );
+
+ // delete
+ browser.call( function () {
+ return DeletePage.apiDelete( name, content + '-deletereason' );
+ } );
+
+ // restore
+ RestorePage.restore( name, content + '-restorereason' );
+
+ // check
+ assert.equal( RestorePage.displayedContent.getText(), name + ' has been restored\nConsult the deletion log for a record of recent deletions and restorations.' );
+
+ } );
+
} );
const assert = require( 'assert' ),
CreateAccountPage = require( '../pageobjects/createaccount.page' ),
PreferencesPage = require( '../pageobjects/preferences.page' ),
- UserLoginPage = require( '../pageobjects/userlogin.page' );
+ UserLoginPage = require( '../pageobjects/userlogin.page' ),
+ UserMessagePage = require( '../pageobjects/usermessage.page' ),
+ EditPage = require( '../pageobjects/edit.page' );
describe( 'User', function () {
} );
+ it( 'should be able to view new message banner', function () {
+
+ // create user
+ browser.call( function () {
+ return CreateAccountPage.apiCreateAccount( username, password );
+ } );
+
+ // create talk page with content
+ browser.call( function () {
+ return EditPage.apiEdit( 'User_talk:' + username, Math.random().toString() );
+ } );
+
+ // log in
+ UserLoginPage.login( username, password );
+
+ // check
+ assert.equal( UserMessagePage.usermessage.getText(), 'You have a new message (last change).' );
+
+ } );
+
} );
* @return void
*/
function wfThumbErrorText( $status, $msgText ) {
- wfThumbError( $status, htmlspecialchars( $msgText ) );
+ wfThumbError( $status, htmlspecialchars( $msgText, ENT_NOQUOTES ) );
}
/**
if ( $wgShowHostnames ) {
header( 'X-MW-Thumbnail-Renderer: ' . wfHostname() );
$url = htmlspecialchars(
- isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : ''
+ isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '',
+ ENT_NOQUOTES
);
- $hostname = htmlspecialchars( wfHostname() );
+ $hostname = htmlspecialchars( wfHostname(), ENT_NOQUOTES );
$debug = "<!-- $url -->\n<!-- $hostname -->\n";
} else {
$debug = '';