*.sh eol=lf
*.icc binary
*.webp binary
-*.mp3 binary
\ No newline at end of file
+*.mp3 binary
+*~ export-ignore
+#*# export-ignore
+.* export-ignore
+package.json export-ignore
+README.mediawiki export-ignore
+Gemfile* export-ignore
+vendor/pear/net_smtp/README.rst export-ignore
+
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>
Jackmcbarn <jackmcbarn@gmail.com>
Jackmcbarn <jackmcbarn@gmail.com> <jackmcbarn@users.noreply.github.com>
jagori <jagori79@gmail.com>
-James Forrester <jforrester@wikimedia.org>
+James D. Forrester <jforrester@wikimedia.org>
Jaime Crespo <jcrespo@wikimedia.org>
Jan Gerber <j@thing.net> <j@users.mediawiki.org>
Jan Luca Naumann <jan@jans-seite.de>
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>
# https://docs.travis-ci.com/user/languages/php#HHVM-versions
- env: dbtype=mysql dbuser=root
php: hhvm-3.18
+ - env: dbtype=mysql dbuser=root
+ php: hhvm-3.21
+ - env: dbtype=mysql dbuser=root
+ php: hhvm-3.24
- env: dbtype=mysql dbuser=root
php: 7
- env: dbtype=mysql dbuser=root
{{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
* Jaime Crespo
* Jakub Vrana
* James Earl Douglas
-* James Forrester
+* James D. Forrester
* Jan Berkel
* Jan Drewniak
* Jan Gerber
* 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-16 SHA1
+ hash value in the table of basic information.
=== External library changes in 1.31 ===
1.2.0 (development dependency).
* Updated nikic/php-parser from 2.1.0 to 3.1.3
(development dependency).
+* Updated wikimedia/ip-set from 1.1.0 to 1.2.0.
+* Updated wikimedia/relpath from 2.0.0 to 2.1.1.
+* Updated wikimedia/running-stat from 1.1.0 to 1.2.0.
+* Updated wikimedia/wrappedstring from 2.2.0 to 2.3.0.
* …
==== New external libraries ====
* The $statementsOnOwnLine parameter of JavaScriptMinifier::minify was removed.
The corresponding configuration variable ($wgResourceLoaderMinifierStatementsOnOwnLine)
has been deprecated since 1.27 and was removed as well.
+* The $maxLineLength parameter of JavaScriptMinifier::minify was removed.
+ The corresponding configuration variable ($wgResourceLoaderMinifierMaxLineLength)
+ has been deprecated since 1.27 and was removed as well.
* The HtmlFormatter class was removed (deprecated in 1.27). The namespaced
HtmlFormatter\HtmlFormatter class should be used instead.
* License::getLicenses has been deprecated; use License::getLines instead.
+* 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',
'BenchmarkLruHash' => __DIR__ . '/maintenance/benchmarks/benchmarkLruHash.php',
'BenchmarkParse' => __DIR__ . '/maintenance/benchmarks/benchmarkParse.php',
'BenchmarkPurge' => __DIR__ . '/maintenance/benchmarks/benchmarkPurge.php',
+ 'BenchmarkSanitizer' => __DIR__ . '/maintenance/benchmarks/benchmarkSanitizer.php',
'BenchmarkTidy' => __DIR__ . '/maintenance/benchmarks/benchmarkTidy.php',
'Benchmarker' => __DIR__ . '/maintenance/benchmarks/Benchmarker.php',
'BitmapHandler' => __DIR__ . '/includes/media/Bitmap.php',
'DatabaseLag' => __DIR__ . '/maintenance/lag.php',
'DatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
'DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php',
- 'DatabaseMysql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysql.php',
'DatabaseMysqlBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqlBase.php',
'DatabaseMysqli' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqli.php',
'DatabaseOracle' => __DIR__ . '/includes/db/DatabaseOracle.php',
'ExternalStoreHttp' => __DIR__ . '/includes/externalstore/ExternalStoreHttp.php',
'ExternalStoreMedium' => __DIR__ . '/includes/externalstore/ExternalStoreMedium.php',
'ExternalStoreMwstore' => __DIR__ . '/includes/externalstore/ExternalStoreMwstore.php',
+ 'ExternalUserNames' => __DIR__ . '/includes/user/ExternalUserNames.php',
'FSFile' => __DIR__ . '/includes/libs/filebackend/fsfile/FSFile.php',
'FSFileBackend' => __DIR__ . '/includes/libs/filebackend/FSFileBackend.php',
'FSFileBackendDirList' => __DIR__ . '/includes/libs/filebackend/FSFileBackend.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',
'Wikimedia\\Rdbms\\Database' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
'Wikimedia\\Rdbms\\DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php',
- 'Wikimedia\\Rdbms\\DatabaseMysql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysql.php',
'Wikimedia\\Rdbms\\DatabaseMysqlBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqlBase.php',
'Wikimedia\\Rdbms\\DatabaseMysqli' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqli.php',
'Wikimedia\\Rdbms\\DatabasePostgres' => __DIR__ . '/includes/libs/rdbms/database/DatabasePostgres.php',
"wikimedia/cldr-plural-rule-parser": "1.0.0",
"wikimedia/composer-merge-plugin": "1.4.1",
"wikimedia/html-formatter": "1.0.1",
- "wikimedia/ip-set": "1.1.0",
+ "wikimedia/ip-set": "1.2.0",
"wikimedia/php-session-serializer": "1.0.4",
"wikimedia/purtle": "1.0.6",
- "wikimedia/relpath": "2.0.0",
+ "wikimedia/relpath": "2.1.1",
"wikimedia/remex-html": "1.0.2",
- "wikimedia/running-stat": "1.1.0",
+ "wikimedia/running-stat": "1.2.1",
"wikimedia/scoped-callback": "1.0.0",
"wikimedia/utfnormal": "1.1.0",
"wikimedia/timestamp": "1.0.0",
"wikimedia/wait-condition-loop": "1.0.1",
- "wikimedia/wrappedstring": "2.2.0",
+ "wikimedia/wrappedstring": "2.3.0",
"zordius/lightncandy": "0.23"
},
"require-dev": {
'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.
$add: Array of strings corresponding to groups added
$remove: Array of strings corresponding to groups removed
-'UserSaveOptions': Called just before saving user preferences/options.
-$user: User object
-&$options: Options, modifiable
+'UserSaveOptions': Called just before saving user preferences. Hook handlers can either add or
+manipulate options, or reset one back to it's default to block changing it. Hook handlers are also
+allowed to abort the process by returning false, e.g. to save to a global profile instead. Compare
+to the UserSaveSettings hook, which is called after the preferences have been saved.
+$user: The User for which the options are going to be saved
+&$options: The users options as an associative array, modifiable
-'UserSaveSettings': Called when saving user settings.
-$user: User object
+'UserSaveSettings': Called directly after user preferences (user_properties in the database) have
+been saved. Compare to the UserSaveOptions hook, which is called before.
+$user: The User for which the options have been saved
'UserSetCookies': DEPRECATED! If you're trying to replace core session cookie
handling, you want to create a subclass of MediaWiki\Session\CookieSessionProvider
<rdfs:comment>MediaWiki category.</rdfs:comment>
</owl:Class>
+ <owl:Class rdf:about="&mediawiki;HiddenCategory">
+ <rdfs:label>HiddenCategory</rdfs:label>
+ <rdfs:comment>MediaWiki hidden category.</rdfs:comment>
+ </owl:Class>
+
<!--
///////////////////////////////////////////////////////////////////////////////////////
//
<rdfs:domain rdf:resource="&mediawiki;Category"/>
</owl:ObjectProperty>
+ <owl:DatatypeProperty rdf:about="&mediawiki;pages">
+ <rdfs:label>pages</rdfs:label>
+ <rdfs:comment>Number of articles belonging to this category.</rdfs:comment>
+ <rdfs:range rdf:resource="&mediawiki;Category"/>
+ <rdfs:range rdf:resource="&xsd;integer"/>
+ </owl:DatatypeProperty>
+
+ <owl:DatatypeProperty rdf:about="&mediawiki;subcategories">
+ <rdfs:label>subcategories</rdfs:label>
+ <rdfs:comment>Number of subcategories belonging to this category.</rdfs:comment>
+ <rdfs:range rdf:resource="&mediawiki;Category"/>
+ <rdfs:range rdf:resource="&xsd;integer"/>
+ </owl:DatatypeProperty>
+
</rdf:RDF>
/**
* Write out the data for single category.
* @param string $categoryName Category name
+ * @param bool $isHidden Hidden category?
+ * @param int $pages Page count (note this includes only Wiki articles, not subcats or files)
+ * @param int $subcategories Subcategory count
*/
- public function writeCategoryData( $categoryName ) {
+ public function writeCategoryData( $categoryName, $isHidden, $pages, $subcategories ) {
$title = Title::makeTitle( NS_CATEGORY, $categoryName );
$this->rdfWriter->about( $this->titleToUrl( $title ) )
->say( 'a' )
->is( self::ONTOLOGY_PREFIX, 'Category' );
+ if ( $isHidden ) {
+ $this->rdfWriter->is( self::ONTOLOGY_PREFIX, 'HiddenCategory' );
+ }
$titletext = $title->getText();
$this->rdfWriter->say( 'rdfs', 'label' )->value( $titletext );
+ $this->rdfWriter->say( self::ONTOLOGY_PREFIX, 'pages' )->value( $pages );
+ $this->rdfWriter->say( self::ONTOLOGY_PREFIX, 'subcategories' )->value( $subcategories );
+ // TODO: do we want files too here? Easy to add, but don't have use case so far.
}
/**
*/
$wgContentHandlers = [
// the usual case
- CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler',
+ CONTENT_MODEL_WIKITEXT => WikitextContentHandler::class,
// dumb version, no syntax highlighting
- CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler',
+ CONTENT_MODEL_JAVASCRIPT => JavaScriptContentHandler::class,
// simple implementation, for use by extensions, etc.
- CONTENT_MODEL_JSON => 'JsonContentHandler',
+ CONTENT_MODEL_JSON => JsonContentHandler::class,
// dumb version, no syntax highlighting
- CONTENT_MODEL_CSS => 'CssContentHandler',
+ CONTENT_MODEL_CSS => CssContentHandler::class,
// plain text, for use by extensions, etc.
- CONTENT_MODEL_TEXT => 'TextContentHandler',
+ CONTENT_MODEL_TEXT => TextContentHandler::class,
];
/**
* Whether to use SSL in DB connection.
*
* This setting is only used if $wgLBFactoryConf['class'] is set to
- * 'LBFactorySimple' and $wgDBservers is an empty array; otherwise
+ * '\Wikimedia\Rdbms\LBFactorySimple' and $wgDBservers is an empty array; otherwise
* the DBO_SSL flag must be set in the 'flags' option of the database
* connection to achieve the same functionality.
*/
* Whether to use compression in DB connection.
*
* This setting is only used $wgLBFactoryConf['class'] is set to
- * 'LBFactorySimple' and $wgDBservers is an empty array; otherwise
+ * '\Wikimedia\Rdbms\LBFactorySimple' and $wgDBservers is an empty array; otherwise
* the DBO_COMPRESS flag must be set in the 'flags' option of the database
* connection to achieve the same functionality.
*/
* - user: DB user
* - password: DB password
* - type: DB type
+ * - driver: DB driver (when there are multiple drivers)
*
* - load: Ratio of DB_REPLICA load, must be >=0, the sum of all loads must be >0.
* If this is zero for any given server, no normal query traffic will be
* The LBFactoryMulti class is provided for this purpose, please see
* includes/db/LBFactoryMulti.php for configuration information.
*/
-$wgLBFactoryConf = [ 'class' => 'LBFactorySimple' ];
+$wgLBFactoryConf = [ 'class' => \Wikimedia\Rdbms\LBFactorySimple::class ];
/**
* After a state-changing request is done by a client, this determines
* ];
* @endcode
*
- * Used by LBFactorySimple, may be ignored if $wgLBFactoryConf is set to
+ * Used by \Wikimedia\Rdbms\LBFactorySimple, may be ignored if $wgLBFactoryConf is set to
* another class.
*/
$wgExternalServers = [];
* given, giving a callable function which will generate a suitable cache object.
*/
$wgObjectCaches = [
- CACHE_NONE => [ 'class' => 'EmptyBagOStuff', 'reportDupes' => false ],
- CACHE_DB => [ 'class' => 'SqlBagOStuff', 'loggroup' => 'SQLBagOStuff' ],
+ CACHE_NONE => [ 'class' => EmptyBagOStuff::class, 'reportDupes' => false ],
+ CACHE_DB => [ 'class' => SqlBagOStuff::class, 'loggroup' => 'SQLBagOStuff' ],
CACHE_ANYTHING => [ 'factory' => 'ObjectCache::newAnything' ],
CACHE_ACCEL => [ 'factory' => 'ObjectCache::getLocalServerInstance' ],
- CACHE_MEMCACHED => [ 'class' => 'MemcachedPhpBagOStuff', 'loggroup' => 'memcached' ],
+ CACHE_MEMCACHED => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
'db-replicated' => [
- 'class' => 'ReplicatedBagOStuff',
+ 'class' => ReplicatedBagOStuff::class,
'readFactory' => [
- 'class' => 'SqlBagOStuff',
+ 'class' => SqlBagOStuff::class,
'args' => [ [ 'slaveOnly' => true ] ]
],
'writeFactory' => [
- 'class' => 'SqlBagOStuff',
+ 'class' => SqlBagOStuff::class,
'args' => [ [ 'slaveOnly' => false ] ]
],
'loggroup' => 'SQLBagOStuff',
'reportDupes' => false
],
- 'apc' => [ 'class' => 'APCBagOStuff', 'reportDupes' => false ],
- 'apcu' => [ 'class' => 'APCUBagOStuff', 'reportDupes' => false ],
- 'xcache' => [ 'class' => 'XCacheBagOStuff', 'reportDupes' => false ],
- 'wincache' => [ 'class' => 'WinCacheBagOStuff', 'reportDupes' => false ],
- 'memcached-php' => [ 'class' => 'MemcachedPhpBagOStuff', 'loggroup' => 'memcached' ],
- 'memcached-pecl' => [ 'class' => 'MemcachedPeclBagOStuff', 'loggroup' => 'memcached' ],
- 'hash' => [ 'class' => 'HashBagOStuff', 'reportDupes' => false ],
+ 'apc' => [ 'class' => APCBagOStuff::class, 'reportDupes' => false ],
+ 'apcu' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
+ 'xcache' => [ 'class' => XCacheBagOStuff::class, 'reportDupes' => false ],
+ 'wincache' => [ 'class' => WinCacheBagOStuff::class, 'reportDupes' => false ],
+ 'memcached-php' => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
+ 'memcached-pecl' => [ 'class' => MemcachedPeclBagOStuff::class, 'loggroup' => 'memcached' ],
+ 'hash' => [ 'class' => HashBagOStuff::class, 'reportDupes' => false ],
];
/**
*/
$wgWANObjectCaches = [
CACHE_NONE => [
- 'class' => 'WANObjectCache',
+ 'class' => WANObjectCache::class,
'cacheId' => CACHE_NONE,
'channels' => []
]
/* Example of a simple single data-center cache:
'memcached-php' => [
- 'class' => 'WANObjectCache',
+ 'class' => WANObjectCache::class,
'cacheId' => 'memcached-php',
'channels' => [ 'purge' => 'wancache-main-memcached-purge' ]
]
* Use maintenance/rebuildLocalisationCache.php instead.
*/
$wgLocalisationCacheConf = [
- 'class' => 'LocalisationCache',
+ 'class' => LocalisationCache::class,
'store' => 'detect',
'storeClass' => false,
'storeDirectory' => false,
*
* @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+";
* an extension setup function.
*/
$wgParserConf = [
- 'class' => 'Parser',
- # 'preprocessorClass' => 'Preprocessor_Hash',
+ 'class' => Parser::class,
+ # 'preprocessorClass' => Preprocessor_Hash::class,
];
/**
* @since 1.27
*/
$wgCentralIdLookupProviders = [
- 'local' => [ 'class' => 'LocalIdLookup' ],
+ 'local' => [ 'class' => LocalIdLookup::class ],
];
/**
* An advanced example:
* @code
* $wgPasswordConfig['bcrypt-peppered'] = [
- * 'class' => 'EncryptedPassword',
+ * 'class' => EncryptedPassword::class,
* 'underlying' => 'bcrypt',
* 'secrets' => [],
* 'cipher' => MCRYPT_RIJNDAEL_256,
*/
$wgPasswordConfig = [
'A' => [
- 'class' => 'MWOldPassword',
+ 'class' => MWOldPassword::class,
],
'B' => [
- 'class' => 'MWSaltedPassword',
+ 'class' => MWSaltedPassword::class,
],
'pbkdf2-legacyA' => [
- 'class' => 'LayeredParameterizedPassword',
+ 'class' => LayeredParameterizedPassword::class,
'types' => [
'A',
'pbkdf2',
],
],
'pbkdf2-legacyB' => [
- 'class' => 'LayeredParameterizedPassword',
+ 'class' => LayeredParameterizedPassword::class,
'types' => [
'B',
'pbkdf2',
],
],
'bcrypt' => [
- 'class' => 'BcryptPassword',
+ 'class' => BcryptPassword::class,
'cost' => 9,
],
'pbkdf2' => [
- 'class' => 'Pbkdf2Password',
+ 'class' => Pbkdf2Password::class,
'algo' => 'sha512',
'cost' => '30000',
'length' => '64',
* Write SQL queries to the debug log.
*
* This setting is only used $wgLBFactoryConf['class'] is set to
- * 'LBFactorySimple' and $wgDBservers is an empty array; otherwise
+ * '\Wikimedia\Rdbms\LBFactorySimple' and $wgDBservers is an empty array; otherwise
* the DBO_DEBUG flag must be set in the 'flags' option of the database
* connection to achieve the same functionality.
*/
*
* @par To completely disable logging:
* @code
- * $wgMWLoggerDefaultSpi = [ 'class' => '\\MediaWiki\\Logger\\NullSpi' ];
+ * $wgMWLoggerDefaultSpi = [ 'class' => \MediaWiki\Logger\NullSpi::class ];
* @endcode
*
* @since 1.25
* @see MwLogger
*/
$wgMWLoggerDefaultSpi = [
- 'class' => '\\MediaWiki\\Logger\\LegacySpi',
+ 'class' => \MediaWiki\Logger\LegacySpi::class,
];
/**
* 'omit_bots' => true,
* ];
* @example $wgRCFeeds['example'] = [
- * 'class' => 'ExampleRCFeed',
+ * 'class' => ExampleRCFeed::class,
* ];
* @since 1.22
*/
* @since 1.22
*/
$wgRCEngines = [
- 'redis' => 'RedisPubSubFeedEngine',
- 'udp' => 'UDPRCFeedEngine',
+ 'redis' => RedisPubSubFeedEngine::class,
+ 'udp' => UDPRCFeedEngine::class,
];
/**
* $wgOut->isSyndicated() is true.
*/
$wgFeedClasses = [
- 'rss' => 'RSSFeed',
- 'atom' => 'AtomFeed',
+ 'rss' => RSSFeed::class,
+ 'atom' => AtomFeed::class,
];
/**
* or (since 1.30) a callback to use for creating the job object.
*/
$wgJobClasses = [
- 'refreshLinks' => 'RefreshLinksJob',
- 'deleteLinks' => 'DeleteLinksJob',
- 'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
- 'sendMail' => 'EmaillingJob',
- 'enotifNotify' => 'EnotifNotifyJob',
- 'fixDoubleRedirect' => 'DoubleRedirectJob',
- 'AssembleUploadChunks' => 'AssembleUploadChunksJob',
- 'PublishStashedFile' => 'PublishStashedFileJob',
- 'ThumbnailRender' => 'ThumbnailRenderJob',
- 'recentChangesUpdate' => 'RecentChangesUpdateJob',
- 'refreshLinksPrioritized' => 'RefreshLinksJob',
- 'refreshLinksDynamic' => 'RefreshLinksJob',
- 'activityUpdateJob' => 'ActivityUpdateJob',
- 'categoryMembershipChange' => 'CategoryMembershipChangeJob',
- 'clearUserWatchlist' => 'ClearUserWatchlistJob',
- 'cdnPurge' => 'CdnPurgeJob',
- 'enqueue' => 'EnqueueJob', // local queue for multi-DC setups
- 'null' => 'NullJob'
+ 'refreshLinks' => RefreshLinksJob::class,
+ 'deleteLinks' => DeleteLinksJob::class,
+ 'htmlCacheUpdate' => HTMLCacheUpdateJob::class,
+ 'sendMail' => EmaillingJob::class,
+ 'enotifNotify' => EnotifNotifyJob::class,
+ 'fixDoubleRedirect' => DoubleRedirectJob::class,
+ 'AssembleUploadChunks' => AssembleUploadChunksJob::class,
+ 'PublishStashedFile' => PublishStashedFileJob::class,
+ 'ThumbnailRender' => ThumbnailRenderJob::class,
+ 'recentChangesUpdate' => RecentChangesUpdateJob::class,
+ 'refreshLinksPrioritized' => RefreshLinksJob::class,
+ 'refreshLinksDynamic' => RefreshLinksJob::class,
+ 'activityUpdateJob' => ActivityUpdateJob::class,
+ 'categoryMembershipChange' => CategoryMembershipChangeJob::class,
+ 'clearUserWatchlist' => ClearUserWatchlistJob::class,
+ 'cdnPurge' => CdnPurgeJob::class,
+ 'enqueue' => EnqueueJob::class, // local queue for multi-DC setups
+ 'null' => NullJob::class,
];
/**
* These settings should be global to all wikis.
*/
$wgJobTypeConf = [
- 'default' => [ 'class' => 'JobQueueDB', 'order' => 'random', 'claimTTL' => 3600 ],
+ 'default' => [ 'class' => JobQueueDB::class, 'order' => 'random', 'claimTTL' => 3600 ],
];
/**
* These settings should be global to all wikis.
*/
$wgJobQueueAggregator = [
- 'class' => 'JobQueueAggregatorNull'
+ 'class' => JobQueueAggregatorNull::class
];
/**
* Expensive Querypages are already updated.
*/
$wgSpecialPageCacheUpdates = [
- 'Statistics' => [ 'SiteStatsUpdate', 'cacheUpdate' ]
+ 'Statistics' => [ SiteStatsUpdate::class, 'cacheUpdate' ]
];
/**
* @see LogFormatter
*/
$wgLogActionsHandlers = [
- 'block/block' => 'BlockLogFormatter',
- 'block/reblock' => 'BlockLogFormatter',
- 'block/unblock' => 'BlockLogFormatter',
- 'contentmodel/change' => 'ContentModelLogFormatter',
- 'contentmodel/new' => 'ContentModelLogFormatter',
- 'delete/delete' => 'DeleteLogFormatter',
- 'delete/delete_redir' => 'DeleteLogFormatter',
- 'delete/event' => 'DeleteLogFormatter',
- 'delete/restore' => 'DeleteLogFormatter',
- 'delete/revision' => 'DeleteLogFormatter',
- 'import/interwiki' => 'ImportLogFormatter',
- 'import/upload' => 'ImportLogFormatter',
- 'managetags/activate' => 'LogFormatter',
- 'managetags/create' => 'LogFormatter',
- 'managetags/deactivate' => 'LogFormatter',
- 'managetags/delete' => 'LogFormatter',
- 'merge/merge' => 'MergeLogFormatter',
- 'move/move' => 'MoveLogFormatter',
- 'move/move_redir' => 'MoveLogFormatter',
- 'patrol/patrol' => 'PatrolLogFormatter',
- 'patrol/autopatrol' => 'PatrolLogFormatter',
- 'protect/modify' => 'ProtectLogFormatter',
- 'protect/move_prot' => 'ProtectLogFormatter',
- 'protect/protect' => 'ProtectLogFormatter',
- 'protect/unprotect' => 'ProtectLogFormatter',
- 'rights/autopromote' => 'RightsLogFormatter',
- 'rights/rights' => 'RightsLogFormatter',
- 'suppress/block' => 'BlockLogFormatter',
- 'suppress/delete' => 'DeleteLogFormatter',
- 'suppress/event' => 'DeleteLogFormatter',
- 'suppress/reblock' => 'BlockLogFormatter',
- 'suppress/revision' => 'DeleteLogFormatter',
- 'tag/update' => 'TagLogFormatter',
- 'upload/overwrite' => 'UploadLogFormatter',
- 'upload/revert' => 'UploadLogFormatter',
- 'upload/upload' => 'UploadLogFormatter',
+ 'block/block' => BlockLogFormatter::class,
+ 'block/reblock' => BlockLogFormatter::class,
+ 'block/unblock' => BlockLogFormatter::class,
+ 'contentmodel/change' => ContentModelLogFormatter::class,
+ 'contentmodel/new' => ContentModelLogFormatter::class,
+ 'delete/delete' => DeleteLogFormatter::class,
+ 'delete/delete_redir' => DeleteLogFormatter::class,
+ 'delete/event' => DeleteLogFormatter::class,
+ 'delete/restore' => DeleteLogFormatter::class,
+ 'delete/revision' => DeleteLogFormatter::class,
+ 'import/interwiki' => ImportLogFormatter::class,
+ 'import/upload' => ImportLogFormatter::class,
+ 'managetags/activate' => LogFormatter::class,
+ 'managetags/create' => LogFormatter::class,
+ 'managetags/deactivate' => LogFormatter::class,
+ 'managetags/delete' => LogFormatter::class,
+ 'merge/merge' => MergeLogFormatter::class,
+ 'move/move' => MoveLogFormatter::class,
+ 'move/move_redir' => MoveLogFormatter::class,
+ 'patrol/patrol' => PatrolLogFormatter::class,
+ 'patrol/autopatrol' => PatrolLogFormatter::class,
+ 'protect/modify' => ProtectLogFormatter::class,
+ 'protect/move_prot' => ProtectLogFormatter::class,
+ 'protect/protect' => ProtectLogFormatter::class,
+ 'protect/unprotect' => ProtectLogFormatter::class,
+ 'rights/autopromote' => RightsLogFormatter::class,
+ 'rights/rights' => RightsLogFormatter::class,
+ 'suppress/block' => BlockLogFormatter::class,
+ 'suppress/delete' => DeleteLogFormatter::class,
+ 'suppress/event' => DeleteLogFormatter::class,
+ 'suppress/reblock' => BlockLogFormatter::class,
+ 'suppress/revision' => DeleteLogFormatter::class,
+ 'tag/update' => TagLogFormatter::class,
+ 'upload/overwrite' => UploadLogFormatter::class,
+ 'upload/revert' => UploadLogFormatter::class,
+ 'upload/upload' => UploadLogFormatter::class,
];
/**
'credits' => true,
'delete' => true,
'edit' => true,
- 'editchangetags' => 'SpecialPageAction',
+ 'editchangetags' => SpecialPageAction::class,
'history' => true,
'info' => true,
'markpatrolled' => true,
'raw' => true,
'render' => true,
'revert' => true,
- 'revisiondelete' => 'SpecialPageAction',
+ 'revisiondelete' => SpecialPageAction::class,
'rollback' => true,
'submit' => true,
'unprotect' => true,
* @code
* $wgAPIModules['foo'] = 'ApiFoo';
* $wgAPIModules['bar'] = [
- * 'class' => 'ApiBar',
+ * 'class' => ApiBar::class,
* 'factory' => function( $main, $name ) { ... }
* ];
* $wgAPIModules['xyzzy'] = [
- * 'class' => 'ApiXyzzy',
- * 'factory' => [ 'XyzzyFactory', 'newApiModule' ]
+ * 'class' => ApiXyzzy::class,
+ * 'factory' => [ XyzzyFactory::class, 'newApiModule' ]
* ];
* @endcode
*
* @par Example using local redis instance:
* @code
* $wgPoolCounterConf = [ 'ArticleView' => [
- * 'class' => 'PoolCounterRedis',
+ * 'class' => PoolCounterRedis::class,
* 'timeout' => 15, // wait timeout in seconds
* 'workers' => 1, // maximum number of active threads in each pool
* 'maxqueue' => 5, // maximum number of total threads in each pool
* @par Example using C daemon from https://www.mediawiki.org/wiki/Extension:PoolCounter:
* @code
* $wgPoolCounterConf = [ 'ArticleView' => [
- * 'class' => 'PoolCounter_Client',
+ * 'class' => PoolCounter_Client::class,
* 'timeout' => 15, // wait timeout in seconds
* 'workers' => 5, // maximum number of active threads in each pool
* 'maxqueue' => 50, // maximum number of total threads in each pool
* @since 1.20
*/
$wgSiteTypes = [
- 'mediawiki' => 'MediaWikiSite',
+ 'mediawiki' => MediaWikiSite::class,
];
/**
* Auto-mounting example for Parsoid:
*
* $wgVirtualRestConfig['paths']['/parsoid/'] = [
- * 'class' => 'ParsoidVirtualRESTService',
+ * 'class' => ParsoidVirtualRESTService::class,
* 'options' => [
* 'url' => 'http://localhost:8000',
* 'prefix' => 'enwiki',
*/
$wgEventRelayerConfig = [
'default' => [
- 'class' => 'EventRelayerNull',
+ 'class' => EventRelayerNull::class,
]
];
// 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 ) ),
* like "subdir/foo.html", etc.
*
* @param string $url Either fully-qualified or a local path + query
- * @param string $defaultProto One of the PROTO_* constants. Determines the
+ * @param string|int|null $defaultProto One of the PROTO_* constants. Determines the
* protocol to use if $url or $wgServer is protocol-relative
* @return string|false Fully-qualified URL, current-path-relative URL or false if
* no valid URL can be constructed
* Restore error level to previous value
*/
function wfRestoreWarnings() {
- MediaWiki\suppressWarnings( true );
+ MediaWiki\restoreWarnings();
}
/**
// autoload entries for the lowercase variants of these classes (T166759).
// The code below is never executed, but it is picked up by the AutoloadGenerator
// parser, which scans for class_alias() calls.
- class_alias( 'ConcatenatedGzipHistoryBlob', 'concatenatedgziphistoryblob' );
- class_alias( 'HistoryBlobCurStub', 'historyblobcurstub' );
- class_alias( 'HistoryBlobStub', 'historyblobstub' );
+ class_alias( ConcatenatedGzipHistoryBlob::class, 'concatenatedgziphistoryblob' );
+ class_alias( HistoryBlobCurStub::class, 'historyblobcurstub' );
+ class_alias( HistoryBlobStub::class, 'historyblobstub' );
}
$classes = 'mw-userlink';
$page = null;
if ( $userId == 0 ) {
- $pos = strpos( $userName, '>' );
- if ( $pos !== false ) {
- $iw = explode( ':', substr( $userName, 0, $pos ) );
- $firstIw = array_shift( $iw );
- $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
- if ( $interwikiLookup->isValidInterwiki( $firstIw ) ) {
- $title = MWNamespace::getCanonicalName( NS_USER ) . ':' . substr( $userName, $pos + 1 );
- if ( $iw ) {
- $title = join( ':', $iw ) . ':' . $title;
- }
- $page = Title::makeTitle( NS_MAIN, $title, '', $firstIw );
- }
+ $page = ExternalUserNames::getUserLinkTitle( $userName );
+
+ if ( ExternalUserNames::isExternal( $userName ) ) {
$classes .= ' mw-extuserlink';
- } else {
- $page = SpecialPage::getTitleFor( 'Contributions', $userName );
- if ( $altUserName === false ) {
- $altUserName = IP::prettifyIP( $userName );
- }
+ } elseif ( $altUserName === false ) {
+ $altUserName = IP::prettifyIP( $userName );
}
$classes .= ' mw-anonuserlink'; // Separate link class for anons (T45179)
} else {
$blockable = !( $flags & self::TOOL_LINKS_NOBLOCK );
$addEmailLink = $flags & self::TOOL_LINKS_EMAIL && $userId;
- if ( $userId == 0 && strpos( $userText, '>' ) !== false ) {
+ if ( $userId == 0 && ExternalUserNames::isExternal( $userText ) ) {
// No tools for an external user
return '';
}
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
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
use MediaWiki\Session\SessionManager;
-use WrappedString\WrappedString;
-use WrappedString\WrappedStringList;
+use Wikimedia\RelPath;
+use Wikimedia\WrappedString;
+use Wikimedia\WrappedStringList;
/**
* This class should be covered by a general architecture document which does
$remotePathPrefix = $remotePath = $uploadPath;
}
- $path = RelPath\getRelativePath( $path, $remotePath );
+ $path = RelPath::getRelativePath( $path, $remotePath );
return self::transformFilePath( $remotePathPrefix, $localDir, $path );
}
'implementation' => 'PHP',
'version' => PHP_VERSION,
'vendor' => 'the PHP Group',
- 'upstreamSupported' => '5.5.0',
+ 'upstreamSupported' => '5.6.0',
'minSupported' => '5.5.9',
'upgradeURL' => 'https://secure.php.net/downloads.php',
);
$longHtml = <<<HTML
Please consider <a href="{$phpInfo['upgradeURL']}">upgrading your copy of
{$phpInfo['implementation']}</a>.
- {$phpInfo['implementation']} versions less than {$phpInfo['upstreamSupported']} are no
+ {$phpInfo['implementation']} versions less than {$phpInfo['upstreamSupported']} are no
longer supported by {$phpInfo['vendor']} and will not receive
security or bugfix updates.
</p>
<p>
If for some reason you are unable to upgrade your {$phpInfo['implementation']} version,
- you will need to <a href="https://www.mediawiki.org/wiki/Download">download</a> an
+ you will need to <a href="https://www.mediawiki.org/wiki/Download">download</a> an
older version of MediaWiki from our website.
See our<a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
for details of which versions are compatible with prior versions of {$phpInfo['implementation']}.
public static function getFormObject(
$user,
IContextSource $context,
- $formClass = 'PreferencesForm',
+ $formClass = PreferencesForm::class,
array $remove = []
) {
$preferencesFactory = self::getDefaultPreferencesFactory();
/**
* Handle the form submission if everything validated properly
*
+ * @deprecated since 1.31, use PreferencesFactory
+ *
* @param array $formData
* @param PreferencesForm $form
* @return bool|Status|string
* @file
*/
-use IPSet\IPSet;
+use Wikimedia\IPSet;
/**
* @since 1.28
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
*/
$wgLockManagers[] = [
'name' => 'fsLockManager',
- 'class' => 'FSLockManager',
+ 'class' => FSLockManager::class,
'lockDirectory' => "{$wgUploadDirectory}/lockdir",
];
$wgLockManagers[] = [
'name' => 'nullLockManager',
- 'class' => 'NullLockManager',
+ 'class' => NullLockManager::class,
];
/**
*/
if ( !$wgLocalFileRepo ) {
$wgLocalFileRepo = [
- 'class' => 'LocalRepo',
+ 'class' => LocalRepo::class,
'name' => 'local',
'directory' => $wgUploadDirectory,
'scriptDirUrl' => $wgScriptPath,
if ( $wgUseSharedUploads ) {
if ( $wgSharedUploadDBname ) {
$wgForeignFileRepos[] = [
- 'class' => 'ForeignDBRepo',
+ 'class' => ForeignDBRepo::class,
'name' => 'shared',
'directory' => $wgSharedUploadDirectory,
'url' => $wgSharedUploadPath,
];
} else {
$wgForeignFileRepos[] = [
- 'class' => 'FileRepo',
+ 'class' => FileRepo::class,
'name' => 'shared',
'directory' => $wgSharedUploadDirectory,
'url' => $wgSharedUploadPath,
}
if ( $wgUseInstantCommons ) {
$wgForeignFileRepos[] = [
- 'class' => 'ForeignAPIRepo',
+ 'class' => ForeignAPIRepo::class,
'name' => 'wikimediacommons',
'apibase' => 'https://commons.wikimedia.org/w/api.php',
'url' => 'https://upload.wikimedia.org/wikipedia/commons',
$wgLocalFileRepo['backend'] = $wgLocalFileRepo['name'] . '-backend';
}
foreach ( $wgForeignFileRepos as &$repo ) {
- if ( !isset( $repo['directory'] ) && $repo['class'] === 'ForeignAPIRepo' ) {
+ if ( !isset( $repo['directory'] ) && $repo['class'] === ForeignAPIRepo::class ) {
$repo['directory'] = $wgUploadDirectory; // b/c
}
if ( !isset( $repo['backend'] ) ) {
// Convert this deprecated setting to modern system
if ( $wgExperimentalHtmlIds ) {
+ wfDeprecated( '$wgExperimentalHtmlIds', '1.30' );
$wgFragmentMode = [ 'html5-legacy', 'html5' ];
}
$wgLogTypes[] = 'newusers';
$wgLogNames['newusers'] = 'newuserlogpage';
$wgLogHeaders['newusers'] = 'newuserlogpagetext';
- $wgLogActionsHandlers['newusers/newusers'] = 'NewUsersLogFormatter';
- $wgLogActionsHandlers['newusers/create'] = 'NewUsersLogFormatter';
- $wgLogActionsHandlers['newusers/create2'] = 'NewUsersLogFormatter';
- $wgLogActionsHandlers['newusers/byemail'] = 'NewUsersLogFormatter';
- $wgLogActionsHandlers['newusers/autocreate'] = 'NewUsersLogFormatter';
+ $wgLogActionsHandlers['newusers/newusers'] = NewUsersLogFormatter::class;
+ $wgLogActionsHandlers['newusers/create'] = NewUsersLogFormatter::class;
+ $wgLogActionsHandlers['newusers/create2'] = NewUsersLogFormatter::class;
+ $wgLogActionsHandlers['newusers/byemail'] = NewUsersLogFormatter::class;
+ $wgLogActionsHandlers['newusers/autocreate'] = NewUsersLogFormatter::class;
}
if ( $wgPageLanguageUseDB ) {
$wgLogTypes[] = 'pagelang';
- $wgLogActionsHandlers['pagelang/pagelang'] = 'PageLangLogFormatter';
+ $wgLogActionsHandlers['pagelang/pagelang'] = PageLangLogFormatter::class;
}
if ( $wgCookieSecure === 'detect' ) {
// Sites using multiple datacenters can configure a relayer.
$wgMainWANCache = 'mediawiki-main-default';
$wgWANObjectCaches[$wgMainWANCache] = [
- 'class' => 'WANObjectCache',
+ 'class' => WANObjectCache::class,
'cacheId' => $wgMainCacheType,
'channels' => [ 'purge' => 'wancache-main-default-purge' ]
];
// 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' ],
* @throws MWException
*/
private function checkDatabaseWikiId( IDatabase $db ) {
- $storeWiki = $this->wikiId;
+ $storeWiki = $this->loadBalancer->getLocalDomainID();
$dbWiki = $db->getDomainID();
if ( $dbWiki === $storeWiki ) {
return;
}
- // XXX: we really want the default database ID...
- $storeWiki = $storeWiki ?: wfWikiID();
- $dbWiki = $dbWiki ?: wfWikiID();
-
- if ( $dbWiki === $storeWiki ) {
- return;
- }
-
- // HACK: counteract encoding imposed by DatabaseDomain
- $storeWiki = str_replace( '?h', '-', $storeWiki );
- $dbWiki = str_replace( '?h', '-', $dbWiki );
-
- if ( $dbWiki === $storeWiki ) {
- return;
- }
-
throw new MWException( "RevisionStore for $storeWiki "
. "cannot be used with a DB connection for $dbWiki" );
}
* @see wfExpandUrl
* @param string|string[] $query
* @param string|string[]|bool $query2
- * @param string $proto Protocol type to use in URL
+ * @param string|int|null $proto Protocol type to use in URL
* @return string The URL
*/
public function getFullURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
if ( $this->isExternal() ) {
$target = SpecialPage::getTitleFor(
'GoToInterwiki',
- $this->getPrefixedDBKey()
+ $this->getPrefixedDBkey()
);
}
- return $target->getFullUrl( $query, false, $proto );
+ return $target->getFullURL( $query, false, $proto );
}
/**
public function response() {
/* Lazy initialization of response object for this request */
if ( !is_object( $this->response ) ) {
- $class = ( $this instanceof FauxRequest ) ? 'FauxResponse' : 'WebResponse';
+ $class = ( $this instanceof FauxRequest ) ? FauxResponse::class : WebResponse::class;
$this->response = new $class();
}
return $this->response;
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
protected function parseMultiValue( $valueName, $value, $allowMultiple, $allowedValues,
$allSpecifier = null, $limit1 = null, $limit2 = null
) {
- if ( ( trim( $value ) === '' || trim( $value ) === "\x1f" ) && $allowMultiple ) {
+ if ( ( $value === '' || $value === "\x1f" ) && $allowMultiple ) {
return [];
}
$limit1 = $limit1 ?: self::LIMIT_SML1;
<?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
* @ingroup API
*/
abstract class ApiFormatBase extends ApiBase {
- private $mIsHtml, $mFormat, $mUnescapeAmps, $mHelp;
+ private $mIsHtml, $mFormat;
private $mBuffer, $mDisabled = false;
private $mIsWrappedHtml = false;
private $mHttpStatus = false;
<?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
* List of available modules: action name => module class
*/
private static $Modules = [
- 'login' => 'ApiLogin',
- 'clientlogin' => 'ApiClientLogin',
- 'logout' => 'ApiLogout',
- 'createaccount' => 'ApiAMCreateAccount',
- 'linkaccount' => 'ApiLinkAccount',
- 'unlinkaccount' => 'ApiRemoveAuthenticationData',
- 'changeauthenticationdata' => 'ApiChangeAuthenticationData',
- 'removeauthenticationdata' => 'ApiRemoveAuthenticationData',
- 'resetpassword' => 'ApiResetPassword',
- 'query' => 'ApiQuery',
- 'expandtemplates' => 'ApiExpandTemplates',
- 'parse' => 'ApiParse',
- 'stashedit' => 'ApiStashEdit',
- 'opensearch' => 'ApiOpenSearch',
- 'feedcontributions' => 'ApiFeedContributions',
- 'feedrecentchanges' => 'ApiFeedRecentChanges',
- 'feedwatchlist' => 'ApiFeedWatchlist',
- 'help' => 'ApiHelp',
- 'paraminfo' => 'ApiParamInfo',
- 'rsd' => 'ApiRsd',
- 'compare' => 'ApiComparePages',
- 'tokens' => 'ApiTokens',
- 'checktoken' => 'ApiCheckToken',
- 'cspreport' => 'ApiCSPReport',
- 'validatepassword' => 'ApiValidatePassword',
+ 'login' => ApiLogin::class,
+ 'clientlogin' => ApiClientLogin::class,
+ 'logout' => ApiLogout::class,
+ 'createaccount' => ApiAMCreateAccount::class,
+ 'linkaccount' => ApiLinkAccount::class,
+ 'unlinkaccount' => ApiRemoveAuthenticationData::class,
+ 'changeauthenticationdata' => ApiChangeAuthenticationData::class,
+ 'removeauthenticationdata' => ApiRemoveAuthenticationData::class,
+ 'resetpassword' => ApiResetPassword::class,
+ 'query' => ApiQuery::class,
+ 'expandtemplates' => ApiExpandTemplates::class,
+ 'parse' => ApiParse::class,
+ 'stashedit' => ApiStashEdit::class,
+ 'opensearch' => ApiOpenSearch::class,
+ 'feedcontributions' => ApiFeedContributions::class,
+ 'feedrecentchanges' => ApiFeedRecentChanges::class,
+ 'feedwatchlist' => ApiFeedWatchlist::class,
+ 'help' => ApiHelp::class,
+ 'paraminfo' => ApiParamInfo::class,
+ 'rsd' => ApiRsd::class,
+ 'compare' => ApiComparePages::class,
+ 'tokens' => ApiTokens::class,
+ 'checktoken' => ApiCheckToken::class,
+ 'cspreport' => ApiCSPReport::class,
+ 'validatepassword' => ApiValidatePassword::class,
// Write modules
- 'purge' => 'ApiPurge',
- 'setnotificationtimestamp' => 'ApiSetNotificationTimestamp',
- 'rollback' => 'ApiRollback',
- 'delete' => 'ApiDelete',
- 'undelete' => 'ApiUndelete',
- 'protect' => 'ApiProtect',
- 'block' => 'ApiBlock',
- 'unblock' => 'ApiUnblock',
- 'move' => 'ApiMove',
- 'edit' => 'ApiEditPage',
- 'upload' => 'ApiUpload',
- 'filerevert' => 'ApiFileRevert',
- 'emailuser' => 'ApiEmailUser',
- 'watch' => 'ApiWatch',
- 'patrol' => 'ApiPatrol',
- 'import' => 'ApiImport',
- 'clearhasmsg' => 'ApiClearHasMsg',
- 'userrights' => 'ApiUserrights',
- 'options' => 'ApiOptions',
- 'imagerotate' => 'ApiImageRotate',
- 'revisiondelete' => 'ApiRevisionDelete',
- 'managetags' => 'ApiManageTags',
- 'tag' => 'ApiTag',
- 'mergehistory' => 'ApiMergeHistory',
- 'setpagelanguage' => 'ApiSetPageLanguage',
+ 'purge' => ApiPurge::class,
+ 'setnotificationtimestamp' => ApiSetNotificationTimestamp::class,
+ 'rollback' => ApiRollback::class,
+ 'delete' => ApiDelete::class,
+ 'undelete' => ApiUndelete::class,
+ 'protect' => ApiProtect::class,
+ 'block' => ApiBlock::class,
+ 'unblock' => ApiUnblock::class,
+ 'move' => ApiMove::class,
+ 'edit' => ApiEditPage::class,
+ 'upload' => ApiUpload::class,
+ 'filerevert' => ApiFileRevert::class,
+ 'emailuser' => ApiEmailUser::class,
+ 'watch' => ApiWatch::class,
+ 'patrol' => ApiPatrol::class,
+ 'import' => ApiImport::class,
+ 'clearhasmsg' => ApiClearHasMsg::class,
+ 'userrights' => ApiUserrights::class,
+ 'options' => ApiOptions::class,
+ 'imagerotate' => ApiImageRotate::class,
+ 'revisiondelete' => ApiRevisionDelete::class,
+ 'managetags' => ApiManageTags::class,
+ 'tag' => ApiTag::class,
+ 'mergehistory' => ApiMergeHistory::class,
+ 'setpagelanguage' => ApiSetPageLanguage::class,
];
/**
* List of available formats: format name => format class
*/
private static $Formats = [
- 'json' => 'ApiFormatJson',
- 'jsonfm' => 'ApiFormatJson',
- 'php' => 'ApiFormatPhp',
- 'phpfm' => 'ApiFormatPhp',
- 'xml' => 'ApiFormatXml',
- 'xmlfm' => 'ApiFormatXml',
- 'rawfm' => 'ApiFormatJson',
- 'none' => 'ApiFormatNone',
+ 'json' => ApiFormatJson::class,
+ 'jsonfm' => ApiFormatJson::class,
+ 'php' => ApiFormatPhp::class,
+ 'phpfm' => ApiFormatPhp::class,
+ 'xml' => ApiFormatXml::class,
+ 'xmlfm' => ApiFormatXml::class,
+ 'rawfm' => ApiFormatJson::class,
+ 'none' => ApiFormatNone::class,
];
/**
if ( $module->isWriteMode()
&& $this->getUser()->isBot()
- && wfGetLB()->getServerCount() > 1
+ && MediaWikiServices::getInstance()->getDBLoadBalancer()->getServerCount() > 1
) {
$this->checkBotReadOnly();
}
$numLagged = 0;
$lagLimit = $this->getConfig()->get( 'APIMaxLagThreshold' );
$laggedServers = [];
- $loadBalancer = wfGetLB();
+ $loadBalancer = MediaWikiServices::getInstance()->getDBLoadBalancer();
foreach ( $loadBalancer->getLagTimes() as $serverIndex => $lag ) {
if ( $lag > $lagLimit ) {
++$numLagged;
}
// If a majority of replica DBs are too lagged then disallow writes
- $replicaCount = wfGetLB()->getServerCount() - 1;
+ $replicaCount = $loadBalancer->getServerCount() - 1;
if ( $numLagged >= ceil( $replicaCount / 2 ) ) {
$laggedServers = implode( ', ', $laggedServers );
wfDebugLog(
<?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
* @code
* $modules['foo'] = 'ApiFoo';
* $modules['bar'] = [
- * 'class' => 'ApiBar',
+ * 'class' => ApiBar::class,
* 'factory' => function( $main, $name ) { ... }
* ];
* $modules['xyzzy'] = [
- * 'class' => 'ApiXyzzy',
- * 'factory' => [ 'XyzzyFactory', 'newApiModule' ]
+ * 'class' => ApiXyzzy::class,
+ * 'factory' => [ XyzzyFactory::class, 'newApiModule' ]
* ];
* @endcode
*
<?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
$prefix = $query->getModulePath() . '+';
$mgr = $query->getModuleManager();
foreach ( $mgr->getNamesWithClasses() as $name => $class ) {
- if ( is_subclass_of( $class, 'ApiQueryGeneratorBase' ) ) {
+ if ( is_subclass_of( $class, ApiQueryGeneratorBase::class ) ) {
$gens[$name] = $prefix . $name;
}
}
<?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
* @var array
*/
private static $QueryPropModules = [
- 'categories' => 'ApiQueryCategories',
- 'categoryinfo' => 'ApiQueryCategoryInfo',
- 'contributors' => 'ApiQueryContributors',
- 'deletedrevisions' => 'ApiQueryDeletedRevisions',
- 'duplicatefiles' => 'ApiQueryDuplicateFiles',
- 'extlinks' => 'ApiQueryExternalLinks',
- 'fileusage' => 'ApiQueryBacklinksprop',
- 'images' => 'ApiQueryImages',
- 'imageinfo' => 'ApiQueryImageInfo',
- 'info' => 'ApiQueryInfo',
- 'links' => 'ApiQueryLinks',
- 'linkshere' => 'ApiQueryBacklinksprop',
- 'iwlinks' => 'ApiQueryIWLinks',
- 'langlinks' => 'ApiQueryLangLinks',
- 'pageprops' => 'ApiQueryPageProps',
- 'redirects' => 'ApiQueryBacklinksprop',
- 'revisions' => 'ApiQueryRevisions',
- 'stashimageinfo' => 'ApiQueryStashImageInfo',
- 'templates' => 'ApiQueryLinks',
- 'transcludedin' => 'ApiQueryBacklinksprop',
+ 'categories' => ApiQueryCategories::class,
+ 'categoryinfo' => ApiQueryCategoryInfo::class,
+ 'contributors' => ApiQueryContributors::class,
+ 'deletedrevisions' => ApiQueryDeletedRevisions::class,
+ 'duplicatefiles' => ApiQueryDuplicateFiles::class,
+ 'extlinks' => ApiQueryExternalLinks::class,
+ 'fileusage' => ApiQueryBacklinksprop::class,
+ 'images' => ApiQueryImages::class,
+ 'imageinfo' => ApiQueryImageInfo::class,
+ 'info' => ApiQueryInfo::class,
+ 'links' => ApiQueryLinks::class,
+ 'linkshere' => ApiQueryBacklinksprop::class,
+ 'iwlinks' => ApiQueryIWLinks::class,
+ 'langlinks' => ApiQueryLangLinks::class,
+ 'pageprops' => ApiQueryPageProps::class,
+ 'redirects' => ApiQueryBacklinksprop::class,
+ 'revisions' => ApiQueryRevisions::class,
+ 'stashimageinfo' => ApiQueryStashImageInfo::class,
+ 'templates' => ApiQueryLinks::class,
+ 'transcludedin' => ApiQueryBacklinksprop::class,
];
/**
* @var array
*/
private static $QueryListModules = [
- 'allcategories' => 'ApiQueryAllCategories',
- 'alldeletedrevisions' => 'ApiQueryAllDeletedRevisions',
- 'allfileusages' => 'ApiQueryAllLinks',
- 'allimages' => 'ApiQueryAllImages',
- 'alllinks' => 'ApiQueryAllLinks',
- 'allpages' => 'ApiQueryAllPages',
- 'allredirects' => 'ApiQueryAllLinks',
- 'allrevisions' => 'ApiQueryAllRevisions',
- 'mystashedfiles' => 'ApiQueryMyStashedFiles',
- 'alltransclusions' => 'ApiQueryAllLinks',
- 'allusers' => 'ApiQueryAllUsers',
- 'backlinks' => 'ApiQueryBacklinks',
- 'blocks' => 'ApiQueryBlocks',
- 'categorymembers' => 'ApiQueryCategoryMembers',
- 'deletedrevs' => 'ApiQueryDeletedrevs',
- 'embeddedin' => 'ApiQueryBacklinks',
- 'exturlusage' => 'ApiQueryExtLinksUsage',
- 'filearchive' => 'ApiQueryFilearchive',
- 'imageusage' => 'ApiQueryBacklinks',
- 'iwbacklinks' => 'ApiQueryIWBacklinks',
- 'langbacklinks' => 'ApiQueryLangBacklinks',
- 'logevents' => 'ApiQueryLogEvents',
- 'pageswithprop' => 'ApiQueryPagesWithProp',
- 'pagepropnames' => 'ApiQueryPagePropNames',
- 'prefixsearch' => 'ApiQueryPrefixSearch',
- 'protectedtitles' => 'ApiQueryProtectedTitles',
- 'querypage' => 'ApiQueryQueryPage',
- 'random' => 'ApiQueryRandom',
- 'recentchanges' => 'ApiQueryRecentChanges',
- 'search' => 'ApiQuerySearch',
- 'tags' => 'ApiQueryTags',
- 'usercontribs' => 'ApiQueryContributions',
- 'users' => 'ApiQueryUsers',
- 'watchlist' => 'ApiQueryWatchlist',
- 'watchlistraw' => 'ApiQueryWatchlistRaw',
+ 'allcategories' => ApiQueryAllCategories::class,
+ 'alldeletedrevisions' => ApiQueryAllDeletedRevisions::class,
+ 'allfileusages' => ApiQueryAllLinks::class,
+ 'allimages' => ApiQueryAllImages::class,
+ 'alllinks' => ApiQueryAllLinks::class,
+ 'allpages' => ApiQueryAllPages::class,
+ 'allredirects' => ApiQueryAllLinks::class,
+ 'allrevisions' => ApiQueryAllRevisions::class,
+ 'mystashedfiles' => ApiQueryMyStashedFiles::class,
+ 'alltransclusions' => ApiQueryAllLinks::class,
+ 'allusers' => ApiQueryAllUsers::class,
+ 'backlinks' => ApiQueryBacklinks::class,
+ 'blocks' => ApiQueryBlocks::class,
+ 'categorymembers' => ApiQueryCategoryMembers::class,
+ 'deletedrevs' => ApiQueryDeletedrevs::class,
+ 'embeddedin' => ApiQueryBacklinks::class,
+ 'exturlusage' => ApiQueryExtLinksUsage::class,
+ 'filearchive' => ApiQueryFilearchive::class,
+ 'imageusage' => ApiQueryBacklinks::class,
+ 'iwbacklinks' => ApiQueryIWBacklinks::class,
+ 'langbacklinks' => ApiQueryLangBacklinks::class,
+ 'logevents' => ApiQueryLogEvents::class,
+ 'pageswithprop' => ApiQueryPagesWithProp::class,
+ 'pagepropnames' => ApiQueryPagePropNames::class,
+ 'prefixsearch' => ApiQueryPrefixSearch::class,
+ 'protectedtitles' => ApiQueryProtectedTitles::class,
+ 'querypage' => ApiQueryQueryPage::class,
+ 'random' => ApiQueryRandom::class,
+ 'recentchanges' => ApiQueryRecentChanges::class,
+ 'search' => ApiQuerySearch::class,
+ 'tags' => ApiQueryTags::class,
+ 'usercontribs' => ApiQueryContributions::class,
+ 'users' => ApiQueryUsers::class,
+ 'watchlist' => ApiQueryWatchlist::class,
+ 'watchlistraw' => ApiQueryWatchlistRaw::class,
];
/**
* @var array
*/
private static $QueryMetaModules = [
- 'allmessages' => 'ApiQueryAllMessages',
- 'authmanagerinfo' => 'ApiQueryAuthManagerInfo',
- 'siteinfo' => 'ApiQuerySiteinfo',
- 'userinfo' => 'ApiQueryUserInfo',
- 'filerepoinfo' => 'ApiQueryFileRepoInfo',
- 'tokens' => 'ApiQueryTokens',
+ 'allmessages' => ApiQueryAllMessages::class,
+ 'authmanagerinfo' => ApiQueryAuthManagerInfo::class,
+ 'siteinfo' => ApiQuerySiteinfo::class,
+ 'userinfo' => ApiQueryUserInfo::class,
+ 'filerepoinfo' => ApiQueryFileRepoInfo::class,
+ 'tokens' => ApiQueryTokens::class,
];
/**
<?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
}
$this->tokenFunctions = [
- 'edit' => [ 'ApiQueryInfo', 'getEditToken' ],
- 'delete' => [ 'ApiQueryInfo', 'getDeleteToken' ],
- 'protect' => [ 'ApiQueryInfo', 'getProtectToken' ],
- 'move' => [ 'ApiQueryInfo', 'getMoveToken' ],
- 'block' => [ 'ApiQueryInfo', 'getBlockToken' ],
- 'unblock' => [ 'ApiQueryInfo', 'getUnblockToken' ],
- 'email' => [ 'ApiQueryInfo', 'getEmailToken' ],
- 'import' => [ 'ApiQueryInfo', 'getImportToken' ],
- 'watch' => [ 'ApiQueryInfo', 'getWatchToken' ],
+ 'edit' => [ self::class, 'getEditToken' ],
+ 'delete' => [ self::class, 'getDeleteToken' ],
+ 'protect' => [ self::class, 'getProtectToken' ],
+ 'move' => [ self::class, 'getMoveToken' ],
+ 'block' => [ self::class, 'getBlockToken' ],
+ 'unblock' => [ self::class, 'getUnblockToken' ],
+ 'email' => [ self::class, 'getEmailToken' ],
+ 'import' => [ self::class, 'getImportToken' ],
+ 'watch' => [ self::class, 'getWatchToken' ],
];
Hooks::run( 'APIQueryInfoTokens', [ &$this->tokenFunctions ] );
$this->everything = $this->titles + $this->missing;
$result = $this->getResult();
- uasort( $this->everything, [ 'Title', 'compare' ] );
+ uasort( $this->everything, [ Title::class, 'compare' ] );
if ( !is_null( $this->params['continue'] ) ) {
// Throw away any titles we're gonna skip so they don't
// clutter queries
/**
* 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
}
$this->tokenFunctions = [
- 'patrol' => [ 'ApiQueryRecentChanges', 'getPatrolToken' ]
+ 'patrol' => [ self::class, 'getPatrolToken' ]
];
Hooks::run( 'APIQueryRecentChangesTokens', [ &$this->tokenFunctions ] );
<?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
}
$this->tokenFunctions = [
- 'rollback' => [ 'ApiQueryRevisions', 'getRollbackToken' ]
+ 'rollback' => [ self::class, 'getRollbackToken' ]
];
Hooks::run( 'APIQueryRevisionsTokens', [ &$this->tokenFunctions ] );
<?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
protected function appendDbReplLagInfo( $property, $includeAll ) {
$data = [];
- $lb = wfGetLB();
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
$showHostnames = $this->getConfig()->get( 'ShowHostnames' );
if ( $includeAll ) {
if ( !$showHostnames ) {
foreach ( $myWgHooks as $name => $subscribers ) {
$arr = [
'name' => $name,
- 'subscribers' => array_map( [ 'SpecialVersion', 'arrayToString' ], $subscribers ),
+ 'subscribers' => array_map( [ SpecialVersion::class, 'arrayToString' ], $subscribers ),
];
ApiResult::setArrayType( $arr['subscribers'], 'array' );
<?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
}
$this->tokenFunctions = [
- 'userrights' => [ 'ApiQueryUsers', 'getUserrightsToken' ],
+ 'userrights' => [ self::class, 'getUserrightsToken' ],
];
Hooks::run( 'APIQueryUsersTokens', [ &$this->tokenFunctions ] );
<?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
if ( $types ) {
return $types;
}
- $types = [ 'patrol' => [ 'ApiQueryRecentChanges', 'getPatrolToken' ] ];
+ $types = [ 'patrol' => [ ApiQueryRecentChanges::class, 'getPatrolToken' ] ];
$names = [ 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
'email', 'import', 'watch', 'options' ];
foreach ( $names as $name ) {
- $types[$name] = [ 'ApiQueryInfo', 'get' . ucfirst( $name ) . 'Token' ];
+ $types[$name] = [ ApiQueryInfo::class, 'get' . ucfirst( $name ) . 'Token' ];
}
Hooks::run( 'ApiTokensGetTokenTypes', [ &$types ] );
<?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
*/
protected function handleStashException( $e ) {
switch ( get_class( $e ) ) {
- case 'UploadStashFileNotFoundException':
+ case UploadStashFileNotFoundException::class:
$wrap = 'apierror-stashedfilenotfound';
break;
- case 'UploadStashBadPathException':
+ case UploadStashBadPathException::class:
$wrap = 'apierror-stashpathinvalid';
break;
- case 'UploadStashFileException':
+ case UploadStashFileException::class:
$wrap = 'apierror-stashfilestorage';
break;
- case 'UploadStashZeroLengthFileException':
+ case UploadStashZeroLengthFileException::class:
$wrap = 'apierror-stashzerolength';
break;
- case 'UploadStashNotLoggedInException':
+ case UploadStashNotLoggedInException::class:
return StatusValue::newFatal( ApiMessage::create(
[ 'apierror-mustbeloggedin', $this->msg( 'action-upload' ) ], 'stashnotloggedin'
) );
- case 'UploadStashWrongOwnerException':
+ case UploadStashWrongOwnerException::class:
$wrap = 'apierror-stashwrongowner';
break;
- case 'UploadStashNoSuchKeyException':
+ case UploadStashNoSuchKeyException::class:
$wrap = 'apierror-stashnosuchfilekey';
break;
default:
<?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
},
"apihelp-main-summary": "",
- "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Testing:</strong> For ease of testing API requests, see [[Special:ApiSandbox]].",
+ "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Testing:</strong> For ease of testing API requests, see [[Special:ApiSandbox]].</p>",
"apihelp-main-param-action": "Which action to perform.",
"apihelp-main-param-format": "The format of the output.",
"apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code <samp>maxlag</samp> is returned with a message like <samp>Waiting for $host: $lag seconds lagged</samp>.<br />See [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]] for more information.",
"apihelp-query+watchlist-paramvalue-prop-sizes": "Añade la longitud vieja y la nueva de la página.",
"apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Añade fecha y hora de cuando el usuario fue notificado por última vez acerca de la edición.",
"apihelp-query+watchlist-paramvalue-prop-loginfo": "Añade información del registro cuando corresponda.",
+ "apihelp-query+watchlist-paramvalue-prop-tags": "Enumera las etiquetas de la entrada.",
"apihelp-query+watchlist-param-show": "Muestra solo los elementos que cumplan estos criterios. Por ejemplo, para ver solo ediciones menores realizadas por usuarios conectados, introduce $1show=minor|!anon.",
"apihelp-query+watchlist-param-type": "Qué tipos de cambios mostrar:",
"apihelp-query+watchlist-paramvalue-type-edit": "Ediciones comunes a páginas",
"apihelp-opensearch-param-suggest": "کاری نکنید اگر <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> false است.",
"apihelp-opensearch-param-format": "فرمت خروجی.",
"apihelp-opensearch-example-te": "یافتن صفحههایی که با <kbd>Te</kbd> آغاز میشوند",
+ "apihelp-options-summary": "تغییر ترجیحات کاربر جاری",
"apihelp-options-param-reset": "ترجیحات را به مقادیر پیش فرض سایت بازمی گرداند.",
"apihelp-options-example-reset": "بازنشانی همه تنظیمات.",
"apihelp-paraminfo-param-helpformat": "ساختار راهنمای رشتهها",
"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": "Подготовка правки в общем кэше.",
// Fetch the user ID from the master, so that we don't try to create the user
// when they already exist, due to replication lag
// @codeCoverageIgnoreStart
- if ( !$localId && wfGetLB()->getReaderIndex() != 0 ) {
+ if (
+ !$localId &&
+ MediaWikiServices::getInstance()->getDBLoadBalancer()->getReaderIndex() != 0
+ ) {
$localId = User::idFromName( $username, User::READ_LATEST );
$flags = User::READ_LATEST;
}
$wgParser->firstCallInit();
# Clone it and store it
$class = $wgParserConf['class'];
- if ( $class == 'ParserDiffTest' ) {
+ if ( $class == ParserDiffTest::class ) {
# Uncloneable
$this->mParser = new $class( $wgParserConf );
} else {
switch ( $conf['store'] ) {
case 'files':
case 'file':
- $storeClass = 'LCStoreCDB';
+ $storeClass = LCStoreCDB::class;
break;
case 'db':
- $storeClass = 'LCStoreDB';
+ $storeClass = LCStoreDB::class;
break;
case 'array':
- $storeClass = 'LCStoreStaticArray';
+ $storeClass = LCStoreStaticArray::class;
break;
case 'detect':
if ( !empty( $conf['storeDirectory'] ) ) {
- $storeClass = 'LCStoreCDB';
+ $storeClass = LCStoreCDB::class;
} elseif ( $wgCacheDirectory ) {
$storeConf['directory'] = $wgCacheDirectory;
- $storeClass = 'LCStoreCDB';
+ $storeClass = LCStoreCDB::class;
} else {
- $storeClass = 'LCStoreDB';
+ $storeClass = LCStoreDB::class;
}
break;
default:
$this->timestamp = $revision->getTimestamp();
}
$this->revision = $revision;
- $this->newForCategorizationCallback = [ 'RecentChange', 'newForCategorization' ];
+ $this->newForCategorizationCallback = [ RecentChange::class, 'newForCategorization' ];
}
/**
) {
switch ( $typeName ) {
case 'revision':
- $className = 'ChangeTagsRevisionList';
+ $className = ChangeTagsRevisionList::class;
break;
case 'logentry':
- $className = 'ChangeTagsLogList';
+ $className = ChangeTagsLogList::class;
break;
default:
throw new Exception( "Class $typeName requested, but does not exist" );
--- /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 );
}
}
*/
public function register( $name, $callback ) {
if ( !is_callable( $callback ) && !( $callback instanceof Config ) ) {
- throw new InvalidArgumentException( 'Invalid callback provided' );
+ if ( is_array( $callback ) ) {
+ $callback = '[ ' . implode( ', ', $callback ) . ' ]';
+ } elseif ( is_object( $callback ) ) {
+ $callback = 'instanceof ' . get_class( $callback );
+ }
+ throw new InvalidArgumentException( 'Invalid callback \'' . $callback . '\' provided' );
}
unset( $this->configs[$name] );
}
/**
- * 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() {
// When making changes here, remember to also specify MediaWiki-specific options
// for Database classes in the relevant Installer subclass.
// Such as MysqlInstaller::openConnection and PostgresInstaller::openConnectionWithParams.
- if ( $lbConf['class'] === 'LBFactorySimple' ) {
+ if ( $lbConf['class'] === Wikimedia\Rdbms\LBFactorySimple::class ) {
if ( isset( $lbConf['servers'] ) ) {
// Server array is already explicitly configured; leave alone
} elseif ( is_array( $mainConfig->get( 'DBservers' ) ) ) {
if ( !isset( $lbConf['externalClusters'] ) ) {
$lbConf['externalClusters'] = $mainConfig->get( 'ExternalServers' );
}
- } elseif ( $lbConf['class'] === 'LBFactoryMulti' ) {
+ } elseif ( $lbConf['class'] === Wikimedia\Rdbms\LBFactoryMulti::class ) {
if ( isset( $lbConf['serverTemplate'] ) ) {
if ( in_array( $lbConf['serverTemplate']['type'], $typesWithSchema, true ) ) {
$lbConf['serverTemplate']['schema'] = $mainConfig->get( 'DBmwschema' );
* Usage:
* @code
* $wgMWLoggerDefaultSpi = [
- * 'class' => '\\MediaWiki\\Logger\\LegacySpi',
+ * 'class' => \MediaWiki\Logger\LegacySpi::class,
* ];
* @endcode
*
* default SPI provider:
* @code
* $wgMWLoggerDefaultSpi = [
- * 'class' => '\\MediaWiki\\Logger\\MonologSpi',
+ * 'class' => \MediaWiki\Logger\MonologSpi::class,
* 'args' => [ [
* 'loggers' => [
* '@default' => [
* ],
* 'processors' => [
* 'wiki' => [
- * 'class' => '\\MediaWiki\\Logger\\Monolog\\WikiProcessor',
+ * 'class' => \MediaWiki\Logger\Monolog\WikiProcessor::class,
* ],
* 'psr' => [
- * 'class' => '\\Monolog\\Processor\\PsrLogMessageProcessor',
+ * 'class' => \Monolog\Processor\PsrLogMessageProcessor::class,
* ],
* 'pid' => [
- * 'class' => '\\Monolog\\Processor\\ProcessIdProcessor',
+ * 'class' => \Monolog\Processor\ProcessIdProcessor::class,
* ],
* 'uid' => [
- * 'class' => '\\Monolog\\Processor\\UidProcessor',
+ * 'class' => \Monolog\Processor\UidProcessor::class,
* ],
* 'web' => [
- * 'class' => '\\Monolog\\Processor\\WebProcessor',
+ * 'class' => \Monolog\Processor\WebProcessor::class,
* ],
* ],
* 'handlers' => [
* 'stream' => [
- * 'class' => '\\Monolog\\Handler\\StreamHandler',
+ * 'class' => \Monolog\Handler\StreamHandler::class,
* 'args' => [ 'path/to/your.log' ],
* 'formatter' => 'line',
* ],
* 'redis' => [
- * 'class' => '\\Monolog\\Handler\\RedisHandler',
+ * 'class' => \Monolog\Handler\RedisHandler::class,
* 'args' => [ function() {
* $redis = new Redis();
* $redis->connect( '127.0.0.1', 6379 );
* 'buffer' => true,
* ],
* 'udp2log' => [
- * 'class' => '\\MediaWiki\\Logger\\Monolog\\LegacyHandler',
+ * 'class' => \MediaWiki\Logger\Monolog\LegacyHandler::class,
* 'args' => [
* 'udp://127.0.0.1:8420/mediawiki
* ],
* ],
* 'formatters' => [
* 'line' => [
- * 'class' => '\\Monolog\\Formatter\\LineFormatter',
+ * 'class' => \Monolog\Formatter\LineFormatter::class,
* ],
* 'logstash' => [
- * 'class' => '\\Monolog\\Formatter\\LogstashFormatter',
+ * 'class' => \Monolog\Formatter\LogstashFormatter::class,
* 'args' => [ 'mediawiki', php_uname( 'n' ), null, '', 1 ],
* ],
* ],
* Usage:
*
* $wgMWLoggerDefaultSpi = [
- * 'class' => '\\MediaWiki\\Logger\\NullSpi',
+ * 'class' => \MediaWiki\Logger\NullSpi::class,
* ];
*
* @see \MediaWiki\Logger\LoggerFactory
*/
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;
}
global $wgLang;
foreach ( $this->getTrace() as $frame ) {
- if ( isset( $frame['class'] ) && $frame['class'] === 'LocalisationCache' ) {
+ if ( isset( $frame['class'] ) && $frame['class'] === LocalisationCache::class ) {
return false;
}
}
$logger = LoggerFactory::getInstance( 'fatal' );
$logger->error( $msg, [
'fatal_exception' => [
- 'class' => 'ErrorException',
+ 'class' => ErrorException::class,
'message' => "PHP Fatal Error: {$message}",
'code' => $level,
'file' => $file,
private static function useOutputPage( $e ) {
// Can the extension use the Message class/wfMessage to get i18n-ed messages?
foreach ( $e->getTrace() as $frame ) {
- if ( isset( $frame['class'] ) && $frame['class'] === 'LocalisationCache' ) {
+ if ( isset( $frame['class'] ) && $frame['class'] === LocalisationCache::class ) {
return false;
}
}
// Get the FS backend configuration
$autoBackends[] = [
'name' => $backendName,
- 'class' => 'FSFileBackend',
+ 'class' => FSFileBackend::class,
'lockManager' => 'fsLockManager',
'containerPaths' => [
"{$repoName}-public" => "{$directory}",
$config = $this->config( $name );
$class = $config['class'];
- if ( $class === 'FileBackendMultiWrite' ) {
+ if ( $class === FileBackendMultiWrite::class ) {
foreach ( $config['backends'] as $index => $beConfig ) {
if ( isset( $beConfig['template'] ) ) {
// Config is just a modified version of a registered backend's.
'wikiId' => wfWikiID(), // e.g. "my_wiki-en_"
'mimeCallback' => [ $this, 'guessMimeInternal' ],
'obResetFunc' => 'wfResetOutputBuffers',
- 'streamMimeFunc' => [ 'StreamFile', 'contentTypeFromPath' ],
+ 'streamMimeFunc' => [ StreamFile::class, 'contentTypeFromPath' ],
'tmpDirectory' => wfTempDir(),
- 'statusWrapper' => [ 'Status', 'wrap' ],
+ 'statusWrapper' => [ Status::class, 'wrap' ],
'wanCache' => MediaWikiServices::getInstance()->getMainWANObjectCache(),
'srvCache' => ObjectCache::getLocalServerInstance( 'hash' ),
'logger' => LoggerFactory::getInstance( 'FileOperation' ),
LockManagerGroup::singleton( $config['wikiId'] )->get( $config['lockManager'] );
$config['fileJournal'] = isset( $config['fileJournal'] )
? FileJournal::factory( $config['fileJournal'], $name )
- : FileJournal::factory( [ 'class' => 'NullFileJournal' ], $name );
+ : FileJournal::factory( [ 'class' => NullFileJournal::class ], $name );
return $config;
}
if ( !isset( $this->managers[$name]['instance'] ) ) {
$class = $this->managers[$name]['class'];
$config = $this->managers[$name]['config'];
- if ( $class === 'DBLockManager' ) {
+ if ( $class === DBLockManager::class ) {
$lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
$lb = $lbFactory->newMainLB( $config['domain'] );
$dbw = $lb->getLazyConnectionRef( DB_MASTER, [], $config['domain'] );
protected $isPrivate;
/** @var array callable Override these in the base class */
- protected $fileFactory = [ 'UnregisteredLocalFile', 'newFromTitle' ];
+ protected $fileFactory = [ UnregisteredLocalFile::class, 'newFromTitle' ];
/** @var array callable|bool Override these in the base class */
protected $oldFileFactory = false;
/** @var array callable|bool Override these in the base class */
* @return Status
*/
public function newFatal( $message /*, parameters...*/ ) {
- $status = call_user_func_array( [ 'Status', 'newFatal' ], func_get_args() );
+ $status = call_user_func_array( [ Status::class, 'newFatal' ], func_get_args() );
$status->cleanCallback = $this->getErrorCleanupFunction();
return $status;
* Example config:
*
* $wgForeignFileRepos[] = [
- * 'class' => 'ForeignAPIRepo',
+ * 'class' => ForeignAPIRepo::class,
* 'name' => 'shared',
* 'apibase' => 'https://en.wikipedia.org/w/api.php',
* 'fetchDescription' => true, // Optional
'timestamp',
];
- protected $fileFactory = [ 'ForeignAPIFile', 'newFromTitle' ];
+ protected $fileFactory = [ ForeignAPIFile::class, 'newFromTitle' ];
/** @var int Check back with Commons after this expiry */
protected $apiThumbCacheExpiry = 86400; // 1 day (24*3600)
protected $dbConn;
/** @var callable */
- protected $fileFactory = [ 'ForeignDBFile', 'newFromTitle' ];
+ protected $fileFactory = [ ForeignDBFile::class, 'newFromTitle' ];
/** @var callable */
- protected $fileFromRowFactory = [ 'ForeignDBFile', 'newFromRow' ];
+ protected $fileFromRowFactory = [ ForeignDBFile::class, 'newFromRow' ];
/**
* @param array|null $info
protected $tablePrefix;
/** @var array */
- protected $fileFactory = [ 'ForeignDBFile', 'newFromTitle' ];
+ protected $fileFactory = [ ForeignDBFile::class, 'newFromTitle' ];
/** @var array */
- protected $fileFromRowFactory = [ 'ForeignDBFile', 'newFromRow' ];
+ protected $fileFromRowFactory = [ ForeignDBFile::class, 'newFromRow' ];
/** @var bool */
protected $hasSharedCache;
*/
class LocalRepo extends FileRepo {
/** @var callable */
- protected $fileFactory = [ 'LocalFile', 'newFromTitle' ];
+ protected $fileFactory = [ LocalFile::class, 'newFromTitle' ];
/** @var callable */
- protected $fileFactoryKey = [ 'LocalFile', 'newFromKey' ];
+ protected $fileFactoryKey = [ LocalFile::class, 'newFromKey' ];
/** @var callable */
- protected $fileFromRowFactory = [ 'LocalFile', 'newFromRow' ];
+ protected $fileFromRowFactory = [ LocalFile::class, 'newFromRow' ];
/** @var callable */
- protected $oldFileFromRowFactory = [ 'OldLocalFile', 'newFromRow' ];
+ protected $oldFileFromRowFactory = [ OldLocalFile::class, 'newFromRow' ];
/** @var callable */
- protected $oldFileFactory = [ 'OldLocalFile', 'newFromTitle' ];
+ protected $oldFileFactory = [ OldLocalFile::class, 'newFromTitle' ];
/** @var callable */
- protected $oldFileFactoryKey = [ 'OldLocalFile', 'newFromKey' ];
+ protected $oldFileFactoryKey = [ OldLocalFile::class, 'newFromKey' ];
function __construct( array $info = null ) {
parent::__construct( $info );
protected $isSafeFile;
/** @var string Required Repository class type */
- protected $repoClass = 'FileRepo';
+ protected $repoClass = FileRepo::class;
/** @var array Cache of tmp filepaths pointing to generated bucket thumbnails, keyed by width */
protected $tmpBucketedThumbCache = [];
/** @var array */
private $mInfo = [];
- protected $repoClass = 'ForeignApiRepo';
+ protected $repoClass = ForeignApiRepo::class;
/**
* @param Title|string|bool $title
protected $deleted;
/** @var string */
- protected $repoClass = 'LocalRepo';
+ protected $repoClass = LocalRepo::class;
/** @var int Number of line to return by nextHistoryLine() (constructor) */
private $historyLine;
private static function loadModes() {
if ( self::$modeMapping === false ) {
self::$modeMapping = [
- 'traditional' => 'TraditionalImageGallery',
- 'nolines' => 'NolinesImageGallery',
- 'packed' => 'PackedImageGallery',
- 'packed-hover' => 'PackedHoverImageGallery',
- 'packed-overlay' => 'PackedOverlayImageGallery',
- 'slideshow' => 'SlideshowImageGallery',
+ 'traditional' => TraditionalImageGallery::class,
+ 'nolines' => NolinesImageGallery::class,
+ 'packed' => PackedImageGallery::class,
+ 'packed-hover' => PackedHoverImageGallery::class,
+ 'packed-overlay' => PackedOverlayImageGallery::class,
+ 'slideshow' => SlideshowImageGallery::class,
];
// Allow extensions to make a new gallery format.
Hooks::run( 'GalleryGetModes', [ &self::$modeMapping ] );
/**
* 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'];
}
}
class HTMLForm extends ContextSource {
// A mapping of 'type' inputs onto standard HTMLFormField subclasses
public static $typeMappings = [
- 'api' => 'HTMLApiField',
- 'text' => 'HTMLTextField',
- 'textwithbutton' => 'HTMLTextFieldWithButton',
- 'textarea' => 'HTMLTextAreaField',
- 'select' => 'HTMLSelectField',
- 'combobox' => 'HTMLComboboxField',
- 'radio' => 'HTMLRadioField',
- 'multiselect' => 'HTMLMultiSelectField',
- 'limitselect' => 'HTMLSelectLimitField',
- 'check' => 'HTMLCheckField',
- 'toggle' => 'HTMLCheckField',
- 'int' => 'HTMLIntField',
- 'float' => 'HTMLFloatField',
- 'info' => 'HTMLInfoField',
- 'selectorother' => 'HTMLSelectOrOtherField',
- 'selectandother' => 'HTMLSelectAndOtherField',
- 'namespaceselect' => 'HTMLSelectNamespace',
- 'namespaceselectwithbutton' => 'HTMLSelectNamespaceWithButton',
- 'tagfilter' => 'HTMLTagFilter',
- 'sizefilter' => 'HTMLSizeFilterField',
- 'submit' => 'HTMLSubmitField',
- 'hidden' => 'HTMLHiddenField',
- 'edittools' => 'HTMLEditTools',
- 'checkmatrix' => 'HTMLCheckMatrix',
- 'cloner' => 'HTMLFormFieldCloner',
- 'autocompleteselect' => 'HTMLAutoCompleteSelectField',
- 'date' => 'HTMLDateTimeField',
- 'time' => 'HTMLDateTimeField',
- 'datetime' => 'HTMLDateTimeField',
+ 'api' => HTMLApiField::class,
+ 'text' => HTMLTextField::class,
+ 'textwithbutton' => HTMLTextFieldWithButton::class,
+ 'textarea' => HTMLTextAreaField::class,
+ 'select' => HTMLSelectField::class,
+ 'combobox' => HTMLComboboxField::class,
+ 'radio' => HTMLRadioField::class,
+ 'multiselect' => HTMLMultiSelectField::class,
+ 'limitselect' => HTMLSelectLimitField::class,
+ 'check' => HTMLCheckField::class,
+ 'toggle' => HTMLCheckField::class,
+ 'int' => HTMLIntField::class,
+ 'float' => HTMLFloatField::class,
+ 'info' => HTMLInfoField::class,
+ 'selectorother' => HTMLSelectOrOtherField::class,
+ 'selectandother' => HTMLSelectAndOtherField::class,
+ 'namespaceselect' => HTMLSelectNamespace::class,
+ 'namespaceselectwithbutton' => HTMLSelectNamespaceWithButton::class,
+ 'tagfilter' => HTMLTagFilter::class,
+ 'sizefilter' => HTMLSizeFilterField::class,
+ 'submit' => HTMLSubmitField::class,
+ 'hidden' => HTMLHiddenField::class,
+ 'edittools' => HTMLEditTools::class,
+ 'checkmatrix' => HTMLCheckMatrix::class,
+ 'cloner' => HTMLFormFieldCloner::class,
+ 'autocompleteselect' => HTMLAutoCompleteSelectField::class,
+ 'date' => HTMLDateTimeField::class,
+ 'time' => HTMLDateTimeField::class,
+ 'datetime' => HTMLDateTimeField::class,
// HTMLTextField will output the correct type="" attribute automagically.
// There are about four zillion other HTML5 input types, like range, but
// we don't use those at the moment, so no point in adding all of them.
- 'email' => 'HTMLTextField',
- 'password' => 'HTMLTextField',
- 'url' => 'HTMLTextField',
- 'title' => 'HTMLTitleTextField',
- 'user' => 'HTMLUserTextField',
- 'usersmultiselect' => 'HTMLUsersMultiselectField',
+ 'email' => HTMLTextField::class,
+ 'password' => HTMLTextField::class,
+ 'url' => HTMLTextField::class,
+ 'title' => HTMLTitleTextField::class,
+ 'user' => HTMLUserTextField::class,
+ 'usersmultiselect' => HTMLUsersMultiselectField::class,
];
public $mFieldData;
if ( $this->mParent instanceof OOUIHTMLForm ) {
throw new MWException( 'HTMLMultiSelectField#getOneCheckbox() is not supported' );
} else {
- $elementFunc = [ 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ];
+ $elementFunc = [ Html::class, $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ];
$checkbox =
Xml::check( "{$this->mName}[]", $checked, $attribs ) .
' ' .
$html = '';
$attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
- $elementFunc = [ 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ];
+ $elementFunc = [ Html::class, $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ];
# @todo Should this produce an unordered list perhaps?
foreach ( $options as $label => $info ) {
--- /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 );
}
/**
private $countableCache = [];
/** @var bool */
private $disableStatisticsUpdate = false;
- private $usernamePrefix = 'imported';
- private $assignKnownUsers = false;
- private $triedCreations = [];
+ /** @var ExternalUserNames */
+ private $externalUserNames;
/**
* Creates an ImportXMLReader drawing from the source provided
$this->config = $config;
if ( !in_array( 'uploadsource', stream_get_wrappers() ) ) {
- stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
+ stream_wrapper_register( 'uploadsource', UploadSourceAdapter::class );
}
$id = UploadSourceAdapter::registerSource( $source );
$this->setPageOutCallback( [ $this, 'finishImportPage' ] );
$this->importTitleFactory = new NaiveImportTitleFactory();
+ $this->externalUserNames = new ExternalUserNames( 'imported', false );
}
/**
* @param bool $assignKnownUsers Whether to apply the prefix to usernames that exist locally
*/
public function setUsernamePrefix( $usernamePrefix, $assignKnownUsers ) {
- $this->usernamePrefix = rtrim( (string)$usernamePrefix, ':>' );
- $this->assignKnownUsers = (bool)$assignKnownUsers;
+ $this->externalUserNames = new ExternalUserNames( $usernamePrefix, $assignKnownUsers );
}
/**
}
if ( !isset( $logInfo['contributor']['username'] ) ) {
- $revision->setUsername( $this->usernamePrefix . '>Unknown user' );
+ $revision->setUsername( $this->externalUserNames->addPrefix( 'Unknown user' ) );
} else {
- $revision->setUsername( $this->prefixUsername( $logInfo['contributor']['username'] ) );
+ $revision->setUsername(
+ $this->externalUserNames->applyPrefix( $logInfo['contributor']['username'] )
+ );
}
return $this->logItemCallback( $revision );
if ( isset( $revisionInfo['contributor']['ip'] ) ) {
$revision->setUserIP( $revisionInfo['contributor']['ip'] );
} elseif ( isset( $revisionInfo['contributor']['username'] ) ) {
- $revision->setUsername( $this->prefixUsername( $revisionInfo['contributor']['username'] ) );
+ $revision->setUsername(
+ $this->externalUserNames->applyPrefix( $revisionInfo['contributor']['username'] )
+ );
} else {
- $revision->setUsername( $this->usernamePrefix . '>Unknown user' );
+ $revision->setUsername( $this->externalUserNames->addPrefix( 'Unknown user' ) );
}
if ( isset( $revisionInfo['sha1'] ) ) {
$revision->setSha1Base36( $revisionInfo['sha1'] );
$revision->setUserIP( $uploadInfo['contributor']['ip'] );
}
if ( isset( $uploadInfo['contributor']['username'] ) ) {
- $revision->setUsername( $this->prefixUsername( $uploadInfo['contributor']['username'] ) );
+ $revision->setUsername(
+ $this->externalUserNames->applyPrefix( $uploadInfo['contributor']['username'] )
+ );
}
$revision->setNoUpdates( $this->mNoUpdates );
return call_user_func( $this->mUploadCallback, $revision );
}
- /**
- * Add an interwiki prefix to the username, if appropriate
- * @since 1.31
- * @param string $name Name being imported
- * @return string Name, possibly with the prefix prepended.
- */
- protected function prefixUsername( $name ) {
- if ( !User::isUsableName( $name ) ) {
- return $name;
- }
-
- if ( $this->assignKnownUsers ) {
- if ( User::idFromName( $name ) ) {
- return $name;
- }
-
- // See if any extension wants to create it.
- if ( !isset( $this->triedCreations[$name] ) ) {
- $this->triedCreations[$name] = true;
- if ( !Hooks::run( 'ImportHandleUnknownUser', [ $name ] ) &&
- User::idFromName( $name, User::READ_LATEST )
- ) {
- return $name;
- }
- }
- }
-
- return substr( $this->usernamePrefix . '>' . $name, 0, 255 );
- }
-
/**
* @return array
*/
"maintenance/populateLogUsertext.php.\n"
);
- $task = $this->maintenance->runChild( 'PopulateLogUsertext' );
+ $task = $this->maintenance->runChild( PopulateLogUsertext::class );
$task->execute();
$this->output( "done.\n" );
}
"databases, you may want to hit Ctrl-C and do this manually with\n" .
"maintenance/populateLogSearch.php.\n" );
- $task = $this->maintenance->runChild( 'PopulateLogSearch' );
+ $task = $this->maintenance->runChild( PopulateLogSearch::class );
$task->execute();
$this->output( "done.\n" );
}
}
$this->output( "Updating category collations..." );
- $task = $this->maintenance->runChild( 'UpdateCollation' );
+ $task = $this->maintenance->runChild( UpdateCollation::class );
$task->execute();
$this->output( "...done.\n" );
}
*/
protected function doMigrateUserOptions() {
if ( $this->db->tableExists( 'user_properties' ) ) {
- $cl = $this->maintenance->runChild( 'ConvertUserOptions', 'convertUserOptions.php' );
+ $cl = $this->maintenance->runChild( ConvertUserOptions::class, 'convertUserOptions.php' );
$cl->execute();
$this->output( "done.\n" );
}
/**
* @var $cl RebuildLocalisationCache
*/
- $cl = $this->maintenance->runChild( 'RebuildLocalisationCache', 'rebuildLocalisationCache.php' );
+ $cl = $this->maintenance->runChild(
+ RebuildLocalisationCache::class, 'rebuildLocalisationCache.php'
+ );
$this->output( "Rebuilding localisation cache...\n" );
$cl->setForce();
$cl->execute();
"databases, you may want to hit Ctrl-C and do this manually with\n" .
"maintenance/migrateComments.php.\n"
);
- $task = $this->maintenance->runChild( 'MigrateComments', 'migrateComments.php' );
+ $task = $this->maintenance->runChild( MigrateComments::class, 'migrateComments.php' );
$task->execute();
$this->output( "done.\n" );
}
*/
protected function migrateArchiveText() {
$this->output( "Migrating archive ar_text to modern storage.\n" );
- $task = $this->maintenance->runChild( 'MigrateArchiveText', 'migrateArchiveText.php' );
+ $task = $this->maintenance->runChild( MigrateArchiveText::class, 'migrateArchiveText.php' );
$task->execute();
$this->output( "done.\n" );
}
// disable (problematic) object cache types explicitly, preserving all other (working) ones
// bug T113843
- $emptyCache = [ 'class' => 'EmptyBagOStuff' ];
+ $emptyCache = [ 'class' => EmptyBagOStuff::class ];
$objectCaches = [
CACHE_NONE => $emptyCache,
// implementation that won't stomp on PHP's cookies.
$GLOBALS['wgSessionProviders'] = [
[
- 'class' => 'InstallerSessionProvider',
+ 'class' => InstallerSessionProvider::class,
'args' => [ [
'priority' => 1,
] ]
if ( !$overrides ) {
$overrides = [
- 'LocalSettingsGenerator' => 'LocalSettingsGenerator',
- 'WebInstaller' => 'WebInstaller',
- 'CliInstaller' => 'CliInstaller',
+ 'LocalSettingsGenerator' => LocalSettingsGenerator::class,
+ 'WebInstaller' => WebInstaller::class,
+ 'CliInstaller' => CliInstaller::class,
];
foreach ( glob( "$IP/mw-config/overrides/*.php" ) as $file ) {
require $file;
[ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ],
[ 'addIndex', 'site_stats', 'PRIMARY', 'patch-site_stats-pk.sql' ],
+ // Should have been in 1.30
+ [ 'addTable', 'comment', 'patch-comment-table.sql' ],
+ [ 'migrateComments' ],
+
// 1.31
[ 'addTable', 'slots', 'patch-slots.sql' ],
[ 'addTable', 'content', 'patch-content.sql' ],
* @return bool
*/
public function isCompiled() {
- return self::checkExtension( 'mysql' ) || self::checkExtension( 'mysqli' );
+ return self::checkExtension( 'mysqli' );
}
/**
}
protected function doOldLinksUpdate() {
- $cl = $this->maintenance->runChild( 'ConvertLinks' );
+ $cl = $this->maintenance->runChild( ConvertLinks::class );
$cl->execute();
}
$this->applyPatch( 'patch-templatelinks.sql', false, "Creating templatelinks table" );
$this->output( "Populating...\n" );
- if ( wfGetLB()->getServerCount() > 1 ) {
+ $services = MediaWikiServices::getInstance();
+ if ( $services->getDBLoadBalancer()->getServerCount() > 1 ) {
// Slow, replication-friendly update
$res = $this->db->select( 'pagelinks', [ 'pl_from', 'pl_namespace', 'pl_title' ],
[ 'pl_namespace' => NS_TEMPLATE ], __METHOD__ );
foreach ( $res as $row ) {
$count = ( $count + 1 ) % 100;
if ( $count == 0 ) {
- $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+ $lbFactory = $services->getDBLoadBalancerFactory();
$lbFactory->waitForReplication( [ 'wiki' => wfWikiID() ] );
}
$this->db->insert( 'templatelinks',
$this->output( "done.\n" );
$this->output( "Migrating old restrictions to new table...\n" );
- $task = $this->maintenance->runChild( 'UpdateRestrictions' );
+ $task = $this->maintenance->runChild( UpdateRestrictions::class );
$task->execute();
}
"may want to hit Ctrl-C and do this manually with maintenance/\n" .
"populateCategory.php.\n"
);
- $task = $this->maintenance->runChild( 'PopulateCategory' );
+ $task = $this->maintenance->runChild( PopulateCategory::class );
$task->execute();
$this->output( "Done populating category table.\n" );
}
"databases, you may want to hit Ctrl-C and do this manually with\n" .
"maintenance/populateParentId.php.\n" );
- $task = $this->maintenance->runChild( 'PopulateParentId' );
+ $task = $this->maintenance->runChild( PopulateParentId::class );
$task->execute();
}
}
[ 'doAutoIncrementTriggers' ],
[ 'addIndex', 'site_stats', 'PRIMARY', 'patch-site_stats-pk.sql' ],
+ // Should have been in 1.30
+ [ 'addTable', 'comment', 'patch-comment-table.sql' ],
+ [ 'migrateComments' ],
+
// 1.31
[ 'addTable', 'slots', 'patch-slots.sql' ],
[ 'addTable', 'content', 'patch-content.sql' ],
[ 'changeNullableField', 'protected_titles', 'pt_reason', 'NOT NULL', true ],
[ 'addPgField', 'protected_titles', 'pt_reason_id', 'INTEGER NOT NULL DEFAULT 0' ],
[ 'addTable', 'comment', 'patch-comment-table.sql' ],
+ [ 'migrateComments' ],
[ 'addIndex', 'site_stats', 'site_stats_pkey', 'patch-site_stats-pk.sql' ],
[ 'addTable', 'ip_changes', 'patch-ip_changes.sql' ],
return "# SQLite-specific settings
\$wgSQLiteDataDir = \"{$dir}\";
\$wgObjectCaches[CACHE_DB] = [
- 'class' => 'SqlBagOStuff',
+ 'class' => SqlBagOStuff::class,
'loggroup' => 'SQLBagOStuff',
'server' => [
'type' => 'sqlite',
"config-license-cc-0": "''Creative Commons'' „Zero“ (Gemeinfreiheit)",
"config-license-gfdl": "GNU-Lizenz für freie Dokumentation 1.3 oder höher",
"config-license-pd": "Gemeinfreiheit",
- "config-license-cc-choose": "Eine benutzerdefinierte Creative-Commons-Lizenz auswählen",
+ "config-license-cc-choose": "Eine andere Creative-Commons-Lizenz auswählen",
"config-license-help": "Viele öffentliche Wikis publizieren alle Beiträge unter einer [http://freedomdefined.org/Definition/De freien Lizenz.]\nDies trägt dazu bei, ein Gefühl von Gemeinschaft zu schaffen, und ermutigt zu längerfristiger Mitarbeit.\nHingegen ist im Allgemeinen eine freie Lizenz auf geschlossenen Wikis nicht notwendig.\n\nSofern man Texte aus der Wikipedia verwenden möchte und umgekehrt, sollte die Lizenz {{int:config-license-cc-by-sa}} gewählt werden.\n\nDie Wikipedia nutzte vormals die GNU-Lizenz für freie Dokumentation (GFDL).\nDie GFDL ist eine gültige Lizenz, die allerdings schwer zu verstehen ist.\nEs ist zudem schwierig, gemäß dieser Lizenz lizenzierte Inhalte wiederzuverwenden.",
"config-email-settings": "E-Mail-Einstellungen",
"config-enable-email": "Ausgehende E-Mails ermöglichen",
"config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمیباشد:$1",
"config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصبکننده پرونده <code>LocalSettings.php</code> را درست کرد.\nکه شامل تمام تنظیمات میباشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شدهباشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر میتوانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما میتوانید '''[$2 وارد ویکی شوید]'''.",
"config-install-done-path": "<strong>تبریک!</strong>\nمدیاویکی با موفقیت نصب گردید.\nبرنامه نصبکننده یک پرونده <code>LocalSettings.php</code> ایجاد کرده است که شامل تمام تنظیمات میباشد.\n\nلازم است شما آن را دریافت کرده و در <code>$4</code> قرار دهید. اِن دریافت می باِست به صورت خودکار شروع شدهباشد.\n\nاگر دریافت شروع نشده بود و یا آن را لغو کرده اید با کلیک روی پیوند زیر میتوانید آن را دریافت کنید:\n\n$3\n\n<strong>توجه:</strong> اگر این کار را هم اکنون انجام ندهید و بدون دریافت آن از برنامه نصب خارج شويد، این پرونده تنظیمات تولیدشده در آینده در اختیار شما قرار نخواهد داشت.\n\nوقتی که آن کار را انجام داديد، میتوانید <strong>[$2 وارد ويکی خودتان شويد]</strong>.",
+ "config-install-success": "مدیاویکی به صورت موفقیتآمیز نصب شد. شما میتوانید\nاز <$1$2> برای دیدن ویکیتان بازدید کنید.\nاگر پرسشی داشتید، فهرست سوالهای متداول ما را مطالعه کنید:\n<https://www.mediawiki.org/wiki/Manual:FAQ> یا از یکی از انجمنهای پشیبانی ما که در آن صفحه فهرست شدهاند استفاده کنید.",
"config-download-localsettings": "دریافت <code>LocalSettings.php</code>",
"config-help": "راهنما",
"config-help-tooltip": "برای گسترش کلیک کنید",
"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": "להרחיב",
"config-install-mainpage-failed": "Non poteva inserer le pagina principal: $1",
"config-install-done": "<strong>Felicitationes!</strong>\nTu ha installate MediaWiki.\n\nLe installator ha generate un file <code>LocalSettings.php</code>.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in le base del installation wiki (le mesme directorio que index.php).\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, recomencia le discargamento con un clic sur le ligamine sequente:\n\n$3\n\n<strong>Nota:</strong> Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote <strong>[$2 entrar in tu wiki]</strong>.",
"config-install-done-path": "<strong>Felicitationes!</strong>\nTu ha installate MediaWiki.\n\nLe installator ha generate un file <code>LocalSettings.php</code>.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in <code>$4</code>.\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, recomencia le discargamento con un clic sur le ligamine sequente:\n\n$3\n\n<strong>Nota:</strong> Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote <strong>[$2 entrar in tu wiki]</strong>.",
+ "config-install-success": "MediaWiki ha essite installate con successo. Tu pote ora\nvisitar <$1$2> pro vider tu wiki.\nSi tu ha questiones, consulta nostre lista de questiones frequentemente ponite:\n<https://www.mediawiki.org/wiki/Manual:FAQ> o usa un del\nforos de supporto indicate sur ille pagina.",
"config-download-localsettings": "Discargar <code>LocalSettings.php</code>",
"config-help": "adjuta",
"config-help-tooltip": "clicca pro displicar",
"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 Научите како да се борете против спама на Вашој вики]"
}
* @author Antoine Musso "<hashar at free dot fr>"
*/
-use IPSet\IPSet;
+use Wikimedia\IPSet;
// Some regex definition to "play" with IP address and IP address ranges
<?php
-// phpcs:ignoreFile -- File external to MediaWiki. Ignore coding conventions checks.
/**
* JavaScript Minifier
*
const STACK_LIMIT = 1000;
/**
- * Returns minified JavaScript code.
- *
- * NOTE: $maxLineLength isn't a strict maximum. Longer lines will be produced when
- * literals (e.g. quoted strings) longer than $maxLineLength are encountered
+ * NOTE: This isn't a strict maximum. Longer lines will be produced when
+ * literals (e.g. quoted strings) longer than this are encountered
* or when required to guard against semicolon insertion.
+ */
+ const MAX_LINE_LENGTH = 1000;
+
+ /**
+ * Returns minified JavaScript code.
*
* @param string $s JavaScript code to minify
- * @param int $maxLineLength Maximum length of a single line, or -1 for no maximum.
* @return String Minified code
*/
- public static function minify( $s, $maxLineLength = 1000 ) {
+ public static function minify( $s ) {
// First we declare a few tables that contain our parsing rules
// $opChars : characters, which can be combined without whitespace in between them
- $opChars = array(
+ $opChars = [
'!' => true,
'"' => true,
'%' => true,
'|' => true,
'}' => true,
'~' => true
- );
+ ];
// $tokenTypes : maps keywords and operators to their corresponding token type
- $tokenTypes = array(
+ $tokenTypes = [
'!' => self::TYPE_UN_OP,
'~' => self::TYPE_UN_OP,
'delete' => self::TYPE_UN_OP,
'try' => self::TYPE_DO,
'var' => self::TYPE_DO,
'function' => self::TYPE_FUNC
- );
+ ];
// $goto : This is the main table for our state machine. For every state/token pair
// the following state is defined. When no rule exists for a given pair,
// the state is left unchanged.
- $goto = array(
- self::STATEMENT => array(
+ $goto = [
+ self::STATEMENT => [
self::TYPE_UN_OP => self::EXPRESSION,
self::TYPE_INCR_OP => self::EXPRESSION,
self::TYPE_ADD_OP => self::EXPRESSION,
self::TYPE_IF => self::CONDITION,
self::TYPE_FUNC => self::CONDITION,
self::TYPE_LITERAL => self::EXPRESSION_OP
- ),
- self::CONDITION => array(
+ ],
+ self::CONDITION => [
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
- ),
- self::PROPERTY_ASSIGNMENT => array(
+ ],
+ self::PROPERTY_ASSIGNMENT => [
self::TYPE_COLON => self::PROPERTY_EXPRESSION,
self::TYPE_BRACE_OPEN => self::STATEMENT
- ),
- self::EXPRESSION => array(
+ ],
+ self::EXPRESSION => [
self::TYPE_SEMICOLON => self::STATEMENT,
self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
self::TYPE_FUNC => self::EXPRESSION_FUNC,
self::TYPE_LITERAL => self::EXPRESSION_OP
- ),
- self::EXPRESSION_NO_NL => array(
+ ],
+ self::EXPRESSION_NO_NL => [
self::TYPE_SEMICOLON => self::STATEMENT,
self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
self::TYPE_FUNC => self::EXPRESSION_FUNC,
self::TYPE_LITERAL => self::EXPRESSION_OP
- ),
- self::EXPRESSION_OP => array(
+ ],
+ self::EXPRESSION_OP => [
self::TYPE_BIN_OP => self::EXPRESSION,
self::TYPE_ADD_OP => self::EXPRESSION,
self::TYPE_HOOK => self::EXPRESSION_TERNARY,
self::TYPE_COMMA => self::EXPRESSION,
self::TYPE_SEMICOLON => self::STATEMENT,
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
- ),
- self::EXPRESSION_FUNC => array(
+ ],
+ self::EXPRESSION_FUNC => [
self::TYPE_BRACE_OPEN => self::STATEMENT
- ),
- self::EXPRESSION_TERNARY => array(
+ ],
+ self::EXPRESSION_TERNARY => [
self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
self::TYPE_FUNC => self::EXPRESSION_TERNARY_FUNC,
self::TYPE_LITERAL => self::EXPRESSION_TERNARY_OP
- ),
- self::EXPRESSION_TERNARY_OP => array(
+ ],
+ self::EXPRESSION_TERNARY_OP => [
self::TYPE_BIN_OP => self::EXPRESSION_TERNARY,
self::TYPE_ADD_OP => self::EXPRESSION_TERNARY,
self::TYPE_HOOK => self::EXPRESSION_TERNARY,
self::TYPE_COMMA => self::EXPRESSION_TERNARY,
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
- ),
- self::EXPRESSION_TERNARY_FUNC => array(
+ ],
+ self::EXPRESSION_TERNARY_FUNC => [
self::TYPE_BRACE_OPEN => self::STATEMENT
- ),
- self::PAREN_EXPRESSION => array(
+ ],
+ self::PAREN_EXPRESSION => [
self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
self::TYPE_FUNC => self::PAREN_EXPRESSION_FUNC,
self::TYPE_LITERAL => self::PAREN_EXPRESSION_OP
- ),
- self::PAREN_EXPRESSION_OP => array(
+ ],
+ self::PAREN_EXPRESSION_OP => [
self::TYPE_BIN_OP => self::PAREN_EXPRESSION,
self::TYPE_ADD_OP => self::PAREN_EXPRESSION,
self::TYPE_HOOK => self::PAREN_EXPRESSION,
self::TYPE_COMMA => self::PAREN_EXPRESSION,
self::TYPE_SEMICOLON => self::PAREN_EXPRESSION,
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
- ),
- self::PAREN_EXPRESSION_FUNC => array(
+ ],
+ self::PAREN_EXPRESSION_FUNC => [
self::TYPE_BRACE_OPEN => self::STATEMENT
- ),
- self::PROPERTY_EXPRESSION => array(
+ ],
+ self::PROPERTY_EXPRESSION => [
self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
self::TYPE_FUNC => self::PROPERTY_EXPRESSION_FUNC,
self::TYPE_LITERAL => self::PROPERTY_EXPRESSION_OP
- ),
- self::PROPERTY_EXPRESSION_OP => array(
+ ],
+ self::PROPERTY_EXPRESSION_OP => [
self::TYPE_BIN_OP => self::PROPERTY_EXPRESSION,
self::TYPE_ADD_OP => self::PROPERTY_EXPRESSION,
self::TYPE_HOOK => self::PROPERTY_EXPRESSION,
self::TYPE_COMMA => self::PROPERTY_ASSIGNMENT,
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
- ),
- self::PROPERTY_EXPRESSION_FUNC => array(
+ ],
+ self::PROPERTY_EXPRESSION_FUNC => [
self::TYPE_BRACE_OPEN => self::STATEMENT
- )
- );
+ ]
+ ];
// $push : This table contains the rules for when to push a state onto the stack.
// The pushed state is the state to return to when the corresponding
// closing token is found
- $push = array(
- self::STATEMENT => array(
+ $push = [
+ self::STATEMENT => [
self::TYPE_BRACE_OPEN => self::STATEMENT,
self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
- ),
- self::CONDITION => array(
+ ],
+ self::CONDITION => [
self::TYPE_PAREN_OPEN => self::STATEMENT
- ),
- self::PROPERTY_ASSIGNMENT => array(
+ ],
+ self::PROPERTY_ASSIGNMENT => [
self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT
- ),
- self::EXPRESSION => array(
+ ],
+ self::EXPRESSION => [
self::TYPE_BRACE_OPEN => self::EXPRESSION_OP,
self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
- ),
- self::EXPRESSION_NO_NL => array(
+ ],
+ self::EXPRESSION_NO_NL => [
self::TYPE_BRACE_OPEN => self::EXPRESSION_OP,
self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
- ),
- self::EXPRESSION_OP => array(
+ ],
+ self::EXPRESSION_OP => [
self::TYPE_HOOK => self::EXPRESSION,
self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
- ),
- self::EXPRESSION_FUNC => array(
+ ],
+ self::EXPRESSION_FUNC => [
self::TYPE_BRACE_OPEN => self::EXPRESSION_OP
- ),
- self::EXPRESSION_TERNARY => array(
+ ],
+ self::EXPRESSION_TERNARY => [
self::TYPE_BRACE_OPEN => self::EXPRESSION_TERNARY_OP,
self::TYPE_PAREN_OPEN => self::EXPRESSION_TERNARY_OP
- ),
- self::EXPRESSION_TERNARY_OP => array(
+ ],
+ self::EXPRESSION_TERNARY_OP => [
self::TYPE_HOOK => self::EXPRESSION_TERNARY,
self::TYPE_PAREN_OPEN => self::EXPRESSION_TERNARY_OP
- ),
- self::EXPRESSION_TERNARY_FUNC => array(
+ ],
+ self::EXPRESSION_TERNARY_FUNC => [
self::TYPE_BRACE_OPEN => self::EXPRESSION_TERNARY_OP
- ),
- self::PAREN_EXPRESSION => array(
+ ],
+ self::PAREN_EXPRESSION => [
self::TYPE_BRACE_OPEN => self::PAREN_EXPRESSION_OP,
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION_OP
- ),
- self::PAREN_EXPRESSION_OP => array(
+ ],
+ self::PAREN_EXPRESSION_OP => [
self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION_OP
- ),
- self::PAREN_EXPRESSION_FUNC => array(
+ ],
+ self::PAREN_EXPRESSION_FUNC => [
self::TYPE_BRACE_OPEN => self::PAREN_EXPRESSION_OP
- ),
- self::PROPERTY_EXPRESSION => array(
+ ],
+ self::PROPERTY_EXPRESSION => [
self::TYPE_BRACE_OPEN => self::PROPERTY_EXPRESSION_OP,
self::TYPE_PAREN_OPEN => self::PROPERTY_EXPRESSION_OP
- ),
- self::PROPERTY_EXPRESSION_OP => array(
+ ],
+ self::PROPERTY_EXPRESSION_OP => [
self::TYPE_PAREN_OPEN => self::PROPERTY_EXPRESSION_OP
- ),
- self::PROPERTY_EXPRESSION_FUNC => array(
+ ],
+ self::PROPERTY_EXPRESSION_FUNC => [
self::TYPE_BRACE_OPEN => self::PROPERTY_EXPRESSION_OP
- )
- );
+ ]
+ ];
// $pop : Rules for when to pop a state from the stack
- $pop = array(
- self::STATEMENT => array( self::TYPE_BRACE_CLOSE => true ),
- self::PROPERTY_ASSIGNMENT => array( self::TYPE_BRACE_CLOSE => true ),
- self::EXPRESSION => array( self::TYPE_BRACE_CLOSE => true ),
- self::EXPRESSION_NO_NL => array( self::TYPE_BRACE_CLOSE => true ),
- self::EXPRESSION_OP => array( self::TYPE_BRACE_CLOSE => true ),
- self::EXPRESSION_TERNARY_OP => array( self::TYPE_COLON => true ),
- self::PAREN_EXPRESSION => array( self::TYPE_PAREN_CLOSE => true ),
- self::PAREN_EXPRESSION_OP => array( self::TYPE_PAREN_CLOSE => true ),
- self::PROPERTY_EXPRESSION => array( self::TYPE_BRACE_CLOSE => true ),
- self::PROPERTY_EXPRESSION_OP => array( self::TYPE_BRACE_CLOSE => true )
- );
+ $pop = [
+ self::STATEMENT => [ self::TYPE_BRACE_CLOSE => true ],
+ self::PROPERTY_ASSIGNMENT => [ self::TYPE_BRACE_CLOSE => true ],
+ self::EXPRESSION => [ self::TYPE_BRACE_CLOSE => true ],
+ self::EXPRESSION_NO_NL => [ self::TYPE_BRACE_CLOSE => true ],
+ self::EXPRESSION_OP => [ self::TYPE_BRACE_CLOSE => true ],
+ self::EXPRESSION_TERNARY_OP => [ self::TYPE_COLON => true ],
+ self::PAREN_EXPRESSION => [ self::TYPE_PAREN_CLOSE => true ],
+ self::PAREN_EXPRESSION_OP => [ self::TYPE_PAREN_CLOSE => true ],
+ self::PROPERTY_EXPRESSION => [ self::TYPE_BRACE_CLOSE => true ],
+ self::PROPERTY_EXPRESSION_OP => [ self::TYPE_BRACE_CLOSE => true ]
+ ];
// $semicolon : Rules for when a semicolon insertion is appropriate
- $semicolon = array(
- self::EXPRESSION_NO_NL => array(
+ $semicolon = [
+ self::EXPRESSION_NO_NL => [
self::TYPE_UN_OP => true,
self::TYPE_INCR_OP => true,
self::TYPE_ADD_OP => true,
self::TYPE_DO => true,
self::TYPE_FUNC => true,
self::TYPE_LITERAL => true
- ),
- self::EXPRESSION_OP => array(
+ ],
+ self::EXPRESSION_OP => [
self::TYPE_UN_OP => true,
self::TYPE_INCR_OP => true,
self::TYPE_BRACE_OPEN => true,
self::TYPE_DO => true,
self::TYPE_FUNC => true,
self::TYPE_LITERAL => true
- )
- );
+ ]
+ ];
// $divStates : Contains all states that can be followed by a division operator
- $divStates = array(
+ $divStates = [
self::EXPRESSION_OP => true,
self::EXPRESSION_TERNARY_OP => true,
self::PAREN_EXPRESSION_OP => true,
self::PROPERTY_EXPRESSION_OP => true
- );
+ ];
// Here's where the minifying takes place: Loop through the input, looking for tokens
// and output them to $out, taking actions to the above defined rules when appropriate.
$lineLength = 0;
$newlineFound = true;
$state = self::STATEMENT;
- $stack = array();
+ $stack = [];
$last = ';'; // Pretend that we have seen a semicolon yet
- while( $pos < $length ) {
+ while ( $pos < $length ) {
// First, skip over any whitespace and multiline comments, recording whether we
// found any newline character
$skip = strspn( $s, " \t\n\r\xb\xc", $pos );
- if( !$skip ) {
+ if ( !$skip ) {
$ch = $s[$pos];
- if( $ch === '/' && substr( $s, $pos, 2 ) === '/*' ) {
+ if ( $ch === '/' && substr( $s, $pos, 2 ) === '/*' ) {
// Multiline comment. Search for the end token or EOT.
$end = strpos( $s, '*/', $pos + 2 );
$skip = $end === false ? $length - $pos : $end - $pos + 2;
}
}
- if( $skip ) {
+ if ( $skip ) {
// The semicolon insertion mechanism needs to know whether there was a newline
// between two tokens, so record it now.
- if( !$newlineFound && strcspn( $s, "\r\n", $pos, $skip ) !== $skip ) {
+ if ( !$newlineFound && strcspn( $s, "\r\n", $pos, $skip ) !== $skip ) {
$newlineFound = true;
}
$pos += $skip;
// Handle C++-style comments and html comments, which are treated as single line
// comments by the browser, regardless of whether the end tag is on the same line.
// Handle --> the same way, but only if it's at the beginning of the line
- if( ( $ch === '/' && substr( $s, $pos, 2 ) === '//' )
+ if ( ( $ch === '/' && substr( $s, $pos, 2 ) === '//' )
|| ( $ch === '<' && substr( $s, $pos, 4 ) === '<!--' )
|| ( $ch === '-' && $newlineFound && substr( $s, $pos, 3 ) === '-->' )
) {
continue;
}
- // Find out which kind of token we're handling. $end will point past the end of it.
+ // Find out which kind of token we're handling.
+ // Note: $end must point past the end of the current token
+ // so that `substr($s, $pos, $end - $pos)` would be the entire token.
+ // In order words, $end will be the offset of the last relevant character
+ // in the stream + 1, or simply put: The offset of the first character
+ // of any next token in the stream.
$end = $pos + 1;
// Handle string literals
- if( $ch === "'" || $ch === '"' ) {
+ if ( $ch === "'" || $ch === '"' ) {
// Search to the end of the string literal, skipping over backslash escapes
$search = $ch . '\\';
do{
+ // Speculatively add 2 to the end so that if we see a backslash,
+ // the next iteration will start 2 characters further (one for the
+ // backslash, one for the escaped character).
+ // We'll correct this outside the loop.
$end += strcspn( $s, $search, $end ) + 2;
- } while( $end - 2 < $length && $s[$end - 2] === '\\' );
+ // If the last character in our search for a quote or a backlash
+ // matched a backslash and we haven't reached the end, keep searching..
+ } while ( $end - 2 < $length && $s[$end - 2] === '\\' );
+ // Correction (1): Undo speculative add, keep only one (end of string literal)
$end--;
+ if ( $end > $length ) {
+ // Correction (2): Loop wrongly assumed an end quote ended the search,
+ // but search ended because we've reached the end. Correct $end.
+ // TODO: This is invalid and should throw.
+ $end--;
+ }
// We have to distinguish between regexp literals and division operators
// A division operator is only possible in certain states
- } elseif( $ch === '/' && !isset( $divStates[$state] ) ) {
+ } elseif ( $ch === '/' && !isset( $divStates[$state] ) ) {
// Regexp literal
- for( ; ; ) {
+ for ( ; ; ) {
+ // Search until we find "/" (end of regexp), "\" (backslash escapes),
+ // or "[" (start of character classes).
do{
- // Skip until we find "/" (end of regexp), "\" (backslash escapes),
- // or "[" (start of character classes).
+ // Speculatively add 2 to ensure next iteration skips
+ // over backslash and escaped character.
+ // We'll correct this outside the loop.
$end += strcspn( $s, '/[\\', $end ) + 2;
// If backslash escape, keep searching...
- } while( $end - 2 < $length && $s[$end - 2] === '\\' );
+ } while ( $end - 2 < $length && $s[$end - 2] === '\\' );
+ // Correction (1): Undo speculative add, keep only one (end of regexp)
$end--;
- // If the end, stop here.
- if( $end - 1 >= $length || $s[$end - 1] === '/' ) {
+ if ( $end > $length ) {
+ // Correction (2): Loop wrongly assumed end slash was seen
+ // String ended without end of regexp. Correct $end.
+ // TODO: This is invalid and should throw.
+ $end--;
+ break;
+ }
+ if ( $s[$end - 1] === '/' ) {
break;
}
// (Implicit else), we must've found the start of a char class,
// skip until we find "]" (end of char class), or "\" (backslash escape)
do{
+ // Speculatively add 2 for backslash escape.
+ // We'll substract one outside the loop.
$end += strcspn( $s, ']\\', $end ) + 2;
// If backslash escape, keep searching...
- } while( $end - 2 < $length && $s[$end - 2] === '\\' );
+ } while ( $end - 2 < $length && $s[$end - 2] === '\\' );
+ // Correction (1): Undo speculative add, keep only one (end of regexp)
$end--;
- };
+ }
// Search past the regexp modifiers (gi)
- while( $end < $length && ctype_alpha( $s[$end] ) ) {
+ while ( $end < $length && ctype_alpha( $s[$end] ) ) {
$end++;
}
- } elseif(
+ } elseif (
$ch === '0'
- && ($pos + 1 < $length) && ($s[$pos + 1] === 'x' || $s[$pos + 1] === 'X' )
+ && ( $pos + 1 < $length ) && ( $s[$pos + 1] === 'x' || $s[$pos + 1] === 'X' )
) {
// Hex numeric literal
$end++; // x or X
$len = strspn( $s, '0123456789ABCDEFabcdef', $end );
if ( !$len ) {
- return self::parseError($s, $pos, 'Expected a hexadecimal number but found ' . substr( $s, $pos, 5 ) . '...' );
+ return self::parseError(
+ $s,
+ $pos,
+ 'Expected a hexadecimal number but found ' . substr( $s, $pos, 5 ) . '...'
+ );
}
$end += $len;
- } elseif(
+ } elseif (
ctype_digit( $ch )
|| ( $ch === '.' && $pos + 1 < $length && ctype_digit( $s[$pos + 1] ) )
) {
$end += strspn( $s, '0123456789', $end );
$decimal = strspn( $s, '.', $end );
- if ($decimal) {
+ if ( $decimal ) {
if ( $decimal > 2 ) {
- return self::parseError($s, $end, 'The number has too many decimal points' );
+ return self::parseError( $s, $end, 'The number has too many decimal points' );
}
$end += strspn( $s, '0123456789', $end + 1 ) + $decimal;
}
$exponent = strspn( $s, 'eE', $end );
- if( $exponent ) {
+ if ( $exponent ) {
if ( $exponent > 1 ) {
- return self::parseError($s, $end, 'Number with several E' );
+ return self::parseError( $s, $end, 'Number with several E' );
}
$end++;
$end += strspn( $s, '-+', $end );
$len = strspn( $s, '0123456789', $end );
if ( !$len ) {
- return self::parseError($s, $pos, 'No decimal digits after e, how many zeroes should be added?' );
+ return self::parseError(
+ $s,
+ $pos,
+ 'No decimal digits after e, how many zeroes should be added?'
+ );
}
$end += $len;
}
- } elseif( isset( $opChars[$ch] ) ) {
+ } elseif ( isset( $opChars[$ch] ) ) {
// Punctuation character. Search for the longest matching operator.
- while(
+ while (
$end < $length
&& isset( $tokenTypes[substr( $s, $pos, $end - $pos + 1 )] )
) {
$token = substr( $s, $pos, $end - $pos ); // so $end - $pos == strlen( $token )
$type = isset( $tokenTypes[$token] ) ? $tokenTypes[$token] : self::TYPE_LITERAL;
- if( $newlineFound && isset( $semicolon[$state][$type] ) ) {
+ if ( $newlineFound && isset( $semicolon[$state][$type] ) ) {
// This token triggers the semicolon insertion mechanism of javascript. While we
// could add the ; token here ourselves, keeping the newline has a few advantages.
$out .= "\n";
$state = self::STATEMENT;
$lineLength = 0;
- } elseif( $maxLineLength > 0 && $lineLength + $end - $pos > $maxLineLength &&
- !isset( $semicolon[$state][$type] ) && $type !== self::TYPE_INCR_OP )
- {
+ } elseif ( $lineLength + $end - $pos > self::MAX_LINE_LENGTH &&
+ !isset( $semicolon[$state][$type] ) && $type !== self::TYPE_INCR_OP ) {
// This line would get too long if we added $token, so add a newline first.
// Only do this if it won't trigger semicolon insertion and if it won't
// put a postfix increment operator on its own line, which is illegal in js.
$out .= "\n";
$lineLength = 0;
// Check, whether we have to separate the token from the last one with whitespace
- } elseif( !isset( $opChars[$last] ) && !isset( $opChars[$ch] ) ) {
+ } elseif ( !isset( $opChars[$last] ) && !isset( $opChars[$ch] ) ) {
$out .= ' ';
$lineLength++;
// Don't accidentally create ++, -- or // tokens
- } elseif( $last === $ch && ( $ch === '+' || $ch === '-' || $ch === '/' ) ) {
+ } elseif ( $last === $ch && ( $ch === '+' || $ch === '-' || $ch === '/' ) ) {
$out .= ' ';
$lineLength++;
}
$newlineFound = false;
// Now that we have output our token, transition into the new state.
- if( isset( $push[$state][$type] ) && count( $stack ) < self::STACK_LIMIT ) {
+ if ( isset( $push[$state][$type] ) && count( $stack ) < self::STACK_LIMIT ) {
$stack[] = $push[$state][$type];
}
- if( $stack && isset( $pop[$state][$type] ) ) {
+ if ( $stack && isset( $pop[$state][$type] ) ) {
$state = array_pop( $stack );
- } elseif( isset( $goto[$state][$type] ) ) {
+ } elseif ( isset( $goto[$state][$type] ) ) {
$state = $goto[$state][$type];
}
}
return $out;
}
- static function parseError($fullJavascript, $position, $errorMsg) {
+ static function parseError( $fullJavascript, $position, $errorMsg ) {
// TODO: Handle the error: trigger_error, throw exception, return false...
return false;
}
* @file
*/
-use RunningStat\RunningStat;
+use Wikimedia\RunningStat;
/**
* Convenience class for working with XHProf profiling data
foreach ( $this->inclusive as $func => $stats ) {
foreach ( $stats as $name => $value ) {
if ( $value instanceof RunningStat ) {
- $total = $value->m1 * $value->n;
+ $total = $value->getMean() * $value->getCount();
$percent = ( isset( $main[$name] ) && $main[$name] )
? 100 * $total / $main[$name]
: 0;
$this->inclusive[$func][$name] = [
'total' => $total,
'min' => $value->min,
- 'mean' => $value->m1,
+ 'mean' => $value->getMean(),
'max' => $value->max,
'variance' => $value->m2,
'percent' => $percent,
: new NullLockManager( [] );
$this->fileJournal = isset( $config['fileJournal'] )
? $config['fileJournal']
- : FileJournal::factory( [ 'class' => 'NullFileJournal' ], $this->name );
+ : FileJournal::factory( [ 'class' => NullFileJournal::class ], $this->name );
$this->readOnly = isset( $config['readOnly'] )
? (string)$config['readOnly']
: '';
final protected function newStatus() {
$args = func_get_args();
if ( count( $args ) ) {
- $sv = call_user_func_array( [ 'StatusValue', 'newFatal' ], $args );
+ $sv = call_user_func_array( [ StatusValue::class, 'newFatal' ], $args );
} else {
$sv = StatusValue::newGood();
}
* 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
*/
*/
final public function getOperationsInternal( array $ops ) {
$supportedOps = [
- 'store' => 'StoreFileOp',
- 'copy' => 'CopyFileOp',
- 'move' => 'MoveFileOp',
- 'delete' => 'DeleteFileOp',
- 'create' => 'CreateFileOp',
- 'describe' => 'DescribeFileOp',
- 'null' => 'NullFileOp'
+ 'store' => StoreFileOp::class,
+ 'copy' => CopyFileOp::class,
+ 'move' => MoveFileOp::class,
+ 'delete' => DeleteFileOp::class,
+ 'create' => CreateFileOp::class,
+ 'describe' => DescribeFileOp::class,
+ 'null' => NullFileOp::class
];
$performOps = []; // array of FileOp objects
$this->srvsByBucket = array_values( $this->srvsByBucket ); // consecutive
$memcConfig = isset( $config['memcConfig'] ) ? $config['memcConfig'] : [];
- $memcConfig += [ 'class' => 'MemcachedPhpBagOStuff' ]; // default
+ $memcConfig += [ 'class' => MemcachedPhpBagOStuff::class ]; // default
$class = $memcConfig['class'];
- if ( !is_subclass_of( $class, 'MemcachedBagOStuff' ) ) {
+ if ( !is_subclass_of( $class, MemcachedBagOStuff::class ) ) {
throw new InvalidArgumentException( "$class is not of type MemcachedBagOStuff." );
}
if ( !$externalCallback && !$generalCallback && !$checkIfSafe ) {
return;
}
- $dtd = $reader->readOuterXML();
+ $dtd = $reader->readOuterXml();
$callbackReturn = false;
if ( $generalCallback ) {
*
* Setting 'lag' and 'since' help avoids keys getting stuck in stale states.
*
+ * Be aware that this does not update the process cache for getWithSetCallback()
+ * callers. Keys accessed via that method are not generally meant to also be set
+ * using this primitive method.
+ *
+ * Do not use this method on versioned keys accessed via getWithSetCallback().
+ *
* Example usage:
* @code
* $dbr = wfGetDB( DB_REPLICA );
*
* Note that set() can also be lag-aware and lower the TTL if it's high.
*
+ * Be aware that this does not clear the process cache. Even if it did, callbacks
+ * used by getWithSetCallback() might still return stale data in the case of either
+ * uncommitted or not-yet-replicated changes (callback generally use replica DBs).
+ *
* When using potentially long-running ACID transactions, a good pattern is
* to use a pre-commit hook to issue the delete. This means that immediately
* after commit, callers will see the tombstone in cache upon purge relay.
* - flags : Optional bitfield of DBO_* constants that define connection, protocol,
* buffering, and transaction behavior. It is STRONGLY adviced to leave the DBO_DEFAULT
* flag in place UNLESS this this database simply acts as a key/value store.
- * - driver: Optional name of a specific DB client driver. For MySQL, there is the old
- * 'mysql' driver and the newer 'mysqli' driver.
+ * - driver: Optional name of a specific DB client driver. For MySQL, there is only the
+ * 'mysqli' driver; the old one 'mysql' has been removed.
* - variables: Optional map of session variables to set after connecting. This can be
* used to adjust lock timeouts or encoding modes and the like.
* - connLogger: Optional PSR-3 logger interface instance.
* @since 1.18
*/
final public static function factory( $dbType, $p = [] ) {
- static $canonicalDBTypes = [
- 'mysql' => [ 'mysqli', 'mysql' ],
- 'postgres' => [],
- 'sqlite' => [],
- 'oracle' => [],
- 'mssql' => [],
- ];
- static $classAliases = [
- 'DatabaseMssql' => DatabaseMssql::class,
- 'DatabaseMysql' => DatabaseMysql::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;
+++ /dev/null
-<?php
-/**
- * This is the MySQL database abstraction layer.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- */
-namespace Wikimedia\Rdbms;
-
-/**
- * Database abstraction object for PHP extension mysql.
- *
- * @deprecated 1.30 PHP extension 'mysql' was deprecated in PHP 5.5 and removed in PHP 7.0.
- * @see PHP extension 'mysqli' and DatabaseMysqli
- *
- * @ingroup Database
- * @see Database
- */
-class DatabaseMysql extends DatabaseMysqlBase {
- /**
- * @param string $sql
- * @return resource False on error
- */
- protected function doQuery( $sql ) {
- $conn = $this->getBindingHandle();
-
- if ( $this->bufferResults() ) {
- $ret = mysql_query( $sql, $conn );
- } else {
- $ret = mysql_unbuffered_query( $sql, $conn );
- }
-
- return $ret;
- }
-
- /**
- * @param string $realServer
- * @return bool|resource MySQL Database connection or false on failure to connect
- * @throws DBConnectionError
- */
- protected function mysqlConnect( $realServer ) {
- # Avoid a suppressed fatal error, which is very hard to track down
- if ( !extension_loaded( 'mysql' ) ) {
- throw new DBConnectionError(
- $this,
- "MySQL functions missing, have you compiled PHP with the --with-mysql option?\n"
- );
- }
-
- $connFlags = 0;
- if ( $this->mFlags & self::DBO_SSL ) {
- $connFlags |= MYSQL_CLIENT_SSL;
- }
- if ( $this->mFlags & self::DBO_COMPRESS ) {
- $connFlags |= MYSQL_CLIENT_COMPRESS;
- }
-
- if ( ini_get( 'mysql.connect_timeout' ) <= 3 ) {
- $numAttempts = 2;
- } else {
- $numAttempts = 1;
- }
-
- $conn = false;
-
- # The kernel's default SYN retransmission period is far too slow for us,
- # so we use a short timeout plus a manual retry. Retrying means that a small
- # but finite rate of SYN packet loss won't cause user-visible errors.
- for ( $i = 0; $i < $numAttempts && !$conn; $i++ ) {
- if ( $i > 1 ) {
- usleep( 1000 );
- }
- if ( $this->mFlags & self::DBO_PERSISTENT ) {
- $conn = mysql_pconnect( $realServer, $this->mUser, $this->mPassword, $connFlags );
- } else {
- # Create a new connection...
- $conn = mysql_connect( $realServer, $this->mUser, $this->mPassword, true, $connFlags );
- }
- }
-
- return $conn;
- }
-
- /**
- * @param string $charset
- * @return bool
- */
- protected function mysqlSetCharset( $charset ) {
- $conn = $this->getBindingHandle();
-
- if ( function_exists( 'mysql_set_charset' ) ) {
- return mysql_set_charset( $charset, $conn );
- } else {
- return $this->query( 'SET NAMES ' . $charset, __METHOD__ );
- }
- }
-
- /**
- * @return bool
- */
- protected function closeConnection() {
- $conn = $this->getBindingHandle();
-
- return mysql_close( $conn );
- }
-
- /**
- * @return int
- */
- function insertId() {
- $conn = $this->getBindingHandle();
-
- return mysql_insert_id( $conn );
- }
-
- /**
- * @return int
- */
- function lastErrno() {
- if ( $this->mConn ) {
- return mysql_errno( $this->mConn );
- } else {
- return mysql_errno();
- }
- }
-
- /**
- * @return int
- */
- function affectedRows() {
- $conn = $this->getBindingHandle();
-
- return mysql_affected_rows( $conn );
- }
-
- /**
- * @param string $db
- * @return bool
- */
- function selectDB( $db ) {
- $conn = $this->getBindingHandle();
-
- $this->mDBname = $db;
-
- return mysql_select_db( $db, $conn );
- }
-
- protected function mysqlFreeResult( $res ) {
- return mysql_free_result( $res );
- }
-
- protected function mysqlFetchObject( $res ) {
- return mysql_fetch_object( $res );
- }
-
- protected function mysqlFetchArray( $res ) {
- return mysql_fetch_array( $res );
- }
-
- protected function mysqlNumRows( $res ) {
- return mysql_num_rows( $res );
- }
-
- protected function mysqlNumFields( $res ) {
- return mysql_num_fields( $res );
- }
-
- protected function mysqlFetchField( $res, $n ) {
- return mysql_fetch_field( $res, $n );
- }
-
- protected function mysqlFieldName( $res, $n ) {
- return mysql_field_name( $res, $n );
- }
-
- protected function mysqlFieldType( $res, $n ) {
- return mysql_field_type( $res, $n );
- }
-
- protected function mysqlDataSeek( $res, $row ) {
- return mysql_data_seek( $res, $row );
- }
-
- protected function mysqlError( $conn = null ) {
- return ( $conn !== null ) ? mysql_error( $conn ) : mysql_error(); // avoid warning
- }
-
- protected function mysqlRealEscapeString( $s ) {
- $conn = $this->getBindingHandle();
-
- return mysql_real_escape_string( (string)$s, $conn );
- }
-}
-
-class_alias( DatabaseMysql::class, 'DatabaseMysql' );
/** @var string|null */
private $serverVersion = null;
+ /** @var bool|null */
+ private $insertSelectIsSafe = null;
/**
* Additional $params include:
* ID of this server's master will be used. Set the "conds" field to
* override the query conditions, e.g. ['shard' => 's1'].
* - useGTIDs : use GTID methods like MASTER_GTID_WAIT() when possible.
+ * - insertSelectIsSafe : force that native INSERT SELECT is or is not safe [default: null]
* - sslKeyPath : path to key file [default: null]
* - sslCertPath : path to certificate file [default: null]
* - sslCAFile: path to a single certificate authority PEM file [default: null]
}
$this->sqlMode = isset( $params['sqlMode'] ) ? $params['sqlMode'] : '';
$this->utf8Mode = !empty( $params['utf8Mode'] );
+ $this->insertSelectIsSafe = isset( $params['insertSelectIsSafe'] )
+ ? (bool)$params['insertSelectIsSafe'] : null;
parent::__construct( $params );
}
return $this->nativeReplace( $table, $rows, $fname );
}
+ protected function nativeInsertSelect(
+ $destTable, $srcTable, $varMap, $conds,
+ $fname = __METHOD__, $insertOptions = [], $selectOptions = [], $selectJoinConds = []
+ ) {
+ if ( $this->insertSelectIsSafe === null ) {
+ // In MySQL, an INSERT SELECT is only replication safe with row-based
+ // replication or if innodb_autoinc_lock_mode is 0. When those
+ // conditions aren't met, use non-native mode.
+ // While we could try to determine if the insert is safe anyway by
+ // checking if the target table has an auto-increment column that
+ // isn't set in $varMap, that seems unlikely to be worth the extra
+ // complexity.
+ $row = $this->selectRow(
+ false,
+ [
+ 'innodb_autoinc_lock_mode' => '@@innodb_autoinc_lock_mode',
+ 'binlog_format' => '@@binlog_format',
+ ],
+ [],
+ __METHOD__
+ );
+ $this->insertSelectIsSafe = $row->binlog_format === 'ROW' ||
+ (int)$row->innodb_autoinc_lock_mode === 0;
+ }
+
+ if ( !$this->insertSelectIsSafe ) {
+ return $this->nonNativeInsertSelect(
+ $destTable,
+ $srcTable,
+ $varMap,
+ $conds,
+ $fname,
+ $insertOptions,
+ $selectOptions,
+ $selectJoinConds
+ );
+ } else {
+ return parent::nativeInsertSelect(
+ $destTable,
+ $srcTable,
+ $varMap,
+ $conds,
+ $fname,
+ $insertOptions,
+ $selectOptions,
+ $selectJoinConds
+ );
+ }
+ }
+
/**
* Estimate rows in dataset
* Returns estimated count, based on EXPLAIN output
* INSERT SELECT wrapper. Takes data from a SELECT query and inserts it
* into another table.
*
+ * @warning If the insert will use an auto-increment or sequence to
+ * determine the value of a column, this may break replication on
+ * databases using statement-based replication if the SELECT is not
+ * deterministically ordered.
+ *
* @param string $destTable The table name to insert into
* @param string|array $srcTable May be either a table name, or an array of table names
* to include in a join.
$res = $this->result;
if ( $this->mSeekTo !== null ) {
- $result = sqlsrv_fetch_object( $res, 'stdClass', [],
+ $result = sqlsrv_fetch_object( $res, stdClass::class, [],
SQLSRV_SCROLL_ABSOLUTE, $this->mSeekTo );
$this->mSeekTo = null;
} else {
}
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 {
}
}
-class_alias( 'Wikimedia\Rdbms\LoadBalancerSingle', 'LoadBalancerSingle' );
+class_alias( LoadBalancerSingle::class, 'LoadBalancerSingle' );
*/
class CategoryPage extends Article {
# Subclasses can change this to override the viewer class.
- protected $mCategoryViewerClass = 'CategoryViewer';
+ protected $mCategoryViewerClass = CategoryViewer::class;
/**
* @var WikiCategoryPage
if ( is_int( $from ) ) {
list( $index, $opts ) = DBAccessObjectUtils::getDBOptions( $from );
- $data = $this->pageDataFromTitle( wfGetDB( $index ), $this->mTitle, $opts );
$loadBalancer = MediaWikiServices::getInstance()->getDBLoadBalancer();
+ $db = $loadBalancer->getConnection( $index );
+ $data = $this->pageDataFromTitle( $db, $this->mTitle, $opts );
if ( !$data
&& $index == DB_REPLICA
) {
$from = self::READ_LATEST;
list( $index, $opts ) = DBAccessObjectUtils::getDBOptions( $from );
- $data = $this->pageDataFromTitle( wfGetDB( $index ), $this->mTitle, $opts );
+ $db = $loadBalancer->getConnection( $index );
+ $data = $this->pageDataFromTitle( $db, $this->mTitle, $opts );
}
} else {
// No idea from where the caller got this data, assume replica DB.
) {
$baseRevId = null;
if ( $edittime && $sectionId !== 'new' ) {
- $dbr = wfGetDB( DB_REPLICA );
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+ $dbr = $lb->getConnection( DB_REPLICA );
$rev = Revision::loadFromTimestamp( $dbr, $this->mTitle, $edittime );
// Try the master if this thread may have just added it.
// This could be abstracted into a Revision method, but we don't want
// to encourage loading of revisions by timestamp.
if ( !$rev
- && wfGetLB()->getServerCount() > 1
- && wfGetLB()->hasOrMadeRecentMasterChanges()
+ && $lb->getServerCount() > 1
+ && $lb->hasOrMadeRecentMasterChanges()
) {
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $lb->getConnection( DB_MASTER );
$rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
}
if ( $rev ) {
$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() );
}
private $DTopen = false;
private $inPre = false;
private $lastSection = '';
- private $linestart;
+ private $lineStart;
private $text;
# State constants for the definition list colon extraction
// 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' );
}
$this->mPreprocessorClass = $conf['preprocessorClass'];
} elseif ( defined( 'HPHP_VERSION' ) ) {
# Preprocessor_Hash is much faster than Preprocessor_DOM under HipHop
- $this->mPreprocessorClass = 'Preprocessor_Hash';
+ $this->mPreprocessorClass = Preprocessor_Hash::class;
} elseif ( extension_loaded( 'domxml' ) ) {
# PECL extension that conflicts with the core DOM extension (T15770)
wfDebug( "Warning: you have the obsolete domxml extension for PHP. Please remove it!\n" );
- $this->mPreprocessorClass = 'Preprocessor_Hash';
+ $this->mPreprocessorClass = Preprocessor_Hash::class;
} elseif ( extension_loaded( 'dom' ) ) {
- $this->mPreprocessorClass = 'Preprocessor_DOM';
+ $this->mPreprocessorClass = Preprocessor_DOM::class;
} else {
- $this->mPreprocessorClass = 'Preprocessor_Hash';
+ $this->mPreprocessorClass = Preprocessor_Hash::class;
}
wfDebug( __CLASS__ . ": using preprocessor: {$this->mPreprocessorClass}\n" );
}
# 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;
'printable' => false,
'allowUnsafeRawHtml' => true,
'wrapclass' => 'mw-parser-output',
- 'currentRevisionCallback' => [ 'Parser', 'statelessFetchRevision' ],
- 'templateCallback' => [ 'Parser', 'statelessFetchTemplate' ],
+ 'currentRevisionCallback' => [ Parser::class, 'statelessFetchRevision' ],
+ 'templateCallback' => [ Parser::class, 'statelessFetchTemplate' ],
'speculativeRevIdCallback' => null,
];
*/
public $top;
public $out;
- public $elementClass = 'PPDStackElement';
+ public $elementClass = PPDStackElement::class;
public static $false = false;
*/
public $lineStart;
- public $partClass = 'PPDPart';
+ public $partClass = PPDPart::class;
public function __construct( $data = [] ) {
$class = $this->partClass;
class PPDStack_Hash extends PPDStack {
public function __construct() {
- $this->elementClass = 'PPDStackElement_Hash';
+ $this->elementClass = PPDStackElement_Hash::class;
parent::__construct();
$this->rootAccum = [];
}
class PPDStackElement_Hash extends PPDStackElement {
public function __construct( $data = [] ) {
- $this->partClass = 'PPDPart_Hash';
+ $this->partClass = PPDPart_Hash::class;
parent::__construct( $data );
}
$descriptor = $store[$index];
if ( is_string( $descriptor ) ) {
- $class = 'PPNode_Hash_Text';
+ $class = PPNode_Hash_Text::class;
} elseif ( is_array( $descriptor ) ) {
if ( $descriptor[self::NAME][0] === '@' ) {
- $class = 'PPNode_Hash_Attr';
+ $class = PPNode_Hash_Attr::class;
} else {
- $class = 'PPNode_Hash_Tree';
+ $class = self::class;
}
} else {
throw new MWException( __METHOD__.': invalid node descriptor' );
# Stupid hack
$encValue = preg_replace_callback(
'/((?i)' . wfUrlProtocols() . ')/',
- [ 'Sanitizer', 'armorLinksCallback' ],
+ [ self::class, 'armorLinksCallback' ],
$encValue );
return $encValue;
}
static function normalizeCharReferences( $text ) {
return preg_replace_callback(
self::CHAR_REFS_REGEX,
- [ 'Sanitizer', 'normalizeCharReferencesCallback' ],
+ [ self::class, 'normalizeCharReferencesCallback' ],
$text );
}
public static function decodeCharReferences( $text ) {
return preg_replace_callback(
self::CHAR_REFS_REGEX,
- [ 'Sanitizer', 'decodeCharReferencesCallback' ],
+ [ self::class, 'decodeCharReferencesCallback' ],
$text );
}
global $wgContLang;
$text = preg_replace_callback(
self::CHAR_REFS_REGEX,
- [ 'Sanitizer', 'decodeCharReferencesCallback' ],
+ [ self::class, 'decodeCharReferencesCallback' ],
$text,
-1, //limit
$count
* @see Setup.php
*/
private $types = [
- '' => [ 'type' => '', 'class' => 'InvalidPassword' ],
+ '' => [ 'type' => '', 'class' => InvalidPassword::class ],
];
/**
/**
* Get the ParserOutput from this object, or false in case of failure
*
- * @return ParserOutput
+ * @return ParserOutput|bool
*/
public function getParserOutput() {
return $this->parserOutput;
// Handling for multiselect preferences
if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
- ( isset( $info['class'] ) && $info['class'] == 'HTMLMultiSelectField' ) ) {
+ ( isset( $info['class'] ) && $info['class'] == \HTMLMultiSelectField::class ) ) {
$options = HTMLFormField::flattenOptions( $info['options'] );
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
$val = [];
// Handling for checkmatrix preferences
if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
- ( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
+ ( isset( $info['class'] ) && $info['class'] == \HTMLCheckMatrix::class ) ) {
$columns = HTMLFormField::flattenOptions( $info['columns'] );
$rows = HTMLFormField::flattenOptions( $info['rows'] );
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
}
$defaultPreferences['timecorrection'] = [
- 'class' => 'HTMLSelectOrOtherField',
+ 'class' => \HTMLSelectOrOtherField::class,
'label-message' => 'timezonelegend',
'options' => $tzOptions,
'default' => $tzSetting,
public function getForm(
User $user,
IContextSource $context,
- $formClass = 'PreferencesForm',
+ $formClass = PreferencesForm::class,
array $remove = []
) {
$formDescriptor = $this->getFormDescriptor( $user, $context );
* @param PreferencesForm $form
* @return bool|Status|string
*/
- protected function legacySaveFormData( $formData, PreferencesForm $form ) {
+ public function legacySaveFormData( $formData, PreferencesForm $form ) {
return $this->saveFormData( $formData, $form );
}
public function getForm(
User $user,
IContextSource $contextSource,
- $formClass = 'PreferencesForm',
+ $formClass = \PreferencesForm::class,
array $remove = []
);
global $wgProfiler, $wgProfileLimit;
$params = [
- 'class' => 'ProfilerStub',
+ 'class' => ProfilerStub::class,
'sampling' => 1,
'threshold' => $wgProfileLimit,
'output' => [],
$inSample = mt_rand( 0, $params['sampling'] - 1 ) === 0;
// wfIsCLI() is not available yet
if ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' || !$inSample ) {
- $params['class'] = 'ProfilerStub';
+ $params['class'] = ProfilerStub::class;
}
if ( !is_array( $params['output'] ) ) {
* Profiler that only tracks explicit profiling sections
*
* @code
- * $wgProfiler['class'] = 'ProfilerSectionOnly';
+ * $wgProfiler['class'] = ProfilerSectionOnly::class;
* $wgProfiler['output'] = 'text';
* $wgProfiler['visible'] = true;
* @endcode
* Profiler wrapper for XHProf extension.
*
* @code
- * $wgProfiler['class'] = 'ProfilerXhprof';
+ * $wgProfiler['class'] = ProfilerXhprof::class;
* $wgProfiler['flags'] = XHPROF_FLAGS_NO_BUILTINS;
* $wgProfiler['output'] = 'text';
* $wgProfiler['visible'] = true;
* @endcode
*
* @code
- * $wgProfiler['class'] = 'ProfilerXhprof';
+ * $wgProfiler['class'] = ProfilerXhprof::class;
* $wgProfiler['flags'] = XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_NO_BUILTINS;
* $wgProfiler['output'] = 'udp';
* @endcode
// 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;
}
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
-use WrappedString\WrappedString;
use Wikimedia\Rdbms\DBConnectionError;
+use Wikimedia\WrappedString;
/**
* Dynamic JavaScript and CSS resource loading system.
$object->setLogger( $this->logger );
} else {
if ( !isset( $info['class'] ) ) {
- $class = 'ResourceLoaderFileModule';
+ $class = ResourceLoaderFileModule::class;
} else {
$class = $info['class'];
}
}
if (
isset( $info['class'] ) &&
- $info['class'] !== 'ResourceLoaderFileModule' &&
- !is_subclass_of( $info['class'], 'ResourceLoaderFileModule' )
+ $info['class'] !== ResourceLoaderFileModule::class &&
+ !is_subclass_of( $info['class'], ResourceLoaderFileModule::class )
) {
return false;
}
* @file
*/
-use WrappedString\WrappedStringList;
+use Wikimedia\WrappedStringList;
/**
* Bootstrap a ResourceLoader client on an HTML page.
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
+use Wikimedia\RelPath;
use Wikimedia\ScopedCallback;
/**
public static function getRelativePaths( array $filePaths ) {
global $IP;
return array_map( function ( $path ) use ( $IP ) {
- return RelPath\getRelativePath( $path, $IP );
+ return RelPath::getRelativePath( $path, $IP );
}, $filePaths );
}
public static function expandRelativePaths( array $filePaths ) {
global $IP;
return array_map( function ( $path ) use ( $IP ) {
- return RelPath\joinPath( $IP, $path );
+ return RelPath::joinPath( $IP, $path );
}, $filePaths );
}
* @return string JavaScript code
*/
public function getScript( ResourceLoaderContext $context ) {
- return Xml::encodeJsCall( 'mw.user.options.set',
+ // Use FILTER_NOMIN annotation to prevent needless minification and caching (T84960).
+ return ResourceLoader::FILTER_NOMIN . Xml::encodeJsCall(
+ 'mw.user.options.set',
[ $context->getUserObj()->getOptions( User::GETOPTIONS_EXCLUDE_DEFAULTS ) ],
ResourceLoader::inDebugMode()
);
}
/**
- * Generate the JavaScript content of this module.
- *
- * Add FILTER_NOMIN annotation to prevent needless minification and caching (T84960).
- *
* @param ResourceLoaderContext $context
* @return string JavaScript code
*/
public function getScript( ResourceLoaderContext $context ) {
- return Xml::encodeJsCall(
+ // Use FILTER_NOMIN annotation to prevent needless minification and caching (T84960).
+ return ResourceLoader::FILTER_NOMIN . Xml::encodeJsCall(
'mw.user.tokens.set',
[ $this->contextUserTokens( $context ) ],
ResourceLoader::inDebugMode()
- ) . ResourceLoader::FILTER_NOMIN;
+ );
}
/**
class RevisionDeleter {
/** List of known revdel types, with their corresponding list classes */
private static $allowedTypes = [
- 'revision' => 'RevDelRevisionList',
- 'archive' => 'RevDelArchiveList',
- 'oldimage' => 'RevDelFileList',
- 'filearchive' => 'RevDelArchivedFileList',
- 'logging' => 'RevDelLogList',
+ 'revision' => RevDelRevisionList::class,
+ 'archive' => RevDelArchiveList::class,
+ 'oldimage' => RevDelFileList::class,
+ 'filearchive' => RevDelArchivedFileList::class,
+ 'logging' => RevDelLogList::class,
];
/** Type map to support old log entries */
$this->setLimitOffset( $fallbackLimit );
$fallbackSearchResult = $this->completionSearch( $fbs );
$results->appendAll( $fallbackSearchResult );
- $fallbackLimit -= count( $fallbackSearchResult );
+ $fallbackLimit -= $fallbackSearchResult->getSize();
if ( $fallbackLimit <= 0 ) {
break;
}
public static function getSearchEngineClass( IDatabase $db ) {
switch ( $db->getType() ) {
case 'sqlite':
- return 'SearchSqlite';
+ return SearchSqlite::class;
case 'mysql':
- return 'SearchMySQL';
+ return SearchMySQL::class;
case 'postgres':
- return 'SearchPostgres';
+ return SearchPostgres::class;
case 'mssql':
- return 'SearchMssql';
+ return SearchMssql::class;
case 'oracle':
- return 'SearchOracle';
+ return SearchOracle::class;
default:
- return 'SearchEngineDummy';
+ return SearchEngineDummy::class;
}
}
}
* @return string
*/
public function getObjectType() {
- return 'Site';
+ return Site::class;
}
/**
$s = '';
}
- if ( wfGetLB()->getLaggedReplicaMode() ) {
+ if ( MediaWikiServices::getInstance()->getDBLoadBalancer()->getLaggedReplicaMode() ) {
$s .= ' <strong>' . $this->msg( 'laggedslavemode' )->parse() . '</strong>';
}
* 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
*/
class SkinApi extends SkinTemplate {
public $skinname = 'apioutput';
- public $template = 'SkinApiTemplate';
+ public $template = SkinApiTemplate::class;
public function setupSkinUserCss( OutputPage $out ) {
parent::setupSkinUserCss( $out );
* 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
class SkinFallback extends SkinTemplate {
public $skinname = 'fallback';
- public $template = 'SkinFallbackTemplate';
+ public $template = SkinFallbackTemplate::class;
/**
* Add CSS via ResourceLoader
* @var string For QuickTemplate, the name of the subclass which will
* actually fill the template. Child classes should override the default.
*/
- public $template = 'QuickTemplate';
+ public $template = QuickTemplate::class;
public $thispage;
public $titletxt;
} elseif ( array_key_exists( 'type', $definition ) ) {
$class = HTMLForm::$typeMappings[$definition['type']];
}
- if ( $class !== 'HTMLInfoField' ) {
+ if ( $class !== HTMLInfoField::class ) {
$definition['tabindex'] = $i;
$i++;
}
if ( $qp === null ) {
// QueryPage subclass, Special page name
$qp = [
- [ 'AncientPagesPage', 'Ancientpages' ],
- [ 'BrokenRedirectsPage', 'BrokenRedirects' ],
- [ 'DeadendPagesPage', 'Deadendpages' ],
- [ 'DoubleRedirectsPage', 'DoubleRedirects' ],
- [ 'FileDuplicateSearchPage', 'FileDuplicateSearch' ],
- [ 'ListDuplicatedFilesPage', 'ListDuplicatedFiles' ],
- [ 'LinkSearchPage', 'LinkSearch' ],
- [ 'ListredirectsPage', 'Listredirects' ],
- [ 'LonelyPagesPage', 'Lonelypages' ],
- [ 'LongPagesPage', 'Longpages' ],
- [ 'MediaStatisticsPage', 'MediaStatistics' ],
- [ 'MIMEsearchPage', 'MIMEsearch' ],
- [ 'MostcategoriesPage', 'Mostcategories' ],
- [ 'MostimagesPage', 'Mostimages' ],
- [ 'MostinterwikisPage', 'Mostinterwikis' ],
- [ 'MostlinkedCategoriesPage', 'Mostlinkedcategories' ],
- [ 'MostlinkedTemplatesPage', 'Mostlinkedtemplates' ],
- [ 'MostlinkedPage', 'Mostlinked' ],
- [ 'MostrevisionsPage', 'Mostrevisions' ],
- [ 'FewestrevisionsPage', 'Fewestrevisions' ],
- [ 'ShortPagesPage', 'Shortpages' ],
- [ 'UncategorizedCategoriesPage', 'Uncategorizedcategories' ],
- [ 'UncategorizedPagesPage', 'Uncategorizedpages' ],
- [ 'UncategorizedImagesPage', 'Uncategorizedimages' ],
- [ 'UncategorizedTemplatesPage', 'Uncategorizedtemplates' ],
- [ 'UnusedCategoriesPage', 'Unusedcategories' ],
- [ 'UnusedimagesPage', 'Unusedimages' ],
- [ 'WantedCategoriesPage', 'Wantedcategories' ],
- [ 'WantedFilesPage', 'Wantedfiles' ],
- [ 'WantedPagesPage', 'Wantedpages' ],
- [ 'WantedTemplatesPage', 'Wantedtemplates' ],
- [ 'UnwatchedpagesPage', 'Unwatchedpages' ],
- [ 'UnusedtemplatesPage', 'Unusedtemplates' ],
- [ 'WithoutInterwikiPage', 'Withoutinterwiki' ],
+ [ AncientPagesPage::class, 'Ancientpages' ],
+ [ BrokenRedirectsPage::class, 'BrokenRedirects' ],
+ [ DeadendPagesPage::class, 'Deadendpages' ],
+ [ DoubleRedirectsPage::class, 'DoubleRedirects' ],
+ [ FileDuplicateSearchPage::class, 'FileDuplicateSearch' ],
+ [ ListDuplicatedFilesPage::class, 'ListDuplicatedFiles' ],
+ [ LinkSearchPage::class, 'LinkSearch' ],
+ [ ListredirectsPage::class, 'Listredirects' ],
+ [ LonelyPagesPage::class, 'Lonelypages' ],
+ [ LongPagesPage::class, 'Longpages' ],
+ [ MediaStatisticsPage::class, 'MediaStatistics' ],
+ [ MIMEsearchPage::class, 'MIMEsearch' ],
+ [ MostcategoriesPage::class, 'Mostcategories' ],
+ [ MostimagesPage::class, 'Mostimages' ],
+ [ MostinterwikisPage::class, 'Mostinterwikis' ],
+ [ MostlinkedCategoriesPage::class, 'Mostlinkedcategories' ],
+ [ MostlinkedTemplatesPage::class, 'Mostlinkedtemplates' ],
+ [ MostlinkedPage::class, 'Mostlinked' ],
+ [ MostrevisionsPage::class, 'Mostrevisions' ],
+ [ FewestrevisionsPage::class, 'Fewestrevisions' ],
+ [ ShortPagesPage::class, 'Shortpages' ],
+ [ UncategorizedCategoriesPage::class, 'Uncategorizedcategories' ],
+ [ UncategorizedPagesPage::class, 'Uncategorizedpages' ],
+ [ UncategorizedImagesPage::class, 'Uncategorizedimages' ],
+ [ UncategorizedTemplatesPage::class, 'Uncategorizedtemplates' ],
+ [ UnusedCategoriesPage::class, 'Unusedcategories' ],
+ [ UnusedimagesPage::class, 'Unusedimages' ],
+ [ WantedCategoriesPage::class, 'Wantedcategories' ],
+ [ WantedFilesPage::class, 'Wantedfiles' ],
+ [ WantedPagesPage::class, 'Wantedpages' ],
+ [ WantedTemplatesPage::class, 'Wantedtemplates' ],
+ [ UnwatchedpagesPage::class, 'Unwatchedpages' ],
+ [ UnusedtemplatesPage::class, 'Unusedtemplates' ],
+ [ WithoutInterwikiPage::class, 'Withoutinterwiki' ],
];
Hooks::run( 'wgQueryPages', [ &$qp ] );
}
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();
*/
private static $coreList = [
// Maintenance Reports
- 'BrokenRedirects' => 'BrokenRedirectsPage',
- 'Deadendpages' => 'DeadendPagesPage',
- 'DoubleRedirects' => 'DoubleRedirectsPage',
- 'Longpages' => 'LongPagesPage',
- 'Ancientpages' => 'AncientPagesPage',
- 'Lonelypages' => 'LonelyPagesPage',
- 'Fewestrevisions' => 'FewestrevisionsPage',
- 'Withoutinterwiki' => 'WithoutInterwikiPage',
- 'Protectedpages' => 'SpecialProtectedpages',
- 'Protectedtitles' => 'SpecialProtectedtitles',
- 'Shortpages' => 'ShortPagesPage',
- 'Uncategorizedcategories' => 'UncategorizedCategoriesPage',
- 'Uncategorizedimages' => 'UncategorizedImagesPage',
- 'Uncategorizedpages' => 'UncategorizedPagesPage',
- 'Uncategorizedtemplates' => 'UncategorizedTemplatesPage',
- 'Unusedcategories' => 'UnusedCategoriesPage',
- 'Unusedimages' => 'UnusedimagesPage',
- 'Unusedtemplates' => 'UnusedtemplatesPage',
- 'Unwatchedpages' => 'UnwatchedpagesPage',
- 'Wantedcategories' => 'WantedCategoriesPage',
- 'Wantedfiles' => 'WantedFilesPage',
- 'Wantedpages' => 'WantedPagesPage',
- 'Wantedtemplates' => 'WantedTemplatesPage',
+ 'BrokenRedirects' => BrokenRedirectsPage::class,
+ 'Deadendpages' => DeadendPagesPage::class,
+ 'DoubleRedirects' => DoubleRedirectsPage::class,
+ 'Longpages' => LongPagesPage::class,
+ 'Ancientpages' => AncientPagesPage::class,
+ 'Lonelypages' => LonelyPagesPage::class,
+ 'Fewestrevisions' => FewestrevisionsPage::class,
+ 'Withoutinterwiki' => WithoutInterwikiPage::class,
+ 'Protectedpages' => SpecialProtectedpages::class,
+ 'Protectedtitles' => SpecialProtectedtitles::class,
+ 'Shortpages' => ShortPagesPage::class,
+ 'Uncategorizedcategories' => UncategorizedCategoriesPage::class,
+ 'Uncategorizedimages' => UncategorizedImagesPage::class,
+ 'Uncategorizedpages' => UncategorizedPagesPage::class,
+ 'Uncategorizedtemplates' => UncategorizedTemplatesPage::class,
+ 'Unusedcategories' => UnusedCategoriesPage::class,
+ 'Unusedimages' => UnusedimagesPage::class,
+ 'Unusedtemplates' => UnusedtemplatesPage::class,
+ 'Unwatchedpages' => UnwatchedpagesPage::class,
+ 'Wantedcategories' => WantedCategoriesPage::class,
+ 'Wantedfiles' => WantedFilesPage::class,
+ 'Wantedpages' => WantedPagesPage::class,
+ 'Wantedtemplates' => WantedTemplatesPage::class,
// List of pages
- 'Allpages' => 'SpecialAllPages',
- 'Prefixindex' => 'SpecialPrefixindex',
- 'Categories' => 'SpecialCategories',
- 'Listredirects' => 'ListredirectsPage',
- 'PagesWithProp' => 'SpecialPagesWithProp',
- 'TrackingCategories' => 'SpecialTrackingCategories',
+ 'Allpages' => SpecialAllPages::class,
+ 'Prefixindex' => SpecialPrefixindex::class,
+ 'Categories' => SpecialCategories::class,
+ 'Listredirects' => ListredirectsPage::class,
+ 'PagesWithProp' => SpecialPagesWithProp::class,
+ 'TrackingCategories' => SpecialTrackingCategories::class,
// Authentication
- 'Userlogin' => 'SpecialUserLogin',
- 'Userlogout' => 'SpecialUserLogout',
- 'CreateAccount' => 'SpecialCreateAccount',
- 'LinkAccounts' => 'SpecialLinkAccounts',
- 'UnlinkAccounts' => 'SpecialUnlinkAccounts',
- 'ChangeCredentials' => 'SpecialChangeCredentials',
- 'RemoveCredentials' => 'SpecialRemoveCredentials',
+ 'Userlogin' => SpecialUserLogin::class,
+ 'Userlogout' => SpecialUserLogout::class,
+ 'CreateAccount' => SpecialCreateAccount::class,
+ 'LinkAccounts' => SpecialLinkAccounts::class,
+ 'UnlinkAccounts' => SpecialUnlinkAccounts::class,
+ 'ChangeCredentials' => SpecialChangeCredentials::class,
+ 'RemoveCredentials' => SpecialRemoveCredentials::class,
// Users and rights
- 'Activeusers' => 'SpecialActiveUsers',
- 'Block' => 'SpecialBlock',
- 'Unblock' => 'SpecialUnblock',
- 'BlockList' => 'SpecialBlockList',
- 'AutoblockList' => 'SpecialAutoblockList',
- 'ChangePassword' => 'SpecialChangePassword',
- 'BotPasswords' => 'SpecialBotPasswords',
- 'PasswordReset' => 'SpecialPasswordReset',
- 'DeletedContributions' => 'DeletedContributionsPage',
- 'Preferences' => 'SpecialPreferences',
- 'ResetTokens' => 'SpecialResetTokens',
- 'Contributions' => 'SpecialContributions',
- 'Listgrouprights' => 'SpecialListGroupRights',
- 'Listgrants' => 'SpecialListGrants',
- 'Listusers' => 'SpecialListUsers',
- 'Listadmins' => 'SpecialListAdmins',
- 'Listbots' => 'SpecialListBots',
- 'Userrights' => 'UserrightsPage',
- 'EditWatchlist' => 'SpecialEditWatchlist',
+ 'Activeusers' => SpecialActiveUsers::class,
+ 'Block' => SpecialBlock::class,
+ 'Unblock' => SpecialUnblock::class,
+ 'BlockList' => SpecialBlockList::class,
+ 'AutoblockList' => SpecialAutoblockList::class,
+ 'ChangePassword' => SpecialChangePassword::class,
+ 'BotPasswords' => SpecialBotPasswords::class,
+ 'PasswordReset' => SpecialPasswordReset::class,
+ 'DeletedContributions' => DeletedContributionsPage::class,
+ 'Preferences' => SpecialPreferences::class,
+ 'ResetTokens' => SpecialResetTokens::class,
+ 'Contributions' => SpecialContributions::class,
+ 'Listgrouprights' => SpecialListGroupRights::class,
+ 'Listgrants' => SpecialListGrants::class,
+ 'Listusers' => SpecialListUsers::class,
+ 'Listadmins' => SpecialListAdmins::class,
+ 'Listbots' => SpecialListBots::class,
+ 'Userrights' => UserrightsPage::class,
+ 'EditWatchlist' => SpecialEditWatchlist::class,
// Recent changes and logs
- 'Newimages' => 'SpecialNewFiles',
- 'Log' => 'SpecialLog',
- 'Watchlist' => 'SpecialWatchlist',
- 'Newpages' => 'SpecialNewpages',
- 'Recentchanges' => 'SpecialRecentChanges',
- 'Recentchangeslinked' => 'SpecialRecentChangesLinked',
- 'Tags' => 'SpecialTags',
+ 'Newimages' => SpecialNewFiles::class,
+ 'Log' => SpecialLog::class,
+ 'Watchlist' => SpecialWatchlist::class,
+ 'Newpages' => SpecialNewpages::class,
+ 'Recentchanges' => SpecialRecentChanges::class,
+ 'Recentchangeslinked' => SpecialRecentChangesLinked::class,
+ 'Tags' => SpecialTags::class,
// Media reports and uploads
- 'Listfiles' => 'SpecialListFiles',
- 'Filepath' => 'SpecialFilepath',
- 'MediaStatistics' => 'MediaStatisticsPage',
- 'MIMEsearch' => 'MIMEsearchPage',
- 'FileDuplicateSearch' => 'FileDuplicateSearchPage',
- 'Upload' => 'SpecialUpload',
- 'UploadStash' => 'SpecialUploadStash',
- 'ListDuplicatedFiles' => 'ListDuplicatedFilesPage',
+ 'Listfiles' => SpecialListFiles::class,
+ 'Filepath' => SpecialFilepath::class,
+ 'MediaStatistics' => MediaStatisticsPage::class,
+ 'MIMEsearch' => MIMEsearchPage::class,
+ 'FileDuplicateSearch' => FileDuplicateSearchPage::class,
+ 'Upload' => SpecialUpload::class,
+ 'UploadStash' => SpecialUploadStash::class,
+ 'ListDuplicatedFiles' => ListDuplicatedFilesPage::class,
// Data and tools
- 'ApiSandbox' => 'SpecialApiSandbox',
- 'Statistics' => 'SpecialStatistics',
- 'Allmessages' => 'SpecialAllMessages',
- 'Version' => 'SpecialVersion',
- 'Lockdb' => 'SpecialLockdb',
- 'Unlockdb' => 'SpecialUnlockdb',
+ 'ApiSandbox' => SpecialApiSandbox::class,
+ 'Statistics' => SpecialStatistics::class,
+ 'Allmessages' => SpecialAllMessages::class,
+ 'Version' => SpecialVersion::class,
+ 'Lockdb' => SpecialLockdb::class,
+ 'Unlockdb' => SpecialUnlockdb::class,
// Redirecting special pages
- 'LinkSearch' => 'LinkSearchPage',
- 'Randompage' => 'RandomPage',
- 'RandomInCategory' => 'SpecialRandomInCategory',
- 'Randomredirect' => 'SpecialRandomredirect',
- 'Randomrootpage' => 'SpecialRandomrootpage',
- 'GoToInterwiki' => 'SpecialGoToInterwiki',
+ 'LinkSearch' => LinkSearchPage::class,
+ 'Randompage' => RandomPage::class,
+ 'RandomInCategory' => SpecialRandomInCategory::class,
+ 'Randomredirect' => SpecialRandomredirect::class,
+ 'Randomrootpage' => SpecialRandomrootpage::class,
+ 'GoToInterwiki' => SpecialGoToInterwiki::class,
// High use pages
- 'Mostlinkedcategories' => 'MostlinkedCategoriesPage',
- 'Mostimages' => 'MostimagesPage',
- 'Mostinterwikis' => 'MostinterwikisPage',
- 'Mostlinked' => 'MostlinkedPage',
- 'Mostlinkedtemplates' => 'MostlinkedTemplatesPage',
- 'Mostcategories' => 'MostcategoriesPage',
- 'Mostrevisions' => 'MostrevisionsPage',
+ 'Mostlinkedcategories' => MostlinkedCategoriesPage::class,
+ 'Mostimages' => MostimagesPage::class,
+ 'Mostinterwikis' => MostinterwikisPage::class,
+ 'Mostlinked' => MostlinkedPage::class,
+ 'Mostlinkedtemplates' => MostlinkedTemplatesPage::class,
+ 'Mostcategories' => MostcategoriesPage::class,
+ 'Mostrevisions' => MostrevisionsPage::class,
// Page tools
- 'ComparePages' => 'SpecialComparePages',
- 'Export' => 'SpecialExport',
- 'Import' => 'SpecialImport',
- 'Undelete' => 'SpecialUndelete',
- 'Whatlinkshere' => 'SpecialWhatLinksHere',
- 'MergeHistory' => 'SpecialMergeHistory',
- 'ExpandTemplates' => 'SpecialExpandTemplates',
+ 'ComparePages' => SpecialComparePages::class,
+ 'Export' => SpecialExport::class,
+ 'Import' => SpecialImport::class,
+ 'Undelete' => SpecialUndelete::class,
+ 'Whatlinkshere' => SpecialWhatLinksHere::class,
+ 'MergeHistory' => SpecialMergeHistory::class,
+ 'ExpandTemplates' => SpecialExpandTemplates::class,
// Other
- 'Booksources' => 'SpecialBookSources',
+ 'Booksources' => SpecialBookSources::class,
// Unlisted / redirects
- 'ApiHelp' => 'SpecialApiHelp',
- 'Blankpage' => 'SpecialBlankpage',
- 'Diff' => 'SpecialDiff',
- 'EditTags' => 'SpecialEditTags',
- 'Emailuser' => 'SpecialEmailUser',
- 'Movepage' => 'MovePageForm',
- 'Mycontributions' => 'SpecialMycontributions',
- 'MyLanguage' => 'SpecialMyLanguage',
- 'Mypage' => 'SpecialMypage',
- 'Mytalk' => 'SpecialMytalk',
- 'Myuploads' => 'SpecialMyuploads',
- 'AllMyUploads' => 'SpecialAllMyUploads',
- 'PermanentLink' => 'SpecialPermanentLink',
- 'Redirect' => 'SpecialRedirect',
- 'Revisiondelete' => 'SpecialRevisionDelete',
- 'RunJobs' => 'SpecialRunJobs',
- 'Specialpages' => 'SpecialSpecialpages',
- 'PageData' => 'SpecialPageData'
+ 'ApiHelp' => SpecialApiHelp::class,
+ 'Blankpage' => SpecialBlankpage::class,
+ 'Diff' => SpecialDiff::class,
+ 'EditTags' => SpecialEditTags::class,
+ 'Emailuser' => SpecialEmailUser::class,
+ 'Movepage' => MovePageForm::class,
+ 'Mycontributions' => SpecialMycontributions::class,
+ 'MyLanguage' => SpecialMyLanguage::class,
+ 'Mypage' => SpecialMypage::class,
+ 'Mytalk' => SpecialMytalk::class,
+ 'Myuploads' => SpecialMyuploads::class,
+ 'AllMyUploads' => SpecialAllMyUploads::class,
+ 'PermanentLink' => SpecialPermanentLink::class,
+ 'Redirect' => SpecialRedirect::class,
+ 'Revisiondelete' => SpecialRevisionDelete::class,
+ 'RunJobs' => SpecialRunJobs::class,
+ 'Specialpages' => SpecialSpecialpages::class,
+ 'PageData' => SpecialPageData::class,
];
private static $list;
self::$list = self::$coreList;
if ( !$wgDisableInternalSearch ) {
- self::$list['Search'] = 'SpecialSearch';
+ self::$list['Search'] = SpecialSearch::class;
}
if ( $wgEmailAuthentication ) {
- self::$list['Confirmemail'] = 'EmailConfirmation';
- self::$list['Invalidateemail'] = 'EmailInvalidation';
+ self::$list['Confirmemail'] = EmailConfirmation::class;
+ self::$list['Invalidateemail'] = EmailInvalidation::class;
}
if ( $wgEnableEmail ) {
- self::$list['ChangeEmail'] = 'SpecialChangeEmail';
+ self::$list['ChangeEmail'] = SpecialChangeEmail::class;
}
if ( $wgEnableJavaScriptTest ) {
- self::$list['JavaScriptTest'] = 'SpecialJavaScriptTest';
+ self::$list['JavaScriptTest'] = SpecialJavaScriptTest::class;
}
if ( $wgPageLanguageUseDB ) {
- self::$list['PageLanguage'] = 'SpecialPageLanguage';
+ self::$list['PageLanguage'] = SpecialPageLanguage::class;
}
if ( $wgContentHandlerUseDB ) {
- self::$list['ChangeContentModel'] = 'SpecialChangeContentModel';
+ self::$list['ChangeContentModel'] = SpecialChangeContentModel::class;
}
// Add extension special pages
];
$fields['restrictions'] = [
- 'class' => 'HTMLRestrictionsField',
+ 'class' => HTMLRestrictionsField::class,
'required' => true,
'default' => $this->botPassword->getRestrictions(),
];
* @ingroup SpecialPage
*/
+use MediaWiki\MediaWikiServices;
use MediaWiki\Widget\DateInputWidget;
/**
$out->addWikiMsg( 'nocontribs', $target );
} else {
# Show a message about replica DB lag, if applicable
- $lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+ $lag = $lb->safeGetLag( $pager->getDatabase() );
if ( $lag > 0 ) {
$out->showLagWarning( $lag );
}
* @ingroup SpecialPage
*/
+use MediaWiki\MediaWikiServices;
+
/**
* Implements Special:DeletedContributions to display archived revisions
* @ingroup SpecialPage
}
# Show a message about replica DB lag, if applicable
- $lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+ $lag = $lb->safeGetLag( $pager->getDatabase() );
if ( $lag > 0 ) {
$out->showLagWarning( $lag );
}
],
'diff' => [
'name' => 'diff',
- 'class' => 'HTMLTextField',
+ 'class' => HTMLTextField::class,
'label-message' => 'diff-form-revid',
],
], $this->getContext(), 'diff-form' );
// checkTitle can filter some options out, avoid empty sections
if ( count( $options ) > 0 ) {
$fields['TitlesNs' . $namespace] = [
- 'class' => 'EditWatchlistCheckboxSeriesField',
+ 'class' => EditWatchlistCheckboxSeriesField::class,
'options' => $options,
'section' => "ns$namespace",
];
'size' => 60,
'default' => $title,
'autofocus' => true,
- 'cssclass' => 'mw-ui-input-inline',
],
'input' => [
'type' => 'textarea',
$formDescriptor += [
'textarea' => [
- 'class' => 'HTMLTextAreaField',
+ 'class' => HTMLTextAreaField::class,
'name' => 'pages',
'label-message' => 'export-manual',
'nodata' => true,
$qc = [];
if ( $opts->getValue( 'type' ) == 'suppress' ) {
$offender = User::newFromName( $opts->getValue( 'offender' ), false );
- if ( $offender && $offender->getId() > 0 ) {
- $qc = [ 'ls_field' => 'target_author_id', 'ls_value' => $offender->getId() ];
- } elseif ( $offender && IP::isIPAddress( $offender->getName() ) ) {
- $qc = [ 'ls_field' => 'target_author_ip', 'ls_value' => $offender->getName() ];
+ if ( $offender ) {
+ if ( $offender->getId() > 0 ) {
+ $qc = [ 'ls_field' => 'target_author_id', 'ls_value' => $offender->getId() ];
+ } else {
+ $qc = [ 'ls_field' => 'target_author_ip', 'ls_value' => $offender->getName() ];
+ }
}
} else {
// Allow extensions to add relations to their search types
/** @var PasswordReset */
private $passwordReset = null;
- /**
- * @var string[] Temporary storage for the passwords which have been sent out, keyed by username.
- */
- private $passwords = [];
-
/**
* @var Status
*/
) {
$formDescriptor = [
'namespace' => [
- 'class' => 'HTMLSelectNamespace',
+ 'class' => HTMLSelectNamespace::class,
'name' => 'namespace',
'id' => 'namespace',
'cssclass' => 'namespaceselector',
'id' => 'noredirect',
],
'sizelimit' => [
- 'class' => 'HTMLSizeFilterField',
+ 'class' => HTMLSizeFilterField::class,
'name' => 'size',
]
];
$out = $context->getOutput();
$tag = $data['HiddenTag'];
- $status = call_user_func( [ 'ChangeTags', "{$form->tagAction}TagWithChecks" ],
+ $status = call_user_func( [ ChangeTags::class, "{$form->tagAction}TagWithChecks" ],
$tag, $data['Reason'], $context->getUser(), true );
if ( $status->isGood() ) {
$output = $this->getOutput();
# Show a message about replica DB lag, if applicable
- $lag = wfGetLB()->safeGetLag( $dbr );
+ $lag = MediaWikiServices::getInstance()->getDBLoadBalancer()->safeGetLag( $dbr );
if ( $lag > 0 ) {
$output->showLagWarning( $lag );
}
}
$descriptor['UploadFile'] = [
- 'class' => 'UploadSourceField',
+ 'class' => UploadSourceField::class,
'section' => 'source',
'type' => 'file',
'id' => 'wpUploadFile',
if ( $canUploadByUrl ) {
$this->mMaxUploadSize['url'] = UploadBase::getMaxUploadSize( 'url' );
$descriptor['UploadFileURL'] = [
- 'class' => 'UploadSourceField',
+ 'class' => UploadSourceField::class,
'section' => 'source',
'id' => 'wpUploadFileURL',
'radio-id' => 'wpSourceTypeurl',
} else {
$descriptor['License'] = [
'type' => 'select',
- 'class' => 'Licenses',
+ 'class' => Licenses::class,
'section' => 'description',
'id' => 'wpLicense',
'label-message' => 'license',
$formDescriptor = [
'user' => [
- 'class' => 'HTMLUserTextField',
+ 'class' => HTMLUserTextField::class,
'label' => $this->msg( 'listusersfrom' )->text(),
'name' => 'username',
'default' => $this->requestedUser,
'label' => $this->msg( 'group' )->text(),
'name' => 'group',
'default' => $this->requestedGroup,
- 'class' => 'HTMLSelectField',
+ 'class' => HTMLSelectField::class,
'options' => $groupOptions,
],
'editsOnly' => [
'default' => $this->mDefaultDirection
],
'limithiddenfield' => [
- 'class' => 'HTMLHiddenField',
+ 'class' => HTMLHiddenField::class,
'name' => 'limit',
'default' => $this->mLimit
]
if ( $beforeSubmitButtonHookOut !== '' ) {
$formDescriptior[ 'beforeSubmitButtonHookOut' ] = [
- 'class' => 'HTMLInfoField',
+ 'class' => HTMLInfoField::class,
'raw' => true,
'default' => $beforeSubmitButtonHookOut
];
}
$formDescriptor[ 'submit' ] = [
- 'class' => 'HTMLSubmitField',
+ 'class' => HTMLSubmitField::class,
'buttonlabel-message' => 'listusers-submit',
];
if ( $beforeClosingFieldsetHookOut !== '' ) {
$formDescriptior[ 'beforeClosingFieldsetHookOut' ] = [
- 'class' => 'HTMLInfoField',
+ 'class' => HTMLInfoField::class,
'raw' => true,
'default' => $beforeClosingFieldsetHookOut
];
--- /dev/null
+<?php
+/**
+ * Class to parse and build external user names
+ *
+ * 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
+ */
+
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Class to parse and build external user names
+ * @since 1.31
+ */
+class ExternalUserNames {
+ private $usernamePrefix = 'imported';
+ private $assignKnownUsers = false;
+ private $triedCreations = [];
+
+ /**
+ * @param string $usernamePrefix Prefix to apply to unknown (and possibly also known) usernames
+ * @param bool $assignKnownUsers Whether to apply the prefix to usernames that exist locally
+ */
+ public function __construct( $usernamePrefix, $assignKnownUsers ) {
+ $this->usernamePrefix = rtrim( (string)$usernamePrefix, ':>' );
+ $this->assignKnownUsers = (bool)$assignKnownUsers;
+ }
+
+ /**
+ * Get a target Title to link a username.
+ *
+ * @param string $userName Username to link
+ *
+ * @return null|Title
+ */
+ public static function getUserLinkTitle( $userName ) {
+ $pos = strpos( $userName, '>' );
+ if ( $pos !== false ) {
+ $iw = explode( ':', substr( $userName, 0, $pos ) );
+ $firstIw = array_shift( $iw );
+ $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
+ if ( $interwikiLookup->isValidInterwiki( $firstIw ) ) {
+ $title = MWNamespace::getCanonicalName( NS_USER ) . ':' . substr( $userName, $pos + 1 );
+ if ( $iw ) {
+ $title = join( ':', $iw ) . ':' . $title;
+ }
+ return Title::makeTitle( NS_MAIN, $title, '', $firstIw );
+ }
+ return null;
+ } else {
+ return SpecialPage::getTitleFor( 'Contributions', $userName );
+ }
+ }
+
+ /**
+ * Add an interwiki prefix to the username, if appropriate
+ *
+ * @param string $name Name being imported
+ * @return string Name, possibly with the prefix prepended.
+ */
+ public function applyPrefix( $name ) {
+ if ( !User::isUsableName( $name ) ) {
+ return $name;
+ }
+
+ if ( $this->assignKnownUsers ) {
+ if ( User::idFromName( $name ) ) {
+ return $name;
+ }
+
+ // See if any extension wants to create it.
+ if ( !isset( $this->triedCreations[$name] ) ) {
+ $this->triedCreations[$name] = true;
+ if ( !Hooks::run( 'ImportHandleUnknownUser', [ $name ] ) &&
+ User::idFromName( $name, User::READ_LATEST )
+ ) {
+ return $name;
+ }
+ }
+ }
+
+ return $this->addPrefix( $name );
+ }
+
+ /**
+ * Add an interwiki prefix to the username regardless of circumstances
+ *
+ * @param string $name Name being imported
+ * @return string Name
+ */
+ public function addPrefix( $name ) {
+ return substr( $this->usernamePrefix . '>' . $name, 0, 255 );
+ }
+
+ /**
+ * Tells whether the username is external or not
+ *
+ * @param string $username Username to check
+ * @return bool true if it's external, false otherwise.
+ */
+ public static function isExternal( $username ) {
+ return strpos( $username, '>' ) !== false;
+ }
+
+}
* @file
*/
-use IPSet\IPSet;
use MediaWiki\MediaWikiServices;
use MediaWiki\Session\SessionManager;
use MediaWiki\Session\Token;
use MediaWiki\Auth\AuthenticationResponse;
use MediaWiki\Auth\AuthenticationRequest;
use MediaWiki\User\UserIdentity;
+use Wikimedia\IPSet;
use Wikimedia\ScopedCallback;
use Wikimedia\Rdbms\Database;
use Wikimedia\Rdbms\DBExpectedError;
protected $mRegistration;
/** @var int */
protected $mEditCount;
- /**
- * @var array No longer used since 1.29; use User::getGroups() instead
- * @deprecated since 1.29
- */
- private $mGroups;
/** @var UserGroupMembership[] Associative array of (group name => UserGroupMembership object) */
protected $mGroupMemberships;
/** @var array */
break;
case 'name':
// Make sure this thread sees its own changes
- if ( wfGetLB()->hasOrMadeRecentMasterChanges() ) {
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+ if ( $lb->hasOrMadeRecentMasterChanges() ) {
$flags |= self::READ_LATEST;
$this->queryFlagsUsed = $flags;
}
$multiselectOptions = [];
foreach ( $prefs as $name => $info ) {
if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
- ( isset( $info['class'] ) && $info['class'] == 'HTMLMultiSelectField' ) ) {
+ ( isset( $info['class'] ) && $info['class'] == HTMLMultiSelectField::class ) ) {
$opts = HTMLFormField::flattenOptions( $info['options'] );
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
$checkmatrixOptions = [];
foreach ( $prefs as $name => $info ) {
if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
- ( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
+ ( isset( $info['class'] ) && $info['class'] == HTMLCheckMatrix::class ) ) {
$columns = HTMLFormField::flattenOptions( $info['columns'] );
$rows = HTMLFormField::flattenOptions( $info['rows'] );
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
$this->cache = $cache;
$this->readOnlyMode = $readOnlyMode;
$this->stats = new NullStatsdDataFactory();
- $this->deferredUpdatesAddCallableUpdateCallback = [ 'DeferredUpdates', 'addCallableUpdate' ];
- $this->revisionGetTimestampFromIdCallback = [ 'Revision', 'getTimestampFromId' ];
+ $this->deferredUpdatesAddCallableUpdateCallback = [ DeferredUpdates::class, 'addCallableUpdate' ];
+ $this->revisionGetTimestampFromIdCallback = [ Revision::class, 'getTimestampFromId' ];
}
/**
<?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": "التحويلات التالية تصل لصفحات غير موجودة:",
"years": "{{PLURAL:$1||سنة واحدة|سنتين|$1 سنين|$1 سنة}}",
"ago": "قبل $1",
"just-now": "الآن فقط",
- "hours-ago": "Ù\85Ù\86Ø° {{PLURAL:$1|ساعة|$1 ساعات}}",
- "minutes-ago": "Ù\85Ù\86Ø° {{PLURAL:$1|دقيقة|$1 دقائق}}",
- "seconds-ago": "Ù\85Ù\86Ø° {{PLURAL:$1|ثانية|$1 ثوان}}",
+ "hours-ago": "Ù\82بÙ\84 {{PLURAL:$1|ساعة|$1 ساعات}}",
+ "minutes-ago": "Ù\82بÙ\84 {{PLURAL:$1|دقيقة|$1 دقائق}}",
+ "seconds-ago": "Ù\82بÙ\84 {{PLURAL:$1|ثانية|$1 ثوان}}",
"monday-at": "يوم الإثنين الساعة $1",
"tuesday-at": "يوم الثلاثاء الساعة $1",
"wednesday-at": "يوم الأربعاء الساعة $1",
"authmanager-create-not-in-progress": "إنشاء الحساب ليس جاريا أو بيانات الجلسة تم فقدها. من فضلك ابدأ ثانية من البداية.",
"authmanager-create-no-primary": "الاعتمادات الموفرة لم يمكن استخدامها لإنشاء الحساب.",
"authmanager-link-no-primary": "الاعتماد الموفر لم يمكن استخدامه لوصل الحسابات.",
- "authmanager-link-not-in-progress": "وصل الحساب ليس جاريا أو بيانات الجلسة تم فقدها. من فضلك ابدأ ثانية منذ البداية.",
+ "authmanager-link-not-in-progress": "وصل الحساب ليس جاريا أو بيانات الجلسة تم فقدها. من فضلك ابدأ ثانية من البداية.",
"authmanager-authplugin-setpass-failed-title": "تغيير كلمة السر فشل",
"authmanager-authplugin-setpass-failed-message": "إضافة التحقق رفضت تغيير كلمة السر.",
"authmanager-authplugin-create-fail": "إضافة التحقق رفضت إنشاء الحساب.",
"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"
}
"redirectedfrom": "(Pinagbalikwat gikan sa $1)",
"redirectpagesub": "Balikwaton an pahina",
"redirectto": "Balikwaton pasiring sa:",
- "lastmodifiedat": "Ining pahina huring pinagbago kan $1, mga alas $2.",
+ "lastmodifiedat": "Ining pahina huring pinagbago kan $1, alas $2.",
"viewcount": "Ining pahina pinaglaog nin {{PLURAL:$1|sarong beses|nin $1 beses}}.",
"protectedpage": "Protektadong pahina",
"jumpto": "Maglukso sa:",
"searchprofile-advanced-tooltip": "Maghanap nin pankustombreng espasyong-ngaran",
"search-result-size": "$1 ({{PLURAL:$2|1 tatarámon|$2 mga tatarámon}})",
"search-result-category-size": "{{PLURAL:$1|1 miyembro|$1 mga miyembro}} ({{PLURAL:$2|1 subkategorya|$2 mga subkategorya}}, {{PLURAL:$3|1 sagunson|$3 mga sagunson}})",
- "search-redirect": "(Panukdong otro $1)",
+ "search-redirect": "(panukdong hali sa $1)",
"search-section": "(Seksyon $1)",
"search-suggest": "Boot mong ipakahulugan: $1",
"search-interwiki-caption": "Tugang na mga proyekto",
"recentchangeslinked-feed": "Mga angay na pagbabàgo",
"recentchangeslinked-toolbox": "Kasurugpon na mga kaliwatan",
"recentchangeslinked-title": "Mga kaliwatan na katakod sa \"$1\"",
- "recentchangeslinked-summary": "Ini an listahan kan mga pagbabagong ginibo kan dae pa sana nahaloy sa mga pahina na nakatakod gikan sa sarong pinagsambit na pahina (o sa mga miyembro kan sarong pinagsambit na kategorya).\nAn mga pahina na yaon sa [[Special:Watchlist|saimong Bantay-listahan]] na '''tekstong mahibog'''.",
+ "recentchangeslinked-summary": "Maglaag nin ngaran nin pahina tanganing mahiling sa mga pahinang nakatakod digdi o gikan sa pahinang idto. (Tanganing mahiling an mga miyembro kan sarong kategorya, ilaag an Kategorya:Ngaran kan kategorya). <strong>Tekstong mahibog</strong> an mga pagbago sa mga pahina na yaon sa [[Special:Watchlist|saimong bantay-listahan]].",
"recentchangeslinked-page": "Pahinang ngaran:",
"recentchangeslinked-to": "Ipahiling an mga pagbabago sa mga pahina na nakatakod sa pinagtaong pahina lugod",
"upload": "Ikarga an sagunson",
"tooltip-pt-mycontris": "Sarong listahan kan saimong mga kontribusyon",
"tooltip-pt-login": "Ika inaagyat na maglaog; alagad, bako tabi ining piriritan",
"tooltip-pt-logout": "Magluwas",
+ "tooltip-pt-createaccount": "Inaalok ika na maggibo nin account asin maglaog; alagad dai man ini kinakaipohan.",
"tooltip-ca-talk": "Orolayan dapit sa laog kan pahina",
"tooltip-ca-edit": "Liwata ining pahina",
"tooltip-ca-addsection": "Magpoon nin sarong baguhon na seksyon",
"tooltip-ca-nstab-main": "Tanawon an laog nin pahina",
"tooltip-ca-nstab-user": "Hilingón an pahina nin paragamit",
"tooltip-ca-nstab-media": "Hilingón an pahina kan ''media''",
- "tooltip-ca-nstab-special": "Ini sarong espesyal na pahina, ika dae makakapagliwat sa pahina mismo",
+ "tooltip-ca-nstab-special": "Sarong espesyal na pahina ini, dae ini maliliwat",
"tooltip-ca-nstab-project": "Tanawon an pahina kan proyekto",
"tooltip-ca-nstab-image": "Hilnga an pahina kan sagunson",
"tooltip-ca-nstab-mediawiki": "Hilingón an ''system message''",
"feedback-subject": "Subheto",
"feedback-submit": "Isumite",
"feedback-thanks": "Salamat! An saimong balik-simbag pinagposte sa pahina \"[$2 $1]\".",
- "searchsuggest-search": "Hanapa baya",
+ "searchsuggest-search": "{{SITENAME}}",
"searchsuggest-containing": "may laog na...",
"api-error-badtoken": "Panlaog na kasalaan: Raot na pangilip",
"api-error-emptypage": "Nagmumukna nin bago, mayong laog na mga pahina dae pinagtutugutan.",
"group-all": "(усе)",
"group-user-member": "{{GENDER:$1|удзельнік|удзельніца}}",
"group-autoconfirmed-member": "{{GENDER:$1|аўтаматычна пацьверджаны ўдзельнік|аўтаматычна пацьверджаная ўдзельніца}}",
- "group-bot-member": "робат",
+ "group-bot-member": "{{GENDER:$1|робат}}",
"group-sysop-member": "{{GENDER:$1|адміністратар|адміністратарка}}",
"group-bureaucrat-member": "{{GENDER:$1|бюракрат|бюракратка}}",
"group-suppress-member": "{{GENDER:$1|падаўляльнік|падаўляльніца}} вэрсіяў",
"grouppage-sysop": "{{ns:project}}:Адміністрацыя",
"grouppage-bureaucrat": "{{ns:project}}:Бюракраты",
"grouppage-suppress": "{{ns:project}}:Падаўляльнікі_вэрсіяў",
- "right-read": "прагляд старонак",
- "right-edit": "рэдагаваньне старонак",
- "right-createpage": "стварэньне старонак (акрамя старонак абмеркаваньняў)",
- "right-createtalk": "стварэньне старонак абмеркаваньня",
- "right-createaccount": "стварэньне новых рахункаў удзельніка",
+ "right-read": "Ð\9fрагляд старонак",
+ "right-edit": "Рэдагаваньне старонак",
+ "right-createpage": "Стварэньне старонак (акрамя старонак абмеркаваньняў)",
+ "right-createtalk": "Стварэньне старонак абмеркаваньня",
+ "right-createaccount": "Стварэньне новых рахункаў удзельнікаў",
"right-autocreateaccount": "Аўтаматычны ўваход з вонкавага рахунку ўдзельніка",
"right-minoredit": "пазначэньне рэдагаваньняў як дробныя",
"right-move": "перанос старонак",
"lockmanager-fail-closelock": "Немагчыма закрыць файл блякаваньня для «$1».",
"lockmanager-fail-deletelock": "Немагчыма выдаліць файл блякаваньня для «$1».",
"lockmanager-fail-acquirelock": "Немагчыма здабыць блякаваньне для «$1».",
- "lockmanager-fail-openlock": "Немагчыма адкрыць файл блякаваньня для «$1».",
+ "lockmanager-fail-openlock": "Немагчыма адкрыць файл блякаваньня для «$1». Упэўніцеся, што вашая тэчка для загрузкі наладжаная слушна і што ваш вэб-сэрвэр мае дазвол на запіс у гэтую тэчку. Глядзіце https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory для дадатковых зьвестак.",
"lockmanager-fail-releaselock": "Немагчыма зьняць блякаваньне для «$1».",
"lockmanager-fail-db-bucket": "Немагчыма скантактавацца з дастатковай колькасьцю базаў блякавньняў на ўчастку $1.",
"lockmanager-fail-db-release": "Немагчыма зьняць блякаваньні для базы зьвестак $1.",
"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",
+ "edit-error-long": "Памылкі:\n\n$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": "धियानसूची से बॉट संपादन छिपावल जाय",
"anonpreviewwarning": "''रउआँ खाता में प्रवेश नइखीं भइल। सहेजब तब ए पन्ना के संपादन इतिहास में राउर आईपी पता दर्ज हो जाई।\"",
"missingsummary": "'''याद दियावल जात बा:'''रउआँ एगो संपादन सारांश नइखीं दिहले। अगर फिर \"$1\" पर क्लिक करब, त राउर संपादन एकरे बिना सहेजा जाई।",
"selfredirect": "<strong>चेतावनी:</strong> आप ई पन्ना के खुदे एही पर अनुप्रेषण क रहल बानी।\nया त आप अनुप्रेषण खातिर गलत लक्ष्य देत बानी, या आप गलत पन्ना के संपादन करत बानी।\nएक बेर अउरी \"$1\" क्लिक करब त, ओइसहूँ ई अनुप्रेषण बना दिहल जाई।",
- "missingcommenttext": "नà¥\80à¤\9aà¥\87 à¤\8fà¤\97à¥\8b à¤\9fिपà¥\8dपणà¥\80 à¤à¤°à¥\80à¤\82।",
+ "missingcommenttext": "एगो टिप्पणी भरीं।",
"missingcommentheader": "'''याद दियावल जात बा:''' रउआँ एह कमेंट खातिर कौनों बिसय नइखीं दिहले। अगर आप \"$1\" पर क्लिक करब तब राउर संपादन एकरे बिना सहेजा जाई।",
"summary-preview": "संपादन सारांश क झलक:",
"subject-preview": "बिसय के झलक:",
"editundo": "वापस लीं",
"diff-empty": "(कौनों अंतर नइखे)",
"diff-multi-sameuser": "(एही सदस्य द्वारा कइल {{PLURAL:$1|बीच के एगो बदलाव|बीच के $1 बदलाव}} नइखे देखावल जात)",
+ "diff-multi-otherusers": "({{PLURAL:$2|एगो अन्य प्रयोगकर्ता|$2 प्रयोगकर्ता लोग}} के कइल {{PLURAL:$1|एक ठो बीच के रिवीजन|$1 बीच के रिवीजन}} नइखे देखावल जात)",
"searchresults": "खोज परिणाम",
"searchresults-title": "$1 खातिर खोज परिणाम",
"titlematches": "पन्ना टाइटिल मिलान",
"searchprofile-everything-tooltip": "सब जगह खोजीं (बातचीत पन्ना सहित)",
"searchprofile-advanced-tooltip": "आपन जरूरत के नाँवस्थान में खोजीं",
"search-result-size": "$1 ({{PLURAL:$2|1 शब्द|$2 शब्द}})",
+ "search-result-category-size": "{{PLURAL:$1|1 मेंबर|$1 मेंबरसभ}} ({{PLURAL:$2|1 उपश्रेणी|$2 उपश्रेणीसभ}}, {{PLURAL:$3|1 फाइल|$3 फाइल सभ}})",
"search-redirect": "($1 से अनुप्रेषित)",
"search-section": "(खंड $1)",
"search-category": "(श्रेणी $1)",
"filehist-comment": "टिप्पणी",
"imagelinks": "फाइल के उपयोग",
"linkstoimage": "ए फाइल से ई {{PLURAL:$1|पन्ना जुड़ल बा|$1 पन्ना जुड़ल बाड़ें}}:",
+ "linkstoimage-more": "$1 से ज्यादा {{PLURAL:$1|पन्ना कड़ी}} एह फाइल से जुड़ल बा।\nआगे दिहल कड़ी {{PLURAL:$1|पहिला पन्ना कड़ी देखावत बा }} खाली एह फाइल से जुड़ल।\n[[Special:WhatLinksHere/$2|पूरा लिस्ट]] मौजूद बा।",
"nolinkstoimage": "कौनों पन्ना अइसन नइखे जेवन ए फाइल से जुड़ल होखे",
"morelinkstoimage": "इ फाइल संगे जुड़ल [[Special:WhatLinksHere/$1|सब लिंक]] देखीं।",
+ "linkstoimage-redirect": "$1 (फाइल अनुप्रेषण) $2",
"sharedupload": "इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा।",
"sharedupload-desc-there": "इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा। अधिक जानकारी खातिर कृपया [$2 फाईल विवरण पन्ना] देखीं।",
"sharedupload-desc-here": "ई फाइल $1 से बा आ अउरी प्रोजेक्ट भी एकर इस्तेमाल कर सकत बाड़ें। \nएकर विवरण [$2 फाइल विवरण पन्ना] नीचे देखावल गइल बा।",
"speciallogtitlelabel": "टारगेट (टाइटिल या {{ns:user}}:प्रयोगकर्ता खाती प्रयोगकर्तानाँव):",
"log": "सगरी लॉग",
"all-logs-page": "सगरी पब्लिक लॉग",
+ "alllogstext": "{{SITENAME}} के सगरी मौजूद लॉग सब के कंबाइन डिस्प्ले।\nआप लॉग के प्रकार, प्रयोगकर्ता नाँव (केस सेंसेटिव), या प्रभावित पन्ना (इहो केस सेंसेटिव) बीछ के एकरा के कम आइटम पर फोकस के के देख सकी ला।",
+ "logempty": "लॉग में कौनों मैचिंग आइटम ना बा।",
"allpages": "सगरी पन्ना",
"nextpage": "अगिला पन्ना ($1)",
"prevpage": "पछिला पन्ना ($1)",
"categories": "श्रेणीसभ",
"activeusers": "सक्रिय सदस्यन के सूची",
"listgrouprights": "सदस्य समूह अधिकारसभ",
+ "listgrouprights-members": "(सदस्यन के लिस्ट)",
"trackingcategories": "नजर रखे वाला श्रेणीसभ",
"trackingcategories-msg": "निगरानी श्रेणी",
"trackingcategories-name": "संदेस नाँव",
"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": "सगरी पन्ना सभ देखल चिन्हित करीं",
+ "enotif_impersonal_salutation": "{{SITENAME}} प्रयोगकर्ता",
+ "enotif_subject_deleted": "$2 पन्ना $1 के हटा {{GENDER:$2|दिहलें|दिहली}}",
+ "enotif_minoredit": "ई एगो छोट संपादन बा",
"created": "बनावल गईल",
+ "deletepage": "पन्ना हटाईं",
+ "confirm": "कन्फर्म",
+ "excontent": "सामग्री रहल: \"$1\"",
+ "exbeforeblank": "खाली करे से पहिले सामग्री: \"$1\"",
+ "delete-confirm": "$1 के हटाईं",
+ "delete-legend": "हटाईं",
"actioncomplete": "काम पुरा भइल",
"dellogpage": "हटवले के लिस्ट",
"rollbacklink": "रोलबैक",
"rollbacklinkcount": "रोलबैक $1 {{PLURAL:$1|संपादन|संपादन सब}}",
+ "changecontentmodel-title-label": "पन्ना टाइटिल",
+ "changecontentmodel-model-label": "नया बिसयसूची माडल",
+ "changecontentmodel-reason-label": "कारण:",
+ "changecontentmodel-submit": "बदलीं",
+ "logentry-contentmodel-change-revertlink": "वापस लीं",
"protectlogpage": "सुरक्षा लॉग",
"protectlogtext": "नीचे पन्ना सुरक्षा में भइल बदलावकुल के सूची बा।\nहाल में सुरक्षित पन्नन के सूची खातिर [[Special:ProtectedPages|सुरक्षित पन्नन के सूची]] देखीं।",
"protectedarticle": "\"[[$1]]\" सुरक्षित कइल गइल",
"contribslink": "योगदान",
"blocklogpage": "निष्क्रिय खाता",
"blocklogentry": "[[$1]] के ब्लॉक कइल गइल, समाप्ती के अवधि $2 $3",
+ "reblock-logentry": "[[$1]] खातिर रोक सेटिंग बदलल गइल आ अब समाप्ती समय बा $2 $3",
"block-log-flags-nocreate": "खाता निर्माण सक्षम नइखे",
"proxyblocker": "प्रॉक्सी ब्लॉककर्ता",
"movepagebtn": "पन्ना स्थांतरण करीं",
"tooltip-t-recentchangeslinked": "ए पन्ना से जुड़ल पन्नवन पर तुरंत भइल बदलाव",
"tooltip-feed-atom": "ए पन्ना खातिर एटम फीड",
"tooltip-t-contributions": "{{GENDER:$1|एह सदस्य}} के योगदान के एक ठो लिस्ट",
+ "tooltip-t-emailuser": "{{GENDER:$1|एह प्रयोगकर्ता}} के ईमेल भेजीं",
"tooltip-t-upload": "फाइल अपलोड करीं",
"tooltip-t-specialpages": "सगरी खास पन्नवन के लिस्ट",
"tooltip-t-print": "ए पन्ना के छापे लायक वर्शन",
"pageinfo-header-basic": "बेसिक जानकारी",
"pageinfo-header-edits": "संपादन इतिहास",
"pageinfo-header-restrictions": "पन्ना सुरक्षा",
+ "pageinfo-header-properties": "पन्ना प्रॉपर्टी सभ",
"pageinfo-display-title": "टाइटिल जवन देखाई पड़ी",
"pageinfo-default-sort": "डिफॉल्ट सॉर्ट कुंजी",
"pageinfo-length": "पन्ना लंबाई (बाइट में)",
"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": "सामग्री पन्ना के रूप में गिनती वाला",
"pageinfo-contentpage-yes": "हँऽ",
"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]] पर अनुप्रेषित कइल गइल",
+ "autosumm-new": "पन्ना बनावल गइल \"$1\" के साथ",
+ "watchlisttools-clear": "धियानसूची साफ करीं",
+ "watchlisttools-view": "प्रासंगिक बदलाव देखीं",
+ "watchlisttools-edit": "धियानसूची देखीं आ संपादित करीं",
+ "watchlisttools-raw": "मूल धियानसूची संपादित करीं",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|बात करीं]])",
"version-no-ext-name": "[अज्ञात नाम]",
+ "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": "जाईं",
+ "redirect-lookup": "लुकअप:",
+ "redirect-value": "वैल्यू:",
+ "redirect-user": "प्रयोगकर्ता आइडी",
+ "redirect-page": "पन्ना आइडी",
+ "redirect-revision": "पन्ना रिवीजन",
+ "redirect-file": "फाइलनाँव",
"fileduplicatesearch": "नकल प्रति फाइल खोजीं",
"specialpages": "खास पन्ना",
"specialpages-group-maintenance": "रखरखाव रिपोर्ट",
"specialpages-group-wiki": "डेटा अउर औजार",
"tag-filter": "[[Special:Tags|टैग]] छननी:",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|टैग|टैग कुल}}]]: $2)",
+ "tag-mw-new-redirect": "नाया अनुप्रेषण",
"tags-active-yes": "हँऽ",
"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": "प्रबंधक पर प्रतिबंध लागू",
"revdelete-unrestricted": "प्रबंधक पर से प्रतिबंध समाप्त",
"logentry-move-move": "$1 पन्ना $3 के $4 पर {{GENDER:$2|स्थानांतरण कइलें}}",
"logentry-move-move_redir": "$1 पन्ना $3 के $4 पर अनुप्रेषण के ऊपर स्थानांतरण {{GENDER:$2|कइलें|कइली}}",
"logentry-patrol-patrol-auto": "पन्ना $3 के रिवीजन $4 $1 द्वारा ऑटोमेटिक {{GENDER:$2|जाँचल चिन्हित कइल गइल}}",
"logentry-newusers-create": "खाता $1 {{GENDER:$2|बनावल गइल}}",
+ "logentry-newusers-autocreate": "प्रयोगकर्ता खाता $1 ऑटोमेटिक {{GENDER:$2|बनावल गइल}}",
"logentry-upload-upload": "$1 {{GENDER:$2|अपलोड कइलें}} $3",
+ "logentry-upload-overwrite": "$1, $3 के नया वर्शन अपलोड {{GENDER:$2|कइलें|कइली}}",
"searchsuggest-search": "{{SITENAME}} में खोजीं",
"duration-days": "$1 {{PLURAL:$1|दिन}}",
"expandtemplates": "टेम्पलेट बिस्तार",
- "mediastatistics": "मीडिया सांख्यिकी"
+ "mediastatistics": "मीडिया सांख्यिकी",
+ "randomrootpage": "अट्रेंडम रूट पन्ना"
}
"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> ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।",
"redirectedfrom": "(تصحیح مجدداز$1)",
"redirectpagesub": "صفحه تصحیح وهدایت مجدد",
"redirectto": "ڤاگردۈنی سی:",
- "lastmodifiedat": "این صفحه اخیرا تغییر واصلاح شددر $1, در $2.",
+ "lastmodifiedat": "ای بلگٱ تازاٛییا ماٛن $1 و ماٛن $2 ۋیرایشد ۋابیاٛ.",
"viewcount": "این صفحه قابل دسترسی شده است {{PLURAL:$1|once|$1 times}}.",
"protectedpage": "صفحه حمایت شده",
"jumpto": "پریدن به:",
"nstab-help": "بألگإ هومیاری",
"nstab-category": "دسته",
"mainpage-nstab": "سأرآسوٙنە",
+ "nosuchspecialpage": "چونو بلگاٛ ۋیجاٛیی دیاری نیکوناٛ",
"error": "خطا",
"databaseerror-query": "جوستکاری: $1",
"databaseerror-error": "خطا: $1",
"badtitle": "عنوان بد",
"badtitletext": "عنوان درخواستی نامعتبر، خالی، یا عنوانی بین زبانی یا بینویکیای با پیوند نادرسته\nو ممکنه دارای یک یا چند کاراکتر بوه که در عنوان مربوط نوا زش استفاده کنین",
"viewsource": "مشاهده منبع",
- "viewsourcetext": "اÛ\8cسا ترÛ\8cÙ\86 بÙ\88Û\8cÙ\86Û\8cÙ\86 Ù\88Ú©Ù¾Û\8c Ú©Ù\86Û\8cÙ\86 Ù\85Ù\86بع اÛ\8c صÙ\81ØÙ\87 را:",
+ "viewsourcetext": "اÛ\8cسا ترÛ\8cÙ\86 سرÚ\86Ø´Ù\85اÙ\9b اÛ\8c بÙ\84گاÙ\9b Ù\86Ù± Ù\87Ù\85 بÙ\86Û\8cٱرÛ\8cÙ\86 Ù\88 Ù\87Ù\85 Û\8bÙ\88ردارÛ\8cÙ\86س:",
"welcomeuser": "خۈش أڤوڌين،$1!",
"yourname": "نام کاربر:",
"userlogin-yourname": "نوم کارياري",
"page_first": "اولین",
"page_last": "آخری",
"histlegend": "انتخاب متفاوت: علامت بنین رو رادیو جعبه ها زه آن نسخه ها سی مقایسه وامتیاز دادن ویا داخل تکمه های زیر سی مسابقه بوین .<br />\n'شرح: (فعلی) = تفاوت با نسخه جاری\n(قبلی) = تفاوت با نسخه قبلی، جز = ویرایش جزئی',",
+ "history-fieldset-title": "پاٛی جۊری سی ۋانیاٛریا",
"histfirst": "دينداتري",
"histlast": "تازإترين",
"historyempty": "(هالي)",
"right-writeapi": "سي نڤشدن اي پ آی ڤأنين ڤاکار",
"newuserlogpage": "راسد ڤابیه وا کاریار",
"rightslog": "نمایه حقوق کاربر",
+ "action-edit": "ای بلگٱ نٱ ۋیرایشد کو",
"nchanges": "$1 {{PLURAL:$1|تغییر|تغییرات}}",
"enhancedrc-history": "ڤیرگار",
"recentchanges": "تغییرات اخیر",
"recentchanges-label-plusminus": "أندازإ بألگأ ب شومار اي بایتا آلشد کردإ.",
"recentchanges-legend-heading": "<strong>میراث:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنو سإیل کونين ب[[Special:بألگإیل تازأ|نومگأ بإلگإیل تازأ]])",
- "rcnotefrom": "در زیر تغییرات زه تاریخ <b>$2</b> آمدهاند (تا <b>$1</b> مورد نشو داده ابوه).",
+ "rcnotefrom": "ۋازیر {{PLURAL:$5|ۋیرایشد|ۋیرایشدا}}ز ۋیرگار strong>$3, $4</strong> تا ۋیرگار <strong>$1</strong> دیاری اٛکونن .",
"rclistfrom": "نشودادن تغییرات تازه با شروع زه $3 $2",
"rcshowhideminor": "اصلاحات کوچیک $1",
"rcshowhideminor-show": "نشون دائن",
"rcshowhidebots-show": "نشون دائن",
"rcshowhidebots-hide": "قام کردن",
"rcshowhideliu": "$1 کاریارا ثوت نام کرده",
+ "rcshowhideliu-show": "دیار کردن",
"rcshowhideliu-hide": "قام کئردئن",
"rcshowhideanons": "$1 کاربران داخل نوابیده",
"rcshowhideanons-show": "نشون دائن",
"recentchangeslinked-feed": "تغییرات مرتبط",
"recentchangeslinked-toolbox": "تغییرات مرتبط",
"recentchangeslinked-title": "تغییرهای مرتبط با $1",
- "recentchangeslinked-summary": " ای صفحه خاص تغییرات اخیر در صفحههای لینک داده شده به این صفحه را نشو اده.\nصفحههایی که در لیست پیگیریهای ایسا بون به شکل '''سیاه''' نشو داده ابون.",
+ "recentchangeslinked-summary": "نوم یٱ بلگاٛ نٱ بزنین سی یو کاٛ ترستاٛ بۊین ۋیرایشدآ هوم پیۋند دار ۋا هوناٛ بنیٱرین.(سی دیاٛن ٱندوما یٱ دسدٱ؛ چونو چی ای نٱ بزنین:نوم دسدٱ). \nآلشدکاریا بلگاٛیلی کاٛ ماٛن سیائاٛ ساٛیل برگ ایسا بۊن چونو <strong>ماٛن پور</strong> دیاری اٛکونن.",
"recentchangeslinked-page": "نوم بألگە:",
"recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
"upload": "آپلود فایل",
"uploadbtn": "آپلود فایل",
"uploadlogpage": "نمایه آپلود",
"filedesc": "چكستأ",
+ "license": "ماٛن حال و بال لیسانس دار ۋابیاٛن",
"license-header": "ب حال وبال ليسانس دار ڤابيڌن",
"imgfile": "جانيا",
"listfiles": "لیست فایل",
"ancientpages": "کهنه ترین صفحات",
"move": "جابجا کردن",
"movethispage": "جابجایی ای صفحه",
+ "pager-newer-n": "{{PLURAL:ۋانیاتر ز 1|ۋانیاتر ز $1}}",
"pager-older-n": "{{PLURAL:$1|گپسالتر 1|گپسالتر $1}}",
"booksources": "منابع کتاب",
"booksources-search-legend": "پی جۈري سي سرچشمإیل کتاڤ",
"protect-text": "ایسا ممکنه بوینین وتغییر بدین سطح حمایت زه ای صفحه'''$1'''.",
"protect-locked-access": "حساب کاربری ایسا اجازه تغییر سطح حمایت ای صفحه را نداره.\nای چونه تنظیمات جاری سی آن صفحه '''$1''':",
"protect-cascadeon": "ای صفحه در حال حاضر حفاظت وحمایت وابیده چون که در {{PLURAL:$1|صفحه|صفحات}}\nزیر که گزینه حفاظت وحمایت موجی {{PLURAL:$1|آن|آنها}} فعال هده ،\nایسا ترین سطح حفاظت ای صفحه را تغییر بدین اما ای کارنتره تاثیری رو\nحفاظت وحمایت موجی صفحه داشته بوه.",
- "protect-default": "(پیش فرض)",
+ "protect-default": "هماٛ کاریارا سلادارن",
"protect-fallback": "درخواست\"$1\" اجازه",
"protect-level-autoconfirmed": "بستن کاربران ثبت نام نوابیده",
"protect-level-sysop": "Sysops فقط",
"tooltip-namespace_association": "اي جأڤإ نأ ڤارسي کونين اي جأڤأ د ڤأرگرهڌإ چأک چنإ آ داسۈن نوم ڤأرگأ شريکي و نوم ڤأرگأ گولإڤورچينإ.",
"blanknamespace": "(اصلی)",
"contributions": "{{GENDER:$1|کاریار}} هومیاریا",
+ "contributions-title": "هومیاری كاریارآ سی $1",
"mycontris": "هومياریا",
"anoncontribs": "هومياریا",
"contribsub2": "سی $1 ($2)",
- "uctop": "(باÙ\84ا)",
+ "uctop": "(تازاÙ\9b باÛ\8b)",
"month": "در این ماه (و قبل زه آن):",
"year": "در ای سال (وقبل زه آن):",
"sp-contributions-newbies-sub": "سی حسابهای کاربری تازه",
"sp-contributions-blocklog": "نمایه بسته وابیده ها",
- "sp-contributions-talk": "صحبت",
+ "sp-contributions-logs": "نۋشدن روخ ۋندا",
+ "sp-contributions-talk": "چٱک چناٛ",
+ "sp-contributions-search": "سی هومیاریا پاٛی جۊری ۋابۊ",
+ "sp-contributions-username": "نوم ناٛشۊن آی پی یا نوم کاریاری",
+ "sp-contributions-submit": "پاٛی جۊری",
"whatlinkshere": "لینک های ای صفحه",
"whatlinkshere-title": "صفحات آن لینک به \"$1\"",
"whatlinkshere-page": "بألگە",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
"version": "ترجمه یا تفسیر",
"specialpages": "صفحات ویژه",
- "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر:",
+ "tag-filter": "[[Special:سردیسا|سرديس]] فيلتر:",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|سرديس|سرديسا}}]]: $2)",
"logentry-delete-delete": "$1 بألگأ {{GENDER:$2|پاکسا ڤابيأ}} $3",
"logentry-move-move": "$1 {{GENDER:$2|جا ب جا کردإ}} بألگأ $3 نأ سي $4",
"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.",
"edit-local": "Modifica la descripció local",
"create": "Crea",
"create-local": "Afegeix una descripció local",
- "delete": "Elimina",
+ "delete": "Suprimeix",
"undelete_short": "Restaura {{PLURAL:$1|l'edició eliminada|$1 edicions eliminades}}",
"viewdeleted_short": "Mostra {{PLURAL:$1|una edició eliminada|$1 edicions eliminades}}",
"protect": "Protegeix",
"recentchanges-page-removed-from-category": "[[:$1]] treta de la categoria",
"recentchanges-page-removed-from-category-bundled": "[[:$1]] treta de la categoria, [[Special:WhatLinksHere/$1|aquesta pàgina està inclosa en d'altres]]",
"autochange-username": "Canvi automàtic del MediaWiki",
- "upload": "Pujar un fitxer",
+ "upload": "Puja un fitxer",
"uploadbtn": "Carrega un fitxer",
"reuploaddesc": "Torna al formulari per apujar.",
"upload-tryagain": "Envia la descripció del fitxer modificat",
"brokenredirects": "Redireccions rompudes",
"brokenredirectstext": "Les següents redireccions enllacen a pàgines inexistents:",
"brokenredirects-edit": "modifica",
- "brokenredirects-delete": "elimina",
+ "brokenredirects-delete": "suprimeix",
"withoutinterwiki": "Pàgines sense enllaços a altres llengües",
"withoutinterwiki-summary": "Les pàgines següents no enllacen a versions d'altres llengües:",
"withoutinterwiki-legend": "Prefix",
"uncategorizedimages": "Fitxers sense categoria",
"uncategorizedtemplates": "Plantilles sense categoria",
"uncategorized-categories-exceptionlist": " # Conté una llista de categories no no s'haurien de mencionar a Special:UncategorizedCategories. Una per línia, començant amb «*». Les línies que comencin amb un altre caràcter (incloent l'espai en blanc) són ignorades. Utilitzeu «#» per a comentaris.",
- "unusedcategories": "Categories sense cap ús",
+ "unusedcategories": "Categories no utilitzades",
"unusedimages": "Fitxers no utilitzats",
"wantedcategories": "Categories demanades",
"wantedpages": "Pàgines demanades",
"excontent": "el contingut era: «$1»",
"excontentauthor": "el contingut era: «$1», i l'únic col·laborador era «[[Special:Contributions/$2|$2]]» ([[User talk:$2|discussió]])",
"exbeforeblank": "el contingut abans de buidar era: '$1'",
- "delete-confirm": "Elimina «$1»",
- "delete-legend": "Elimina",
+ "delete-confirm": "Supressió de la pàgina «$1»",
+ "delete-legend": "Suprimeix",
"historywarning": "<strong>Avís:</strong> la pàgina que esteu a punt d'eliminar té un historial amb $1 {{PLURAL:$1|revisió|revisions}}:",
"historyaction-submit": "Mostra",
"confirmdeletetext": "Esteu a punt d'esborrar de forma permanent una pàgina o imatge i tot el seu historial de la base de dades.\nConfirmeu que realment ho voleu fer, que enteneu les\nconseqüències, i que el que esteu fent està d'acord amb la [[{{MediaWiki:Policy-url}}|política]] del projecte.",
"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گۆڕانکارییەکان لەم پەڕەیەدا لە سەر ڕواڵەتی پەڕەکان بۆ بەکارھێنەرانی تر لەم ویکییەدا کاریگەر دەبێت.",
"timezoneregion-indian": "ئوقیانووسی ھیند",
"timezoneregion-pacific": "ئۆقیانووسی ئارام",
"allowemail": "ڕێگە بدە بە بەکارھێنەرانی تر کە ئیمەیلم بۆ بنێرن",
+ "email-allow-new-users-label": "ڕێگە بدە بە بەکارھێنەرە نوێکان کە ئیمەیلم بۆ بنێرن",
"email-blacklist-label": "ڕێگری لە ناردنی پۆستی ئەلیکترۆنی لە لایەن ئەم بەکارھێنەرانە بکە:",
"prefs-searchoptions": "گەڕان",
"prefs-namespaces": "بۆشایی ناوەکان",
"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|بار کرد}}",
"special-characters-group-gujarati": "گوجەراتی",
"special-characters-group-thai": "تایلەندی",
"special-characters-group-khmer": "خمێری",
+ "mw-widgets-usersmultiselect-placeholder": "زیادکردن...",
"log-action-filter-block": "جۆری بلۆک:",
"log-action-filter-all": "ھەموو",
"log-action-filter-upload-upload": "بارکردنی نوێ",
"nstab-template": "Шаблон",
"nstab-help": "Ярдым",
"nstab-category": "Категория",
- "mainpage-nstab": "Баш Саифе",
+ "mainpage-nstab": "Баш саифе",
"nosuchaction": "Бойле бир арекет ёкъ",
"nosuchactiontext": "URL-де бильдирильген арекет рухсетсиз.\nБельки де URL-ни янълыш язгъандырсыз, я да догъру олмагъан бир багълантыны къуллангъандырсыз.\nБу, {{SITENAME}} сайтындаки бир хатаны да косьтерип ола.",
"nosuchspecialpage": "Бу исимде бир махсус саифе ёкъ",
"rightslog": "Къулланыджынынъ акълары журналы",
"action-edit": "бу саифени денъиштирмеге",
"nchanges": "$1 {{PLURAL:$1|денъиштирме}}",
- "enhancedrc-history": "тарих",
+ "enhancedrc-history": "кечмиш",
"recentchanges": "Сонъки денъиштирмелер",
"recentchanges-legend": "Сонъки денъиштирмелер сазламалары",
- "recentchanges-summary": "ЯпÑ\8bлгÑ\8aан Ñ\8dнÑ\8a Ñ\81онÑ\8aки денÑ\8aиÑ\88Ñ\82иÑ\80мелеÑ\80ни бÑ\83 Ñ\81аиÑ\84еде коÑ\80ип олаÑ\81Ñ\8bнÑ\8aÑ\8bз.",
+ "recentchanges-summary": "ÐнÑ\8a Ñ\81онÑ\8aки Ñ\81аиÑ\84е денÑ\8aиÑ\88Ñ\82иÑ\80илÑ\8cгенлеÑ\80и бÑ\83 Ñ\81аиÑ\84еде коÑ\81Ñ\8cÑ\82еÑ\80илÑ\8cген.",
"recentchanges-feed-description": "Бу лента вастасынен викиде сонъки денъиштирмелерни козет.",
"recentchanges-label-newpage": "Бу денъиштирме янъы бир саифе яратты",
"recentchanges-label-minor": "Бу, кичик бир денъиштирме",
"recentchanges-label-plusminus": "Байт эсабынен саифе буюклигининъ денъиштирильмеси",
"recentchanges-legend-heading": "<strong>Ишаретлер:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|янъы саифелер джедвелине]] де бакъынъыз)",
+ "rcfilters-legend-heading": "<strong>Къыскъартмалар джедвели:</strong>",
"rcfilters-group-results-by-page": "Нетиджелер саифеге коре группалансын",
"rcfilters-activefilters": "Фааль сюзгючлер",
"rcfilters-advancedfilters": "Тафсилятлы сюзгючлер",
"rcfilters-limit-title": "Косьтериледжек денъиштирмелер",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|денъиштирме}}, $2",
"rcfilters-days-title": "Сонъки куньлер",
"rcfilters-hours-title": "Сонъки саатлар",
"rcfilters-days-show-days": "$1 кунь",
"rcfilters-days-show-hours": "$1 саат",
"rcfilters-quickfilters": "Сакълангъан сюзгючлер",
+ "rcfilters-quickfilters-placeholder-title": "Аля даа ич бир сюзгюч сакъланмады",
"rcfilters-savedqueries-defaultlabel": "Сакълангъан сюзгючлер",
"rcfilters-clear-all-filters": "Сюзгючлернинъ эписини темизле",
"rcfilters-show-new-changes": "Сонъки денъиштирмелер",
"rcfilters-filter-pageedits-label": "Саифе денъиштирильмелери",
"rcfilters-filter-newpages-label": "Саифе яратылмалары",
"rcfilters-filter-logactions-label": "Куньделиги япылгъан арекетлер",
+ "rcfilters-liveupdates-button": "Джанлы янъартув",
"rcnotefrom": "<strong>$3, $4</strong> тарихындан башлап япылгъан {{PLURAL:$5|денъиштирме|денъиштирмелер}} ашагъыдадыр (энъ чокъ <strong>$1</strong> дане саифе косьтериле).",
"rclistfrom": "$3 $2 тарихындан берли япылгъан денъиштирмелерни косьтер",
"rcshowhideminor": "кичик денъиштирмелерни $1",
"nstab-template": "Şablon",
"nstab-help": "Yardım",
"nstab-category": "Kategoriya",
+ "mainpage-nstab": "Baş saife",
"nosuchaction": "Böyle bir areket yoq",
"nosuchactiontext": "URL-de bildirilgen areket ruhsetsiz.\nBelki de URL-ni yañlış yazğandırsız, ya da doğru olmağan bir bağlantını qullanğandırsız.\nBu, {{SITENAME}} saytındaki bir hatanı da kösterip ola.",
"nosuchspecialpage": "Bu isimde bir mahsus saife yoq",
"rightslog": "Qullanıcınıñ aqları jurnalı",
"action-edit": "bu saifeni deñiştirmege",
"nchanges": "$1 {{PLURAL:$1|deñiştirme}}",
+ "enhancedrc-history": "keçmiş",
"recentchanges": "Soñki deñiştirmeler",
"recentchanges-legend": "Soñki deñiştirmeler sazlamaları",
- "recentchanges-summary": "Yapılğan eñ soñki deñişitirmelerni bu saifede körip olasıñız.",
+ "recentchanges-summary": "Eñ soñki saife deñişitirilgenleri bu saifede kösterilgen.",
"recentchanges-feed-description": "Bu lenta vastasınen vikide soñki deñiştirmelerni közet.",
"recentchanges-label-newpage": "Bu deñiştirme yañı bir saife yarattı",
"recentchanges-label-minor": "Bu, kiçik bir deñiştirme",
"recentchanges-label-plusminus": "Bayt esabınen saife büyükliginiñ deñiştirilmesi",
"recentchanges-legend-heading": "<strong>İşaretler:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|yañı saifeler cedveline]] de baqıñız)",
+ "rcfilters-legend-heading": "<strong>Qısqartmalar cedveli:</strong>",
"rcfilters-group-results-by-page": "Neticeler saifege köre gruppalansın",
"rcfilters-activefilters": "Faal süzgüçler",
"rcfilters-advancedfilters": "Tafsilâtlı süzgüçler",
"rcfilters-limit-title": "Kösterilecek deñiştirmeler",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|deñiştirme}}, $2",
"rcfilters-days-title": "Soñki künler",
"rcfilters-hours-title": "Soñki saatlar",
"rcfilters-days-show-days": "$1 kün",
"rcfilters-days-show-hours": "$1 saat",
"rcfilters-quickfilters": "Saqlanğan süzgüçler",
+ "rcfilters-quickfilters-placeholder-title": "Alâ daa iç bir süzgüç saqlanmadı",
"rcfilters-savedqueries-defaultlabel": "Saqlanğan süzgüçler",
"rcfilters-clear-all-filters": "Süzgüçlerniñ episini temizle",
"rcfilters-show-new-changes": "Soñki deñiştirmeler",
"rcfilters-filter-pageedits-label": "Saife deñiştirilmeleri",
"rcfilters-filter-newpages-label": "Saife yaratılmaları",
"rcfilters-filter-logactions-label": "Kündeligi yapılğan areketler",
+ "rcfilters-liveupdates-button": "Canlı yañartuv",
"rcnotefrom": "<strong>$3, $4</strong> tarihından başlap yapılğan {{PLURAL:$5|deñiştirme|deñiştirmeler}} aşağıdadır (eñ çоq <strong>$1</strong> dane saife kösterile).",
"rclistfrom": "$3 $2 tarihından berli yapılğan deñiştirmelerni köster",
"rcshowhideminor": "kiçik deñiştirmelerni $1",
"contributions": "{{GENDER:$1|Qullanıcınıñ}} isseleri",
"contributions-title": "$1 qullanıcısınıñ isseleri",
"mycontris": "İsseler",
+ "anoncontribs": "İsseler",
"contribsub2": "$1 ($2)",
"nocontribs": "Bu kriteriylerge uyğan deñiştirme tapılamadı",
"uctop": "(soñki)",
"pageinfo-category-subcats": "Počet podkategorií",
"pageinfo-category-files": "Počet souborů",
"pageinfo-user-id": "ID uživatele",
+ "pageinfo-file-hash": "Kontrolní součet",
"markaspatrolleddiff": "Označit jako prověřené",
"markaspatrolledtext": "Označit tuto stránku jako prověřenou",
"markaspatrolledtext-file": "Označit tuto verzi souboru jako prověřenou",
"version-poweredby-others": "další",
"version-poweredby-translators": "překladatelé na translatewiki.net",
"version-credits-summary": "Následujícím lidem bychom rádi poděkovali za jejich příspěvky [[Special:Version|MediaWiki]].",
- "version-license-info": "MediaWiki je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buď verze 2 této licence, anebo (podle vašeho uvážení) kterékoli pozdější verze.\n\nMediaWiki je distribuována v naději, že bude užitečná, avšak BEZ JAKÉKOLI ZÁRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo VHODNOSTI PRO URČITÝ ÚČEL. Podrobnosti se dočtete v textu GNU General Public License.\n\n[{{SERVER}}{{SCRIPTPATH}}/COPYING Kopii GNU General Public License] jste měli obdržet spolu s tímto programem, pokud ne, napište na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA nebo [//www.gnu.org/licenses/old-licenses/gpl-2.0.html si ji přečtěte online].",
+ "version-license-info": "MediaWiki je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buď verze 2 této licence, anebo (podle vašeho uvážení) kterékoli pozdější verze.\n\nMediaWiki je distribuována v naději, že bude užitečná, avšak <em>BEZ JAKÉKOLI ZÁRUKY</em>; neposkytují se ani odvozené záruky <strong>PRODEJNOSTI</strong> anebo <strong>VHODNOSTI PRO URČITÝ ÚČEL</strong>. Podrobnosti se dočtete v textu GNU General Public License.\n\n[{{SERVER}}{{SCRIPTPATH}}/COPYING Kopii GNU General Public License] jste měli obdržet spolu s tímto programem, pokud ne, napište na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA nebo [//www.gnu.org/licenses/old-licenses/gpl-2.0.html si ji přečtěte online].",
"version-software": "Nainstalovaný software",
"version-software-product": "Název",
"version-software-version": "Verze",
"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:"
}
"lockmanager-fail-closelock": "Die Sperrdatei für „$1“ konnte nicht geschlossen werden.",
"lockmanager-fail-deletelock": "Die Sperrdatei für „$1“ konnte nicht gelöscht werden.",
"lockmanager-fail-acquirelock": "Die Sperre für „$1“ konnte nicht abgerufen werden.",
- "lockmanager-fail-openlock": "Die Sperrdatei für „$1“ konnte nicht geöffnet werden.",
+ "lockmanager-fail-openlock": "Die Sperrdatei für „$1“ konnte nicht geöffnet werden. Stelle sicher, dass dein Hochladerepositorium korrekt konfiguriert ist und dein Webserver eine Berechtigung zum Beschreiben dieses Repositoriums hat. Siehe https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory für weitere Informationen.",
"lockmanager-fail-releaselock": "Die Sperre für „$1“ konnte nicht freigegeben werden.",
"lockmanager-fail-db-bucket": "Es konnte mit Sammelabruf $1 keine ausreichende Anzahl an Verbindungen zu Sperrdatenbanken hergestellt werden.",
"lockmanager-fail-db-release": "Die Sperren auf Datenbank $1 konnten nicht freigegeben werden.",
"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.",
"tog-shownumberswatching": "Amarê karberanê seyr kerdoğan bımotne",
"tog-oldsig": "İmzaya mewcud:",
"tog-fancysig": "İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)",
- "tog-uselivepreview": "Verqayto giyane bıgureyne",
+ "tog-uselivepreview": "Bêbarkerdışê pele verqayti bımocne",
"tog-forceeditsummary": "Mı ke xulasa veng verdaye, hay a mı ser de",
"tog-watchlisthideown": "Vurnayışanê mı lista mına seyr kerdışi de bınımne",
"tog-watchlisthidebots": "Lista seyr kerdışi ra vurnayışanê boti bınımne",
"title-invalid-empty": "Waziyaye sernamey perrer venonyana teyna canamey nami sero esto.",
"title-invalid-utf8": "Sernamey perre ke şıma wazenê, yew rêza UTF-8iya ke nêvêrene xo sero kırışeno.",
"title-invalid-talk-namespace": "Ena perra ke waziyena yew perrê werênayışa ke nêşena bıbo aye ra bestiyena.",
- "title-invalid-characters": "Ena perra karakterê ke nêvêrenê inan gêna xo miyan.",
+ "title-invalid-characters": "Ena perra karakterê ke nêvêrenê inan gêna xo miyan: \"$1\".",
"perfcached": "Datay cı ver hazır biye. No semedê ra nıkayin niyo! tewr zaf {{PLURAL:$1|netice|$1 netice}} debêno de",
"perfcachedts": "Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticey cı}} debyayo de",
"querypage-no-updates": "Rocanebiyayışê na pele nıka cadayiyê.\nDayiyi tiya nıka newe nêbenê.",
"nosuchusershort": "No \"$1\" name de yew ten çino. Kontrolê nuştışi bıkere.",
"nouserspecified": "Şıma gani yew name bıde.",
"login-userblocked": "No karber/na karbere blokekerdeyo/blokekerdiya. Cıkewtışi rê musade çıniyo.",
- "wrongpassword": "Parola ğeleta. Rêna / fına bıcerrebne .",
+ "wrongpassword": "Parola ğelete ya zi namey karberio ğelet nusna.\nKerem ke, anciya bıcerrebne.",
"wrongpasswordempty": "Parola tola, venga. tekrar bınuse.",
"passwordtooshort": "Paroley gani tewr senık be {{PLURAL:$1|1 karakter|$1 karakteran}} derg bê.",
"passwordtoolong": "Paroleyi be {{PLURAL:$1|1 karakter|$1 karakteran}} ra derg nêbenê.",
"sectioneditnotsupported-text": "Destekê vurnayışiê qısımi ena pela vurnayışi de çıniyo.",
"permissionserrors": "İdari xeta",
"permissionserrorstext": "Qey {{PLURAL:$1|sebeb|sebebê}} cêrini ra icazetê şıma çıniyo:",
- "permissionserrorstext-withaction": "{{PLURAL:$1|Sebebê|Sebebê}} cêri ra icazetê $2y çıniyo:",
+ "permissionserrorstext-withaction": "Seba {{PLURAL:$1|sebeb|sebebê}} cêrêni ra icazetê şıma be $2 ra çıniyo:",
"recreate-moveddeleted-warn": "'''Hişyari: Şıma yew nuşteyo ke veri de esteriyao, ey vırazenê.'''\n\nHetê bınêni de qeydê esterıtışi u kırıştışi esto:",
- "moveddeleted-notice": "Ena pela esteriya ya.\nQeydé esternayışi u wedarnayışi cér dé deya yo.",
+ "moveddeleted-notice": "Ena pela esteriyaya.\nQeydê esterıtışi u wedarnayışi cêr de deyayo.",
"log-fulllog": "Temamê rocaneyi bıvine",
"edit-hook-aborted": "Vurnayiş vınderiya.\nYew sebeb beyan nibı.",
"edit-gone-missing": "Pel rocanebiyaye niyo.\nHewna kerde aseno.",
"rcshowhidecategorization": "kategorizasyoni $1",
"rcshowhidecategorization-show": "Bımotné",
"rcshowhidecategorization-hide": "Bınımne",
- "rclinks": "Peyniya $2 rocan de $1 vurnayışan ra <br />$3 bımocne",
+ "rclinks": "$1 vurnayışê peyênê ke $2 rocanê peyênan de biyê, inan bımocne",
"diff": "ferq",
"hist": "verên",
"hide": "Bınımne",
"recentchangeslinked-feed": "Vırnayışê bestiyaey",
"recentchangeslinked-toolbox": "Vırnayışê bestiyaey",
"recentchangeslinked-title": "Heqa \"$1\" de vurnayışi",
- "recentchangeslinked-summary": "Ena liste, perra spesifike rê (ya zi karberanê kategoriya spesifike rê) perranê gırêdayoğan de lista de vırnayışê peyênana.\n[[Special:Watchlist|Lista şımaya seyrkedışi de]] perri be nuşteyo '''qolınd''' bêli kerdê.",
+ "recentchangeslinked-summary": "Ena liste, perra spesifike rê (ya zi karberanê kategoriya spesifike rê) perranê gırêdayoğan de lista de vırnayışê peyênana.\n[[Special:Watchlist|Lista şımaya seyrkedışi de]] perri be nuşteyo <strong>qalınd</strong> bêli kerdê.",
"recentchangeslinked-page": "Namey perrer:",
"recentchangeslinked-to": "Heruna perra kı yena dayene, vurnayışanê perranê ke daye ra gırêdayiyê inan bımotne",
"recentchanges-page-added-to-category": "[[:$1]] kerd kategoriye miyan",
"unwatchthispage": "temaşa kerdışê peli vındarn.",
"notanarticle": "mebhesê peli niyo",
"notvisiblerev": "Revizyon esteriyayo",
- "watchlist-details": "{{PLURAL:$1|$1 pele|$1 peleyan}} listeyê seyr-kerdışi şıma dı, peleyanê vurnayışi dahil niyo.",
+ "watchlist-details": "Lista şımaya seyrkerdışi de (be pelanê werênayışi ra piya) {{PLURAL:$1|$1 pele esta|$1 peli estê}}.",
"wlheader-enotif": "E-mail xeber dayiş abiyo.",
"wlheader-showupdated": "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
"wlnote": "$3 saete $4 ra dıme {{PLURAL:$2|yew saete de|'''$2''' saetan de}} {{PLURAL:$1|vurnayışo peyên|vurnayışê '''$1''' peyêni}} cêrderê.",
"sp-contributions-search": "Dekerdena cı geyrê",
"sp-contributions-username": "Adresa IPy ya zi nameyê karberi:",
"sp-contributions-toponly": "Tenya tewr çım ra viyarnayışanê peyniyan bımocne",
+ "sp-contributions-newonly": "Tenya vurnayışanê pelevıraştışi bımocne",
"sp-contributions-hideminor": "Vurriyayışanê werdiyan bınımne",
"sp-contributions-submit": "Cı geyre",
"whatlinkshere": "Linkê tedeestey",
"tooltip-feed-rss": "RSS feed qe ena pele",
"tooltip-feed-atom": "Qe ena pele atom feed",
"tooltip-t-contributions": "Yew lista iştırakanê {{GENDER:$1|enê karberi}}",
- "tooltip-t-emailuser": "Ena karber ri yew email bırış",
+ "tooltip-t-emailuser": "{{GENDER:$1|Enê karberi}} rê yew e-poste bırışe",
"tooltip-t-upload": "Dosyeyan bar ke",
"tooltip-t-specialpages": "Listeya peranê hısusiyan hemın",
"tooltip-t-print": "Versiyono perre ro ke nuşterniyaye.",
"htmlform-cloner-create": "Tayêna cı ke",
"htmlform-cloner-delete": "Wedare",
"logentry-delete-delete": "$1 perra $3 {{GENDER:$2|esterıte}}",
- "logentry-delete-restore": "$1 pela $3 {{GENDER:$2|peyser arde}}",
+ "logentry-delete-restore": "$1 pela $3 ($4) {{GENDER:$2|peyser arde}}",
"logentry-delete-event": "$1 $3: $4 de asayışê {{PLURAL:$5|cıkerdışi|cıkerdışan}} {{GENDER:$2|vurna}}",
"logentry-delete-revision": "$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} {{GENDER:$2|vurna}}",
"logentry-delete-event-legacy": "$1 Asayışê {{GENDER:$2|vurnayışê}} $3 dekerde de",
"logentry-rights-rights-legacy": "$1 qandê $3 rê ezayiya grube {{GENDER:$2|vuriye}}",
"logentry-rights-autopromote": "$1 otomatikmen $4 ra $5 {{GENDER:$2|terfi bi}}",
"logentry-upload-upload": "$1 {{GENDER:$2|bar kerd}} $3",
+ "logentry-upload-overwrite": "$1 versiyonê $3 {{GENDER:$2|bar kerd}}",
"log-name-managetags": "Qeydê idareyê etiketi",
"log-name-tag": "Qeydê etiketi",
"rightsnone": "(çıniyo)",
"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"
}
"newpageletter": "N",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} vigilando]",
- "rc_categories": "Limitar a las categorías (separadas por «|»):",
+ "rc_categories": "Limitar a categorías (sep.: |):",
"rc_categories_any": "Cualquiera de las elegidas",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} después del cambio",
"newsectionsummary": "Sección nueva: /* $1 */",
"lockmanager-fail-closelock": "No se pudo cerrar la referencia para el archivo de bloqueo de \"$1\".",
"lockmanager-fail-deletelock": "No se pudo eliminar el archivo de bloqueo para \"$1\".",
"lockmanager-fail-acquirelock": "No pudo adquirir el bloqueo para \"$1\".",
- "lockmanager-fail-openlock": "No se pudo abrir el archivo de bloqueo para \"$1\".",
+ "lockmanager-fail-openlock": "No se pudo abrir el archivo de bloqueo para \"$1\". Por favor verifica que el directorio de subidas está configurado correctamente y que tu servidor web tiene permisos de escritura en ese directorio. Ver https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory para más información.",
"lockmanager-fail-releaselock": "No se pudo liberar el bloqueo de \"$1\".",
"lockmanager-fail-db-bucket": "No se pudo contactar con las suficientes bases de datos del conjunto $1.",
"lockmanager-fail-db-release": "No se pudieron liberar los bloqueos registrados en la base de datos $1.",
"listduplicatedfiles": "Lista de archivos con duplicados",
"listduplicatedfiles-summary": "Esta es una lista de archivos donde la versión más reciente es un duplicado de la versión más reciente de un archivo con otro nombre. Solo se tienen en cuenta archivos locales.",
"listduplicatedfiles-entry": "[[:File:$1|$1]] tiene [[$3|{{PLURAL:$2|un duplicado|$2 duplicados}}]].",
- "unusedtemplates": "Plantillas sin uso",
+ "unusedtemplates": "Plantillas no utilizadas",
"unusedtemplatestext": "Aquí se enumeran todas las páginas en el espacio de nombres {{ns:template}} que no están incluidas en otras páginas. Recuerda mirar lo que enlaza a las plantillas antes de borrarlas.",
"unusedtemplateswlh": "otros enlaces",
"randompage": "Página aleatoria",
"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:",
"uncategorizedimages": "Archivos sin categorizar",
"uncategorizedtemplates": "Plantillas sin categorizar",
"uncategorized-categories-exceptionlist": "# Contiene una lista de categorías que no deberían figurar en Special:UncategorizedCategories. Una categoría por línea, empezando por «*». Las líneas que empiecen por otro carácter (espacios en blanco incluidos) se ignorarán. Usa «#» para añadir comentarios.",
- "unusedcategories": "Categorías sin uso",
- "unusedimages": "Archivos sin uso",
+ "unusedcategories": "Categorías no utilizadas",
+ "unusedimages": "Archivos no utilizados",
"wantedcategories": "Categorías requeridas",
"wantedpages": "Páginas requeridas",
"wantedpages-summary": "Lista de páginas inexistentes con el mayor número de enlaces a ellas, excluyendo páginas que son solo redirecciones a ellas. Para ver una lista de páginas inexistentes con redirecciones apuntando a ellas, consulta [[{{#special:BrokenRedirects}}|la lista de redirecciones rotas]].",
"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:",
"logentry-protect-protect-cascade": "$1 wikilariak {{GENDER:$2|}} $3 $4 babestu du [korrontean]",
"logentry-protect-modify": "$1 wikilariak {{GENDER:$2|}} $3 $4rentzako babespen maila aldatu du",
"logentry-protect-modify-cascade": "$1 wikilariak $3 $4 duten babespen maila {{GENDER:$2|aldatu}} egin du [kaskada bidez]",
- "logentry-rights-rights": "$1 wikilariak {{GENDER:$6 eta|$3 wikilarientzako}} talde bazkidetza $4tik $5ra {{GENDER:$2|aldatu}} dizkie",
- "logentry-rights-rights-legacy": "$1 erabiltzaileak $3ren talde bazkidetza {{GENDER:$2|aldatu}} egin du",
+ "logentry-rights-rights": "$1 wikilariak {{GENDER:$6|$3}} wikilaria $4 taldetik $5 taldera aldatu du",
+ "logentry-rights-rights-legacy": "$1 wikilariak $3 wikilaria taldez {{GENDER:$2|aldatu}} du",
"logentry-rights-autopromote": "$1 automatikoki $4tik $5ra {{GENDER:$2|igo}} egin zaio",
"logentry-upload-upload": "$1(e)k $3 {{GENDER:$2|igo du}}",
"logentry-upload-overwrite": "$1(e)k $3(r)en bertsio berria {{GENDER:$2|igo du}}",
"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": "فضاهای نام",
"recentchanges-noresult": "در فاصله زمانی ارائه شده هیچ تغییری با این معیارهای صورت نگرفته است",
"recentchanges-timeout": "این جستجو زمانش تمام شد. اگر مایلید کلیدواژههای دیگری را جستجو کنید.",
"recentchanges-network": "به دلیل خطای فنی، نتیجهای بدست نیامد. لطفاً برای تازهسازی صفحخ مجدداُ تلاش کنید.",
+ "recentchanges-notargetpage": "نام صفحه را در بالا وارد کنید تا تغییرات مرتبط با آن صفحه را مشاهده کنید.",
"recentchanges-feed-description": "آخرین تغییرات ویکی را در این خوراک پیگیری کنید.",
"recentchanges-label-newpage": "این ویرایش صفحهای تازه ایجاد کرد",
"recentchanges-label-minor": "این یک ویرایش جزئی است",
"rcfilters-advancedfilters": "پالایههای پیشرفته",
"rcfilters-limit-title": "تعداد تغییرات برای نمایش",
"rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|تغییر|تغییر}}, $2",
+ "rcfilters-date-popup-title": "دوره زمانی برای جستجو",
"rcfilters-days-title": "روزهای اخیر",
"rcfilters-hours-title": "ساعتهای اخیر",
"rcfilters-days-show-days": "$1 {{PLURAL:$1|روز|روز}}",
"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": "دیدن جدیدترین تغییرات",
"rcfilters-watchlist-showupdated": "تغییرات صفحاتی که شما بازدید نکردید از زمانی که تغییرات رخ داده به صورت <strong>پررنگ</strong>، با نشانگر توپر.",
"rcfilters-preference-label": "مخفی کردن نسخه بهبود یافته تغییرات اخیر",
"rcfilters-preference-help": "تغییرات رابط کاربری که در سال ۲۰۱۷ اضافه شده است را بر میگرداند.",
+ "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>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شدهاست|نشان داده شدهاند}}).",
"rclistfromreset": "از نو کردن انتخاب تاریخ",
"rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
"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]] به رده اضافه شد",
"doubleredirects": "تغییرمسیرهای دوتایی",
"doubleredirectstext": "این صفحه فهرستی از صفحههای تغییرمسیری را ارائه میکند که به صفحهٔ تغییرمسیر دیگری اشاره میکنند.\nهر سطر دربردارندهٔ پیوندهایی به تغییرمسیر اول و دوم و همچنین مقصد تغییرمسیر دوم است، که معمولاً صفحهٔ مقصد واقعی است و نخستین تغییرمسیر باید به آن اشاره کند.\nموارد <del>خط خورده</del> درست شدهاند.",
"double-redirect-fixed-move": "[[$1]] انتقال داده شدهاست.\n\nبه صورت خودکار بهروز شدهاست و تغییرمسیری به [[$2]] داده شد.",
- "double-redirect-fixed-maintenance": "رفع خودکار تغییرمسیر دوتایی از [[$1]] به [[$2]] در روند نگهداری.",
+ "double-redirect-fixed-maintenance": "رفع خودکار تغییرمسیر دوتایی از [[$1]] به [[$2]] در روند نگهداری",
"double-redirect-fixer": "تعمیرکار تغییرمسیرها",
"brokenredirects": "تغییرمسیرهای خراب",
"brokenredirectstext": "تغییرمسیرهای زیر به یک صفحهٔ ناموجود پیوند دارند:",
"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": "درونریزی صفحات شکست خورد: <nowiki>$1</nowiki>",
"importunknownsource": "نوع مأخذ درونریزی معلوم نیست",
+ "importnoprefix": "پیشوند میانویکی پشتیبانی نمیشود",
"importcantopen": "پروندهٔ درونریزی صفحات باز نشد",
"importbadinterwiki": "پیوند میانویکی نادرست",
"importsuccess": "درونریزی با موفقیت انجام شد!",
"pageinfo-category-subcats": "تعداد زیرردهها",
"pageinfo-category-files": "تعداد پروندهها",
"pageinfo-user-id": "شناسه کاربر",
+ "pageinfo-file-hash": "مقدار هش",
"markaspatrolleddiff": "برچسب گشت بزن",
"markaspatrolledtext": "به این صفحه برچسب گشت بزن",
"markaspatrolledtext-file": "انتخاب این نسخهٔ پرونده به عنوان گشت خورده",
"autosumm-replace": "جایگزینی صفحه با '$1'",
"autoredircomment": "تغییرمسیر به [[$1]]",
"autosumm-removed-redirect": "تغییرمسیر به [[$1]] حذف شد",
+ "autosumm-changed-redirect-target": "تغییر هدف تغییرمسیر از [[$1]] به [[$2]]",
"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": "ایجاد صفحه با مدل محتوای غیر استاندارد",
"restrictionsfield-badip": "نشانی یا بازهٔ آیپی نامعتبر: $1",
"restrictionsfield-label": "بازههای آیپی مجاز:",
"restrictionsfield-help": "یک نشانی آیپی یا بازهٔ سیآیدیار در هر خط وارد کنید. برای فعال کردن همهچیز، این مقدار را استفاده کنید: <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> را نمیتوان خارج از صفحههای معمولی استفاده کرد.",
"userrights-expiry-existing": "Nykyinen vanhentumisaika: $2 kello $3",
"userrights-expiry-othertime": "Muu aika:",
"userrights-expiry-options": "1 päivä:1 day,1 viikko:1 week,1 kuukausi:1 month,3 kuukautta:3 months,6 kuukautta:6 months,1 vuosi:1 year",
+ "userrights-invalid-expiry": "Ryhmän \"$1\" vanhentumisaika on virheellinen.",
+ "userrights-expiry-in-past": "Ryhmän \"$1\" vanhentumisaika on mennyt.",
"userrights-conflict": "Päällekkäinen käyttöoikeuksien muutos! Tarkista tekemäsi muutokset ja vahvista ne.",
"group": "Ryhmä",
"group-user": "käyttäjät",
"recentchangeslinked-feed": "Linkitettyjen sivujen muutokset",
"recentchangeslinked-toolbox": "Linkitettyjen sivujen muutokset",
"recentchangeslinked-title": "Sivulta $1 linkitettyjen sivujen muutokset",
- "recentchangeslinked-summary": "Tämä on luettelo muutoksista, jotka on viimeksi tehty niihin sivuihin, joihin johtaa linkki tietystä sivusta (tai jonkun määrätyn luokan sisältämistä sivuista). Omalla [[Special:Watchlist|tarkkailulistallasi]] olevat sivut on <strong>lihavoitu</strong>.",
+ "recentchangeslinked-summary": "Kirjoita sivun nimi nähdäksesi muutokset sivuihin jotka on linkitetty tai ovat tältä sivulta. (Nähdäksesi luokan jäsenet, kirjoita Luokka:Luokan nimi). Muutokset sivuihin\n[[Special:Watchlist|tarkkailulistallasi]] on <strong>lihavoitu</strong>.",
"recentchangeslinked-page": "Sivun nimi:",
"recentchangeslinked-to": "Näytä sen sijaan muutokset sivuihin, joista on linkki tähän sivuun",
"recentchanges-page-added-to-category": "[[:$1]] lisätty luokkaan",
"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.",
"uploadstash-thumbnail": "näytä pienoiskuva",
"uploadstash-bad-path": "\nPolkua ei ole.",
"uploadstash-bad-path-invalid": "Polku ei kelpaa.",
+ "uploadstash-bad-path-unknown-type": "Tuntematon tyyppi \"$1\".",
"uploadstash-not-logged-in": "Käyttäjää ei ole kirjautunut sisään, tiedostojen on kuuluttava käyttäjille.",
+ "uploadstash-no-such-key": "Ei tälläistä avainta ($1), ei voi poistaa.",
"uploadstash-no-extension": "Laajennus on tyhjä.",
"invalid-chunk-offset": "Kelpaamaton siirtymä lohkoissa",
"img-auth-accessdenied": "Pääsy estetty",
"ipb_blocked_as_range": "IP-osoite $1 on estetty välillisesti ja sen estoa ei voi poistaa. Se on estetty osana verkkoaluetta $2, jonka eston voi poistaa",
"ip_range_invalid": "Virheellinen IP-alue.",
"ip_range_toolarge": "Suuremmat osoitealue-estot kuin /$1 eivät ole sallittuja.",
+ "ip_range_toolow": "IP-alueet eivät käytännöllisesti katsoen ole sallittuja.",
"proxyblocker": "Välityspalvelinesto",
"proxyblockreason": "IP-osoitteestasi on estetty muokkaukset, koska se on avoin välityspalvelin. Ota yhteyttä Internet-palveluntarjoajaasi tai tekniseen tukeen ja kerro heille tästä tietoturvaongelmasta.",
"sorbsreason": "IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}.",
"sorbs_create_account_reason": "IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}. \nEt voi luoda käyttäjätunnusta.",
+ "softblockrangesreason": "Anonyymit muokkaukset eivät ole sallittuja IP-osoitteestasi ($1). Ole hyvä ja kirjaudu.",
"xffblockreason": "Yhteydet IP-osoitteesta, joka löytyy sinun tai käyttämäsi välipalvelimen X-Forwarded-For-otsakkeesta, on estetty. Alkuperäinen estämisen syy oli: $1",
"cant-see-hidden-user": "Käyttäjä, jota yrität estää, on jo estetty ja käyttäjänimi on piilotettu. \nKoska sinulla ei ole hideuser-oikeutta, et voi nähdä tai muuttaa käyttäjän estoasetuksia.",
"ipbblocked": "Et voi estää tai poistaa estoja muilta käyttäjiltä, koska itse olet estettynä",
"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",
"usercssispublic": "Huomio: CSS-alasivuilla ei tulisi olla luottamuksellisia tietoja, koska muut käyttäjät voivat nähdä ne.",
"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)",
"lockmanager-fail-closelock": "Impossible de fermer le fichier de verrou pour « $1 ».",
"lockmanager-fail-deletelock": "Impossible de supprimer le fichier de verrou pour « $1 ».",
"lockmanager-fail-acquirelock": "Impossible d'obtenir le verrou pour « $1 ».",
- "lockmanager-fail-openlock": "Impossible d'ouvrir le fichier de verrou pour « $1» .",
+ "lockmanager-fail-openlock": "Impossible d’ouvrir le fichier de verrou pour « $1 » . Assurez-vous que votre répertoire de téléchargement est configuré correctement et que votre serveur web a le droit d’y écrire. Voyez https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory pour plus d’information.",
"lockmanager-fail-releaselock": "Impossible de relâcher le verrou pour « $1 ».",
"lockmanager-fail-db-bucket": "Impossible de contacter suffisamment de bases de données de verrouillage dans le godet $1.",
"lockmanager-fail-db-release": "Impossible de relâcher les verrous sur la base de données $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.",
"Gothicspeaker"
]
},
+ "tog-hideminor": "𐌰𐍆𐍆𐌹𐌻𐌷 𐌻𐌴𐌹𐍄𐌹𐌻𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌰𐌹𐌶𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉",
"tog-previewontop": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽 𐍆𐌰𐌿𐍂𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌰𐍂𐌺𐌰",
"tog-previewonfirst": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽 𐌰𐍄 𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽",
"tog-enotifusertalkpages": "𐍃𐌰𐌽𐌳𐌴𐌹 𐌼𐌹𐌺 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌾𐌰𐌱𐌰𐌹 𐌼𐌴𐌹𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌳𐌰",
"error": "𐌰𐌹𐍂𐌶𐌴𐌹",
"databaseerror-error": "𐌰𐌹𐍂𐌶𐌴𐌹: $1",
"missing-article": "𐌳𐌰𐍄𐌰𐌷𐌿𐌶𐌳 𐌽𐌹 𐌱𐌹𐌲𐌰𐍄 𐌱𐍉𐌺𐍉𐍃 𐌻𐌰𐌿𐌱𐌹𐍃 𐌸𐌹𐌶𐌴𐌹 𐍃𐌺𐌿𐌻𐌳𐌴𐌳𐌹 𐌱𐌹𐌲𐌹𐍄𐌰𐌽, 𐌷𐌰𐌹𐍄𐌰𐌽𐍃 \"$1\" $2. \n\n𐌸𐌰𐍄𐌰 𐌿𐍆𐍄𐌰 𐍅𐌰𐌹𐍂𐌸𐌹𐌸 𐌾𐌰𐌱𐌰𐌹 𐌻𐌰𐌹𐍃𐍄𐌾𐌰𐌳𐌰 𐍆𐌰𐌹𐍂𐌽𐌾𐌰 𐌳𐌹𐍆𐍆 𐌸𐌰𐌿 𐍃𐍀𐌹𐌻𐌻𐌰𐌲𐌰𐍅𐌹𐍃𐍃 𐍃𐌴𐌹 𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌹𐌳𐌰 𐌹𐍃𐍄. 𐌾𐌰𐌱𐌰𐌹 𐌽𐌹𐍃𐍄, 𐌼𐌰𐌷𐍄𐍃 𐌹𐍃𐍄 𐌴𐌹 𐌱𐌹𐌲𐌴𐍄𐌴𐌹𐍃 𐌰𐌹𐍂𐌶𐌴𐌹𐌽 𐌹𐌽 𐍃𐌰𐌿𐍆𐍄𐍅𐌰𐌹𐍂𐌰. \n\n𐌱𐌹𐌳𐌾𐌰𐌼 𐌸𐌿𐌺, 𐌼𐌴𐍂𐌴𐌹 𐌸𐌰𐍄𐌰 𐌳𐌿 [[Special:ListUsers/sysop\n|𐍂𐌴𐌹𐌺]] 𐌲𐌹𐍆𐌿𐌷 𐌲𐌰𐍅𐌹𐍃.",
+ "badarticleerror": "𐌸𐍉 𐍅𐌰𐌹𐌷𐍄 𐌽𐌹 𐌼𐌰𐌲𐍄 𐍄𐌰𐌿𐌾𐌰𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
"cannotdelete-title": "𐌽𐌹 𐌼𐌰𐌲 𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌾𐌰𐌽 𐌻𐌰𐌿𐌱𐌰 \"$1\"",
"badtitle": "𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐍄𐌰 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹",
"badtitletext": "𐍆𐍂𐌰𐌹𐌷𐌰𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐍅𐌰𐍃 𐌿𐌽𐌲𐌰𐌼𐌰𐌲𐌰𐌽𐌳𐍃, 𐌻𐌰𐌿𐍃, 𐌰𐌹𐌸𐌸𐌰𐌿 𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐌱𐌰 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍃 𐌼𐌹𐌸𐍂𐌰𐌶𐌳𐌰 𐌸𐌰𐌿 𐌼𐌹𐌸-𐍅𐌹𐌺𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹. 𐌼𐌰𐌲𐌹 𐌷𐌰𐌱𐌰𐌽 𐌰𐌹𐌽𐌰 𐌸𐌰𐌿 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐍉𐍃 𐌱𐍉𐌺𐍉𐍃 𐌱𐍂𐌿𐌺𐌹𐌳𐍉𐍃 𐌹𐌽 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰𐌼.",
"showdiff": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃",
"loginreqlink": "𐌰𐍄𐌲𐌰𐌲𐌲",
"newarticle": "(𐌽𐌹𐍅𐌹)",
- "newarticletext": "𐌻𐌰𐌹𐍃𐍄𐌹𐌳𐌴𐍃 𐌲𐌰𐍅𐌹𐍃 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 𐍃𐌰𐌴𐌹 𐌽𐌹𐍃𐍄. 𐌳𐌿 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆, 𐌰𐌽 𐌰𐍃𐍄𐍉𐌳𐌴𐌹 𐌼𐌴𐌻𐌾𐌰𐌽 𐌹𐌽 𐌰𐍂𐌺𐌰𐌹 𐌿𐍆 (𐍃𐌰𐌹𐍈 [$1 𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆] 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐌹𐌽 𐌺𐌿𐌽𐌸𐌾𐌰). 𐌾𐌰𐌱𐌰𐌹 𐌹𐍃 𐌷𐌴𐍂 𐌹𐌽 𐌰𐌹𐍂𐌶𐌴𐌹𐌽𐍃, 𐌲𐌰𐌲𐌲 𐌳𐌿 <𐍃𐍄𐍂𐍉𐌽𐌲>𐌹𐌱𐌿𐌺𐌰𐌷𐌰𐌿𐌱𐌹𐌳𐌹𐌻𐍉𐌽.",
+ "newarticletext": "𐌻𐌰𐌹𐍃𐍄𐌹𐌳𐌴𐍃 𐌲𐌰𐍅𐌹𐍃 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 𐍃𐌰𐌴𐌹 𐌽𐌹𐍃𐍄. 𐌳𐌿 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆, 𐌰𐌽 𐌰𐍃𐍄𐍉𐌳𐌴𐌹 𐌼𐌴𐌻𐌾𐌰𐌽 𐌹𐌽 𐌰𐍂𐌺𐌰𐌹 𐌿𐍆 (𐍃𐌰𐌹𐍈 [$1 𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆] 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐌹𐌽 𐌺𐌿𐌽𐌸𐌾𐌰). 𐌾𐌰𐌱𐌰𐌹 𐌹𐍃 𐌷𐌴𐍂 𐌹𐌽 𐌰𐌹𐍂𐌶𐌴𐌹𐌽𐍃, 𐌲𐌰𐌲𐌲 𐌳𐌿 <strong>𐌹𐌱𐌿𐌺𐌰𐌷𐌰𐌿𐌱𐌹𐌳𐌹𐌻𐍉𐌽</strong>.",
"noarticletext": "𐌽𐌿 𐌽𐌹 𐍃𐌹𐌽𐌳 𐌱𐍉𐌺𐍉𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.\n𐌼𐌰𐌲𐍄 [[Special:Search/{{PAGENAME}}|𐍃𐍉𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐌻𐌰𐌿𐌱𐌰-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹]] 𐌹𐌽 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐌻𐌰𐌿𐌱𐌰𐌼, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 𐍃𐍉𐌺𐌾𐌰𐌽 𐌲𐌰𐌷𐌰𐌷𐌾𐍉 𐌲𐌰𐍆𐌰𐍃𐍄𐍉𐍃], 𐌰𐌹𐌸𐌸𐌰𐌿 [{{fullurl:{{FULLPAGENAME}}|action=edit}} 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆.]</ span>",
"noarticletext-nopermission": "𐌽𐌿 𐌽𐌹 𐍃𐌹𐌽𐌳 𐌱𐍉𐌺𐍉𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.\n𐌼𐌰𐌲𐍄 [[Special:Search/{{PAGENAME}}|𐍃𐍉𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐌻𐌰𐌿𐌱𐌰-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹]] 𐌹𐌽 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐌻𐌰𐌿𐌱𐌰𐌼, 𐌸𐌰𐌿 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 𐍃𐍉𐌺𐌾𐌰𐌽 𐌲𐌰𐌷𐌰𐌷𐌾𐍉 𐌲𐌰𐍆𐌰𐍃𐍄𐍉𐍃]</span>, 𐌹𐌸 𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆.",
"updated": "(𐌰𐌽𐌰𐌽𐌹𐍅𐌹𐌸)",
"moveddeleted-notice": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌿𐍃𐌽𐌿𐌼𐌰𐌽𐍃 𐌹𐍃𐍄. 𐌿𐍃𐌽𐌿𐌼𐍄𐍃 𐌾𐌰𐌷 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐍃 𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹𐌽𐌰𐌹𐍃 𐌿𐍆 𐍃𐌹𐌽𐌳 𐌿𐍃𐍄𐌰𐌹𐌺𐌽𐌴𐌹𐌽𐌰𐌹.",
"postedit-confirmation-created": "𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍃𐌺𐌰𐍀𐌰𐌽𐍃 𐌹𐍃𐍄.",
"edit-already-exists": "𐌽𐌹 𐍅𐌰𐍃 𐌼𐌰𐌷𐍄𐍃 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆. \n𐌾𐌿 𐌹𐍃𐍄.",
- "post-expand-template-inclusion-warning": "'''𐌷𐍅𐍉𐍄𐌾𐌰𐌽𐌳𐍃:''' 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐌳 𐌿𐍆𐌰𐍂𐌼𐌹𐌺𐌹𐌻𐍃. 𐍃𐌿𐌼𐍃 𐍆𐌰𐌿𐍂𐌴𐌼𐌴𐌻𐌴𐌹𐌽𐍉𐍃 𐌽𐌹 𐌼𐌰𐌲 𐍅𐌹𐍃𐌰𐌽 𐌸𐌰𐍂",
+ "post-expand-template-inclusion-warning": "<strong>𐌷𐍅𐍉𐍄𐌴𐌹𐌽𐍃</strong>: 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐌳 𐌿𐍆𐌰𐍂𐌼𐌹𐌺𐌹𐌻𐍃. 𐍃𐌿𐌼𐍃 𐍆𐌰𐌿𐍂𐌴𐌼𐌴𐌻𐌴𐌹𐌽𐍉𐍃 𐌽𐌹 𐌼𐌰𐌲 𐍅𐌹𐍃𐌰𐌽 𐌸𐌰𐍂",
"post-expand-template-inclusion-category": "𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌸𐌰𐍂 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐌳 𐌿𐍆𐌰𐍂𐌼𐌹𐌺𐌹𐌻𐍃",
"viewpagelogs": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐌹𐌽𐍃 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
"currentrev": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰 𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃",
"mytalk": "שיחה",
"anontalk": "שיחה",
"navigation": "ניווט",
- "and": " וגם",
+ "and": " ו",
"faq": "שאלות ותשובות",
"actions": "פעולות",
"namespaces": "מרחבי שם",
"anonpreviewwarning": "<em>אתם לא מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.</em>",
"missingsummary": "<strong>תזכורת:</strong> לא הזנת תקציר עריכה.\nלחיצה חוזרת על הכפתור \"$1\" תגרום לעריכה שלך להישמר בלעדיו.",
"selfredirect": "<strong>אזהרה:</strong> ניסית ליצור הפניה מדף זה לעצמו.\nאולי כתבת יעד שגוי להפניה, ואולי ערכת את הדף הלא־נכון.\nלחיצה חוזרת על הכפתור \"$1\" תגרום להפניה להיווצר בכל זאת.",
- "missingcommenttext": "×\99ש ×\9c×\94ק×\9c×\99×\93 ×\94ער×\94.",
+ "missingcommenttext": "×\99ש ×\9c×\94ק×\9c×\99×\93 ת×\95×\9b×\9f.",
"missingcommentheader": "<strong>תזכורת:</strong> לא הזנת נושא להודעה זו.\nלחיצה חוזרת על הכפתור \"$1\" תגרום לעריכה שלך להישמר ללא נושא.",
"summary-preview": "תצוגה מקדימה של תקציר העריכה:",
"subject-preview": "תצוגה מקדימה של הנושא:",
"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": "लिà¤\82à¤\95 रà¥\87à¤\96ाà¤\82à¤\95ित à¤\95रà¥\87à¤\82:",
- "tog-hideminor": "हाल मà¥\87à¤\82 हà¥\81à¤\8f परिवरà¥\8dतनà¥\8bà¤\82 मà¥\87à¤\82 à¤\9bà¥\8bà¤\9fà¥\87 बदलाव छिपाएँ",
+ "tog-underline": "à¤\95ड़à¥\80 रà¥\87à¤\96ाà¤\82à¤\95न:",
+ "tog-hideminor": "हाल मà¥\87à¤\82 हà¥\81à¤\8f परिवरà¥\8dतनà¥\8bà¤\82 मà¥\87à¤\82 लà¤\98à¥\81 परिवरà¥\8dतन छिपाएँ",
"tog-hidepatrolled": "हाल में हुए परिवर्तनों में परीक्षित बदलाव छिपाएँ",
"tog-newpageshidepatrolled": "नये पृष्ठ की सूची में परीक्षित पृष्ठों को छिपाएँ",
"tog-hidecategorization": "पृष्ठों का श्रेणीकरण छिपाएं",
"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": "इस फ़ाइल संस्करण को जांचा हुआ चिन्हित करें",
"version-poweredby-others": "अन्य",
"version-poweredby-translators": "translatewiki.net अनुवादक",
"version-credits-summary": "हम निम्न व्यक्तियों द्वारा [[Special:Version|मीडियाविकि]] में किये गए योगदानों को सराहते हैं।",
- "version-license-info": "मà¥\80डियाविà¤\95ि मà¥\81à¤\95à¥\8dत सà¥\89फ़à¥\8dà¤\9fवà¥\87यर हà¥\88; à¤\86प à¤\89सà¤\95ा पà¥\81नà¤\83 वितरण à¤\95र सà¤\95तà¥\87 हà¥\88à¤\82 à¤\94र/या à¤\89सà¥\87 सà¤\82शà¥\8bधित à¤\95र सà¤\95तà¥\87 हà¥\88à¤\82 à¤\9cà¥\88सा à¤\95ि à¤\9cà¥\87०à¤\8fन०यà¥\82० साधारण सारà¥\8dवà¤\9cनिà¤\95 लाà¤\87सà¥\87à¤\82स à¤\95à¥\87 à¤\85à¤\82तरà¤\97त फ़à¥\8dरà¥\80 लाà¤\87सà¥\87à¤\82स फ़ाà¤\89नà¥\8dडà¥\87शन दà¥\8dवारा पà¥\8dरà¤\95ाशित à¤\95िया à¤\97या था; या तà¥\8b लाà¤\87सà¥\87à¤\82स à¤\95ा à¤\85वतरण २, या (à¤\86पà¤\95à¥\87 विà¤\95लà¥\8dप à¤\95à¥\87 à¤\85नà¥\81सार) à¤\95à¥\8bà¤\88 à¤\94र à¤\85वतरण।\n\nमà¥\80डियाविà¤\95ि à¤\87स à¤\86शा à¤\95à¥\87 साथ वितरित à¤\95िया à¤\97या हà¥\88 à¤\95ि यह à¤\89पयà¥\81à¤\95à¥\8dत हà¥\88, पर वारà¤\82à¤\9fà¥\80 à¤\95à¥\87 बिना; à¤\9cिसमà¥\87à¤\82 वà¥\8dयापारिà¤\95 मापदà¤\82ड वालà¥\80 वारà¤\82à¤\9fà¥\80 à¤à¥\80 नहà¥\80à¤\82 हà¥\88 à¤\94र न हà¥\80 à¤\95िसà¥\80 लà¤\95à¥\8dषà¥\8dय à¤\95à¥\87 लिà¤\8f परà¥\8dयापà¥\8dत हà¥\8bनà¥\87 à¤\95ा पà¥\8dरावधान हà¥\88। à¤\94र à¤\9cानà¤\95ारà¥\80 à¤\95à¥\87 लिà¤\8f दà¥\87à¤\96िà¤\8f à¤\9cà¥\87०à¤\8fन०यà¥\82० साधारण सारà¥\8dवà¤\9cनिà¤\95 लाà¤\87सà¥\87à¤\82स।\n\nà¤\86पà¤\95à¥\8b à¤\87स पà¥\8dरà¥\8bà¤\97à¥\8dराम à¤\95à¥\87 साथ [{{SERVER}}{{SCRIPTPATH}}/COPYING à¤\9cà¥\87०à¤\8fन०यà¥\82० साधारण सारà¥\8dवà¤\9cनिà¤\95 लाà¤\87सà¥\87à¤\82स à¤\95à¥\80 à¤\8fà¤\95 पà¥\8dरति] मिल à¤\9aà¥\81à¤\95à¥\80 हà¥\8bà¤\97à¥\80; यदि नहà¥\80à¤\82 तà¥\8b समà¥\8dपरà¥\8dà¤\95 à¤\95à¥\80à¤\9cिà¤\8f फ़à¥\8dरà¥\80 लाà¤\87सà¥\87à¤\82स फ़ाà¤\89नà¥\8dडà¥\87शन, à¤\87à¤\82à¤\95., 51 फ़à¥\8dरà¥\88à¤\82à¤\95लिन सà¥\8dà¤\9fà¥\8dरà¥\80à¤\9f, पाà¤\81à¤\9aवà¥\80à¤\82 मà¤\82à¤\9c़िल, बà¥\8bस्टन, एम०ए० 02110-1301, यू०एस०ए० या [//www.gnu.org/licenses/old-licenses/gpl-2.0.html इसे ऑनलाइन पढ़ें].",
+ "version-license-info": "मà¥\80डियाविà¤\95ि मà¥\81à¤\95à¥\8dत सà¥\89फ़à¥\8dà¤\9fवà¥\87यर हà¥\88; à¤\86प à¤\89सà¤\95ा पà¥\81नà¤\83 वितरण à¤\95र सà¤\95तà¥\87 हà¥\88à¤\82 à¤\94र/à¤\85थवा à¤\89सà¥\87 à¤\9cà¥\87०à¤\8fन०यà¥\82० साधारण सारà¥\8dवà¤\9cनिà¤\95 लाà¤\87सà¥\87à¤\82स à¤\95à¥\87 à¤\85à¤\82तरà¤\97त सà¤\82शà¥\8bधित à¤\95र सà¤\95तà¥\87 हà¥\88à¤\82, à¤\9cà¥\88सा à¤\95à¥\80 फ़à¥\8dरà¥\80 लाà¤\87सà¥\87à¤\82स फ़ाà¤\89नà¥\8dडà¥\87शन दà¥\8dवारा पà¥\8dरà¤\95ाशित à¤\95िया à¤\97या था; या तà¥\8b लाà¤\87सà¥\87à¤\82स à¤\95ा à¤\85वतरण २, या (à¤\86पà¤\95à¥\87 विà¤\95लà¥\8dप à¤\95à¥\87 à¤\85नà¥\81सार) à¤\89सà¤\95à¥\87 बाद à¤\95à¥\87 à¤\95à¥\8bà¤\88 à¤à¥\80 à¤\85नà¥\8dय à¤\85वतरण।\n\nमà¥\80डियाविà¤\95ि à¤\87स à¤\86शा à¤\95à¥\87 साथ वितरित à¤\95िया à¤\97या हà¥\88 à¤\95ि यह à¤\89पयà¥\81à¤\95à¥\8dत हà¥\88, पर वारà¤\82à¤\9fà¥\80 à¤\95à¥\87 बिना; à¤\9cिसमà¥\87à¤\82 वà¥\8dयापारिà¤\95 मापदà¤\82ड वालà¥\80 वारà¤\82à¤\9fà¥\80 à¤à¥\80 नहà¥\80à¤\82 हà¥\88 à¤\94र न हà¥\80 à¤\95िसà¥\80 लà¤\95à¥\8dषà¥\8dय à¤\95à¥\87 लिà¤\8f परà¥\8dयापà¥\8dत हà¥\8bनà¥\87 à¤\95ा पà¥\8dरावधान हà¥\88। à¤\85धिà¤\95 à¤\9cानà¤\95ारà¥\80 à¤\95à¥\87 लिà¤\8f à¤\9cà¥\87०à¤\8fन०यà¥\82० साधारण सारà¥\8dवà¤\9cनिà¤\95 लाà¤\87सà¥\87à¤\82स दà¥\87à¤\96ियà¥\87।\n\nà¤\86पà¤\95à¥\8b à¤\87स पà¥\8dरà¥\8bà¤\97à¥\8dराम à¤\95à¥\87 साथ [{{SERVER}}{{SCRIPTPATH}}/COPYING à¤\9cà¥\87०à¤\8fन०यà¥\82० साधारण सारà¥\8dवà¤\9cनिà¤\95 लाà¤\87सà¥\87à¤\82स à¤\95à¥\80 à¤\8fà¤\95 पà¥\8dरति] मिल à¤\9aà¥\81à¤\95à¥\80 हà¥\8bà¤\97à¥\80; यदि नहà¥\80à¤\82 तà¥\8b समà¥\8dपरà¥\8dà¤\95 à¤\95à¥\80à¤\9cिà¤\8f फ़à¥\8dरà¥\80 लाà¤\87सà¥\87à¤\82स फ़ाà¤\89नà¥\8dडà¥\87शन, à¤\87à¤\82à¤\95., 51 फ़à¥\8dरà¥\88à¤\82à¤\95लिन सà¥\8dà¤\9fà¥\8dरà¥\80à¤\9f, पाà¤\81à¤\9aवà¥\80à¤\82 मà¤\82à¤\9c़िल, बà¥\89स्टन, एम०ए० 02110-1301, यू०एस०ए० या [//www.gnu.org/licenses/old-licenses/gpl-2.0.html इसे ऑनलाइन पढ़ें].",
"version-software": "इन्स्टॉल की हुई प्रणाली",
"version-software-product": "प्रोडक्ट",
"version-software-version": "अवतरण",
"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": "नया पà¥\81नà¥\8dनà¤\83 पà¥\8dरà¥\87षित लà¤\95à¥\8dषà¥\8dय",
+ "tag-mw-new-redirect": "नया à¤\85नà¥\81पà¥\8dरà¥\87षण",
"tag-mw-new-redirect-description": "बदलाव जो एक नया रीडायरेक्ट बनाते हैं या पुनर्निर्देशन के लिए एक पृष्ठ बदलते हैं",
"tag-mw-removed-redirect": "हटाया गया पुनर्निर्देशन",
"tag-mw-removed-redirect-description": "संपादन जो किसी मौजूदा रीडायरेक्ट को गैर रीडायरेक्ट में बदलता है",
"tag-mw-replace-description": "संपादन जिसने 90% से अधिक पृष्ट की सामग्री को हटा दिया",
"tag-mw-rollback": "प्रत्यापन्न",
"tag-mw-rollback-description": "संपादन जो रोलबैक लिंक का उपयोग करके पिछला संपादन वापस रोल करता है",
- "tag-mw-undo": "किए हुए कार्य को पूर्वत करना",
+ "tag-mw-undo": "à¤\95िà¤\8f हà¥\81à¤\8f à¤\95ारà¥\8dय à¤\95à¥\8b पà¥\82रà¥\8dववत à¤\95रना",
"tag-mw-undo-description": "संपादन जो पिछले लिंक का उपयोग करके पिछले संपादन को पूर्वत करता है",
"tags-title": "चिप्पियाँ",
"tags-intro": "यह पृष्ठ अर्थ सहित वह चिप्पियाँ दर्शाता है जिनका कोई तंत्रांश किसी संपादन पर निशान लगाने के लिए इस्तेमाल कर सकता है।",
"limitreport-expansiondepth": "उच्चतम विस्तार गहराई",
"limitreport-expensivefunctioncount": "महंगे पार्सर फंक्शनों की संख्या",
"expandtemplates": "साँचा विस्तार",
- "expand_templates_intro": "यह विशà¥\87ष पà¥\83षà¥\8dठपाठà¤\87नपà¥\81à¤\9f लà¥\87ता हà¥\88 à¤\94र सà¤à¥\80 साà¤\81à¤\9aà¥\8bà¤\82 à¤\95à¥\8b विसà¥\8dतà¥\83त à¤\95रता हà¥\88।\nयह <code><nowiki>{{</nowiki>#language:â\80¦}}</code> à¤\9cà¥\88सà¥\87 पारà¥\8dसर फà¤\82à¤\95à¥\8dशनà¥\8bà¤\82 à¤\94र\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> à¤\9cà¥\88सà¥\87 वà¥\87रियà¥\87बलà¥\8bà¤\82 à¤\95à¥\8b à¤à¥\80 विसà¥\8dतà¥\83त à¤\95रता हà¥\88।\nयह दà¥\8bहरà¥\87 à¤\95à¥\8bषà¥\8dठà¤\95à¥\8bà¤\82 मà¥\87à¤\82 दिया लगभग सब कुछ विस्तृत करता है।",
+ "expand_templates_intro": "यह विशà¥\87ष पà¥\83षà¥\8dठविà¤\95िपाठà¥\8dय à¤\87नपà¥\81à¤\9f लà¥\87ता हà¥\88 à¤\94र à¤\89सà¤\95à¥\87 à¤à¥\80तर à¤\95à¥\87 सà¤à¥\80 साà¤\81à¤\9aà¥\8bà¤\82 à¤\95à¥\8b विसà¥\8dतà¥\83त à¤\95रता हà¥\88।\nयह <code><nowiki>{{</nowiki>#language:â\80¦}}</code> à¤\9cà¥\88सà¥\87 पारà¥\8dसर फ़à¤\82à¤\95à¥\8dशनà¥\8dस à¤\94र\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> à¤\9cà¥\88सà¥\87 परिवरà¥\8dतनशà¥\80ल मानà¥\8bà¤\82 à¤\95ा à¤à¥\80 विसà¥\8dतà¥\8dरण à¤\95रता हà¥\88।\nयह दà¥\8bहरà¥\87 à¤\95à¥\8bषà¥\8dठà¤\95à¥\8bà¤\82 मà¥\87à¤\82 पà¥\8dरà¥\87षित लगभग सब कुछ विस्तृत करता है।",
"expand_templates_title": "कन्टेक्स्ट शीर्षक, जैसे {{FULLPAGENAME}} आदि के लिए:",
- "expand_templates_input": "à¤\87नपà¥\81à¤\9f पाठ:",
+ "expand_templates_input": "विà¤\95िपाठà¥\8dय à¤\87नपà¥\81à¤\9f à¤\95रà¥\87à¤\82:",
"expand_templates_output": "परिणाम",
"expand_templates_xml_output": "XML आउटपुट",
"expand_templates_html_output": "सीधे-साधा एचटीएमएल आउटपुट",
"expand_templates_preview": "झलक",
"expand_templates_preview_fail_html": "<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": "à¤\86पà¤\95à¥\8b à¤\95म सà¥\87 à¤\95म à¤\95à¥\81à¤\9b विà¤\95à¥\80पाठà¥\8dय पà¥\8dरदान à¤\95रनà¥\87 पड़à¥\87à¤\82à¤\97à¥\87।",
"pagelanguage": "पृष्ठ भाषा बदलें",
"pagelang-name": "पृष्ठ",
"pagelang-language": "भाषा",
"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.",
"logentry-import-interwiki": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 s drugog wikija",
"logentry-import-interwiki-details": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 sa $5 ($4 {{PLURAL:$4|izmjena|izmjene|izmjena}})",
"logentry-merge-merge": "$1 je {{GENDER:$2|spojio|spojila}} $3 s $4 (izmjene do $5)",
- "logentry-move-move": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4",
+ "logentry-move-move": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4",
"logentry-move-move-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 bez preusmjeravanja",
"logentry-move-move_redir": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja",
"logentry-move-move_redir-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja",
"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:",
"uncategorized-categories-exceptionlist": " # Contine un lista de categorias que non debe esser mentionate sur Special:UncategorizedCategories. Un per linea, comenciante con \"*\". Lineas que comencia con un altere character (incluse spatios) es ignorate. Usa \"#\" for commentos.",
"unusedcategories": "Categorias non usate",
"unusedimages": "Imagines non usate",
- "wantedcategories": "Categorias plus demandate",
- "wantedpages": "Paginas plus demandate",
+ "wantedcategories": "Categorias desirate",
+ "wantedpages": "Paginas desirate",
"wantedpages-summary": "Lista del paginas non existente con le major numero de ligamines verso illos, excludente le paginas verso le quales solmente redirectiones liga. Pro un lista del paginas non existente verso le quales redirectiones liga, vide [[{{#special:BrokenRedirects}}|le lista de redirectiones rupte]].",
"wantedpages-badtitle": "Titulo invalide in le gruppo de resultatos: $1",
"wantedfiles": "Files desirate",
"pageinfo-category-subcats": "Numero de subcategorias",
"pageinfo-category-files": "Numero de files",
"pageinfo-user-id": "ID de usator",
+ "pageinfo-file-hash": "Valor hash",
"markaspatrolleddiff": "Marcar como patruliate",
"markaspatrolledtext": "Marcar iste pagina como patruliate",
"markaspatrolledtext-file": "Marcar iste version del file como patruliate",
"version-poweredby-others": "alteres",
"version-poweredby-translators": "Traductores de translatewiki.net",
"version-credits-summary": "Nos vole recognoscer le sequente personas pro lor contribution a [[Special:Version|MediaWiki]].",
- "version-license-info": "MediaWiki es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.\n\nIste programma es distribuite in le sperantia que illo sia utile, ma SIN GARANTIA; sin mesmo le implicite garantia de COMMERCIALISATION o APTITUDE PRO UN PROPOSITO PARTICULAR. Vide le Licentia Public General de GNU pro plus detalios.\n\nVos deberea haber recipite [{{SERVER}}{{SCRIPTPATH}}/COPYING un exemplar del Licentia Public General de GNU] con iste programma; si non, scribe al Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [//www.gnu.org/copyleft/gpl.html lege lo in linea].",
+ "version-license-info": "MediaWiki es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.\n\nIste programma es distribuite in le sperantia que illo sia utile, ma <em>SIN GARANTIA</em>; sin mesmo le implicite garantia de <strong>COMMERCIALISATION</strong> o <strong>APTITUDE PRO UN PROPOSITO PARTICULAR</sdtrong>. Vide le Licentia Public General de GNU pro plus detalios.\n\nVos deberea haber recipite [{{SERVER}}{{SCRIPTPATH}}/COPYING un exemplar del Licentia Public General de GNU] con iste programma; si non, scribe al Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [//www.gnu.org/copyleft/gpl.html lege lo in linea].",
"version-software": "Software installate",
"version-software-product": "Producto",
"version-software-version": "Version",
"limitreport-expansiondepth": "Maxime profunditate de expansion",
"limitreport-expensivefunctioncount": "Numero de functiones analysator costose",
"expandtemplates": "Expander patronos",
- "expand_templates_intro": "Iste pagina special prende texto e expande recursivemente tote le patronos in illo.\nIllo expande etiam le functiones del analysator syntactic como\n<code><nowiki>{{</nowiki>#language:…}}</code>, e variabiles como\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nDe facto, illo expande quasi toto inter accolladas duple.",
+ "expand_templates_intro": "Iste pagina special prende wikitexto e expande recursivemente tote le patronos in illo.\nIllo expande etiam le functiones del analysator syntactic como\n<code><nowiki>{{</nowiki>#language:…}}</code>, e variabiles como\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nDe facto, illo expande quasi toto inter accolladas duple.",
"expand_templates_title": "Titulo de contexto, pro {{FULLPAGENAME}} etc.:",
- "expand_templates_input": "Texto de entrata:",
+ "expand_templates_input": "Scribe wikitexto:",
"expand_templates_output": "Resultato",
"expand_templates_xml_output": "Output XML",
"expand_templates_html_output": "Resultato in HTML brute",
"expand_templates_preview": "Previsualisation",
"expand_templates_preview_fail_html": "<em>Perque {{SITENAME}} ha HTML crude activate e il habeva un perdita de datos de session, le previsualisation es celate como precaution contra attaccos con JavaScript.</em>\n\n<strong>Si isto es un tentativa de previsualisation legitime, per favor essaya lo de novo.</strong>\nSi illo ancora non functiona, essaya [[Special:UserLogout|clauder le session]] e aperir un nove session, e verifica que tu navigator permitte le cookies de iste sito.",
"expand_templates_preview_fail_html_anon": "<em>Perque {{SITENAME}} ha HTML crude activate e tu non ha aperite session, le previsualisation es celate como precaution contra attaccos con JavaScript.</em>\n\n<strong>Si isto es un tentativa de previsualisation legitime, per favor [[Special:UserLogin|aperi session]] e essaya lo de novo.</strong>",
- "expand_templates_input_missing": "Tu debe scriber alcun texto de entrata.",
+ "expand_templates_input_missing": "Tu debe fornir alcun wikitexto.",
"pagelanguage": "Cambiar lingua del pagina",
"pagelang-name": "Pagina",
"pagelang-language": "Lingua",
"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": "Эршаш",
"history": "Истори",
"history_short": "Истори",
"updatedmarker": "Со тIеххьара укхаз хинначул тIехьагIа кердадаьккхад",
- "printableversion": "Зарба тохара верси",
- "permalink": "Ð\94аиман лаÑ\82Ñ\82аÑ\88 йола Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80г",
+ "printableversion": "Зарба тохара эрш",
+ "permalink": "Ð\9cаÑ\81Ñ\81аза болÑ\85 бÑ\83 Ñ\82Ó\8fаÑ\82овжам",
"print": "Зарба тоха",
"view": "Хьажар",
"view-foreign": "Укх $1 сайта чу хьажа",
"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ув",
"aboutpage": "Project:Сурт оттадар",
"copyright": "Чудара тIакхоачилга $1 лицензе бокъонца да, нагахьа кхыдар белгалдаь деце.",
"copyrightpage": "{{ns:project}}:Автора бокъонаш",
- "currentevents": "Ð¥Ó\80анзаÑ\80а хинна хIамаш",
- "currentevents-url": "Project:Ð¥Ó\80анзаÑ\80а Ñ\85инна Ñ\85Iамаш",
+ "currentevents": "Ð\9aаÑ\80аÑ\80Ñ\87а Ñ\85ана хинна хIамаш",
+ "currentevents-url": "Project:Ð\9aаÑ\80аÑ\80Ñ\87а Ñ\85ана Ñ\85инна Ñ\85Ó\8fамаш",
"disclaimers": "Бехктокхам тIацаэцар",
"disclaimerpage": "Project:Бехктокхам тIацаэцар",
"edithelp": "Хувцам бара новкъостал",
"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?",
"createacct-another-username-ph": "Iочуязъе доакъашхочун цӀи",
"yourpassword": "КъайладIоагIа:",
"userlogin-yourpassword": "Пароль",
- "userlogin-yourpassword-ph": "Iочуязъе хьа пароль",
- "createacct-yourpassword-ph": "Iочуязъе пароль",
+ "userlogin-yourpassword-ph": "Ӏочуязъе хьай пароль",
+ "createacct-yourpassword-ph": "Ӏочуязъе пароль",
"yourpasswordagain": "Юхаязде къайладIоагIа:",
"createacct-yourpasswordagain": "Бакъйе пароль",
- "createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Iочуязъе пароль",
- "userlogin-remembermypassword": "СиÑ\81Ñ\82ема Ñ\87Ñ\83 виса",
+ "createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Ӏочуязъе пароль",
+ "userlogin-remembermypassword": "РажаÑ\87а Ñ\87Ñ\83виса",
"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": "ТIеракхосс хьа пароль?",
- "userlogin-helplink2": "СиÑ\81Ñ\82ема Ñ\87Ñ\83валаÑ\80аÑ\85 новкъостал",
+ "userlogin-resetpassword-link": "Тӏеракхосса езий хьа пароль?",
+ "userlogin-helplink2": "РажеÑ\87а Ñ\87Ñ\83валаÑ\80а новкъостал",
"userlogin-createanother": "Кхыдола дагара йоазув хьакхолла",
- "createacct-emailoptional": "ÐлекÑ\82Ñ\80онни поÑ\87Ñ\82а адÑ\80еÑ\81 (ца яздича мегаш да)",
- "createacct-email-ph": "Iочуязде хьа электронни почта адрес",
+ "createacct-emailoptional": "ÐлекÑ\82Ñ\80онни поÑ\88Ñ\82ан Ñ\86Ó\80ай (ца яздича мегаш да)",
+ "createacct-email-ph": "Ӏочуязде хьай электронни поштан цӀай",
"createaccountmail": "Пайда эца ца ховш нийсденна къайладIоагIа, иштта хьадайта из белгалдаь электронни почта адреса тӀа.",
"createacct-reason": "Бахьан",
- "createacct-submit": "Хьакхолла учета яздар",
+ "createacct-submit": "Хьакхолла дагара йоазув",
"createacct-another-submit": "Дагара йоазув хьакхолла",
- "createacct-benefit-heading": "{{SITENAME}} — хьо санна болача наха цхьан беш бола къахьегам ба.",
+ "createacct-benefit-heading": "{{SITENAME}} — хьо санна болча наха цхьана бу къахьегам ба.",
"createacct-benefit-body1": "{{PLURAL:$1|нийсдар|нийсдараш}}",
"createacct-benefit-body2": "{{PLURAL:$1|статья|статьяш}}",
- "createacct-benefit-body3": "{{PLURAL:$1|доакъашхо|доакъашхой}} тӀеххьара хан",
+ "createacct-benefit-body3": "ТӀехьарча хана хинна {{PLURAL:$1|доакъашхо|доакъашхой}}",
"badretype": "Оаша Iочуяьздаь къайладIоагIий цIераш цхьантара яц.",
"loginerror": "Доакъашхо вовзара гIалат",
"mailmypassword": "КъайладIоагIа тIеракхоссар",
"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": "Хувцамий сурт оттадар",
"post-expand-template-argument-category": "Лерий теркал яь йоаца белгалонаш (аргументаш) чулоацаш оагӀонаш",
"undo-failure": "Ер нийсдар юхадаккха йиш яц юкъе даь хувцамаш бахьане",
"viewpagelogs": "Укх оагӀон тептараш хьахьокха",
- "currentrev-asof": "тӀеххьара верси $1",
+ "currentrev-asof": "ТӀехьара эрш $1",
"revisionasof": "Верси $1",
"revision-info": "Верси $1; {{GENDER:$6|$2}}$7",
"previousrevision": "← Xьалхарча",
"mergelog": "ВIашагIтеха хиннарий тептар",
"revertmerge": "Дéкъа",
"history-title": "\"$1\" — хувцамай истори",
- "difference-title": "$1 — версешта юкъе йола башхало",
+ "difference-title": "$1 — эршашта юкъе йола башхало",
"lineno": "МугI $1:",
"compareselectedversions": "ВIаши йиста хержа версеш",
"editundo": "юхадаккха",
"rcshowhidebots": "$1 боташ",
"rcshowhidebots-show": "Хьахьокха",
"rcshowhidebots-hide": "Къайладаккха",
- "rcshowhideliu": "$1 бовзийтарчара доакъашхой",
+ "rcshowhideliu": "$1 ражача дӏаэтта доакъашхой",
"rcshowhideliu-show": "Хьахьокха",
"rcshowhideliu-hide": "Къайлабаха",
"rcshowhideanons": "$1 цIияккханза доакъашхой",
"recentchangeslinked-feed": "ВIашагIдувзаденна нийсдараш",
"recentchangeslinked-toolbox": "ВIашагIдувзаденна хувцамаш",
"recentchangeslinked-title": "$1ца вIашидувзаденна хувцамаш",
- "recentchangeslinked-summary": "Белгалаяь йола оагIув тIахьожавеш (е белгалаяь йола категорен юкъейоагIаш) йолча оагIонашта даь хувцамаш да ераш.\n[[Special:Watchlist|Хьа зем бара хьаязъяьра]] юкъейоагIаш оагIонаш '''белгалаяьй'''.",
+ "recentchangeslinked-summary": "Ӏочуязъе оагӀон цӀи, цунна тӀатовжаш йолча оагӀонаш чу даь дола хувцамаш бӀаргагургдолаш (ОагӀата доакъашхой бӀаргагургболаш Ӏочуязъе Category:ОагӀата цӀи). \n[[Special:Watchlist|Хьа зема хьаязъяьра]] юкъейоагӀа оагӀонаш <strong>сомача лапӀазаца</strong> белгалаяьй.",
"recentchangeslinked-page": "ОагIон цIи",
"recentchangeslinked-to": "Вешта, белгаляьккха оагIон тIахьожавеш дола оагIонашта даь хувцамаш хьахьокха.",
"upload": "Файл чуяккха",
"imagelinks": "Файлах пайда эцар",
"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": "Укх файла тIахьожавеш йола оагIонаш яц.",
- "linkstoimage-redirect": "$1 (Ñ\84айлан дÓ\80а-Ñ\81аÑ\85Ñ\8cожадар) $2",
+ "nolinkstoimage": "Укх файла тӏатовжаш оагӏонаш яц.",
+ "linkstoimage-redirect": "$1 (Ñ\84айлови дÓ\80а-Ñ\85Ñ\8cа Ñ\85Ñ\8cожавар) $2",
"sharedupload": "Ер файл $1 чура я, из пайда эцаш лелае мегаш я кхыйола проекташ чу.",
"sharedupload-desc-here": "Ер файл $1 чура я, иштта кхыйола проекташ чу пайда эца аьттув болаш я.\nЦун [$2 сурт оттадара оагIон] хоам кIалхахь хьабоалабаьб.",
"filepage-nofile": "Ишта цӀи йола файл йоацаш я.",
"watchlist-options": "Зем бара хьаязъяьра тоадараш",
"watching": "Зем бара хьаязъяьр чу тIатохар",
"unwatching": "Зем бара хьаязъяьр чура дIадаккхар",
- "enotif_reset": "Белгалъе еррига оагӀонаш бIаргтеха санна",
+ "enotif_reset": "Белгалъе еррига оагӀонаш бӀаргтехача санна",
"deletepage": "ДIаяккха оагIув",
"confirmdeletetext": "Оаш дIадийхад бIарчча дIадаккхар оагIон а (е сурта), цун деррига хувцара истори а. '''Дехар да''', бакъде шоай из бокъонца де безам болаш долга а, из дича хургдар кхеташ долга а, из дар укх [[{{MediaWiki:Policy-url}}|бокъонашца]] долга.",
"actioncomplete": "Ардам кхоачашдаьд",
"actionfailed": "Ардам кхоачашдаьдац",
"deletedtext": "«$1» дIаяьккхай.\nХьажа $2 тIехьара дIадаккхарий хьаязъяьрга бIаргтохаргболаш.",
- "dellogpage": "ДIадаккхарай тептар",
+ "dellogpage": "ДӀадаккхарий тептар",
"deletecomment": "Бахьан:",
"deleteotherreason": "Кхыдола бахьан/тIатохар:",
"deletereasonotherlist": "Кхыдола бахьан",
"sp-contributions-toponly": "Гойта алхха тIехьара версеш санна лоархIаш дола нийсдараш",
"sp-contributions-newonly": "ОагIонаш кхоллара мара хувцамаш ма гойта.",
"sp-contributions-submit": "Хьалáха",
- "whatlinkshere": "ТIахьожаяргаш укхаза",
- "whatlinkshere-title": "\"$1а\" тIахьожавеш йола оагIонаш",
+ "whatlinkshere": "Тӏатовжамаш укхаза",
+ "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": "Файлови тIахьожаярг",
+ "isimage": "Файлови тӏатовжам",
"whatlinkshere-prev": "{{PLURAL:$1|1=хьалхайоагIа|хьалхайоагIараш}} $1",
"whatlinkshere-next": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
- "whatlinkshere-links": "← тIахьожаяргаш",
- "whatlinkshere-hideredirs": "$1 дIа-сахьожадараш",
- "whatlinkshere-hidetrans": "$1 Ñ\8eкÑ\8aейоалаÑ\8fраш",
- "whatlinkshere-hidelinks": "$1 тIахьожаяргаш",
+ "whatlinkshere-links": "← тӏатовжамаш",
+ "whatlinkshere-hideredirs": "$1 дӀа-хьа хьожавараш",
+ "whatlinkshere-hidetrans": "$1 Ñ\8eкÑ\8aедоаладаÑ\8cраш",
+ "whatlinkshere-hidelinks": "$1 тӏатовжамаш",
"whatlinkshere-hideimages": "$1 файлай тIахьожаяргаш",
"whatlinkshere-filters": "Фильтраш",
"blockip": "ЧIега тоха {{GENDER:$1|доакъашхочун}}",
"movepage-moved": "'''«$1» оагIон ер «$2» цIи тиллай'''",
"articleexists": "Изза мо цIи йола оагIув тхьовре йолаш я е оаш тилла цIи мегаш яц.\nДехар да, кхыйола цIи харжа.",
"movetalk": "ЦIи хувца дувца оттадара оагIон а",
- "movelogpage": "ЦIи хувцара тептар",
+ "movelogpage": "ЦӀераш хувцара тептар",
"movereason": "Бахьан:",
"revertmove": "юха",
- "export": "ОагIонай экспорт",
+ "export": "Оагӏоний экспорт",
"allmessagesname": "Хоам",
"allmessagesdefault": "Массаза йола текст",
"allmessages-filter-all": "Еррига",
"tooltip-ca-history": "Укх оагIон даь хувцамаш тIа дола тептар",
"tooltip-ca-protect": "Лорае ер оагIув хувцамаш дергдоацаш",
"tooltip-ca-delete": "ДӀаяккха ер оагӀув",
- "tooltip-ca-move": "Укх оагIон цIи хувца",
+ "tooltip-ca-move": "Укх оагӀон цӀи хувца",
"tooltip-ca-watch": "ТIатоха ер оагIув хьа зем бара хьаязъяьра",
- "tooltip-ca-unwatch": "ДIаяккха ер оагIув шоай зем бара хьаязъяьр тIара",
+ "tooltip-ca-unwatch": "ДӀаяккха ер оагӀув шоай зема хьаязъяьра тIара",
"tooltip-search": "Хьалáха {{grammar:prepositional|{{SITENAME}}}} чу",
"tooltip-search-go": "Изза мо цӀи йолаш оагӀон тӀa дехьавала",
"tooltip-search-fulltext": "Изза мо текст йолаш оагӀонаш лаха",
"tooltip-n-recentchanges": "ТӀеххьара хувцамий хьаязъяьр",
"tooltip-n-randompage": "Башхало йоаца ца ховш нийсъенна оагӀув хьаела",
"tooltip-n-help": "Новкъостал лаха мегаш йола моттиг",
- "tooltip-t-whatlinkshere": "Укхаза тIахьожавеш йола оагIонаш",
+ "tooltip-t-whatlinkshere": "Укхаза тӏатовжаш йола оагӏонаш",
"tooltip-t-recentchangeslinked": "Укх оагIо тIахьожавеш йолча оагIонай тIеххьара хувцамаш",
"tooltip-feed-rss": "RSS чу гойтар укх оагIон",
"tooltip-feed-atom": "Укх оагIонна лаьрххIа Atom чу трансляци яр",
"tooltip-t-emailuser": "ДIахьийта каьхат {{GENDER:$1|укх доакъашхочун}}",
"tooltip-t-upload": "Файлаш чуяккха",
"tooltip-t-specialpages": "ГIулакха оагIонаш",
- "tooltip-t-print": "Укх оагIон зарба тохара верси",
- "tooltip-t-permalink": "ОагIон укх версин тIахьожавеш йола даим латташ йола тIахьожаярг",
+ "tooltip-t-print": "Укх оагӏон зарба тохара эрш",
+ "tooltip-t-permalink": "ОагIон укх эрша тӏатовжаш бола массаза тӏатовжам",
"tooltip-ca-nstab-main": "ОагIон чударга хьажар",
"tooltip-ca-nstab-user": "Доакъашхочун ше доалахь йола оагIув",
"tooltip-ca-nstab-special": "Ер гIулакха оагIув я, из хувца бокъо яц",
"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": "Оригинальни таьрахьи хаи",
"exif-languagecode": "Мотт",
"exif-iimcategory": "Категори",
"exif-orientation-1": "гIаьхьа",
+ "exif-exposureprogram-1": "Кара",
"exif-scenecapturetype-1": "Ландшафт",
"exif-scenecapturetype-2": "Сага сурт",
"exif-iimcategory-edu": "Дешарца Iомадар",
"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 {{GENDER:$2|цӀи хийцай}} $3 → $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",
"delete-toobig": "Þessi síða hefur stóra breytingaskrá, yfir $1 {{PLURAL:$1|breyting|breytingar}}.\nÓheimilt er að eyða slíkum síðum til að valda ekki óæskilegum truflunum á {{SITENAME}}.",
"delete-warning-toobig": "Þessi síða hefur stóra breytingaskrá, yfir $1 {{PLURAL:$1|breyting|breytingar}}.\nEyðing síðunnar gæti truflað vinnslu gangnasafns {{SITENAME}}; haltu áfram með varúð.",
"deleteprotected": "Þú getur ekki eytt þessari síðu því hún hefur verið vernduð.",
- "deleting-backlinks-warning": "<strong>Viðvörun:</strong> [[Kerfissíða:Síður sem tengjast hingað/{{FULLPAGENAME}}|Aðrar síður]] tengjast eða inniheldur efni af síðunni sem þú ætlar að eyða.",
+ "deleting-backlinks-warning": "<strong>Viðvörun:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Aðrar síður]] tengjast eða innihalda efni af síðunni sem þú ætlar að eyða.",
"rollback": "Taka aftur breytingar",
"rollbacklink": "taka aftur",
"rollbacklinkcount": "taka aftur $1 {{PLURAL:$1|breytingu|breytingar}}",
"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-poweredby-others": "aðrir",
"version-poweredby-translators": "Þýðendur á translatewiki.net",
"version-credits-summary": "Við viljum þakka eftirfarandi einstaklingum fyrir framlag þeirra til [[Special:Version|MediaWiki]].",
- "version-license-info": "MediaWiki er frjáls hugbúnaður; þú mátt endurútgefa hann og/eða breyta honum undir GNU General Public leyfi eins og það er gefið út af Free Software stofnuninni, annaðhvort útgáfu 2 eða (að þínu mati) hvaða nýrri útgáfa sem er.\n\nMediaWiki er útgefin í þeirri von að hann sé gagnlegur, en ÁN ALLRAR ÁBYRGÐAR; þar meðtalið er undanskilin ábyrgð við MARKAÐSETNINGU og að hugbúnaðurinn VIRKI Í ÁKVEÐNUM TILGANGI. Sjá GNU General Public leyfið fyrir frekari upplýsingar.\n\nÞú ættir að hafa fengið [{{SERVER}}{{SCRIPTPATH}}/COPYING afrit af GNU General Public leyfinu] með þessum hugbúnaði, en ef ekki, skrifaðu til Free Software stofnunarinnar, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Bandaríkjunum eða [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lestu það á netinu]",
+ "version-license-info": "MediaWiki er frjáls hugbúnaður; þú mátt endurútgefa hann og/eða breyta honum undir GNU General Public leyfi eins og það er gefið út af Free Software stofnuninni, annaðhvort útgáfu 2 eða (að þínu mati) hvaða nýrri útgáfa sem er.\n\nMediaWiki er útgefin í þeirri von að hann sé gagnlegur, en <em>ÁN ALLRAR ÁBYRGÐAR</em>; þar meðtalið er undanskilin ábyrgð við </strong>MARKAÐSETNINGU<strong> og að hugbúnaðurinn <strong>VIRKI Í ÁKVEÐNUM TILGANGI</strong>. Sjá GNU General Public leyfið fyrir frekari upplýsingar.\n\nÞú ættir að hafa fengið [{{SERVER}}{{SCRIPTPATH}}/COPYING afrit af GNU General Public leyfinu] með þessum hugbúnaði, en ef ekki, skrifaðu til Free Software stofnunarinnar, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Bandaríkjunum eða [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lestu það á netinu]",
"version-software": "Uppsettur hugbúnaður",
"version-software-product": "Vara",
"version-software-version": "Útgáfa",
"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:",
"compare-title-not-exists": "Umbeðinn titill er ekki til.",
"compare-revision-not-exists": "Umbeðin útgáfa er ekki til.",
"diff-form": "Mismunur",
+ "diff-form-submit": "Sýna mun",
+ "permanentlink": "Varanlegur tengill",
+ "permanentlink-revid": "Auðkenni útgáfu",
+ "permanentlink-submit": "Fara í útgáfu",
"dberr-problems": "Því miður!Tæknilegir örðugleikar eru á þessari síðu.",
"dberr-again": "Reyndu að bíða í nokkrar mínútur og endurhlaða síðan síðuna.",
"dberr-info": "(Mistókst að fá aðgang að gagnaþjóni: $1)",
"logentry-delete-delete": "$1 {{GENDER:$2|eyddi}} síðunni $3",
"logentry-delete-delete_redir": "$1 {{GENDER:$2|eyddi}} tilvísun $3 með því að yfirskrifa",
"logentry-delete-restore": "$1 {{GENDER:$2|endurvakti}} síðu $3 ($4)",
+ "logentry-delete-restore-nocount": "$1 {{GENDER:$2|endurvakti}} síðu $3",
+ "restore-count-revisions": "{{PLURAL:$1|1 útgáfu|$1 útgáfur}}",
"restore-count-files": "{{PLURAL:$1|1 skrá|$1 skrár}}",
"logentry-delete-event": "$1 {{GENDER:$2|breytti}} sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4",
"logentry-delete-revision": "$1 {{GENDER:$2|breytti}} sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4",
"logentry-block-unblock": "$1 {{GENDER:$2|afbannaði}} {{GENDER:$4|$3}}",
"logentry-block-reblock": "$1 {{GENDER:$2|breytti}} bann stillingum fyrir {{GENDER:$4|$3}}, rennur út $5 $6",
"logentry-suppress-block": "$1 {{GENDER:$2|bannaði}} {{GENDER:$4|$3}}, rennur út eftir $5 $6",
+ "logentry-suppress-reblock": "$1 {{GENDER:$2|breytti}} bannstillingum fyrir {{GENDER:$4|$3}}, rennur út $5 $6",
"logentry-import-upload": "$1 {{GENDER:$2|flutti inn}} $3 úr innsendri skrá",
"logentry-import-upload-details": "$1 {{GENDER:$2|flutti}} $3 inn úr innsendri skrá ($4 {{PLURAL:$4|útgáfa|útgáfur}})",
"logentry-import-interwiki": "$1 {{GENDER:$2|flutti inn}} $3 frá öðru wiki",
"log-name-managetags": "Breytingaskrá yfir sýsl með merki",
"logentry-managetags-create": "$1 {{GENDER:$2|bjó til}} merkið \"$4\"",
"rightsnone": "(engum)",
+ "rightslogentry-temporary-group": "$1 (tímabundið, til $2)",
"feedback-adding": "Bæti umsögn á síðuna...",
"feedback-back": "Til baka",
"feedback-bugcheck": "Frábært! Athugaðu hvort þessi villa hafi verið [$1 tilkynnt áður].",
"limitreport-expansiondepth-value": "$1/$2",
"limitreport-expensivefunctioncount-value": "$1/$2",
"expandtemplates": "Opna sniðmát",
- "expand_templates_input": "Inntakstexti:",
+ "expand_templates_input": "Inntaks-wikitexti:",
"expand_templates_output": "Útkoma",
"expand_templates_xml_output": "XML-úttak",
"expand_templates_html_output": "Hrátt HTML úttak",
"expand_templates_preview": "Forskoðun",
"expand_templates_preview_fail_html": "<em>Þar sem {{SITENAME}} styður hráan HTML kóða, þá hefur forskoðunin verið falin sem vörn gegn JavaScript árásum.</em>\n\n<strong>Ef þetta er lögleg breyting, reyndu þá aftur.</strong>\nEf það virkar ekki, reyndu að [[Special:UserLogout|skrá þig út]], skrá þig aftur inn og athugaðu hvort vafrinn þinn leyfi vefkökur frá þessu vefsvæði.",
"expand_templates_preview_fail_html_anon": "<em>Þar sem {{SITENAME}} styður hráan HTML kóða og þú ert ekki skráð/ur inn, þá hefur forskoðunin verið falin sem vörn gegn JavaScript árásum.</em>\n\n<strong>Ef þetta er lögleg breyting, reyndu að [[Special:UserLogin|skrá þig inn]], og prófa aftur.</strong>",
- "expand_templates_input_missing": "Þú verður að skrifa inn einhvern inntakstexta.",
+ "expand_templates_input_missing": "Þú verður að skrifa inn einhvern inntaks-wikitexta.",
"pagelanguage": "Breyta tungumáli síðu",
"pagelang-name": "Síða",
"pagelang-language": "Tungumál",
"Greis",
"Pierpao",
"Sakretsu",
- "Yiyi"
+ "Yiyi",
+ "Manvydasz"
]
},
"tog-underline": "Sottolinea i collegamenti:",
"lockmanager-fail-closelock": "Non riuscita chiusura del file di blocco per \"$1\".",
"lockmanager-fail-deletelock": "Non riuscita cancellazione del file di blocco per \"$1\".",
"lockmanager-fail-acquirelock": "Non riuscita acquisizione blocco per \"$1\".",
- "lockmanager-fail-openlock": "Non riuscita apertura del file di blocco per \"$1\".",
+ "lockmanager-fail-openlock": "Non riuscita apertura del file di blocco per \"$1\". Assicurati che la cartella per i caricamenti sia configurata correttamente e il web server abbia i permessi per scriverci. Vedi https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory per ulteriori informazioni.",
"lockmanager-fail-releaselock": "Non riuscito rilascio del blocco per \"$1\".",
"lockmanager-fail-db-bucket": "Impossibile contattare i necessari database di blocco nel bucket $1.",
"lockmanager-fail-db-release": "Impossibile revocare i blocchi sul database $1.",
"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:",
"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-savedqueries-add-new-title": "ამჟამინდელი ფილტრის კონფიგურაციის შენახვა",
"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-show-new-changes": "ახალი ცვლილებების ნახვა",
+ "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> 태그는 일반 페이지 밖에서는 사용할 수 없습니다.",
"category_header": "Šivut, kumpaset ollah luokašša $1",
"subcategories": "Alaluokat",
"category-media-header": "Medijafailit luokašša «$1»",
+ "category-empty": "Täššä luokašša ei ole šivuja tahi failoja.",
"hidden-categories": "{{PLURAL:$1|Peitetty luokka|Peitetyt luokat}}",
"hidden-category-category": "Peitetyt luokat",
"category-subcat-count": "{{PLURAL:$2|Täššä luokašša on vain tämä alaluokka.|Täššä luokašša on nämä {{PLURAL:$1|subcategory|$1 alaluokkua}}, kaikkieštah $2.}}",
"ok": "OK",
"retrievedfrom": "Lähte - \"$1\"",
"youhavenewmessages": "{{PLURAL:$3|Šiula on}} $1 ($2).",
+ "newmessageslinkplural": "{{PLURAL:$1|uusi viesti|999=uusie viestie}}",
+ "newmessagesdifflinkplural": "{{PLURAL:$1|jälkimäini muutos|999=jälkimäistä muutosta}}",
"editsection": "kohentele",
"editold": "kohentele",
"viewsourceold": "näytä wikiteksti",
"nstab-special": "Toimintošivu",
"nstab-project": "Projektišivu",
"nstab-image": "Faili",
+ "nstab-mediawiki": "Viesti",
"nstab-template": "Malli",
"nstab-category": "Luokka",
"mainpage-nstab": "Piäšivu",
"template-protected": "(šuojattu)",
"template-semiprotected": "(ošittain šuojattu)",
"hiddencategories": "Tämä šivu kuuluu {{PLURAL:$1|1 peitettyh kategorijah|$1 peitettylöih kategorijoih}}:",
+ "permissionserrors": "Ei oikevukšie",
"permissionserrorstext-withaction": "Šiula ei ole oikeutta {{lcfirst:$2}} {{PLURAL:$1|šeuruavašta šyyštä|šeuruavista šyistä}}:",
"moveddeleted-notice": "Tämä šivu on poissettu.\nAlla on tämän šivun poisto- ta šiirtoistorija.",
"content-model-wikitext": "wikiteksti",
"history-fieldset-title": "Eči kohennukšet",
"histfirst": "vanhin",
"histlast": "uušin",
+ "history-feed-title": "Kohennusistorija",
+ "history-feed-description": "Tämän šivun kohennusistorija",
"history-feed-item-nocomment": "$1 ($2)",
"rev-delundel": "muuta näkyvyttä",
"history-title": "Šivun ”$1” muutošistorija",
"protectcomment": "Šyy",
"protect-default": "Anna lupa kohennella kaikilla käyttäjillä",
"restriction-edit": "Kohentele",
+ "restriction-move": "Šiirrä",
"undelete-search-submit": "Ečindy",
"namespace": "Nimitilat:",
"invert": "Päinvaštani valinta",
"tooltip-ca-nstab-image": "Näytä failin šivu",
"tooltip-ca-nstab-template": "Näytä malli",
"tooltip-ca-nstab-category": "Näytä luokkašivu",
+ "tooltip-minoredit": "Merkiče tämä pieneksi kohennukseksi",
"tooltip-save": "Tallenna muutokšet",
"tooltip-preview": "Esikačo muutokšet. Ole hyvä, luaji šitä aina ennen tallennušta.",
"tooltip-diff": "Näytä luajitut muutokšet",
"tooltip-undo": "Kumuomini palauttau tämän muutokšen ta avuau artikkelin esikaččelušša. Yhtehvetokenttäh voi kirjuttua palautukšen šyyn.",
"tooltip-summary": "Kirjuta lyhyt kuvauš",
"simpleantispam-label": "Anti-spam-tarkissuš. \n<strong>älä</strong> täytä tätä!",
+ "pageinfo-title": "Tietoja šivušta $1",
+ "pageinfo-header-edits": "Kohennukšien istorija",
"pageinfo-header-restrictions": "Šivun šuojauš",
"pageinfo-display-title": "Näytä oččikko",
+ "pageinfo-length": "Šivun pituhuš (tavuloina)",
+ "pageinfo-firstuser": "Šivun luatija",
"pageinfo-toolboxlink": "Šivun tiijot",
"previousdiff": "← Vanhempi muutoš",
"nextdiff": "Uuvvempi muutoš →",
"logentry-move-move": "$1 {{GENDER:$2|šiirretty}} šivu $3 kohtah $4",
"logentry-newusers-create": "Käyttäjätunnuš $1 {{GENDER:$2|oli luotu}}",
"logentry-upload-upload": "$1 {{GENDER:$2|päivitetty}} $3",
- "searchsuggest-search": "Eči {{SITENAME}}"
+ "searchsuggest-search": "Eči {{SITENAME}}",
+ "duration-days": "$1 {{PLURAL:$1|päivä|päivyä}}"
}
"password-change-forbidden": "Dir däerft op dëser Wiki Passwierder net änneren.",
"externaldberror": "Entweder ass e Feeler bei der externer Authentifizéierung geschitt, oder Dir däerft Ären externe Benotzerkont net aktualiséieren.",
"login": "Aloggen",
- "login-security": "Iwwerpréift Är Idnetitéit",
+ "login-security": "Iwwerpréift Är Identitéit",
"nav-login-createaccount": "Aloggen / Benotzerkont uleeën",
"logout": "Ofmellen",
"userlogout": "Ausloggen",
"doubleredirects": "Duebel Viruleedungen",
"doubleredirectstext": "Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.\nAn all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d'Zil vun der zweeter Viruleedung, déi normalerweis déi \"richteg\" Zilsäit ass, op déi déi éischt Viruleedung hilinke soll.\n<del>Duerchgestrachen</del> Linke goufe scho sou verännert datt déi duebel Viruleedung opgeléist ass.",
"double-redirect-fixed-move": "[[$1]] gouf geréckelt.\nD'Säit gouf automatesch aktualiséiert an et ass elo eng Viruleedung op [[$2]].",
- "double-redirect-fixed-maintenance": "Duebel Viruleedung vu(n) [[$1]] op [[$2]] gouf automatesch an engem 'maintenance job' gefléckt.",
+ "double-redirect-fixed-maintenance": "Duebel Viruleedung vu(n) [[$1]] op [[$2]] gouf automatesch an engem 'maintenance job' gefléckt",
"double-redirect-fixer": "Verbesserung vu Viruleedungen",
"brokenredirects": "Futtis Viruleedungen",
"brokenredirectstext": "Dës Viruleedunge linken op Säiten déi et net gëtt.",
"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",
"C.R.",
"Macofe",
"Nemo bis",
- "S4b1nuz E.656"
+ "S4b1nuz E.656",
+ "Luensu1959",
+ "Feipìn"
]
},
- "tog-underline": "Sottolineâ i collegamenti",
- "tog-hideminor": "Ascondi e modiffiche minoî inti urtime modiffiche",
- "tog-hidepatrolled": "Ascondi e modifiche verificæ inte ùrtime modifiche",
- "tog-newpageshidepatrolled": "Ascondi e paggine verificæ da l'elenco de paggine ciù reçenti",
- "tog-hidecategorization": "Ascondi a categorizzassion de paggine",
- "tog-extendwatchlist": "mostra tùtte e modifiche a-i osservæ speciali, non solo l'urtima",
- "tog-usenewrc": "Amuggia pe paggina e modiffiche in urtime modifiche e sotta oservaçion",
- "tog-numberheadings": "Nùmeraçion aotomàtica di tìtoli de seçión",
- "tog-showtoolbar": "Fanni vedde a bara di strumenti de modìffica",
+ "tog-underline": "Sotolìnnia i colegamé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ì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": "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çioin co-o clic drito in sciô tìtolo",
- "tog-watchcreations": "Azonzi e paggine che creo e i file che carrego a-i oservæ speciâli",
- "tog-watchdefault": "Azonzi e paggine e i files che modiffico a-i mæ sotta oservaçion",
- "tog-watchmoves": "Azonzi e paggine e i file che mescio a-i mæ sotta oservaçion",
- "tog-watchdeletion": "Azonzi e paggine e i files che scancello a-i mæ sotta oservaçion",
- "tog-watchuploads": "Azonzi i noeuvi file che metto in osservaçion",
- "tog-watchrollback": "Azonzi a-i sotta osservassion e paggine dovve ho fæto un rollback",
- "tog-minordefault": "Indica de longo comme menô e modiffiche",
- "tog-previewontop": "Mostra l'anteprimma de d'ato a-a casella de modiffica",
- "tog-previewonfirst": "Mostra l'anteprimma in sciâ primma modiffica",
- "tog-enotifwatchlistpages": "Famme savéi via e-mail quande 'na paggina o in file inti mæ osservæ a ven cangiâ.",
- "tog-enotifusertalkpages": "Màndime un'e-mail se gh'é de modìffiche inta mæ pagina de discuscion.",
- "tog-enotifminoredits": "Mandime una email ascì pe e modifiche menoî de pagine e di file",
- "tog-enotifrevealaddr": "Mostra o mæ addresso inte e-mail de notiffica",
- "tog-shownumberswatching": "Mostra o numero di utenti che tegnan d'oeuggio sta pagina",
- "tog-oldsig": "Firma attoale:",
- "tog-fancysig": "Tratta a firma comme wikitesto (sensa un ingancio aotomattico)",
- "tog-uselivepreview": "Abillita a fonsion de l'anteprimma in diretta",
- "tog-forceeditsummary": "Domanda conferma se o campo ogetto o l'è veuo",
- "tog-watchlisthideown": "Ascondi e mæ modiffiche da-a lista sotta-oservaçion",
- "tog-watchlisthidebots": "Ascondi e modiffiche di bot da-a lista sotta oservaçion",
- "tog-watchlisthideminor": "Ascondi e modiffiche minoî da-a lista sotta oservaçion",
- "tog-watchlisthideliu": "Ascondi e modiffiche di utenti intræ da-a lista sotta-oservaçion",
- "tog-watchlistreloadautomatically": "Recarrega aotomaticamente a lista di oservæ quande vegne cangiòu un filtro (ghe veu o JavaScript)",
- "tog-watchlisthideanons": "Ascondi e modiffiche di utenti anonnimi da-a lista sotta-oservaçion",
- "tog-watchlisthidepatrolled": "Ascondi e modiffiche za controllæ da-a lista sotta-oservaçion",
- "tog-watchlisthidecategorization": "Ascondi a categorizzassion de paggine",
- "tog-ccmeonemails": "Mandime 'na coppia de e-mail che mando a-i atri utenti",
- "tog-diffonly": "No mostrâ o contegnuo da paggina sotta o confronto tra verscioin",
- "tog-showhiddencats": "Fanni vedde e categorîe ascose",
- "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-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 ö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ì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ì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 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ì",
"noindex-category": "Paggine sença endexo",
"broken-file-category": "Paggine con di colegamenti a di file che no ghe son",
"about": "Informaçioìn",
- "article": "Voxe",
+ "article": "Vôxe",
"newwindow": "(O s'arve inte 'n âtro barcon)",
- "cancel": "Scancella",
+ "cancel": "Scancélla",
"moredotdotdot": "Âtro...",
"morenotlisted": "Questa lista a poriæ ese incompleta.",
- "mypage": "Paggina",
+ "mypage": "Pàgina",
"mytalk": "discuscioìn",
"anontalk": "discuscioìn",
"navigation": "Navegaçión",
"faq": "Domande frequenti",
"actions": "Açioìn",
"namespaces": "Namespaces",
- "variants": "Diferense",
+ "variants": "Variànti",
"navigation-heading": "Menu de navegaçion",
"errorpagetitle": "Erô",
"returnto": "Torna a $1.",
"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",
- "history": "Stöia da pàgina",
+ "history": "Cronologîa da pàgina",
"history_short": "Stöia",
"history_small": "Stoia",
"updatedmarker": "modificâ da-a mæ urtima vixita",
"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",
- "otherlanguages": "In âtre lengoe",
+ "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}}.",
- "protectedpage": "Paggina protetta",
+ "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",
"disclaimers": "Averténse",
"disclaimerpage": "Project:Avertense generâli",
"edithelp": "Agiùtto",
- "helppage-top-gethelp": "Agiutto",
+ "helppage-top-gethelp": "Agiùtto",
"mainpage": "Pàgina prinçipâ",
"mainpage-description": "Pagina prinçipâ",
"policy-url": "Project:Lezzi",
"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).",
"site-atom-feed": "Feed Atom de $1",
"page-rss-feed": "Feed RSS pe \"$1\"",
"page-atom-feed": "Feed Atom pe \"$1\"",
- "red-link-title": "$1 (ancon da scrîve)",
+ "red-link-title": "$1 (a pàgina no esiste)",
"sort-descending": "Ordine decrescente",
"sort-ascending": "Ordine crescente",
"nstab-main": "Pàgina",
- "nstab-user": "Pàgina uténte",
+ "nstab-user": "Uténte",
"nstab-media": "File murtimediâ",
"nstab-special": "Pàgina speçiâ",
"nstab-project": "Pàgina de servìçio",
"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",
"welcomeuser": "Benvegnuo, $1!",
"welcomecreation-msg": "L'utensa a l'è stæta creâ correttamente.\nSe ti veu ti peu personalizzâ e [[Special:Preferences|preferençe de {{SITENAME}}]].",
"yourname": "Nomme",
- "userlogin-yourname": "Nomme utente",
- "userlogin-yourname-ph": "Scrivi o teu nomme utente",
+ "userlogin-yourname": "Nómme uténte",
+ "userlogin-yourname-ph": "Inserisci o teu nómme uténte",
"createacct-another-username-ph": "Scrivi o teu nomme utente",
"yourpassword": "Pòula segretta:",
- "userlogin-yourpassword": "Pòula segretta:",
+ "userlogin-yourpassword": "Ciâve",
"userlogin-yourpassword-ph": "Scrivi a tu poula segretta.",
"createacct-yourpassword-ph": "Scrivi 'na poula segretta.",
"yourpasswordagain": "Riscrivi a pòula segrétta:",
"notloggedin": "No t'ê introu",
"userlogin-noaccount": "No ti t'ê ancon registrou?",
"userlogin-joinproject": "Registrite insce {{SITENAME}}",
- "createaccount": "Crea 'n nêuvo account",
+ "createaccount": "Registrati",
"userlogin-resetpassword-link": "T'hæ miga ascordou a teu poula segretta?",
"userlogin-helplink2": "Agiutto pe intrâ",
"userlogin-loggedin": "Ti t'ê zà connesso comme {{GENDER:$1|$1}}.\nUsa o formulaio sottostante pe accede comme 'n atro utente.",
"createacct-reason": "Raxon",
"createacct-reason-ph": "Perché t'ê apreuvo a creâ un'atra utensa",
"createacct-reason-help": "Messaggio vixualizou into registro da creaçion de l'utença",
- "createacct-submit": "Crea a to utensa",
+ "createacct-submit": "Crea a teu utensa",
"createacct-another-submit": "Crea utensa",
"createacct-continue-submit": "Continnoa a creaçion de l'utença",
"createacct-another-continue-submit": "Continnoa a creaçion de l'utença",
"createacct-benefit-heading": "{{SITENAME}} o l'è realizzou da de gente comme ti.",
"createacct-benefit-body1": "{{PLURAL:$1|modìfica|modìfiche}}",
"createacct-benefit-body2": "{{PLURAL:$1|pàgina|pàgine}}",
- "createacct-benefit-body3": "{{PLURAL:$1|contribuiou|contribuioei}}",
+ "createacct-benefit-body3": "{{PLURAL:$1|contribûtô recénte|contribûtoî recénti}}",
"badretype": "E paròlle d'ordine che t'hæ scrîo son despægie.",
"usernameinprogress": "A creassion de 'n utensa con questo nomme a l'è zà in corso.\nSe prega de aspêtâ.",
"userexists": "O nomme ûtente inserîo o l'è za doeuviao.<br />\nÇernine 'n âtro.",
"nosuchusershort": "No gh'è nisciûn ûtente con quello nomme \"$1\". Verificâ o nomme inserîo.",
"nouserspecified": "Ti g'hæ da specificâ un nomme utente.",
"login-userblocked": "St'utente o l'è bloccou. Accesso negou.",
- "wrongpassword": "Ti gh'æ scrîo 'na paròlla d'ordine sbaliâ. Tenta torna.",
+ "wrongpassword": "Ti gh'æ scrîto 'na paròlla d'órdine sbaliâ. Ténta tórna.",
"wrongpasswordempty": "No ti g'hæ scrîto nisciûnn-a paròlla d'ordine. Ritenta.",
"passwordtooshort": "E password devan aveighe aomanco {{PLURAL:$1|1 carattere|$1 caratteri}}.",
"passwordtoolong": "A poula segretta a no peu contegnî ciù de {{PLURAL:$1|1 carattere|$1 caratteri}}.",
"botpasswords-insert-failed": "Imposcibile azonze o nomme bot \"$1\". O l'è za stæto azonto?",
"botpasswords-update-failed": "Imposcibile aggiornâ o nomme bot \"$1\". O l'è stæto scassou?",
"botpasswords-created-title": "Password bot creâ",
- "botpasswords-created-body": "A password pe-o bot de nomme \"$1\" de l'utente \"$2\" a l'è stæta creâ.",
+ "botpasswords-created-body": "A password pe-o bot de nómme \"$1\" de l'uténte \"$2\" a l'é stæta creâ.",
"botpasswords-updated-title": "Password bot aggiornâ",
- "botpasswords-updated-body": "A password pe-o bot de nomme \"$1\" de l'utente \"$2\" a l'è stæta aggiornâ.",
+ "botpasswords-updated-body": "A password pe-o bot de nómme \"$1\" de l'uténte \"$2\" a l'é stæta agiornâ.",
"botpasswords-deleted-title": "Password bot scassâ",
- "botpasswords-deleted-body": "A password pe-o bot de nomme \"$1\" de l'utente \"$2\" a l'è stæta scassâ.",
+ "botpasswords-deleted-body": "A password pe-o bot de nómme \"$1\" de l'uténte \"$2\" a l'é stæta scassâ.",
"botpasswords-newpassword": "A noeuva password pe accede con <strong>$1</strong> a l'è <strong>$2</strong>. <em>Marchitelo pe rifeimento futuo.</em><br> (Pe-i vegi bot che g'han de besoeugno che o nomme pe accede o segge o mæximo che o nomme utente, ti poeu doeuviâ <strong>$3</strong> comme nomme utente e <strong>$4</strong> comme password.)",
"botpasswords-no-provider": "BotPasswordsSessionProvider o no l'è disponibbile.",
"botpasswords-restriction-failed": "E restriçioin de password bot impediscian questo accesso.",
"resetpass-expired": "A to poula segretta a l'è descheita. Pe piaxei impòstine un-a neuva pe intrâ.",
"resetpass-expired-soft": "A to poula segretta a l'è descheita e a g'ha da ese reimpostâ. Pe piaxei çèrnine un-a neuva òua ò clicca in sce \"{{int:authprovider-resetpass-skip-label}}\" pe reimpostâla ciu tardi.",
"resetpass-validity-soft": "A to poula segretta a no l'è vallida: $1\n\nPe piaxei çèrnine un-a neuva òua, ò clicca in sce \"{{int:authprovider-resetpass-skip-label}}\" pe reimpostala ciu tardi.",
- "passwordreset": "Reimposta a poula segretta",
+ "passwordreset": "Reimposta ciâve",
"passwordreset-text-one": "Compilla sto formulaio pe riçeive a teu poula segretta temporannia via e-mail.",
"passwordreset-text-many": "{{PLURAL:$1|Compilla un di campi pe riçeive una poula segretta temporannia via e-mail.}}",
"passwordreset-disabled": "A reimpostaçion de poule segrette a l'è stæta disabilitâ in sce sta wiki",
"media_tip": "Ingancio a file moltimediâ",
"sig_tip": "Firma con dæta e ôa",
"hr_tip": "Linnia orizontâ",
- "summary": "Oggetto:",
+ "summary": "Ògetto:",
"subject": "Sogetto:",
"minoredit": "Quésta a l'é 'na modìfica minô",
"watchthis": "Metti sotta oservaçion",
"preview": "Anteprìmma",
"showpreview": "Veddi l'anteprimma",
"showdiff": "Veddi i cangiamenti",
- "blankarticle": "<strong>Attençion:</strong> a paggina che ti çerchi a l'è veua.\nCliccando torna in sce \"$1\", a paggina a saiâ creâ sensa contegnui.",
+ "blankarticle": "<strong>Atençión:</strong> a pàgina che ti çerchi a l'é vêua.\nClicando tórna in sce \"$1\", a pàgina a saiâ creâ sénsa contegnûi.",
"anoneditwarning": "<strong>Attension:</strong> No t'ê introu. Se ti fæ di cangi o teu adresso IP o saiâ vixibile pubbricamente. Se <strong>[$1 ti intri]</strong> ò <strong>[$2 ti crei un'utensa]</strong>, e teu modifiche saian attribuie a-o teu nomme utente, insemme a di atri benefiççi.",
"anonpreviewwarning": "No t'hæ fæto l'accesso. Se ti sarvi inta stoia da paggina ghe saiâ solo o to adresso IP",
"missingsummary": "<strong>Aregòrdite:</strong> no t'hæ specificòu l'oggetto de questa modiffica. Sciaccando torna \"$1\", a modiffica a saiâ sarvâ sensa.",
"selfredirect": "<strong>Attençion:</strong> t'ê apreuvo a rendirissâ sta paggina a lê mæxima.\nFoscia t'hæ sballiòu a indicâ a destinaçion pe-o redirect, ò donque ti modiffichi a paggina sbaliâ.\nSe ti clicchi torna \"$1\", o redirect o saiâ creòu comunque.",
- "missingcommenttext": "Scrivi un commento chi de sotta",
+ "missingcommenttext": "Scrîvi 'n coménto chi de sotta",
"missingcommentheader": "<strong>Aregòrdite:</strong> no t'hæ specificòu o soggetto de sto commento. Sciaccando torna \"$1\", a modiffica a saiâ sarvâ sensa.",
- "summary-preview": "Anteprimma oggetto:",
- "subject-preview": "Anteprimma do soggetto:",
+ "summary-preview": "Anteprìmma de l'ògetto da modìffica:",
+ "subject-preview": "Anteprìmma do sogètto:",
"previewerrortext": "Gh'è stæto un errô mentre se çercava de mostrâ l'anteprimma.",
"blockedtitle": "L'utente o l'é bloccòu",
"blockedtext": "''''O to nomme utente ò adresso IP o l'è stæto bloccòu.'''\n\nO blòcco o l'è stæto fæto da $1. A raxon dæta a l'è ''$2''.\n\n* Prinçippio do blocco: $8\n* Fin do blocco: $6\n* Utente blocou: $7\n\nL'è poscibbile contattâ $1 ò un atro [[{{MediaWiki:Grouppage-sysop}}|amministratô]] pe discûtte inscio blòcco.\nNo ti poeu doeuviâ o comando \"Manda un'e-mail a st'utente\" se no ti g'hæ 'n adreçço e-mail registròu inte to [[Special:Preferences|preferençe]] e se no t'ê stæto bloccòu ascì.\nO to adreçço IP o l'è $3, e o to blòcco ID o l'è #$5.\nPe piaxei, pe domandâ de informaçioin, speçifficali tutti doî.",
"yourtext": "O teu testo",
"storedversion": "La verscion memorizzâ",
"editingold": "<strong>Attençion: t'ê apreuvo a modificâ una verscion non aggiornâ da paggina.</strong>\nSarvandola coscì, tutti i cangi fæti doppo sta verscion saian sorvescriti.",
+ "unicode-support-fail": "O pâ che o teu browser o no sostégne Unicode.",
"yourdiff": "Differense",
"copyrightwarning": "Nota: Tùtte e contribuçioìn a {{SITENAME}} van conscideræ comme rilasciæ drento a-i termini da licensa d'ûso $2 (veddi $1 pe savéine de ciù).\nSe no ti veu che i testi teu pêuan esse modificæ da quarchedùn sensa limitaçioìn, no mandâli a {{SITENAME}}.<br />\nInviando o testo ti diciâri, sott'a teu responsabilitæ, ch'o l'é stæto scrîto da ti personalmente oppure ch'o l'é stæto piggiòu da 'na fonte de pùbrico domìnio òu anàlogamente lìbea.<br />\n'''NO INVIÂ MATERIÂLE COVERTO DA DRÎTI D'AUTÔ SENSA OUTORIZAÇION!'''",
"copyrightwarning2": "Pe piaxei tegni presente che tutti i contributi a {{SITENAME}} poeuan ese modificæ, alteræ ò scassæ da di atri contributoî.\nSe no ti voeu che se faççe ravaxo di to testi, alloa no stali manco a mette.<br />\nInviando o testo ti deciæi ascì, sotta a to responsabilitæ, ch'o l'è stæto scrito da ti personalmente oppù ch'o l'è stæto copiou da 'na fonte de pubbrico dominnio o scimilemente libera (vedi $1 pe dettaggi).\n'''No stanni a inviâ do mateiâ protetto da-o drito d'aotô sença aotorizzaçion!'''",
"permissionserrorstext-withaction": "No ti g'hæ i permìssi pe $2 pe {{PLURAL:$1|sta raxon|ste raxoìn}}:",
"contentmodelediterror": "No ti peu modificâ sta verscion da-o momento che o so modello de contegnuo o l'è <code>$1</code>, ch'o diffeisce da-o corrente modello de contegnuo da paggina <code>$2</code>.",
"recreate-moveddeleted-warn": "Atençión: ti stæ pe ricreâ 'na pàgina zà scancelâ into passòu.'''\n\nConsciddera se l'è o caxo de continoâ a cangiâ 'sta pàgina.\nPe comoditæ e cancellaçioìn e i stramui son pubricæ chì sotta:",
- "moveddeleted-notice": "Sta pàgina a l'é stæta scancelâ.\nA lista de scancelaçioìn e di stramui son riportæ chi de sotta pe informaçión.",
- "moveddeleted-notice-recent": "Spiaxenti, sta paggina a l'è stæta scassâ reçentemente (inte urtime 24 oe).\n\nE açioin de cançellaçion e spostamento pe questa paggina son disponibile chì appreuvo pe referença.",
+ "moveddeleted-notice": "Sta pàgina a l'é stæta scancelâ.\nA lista de scancelaçioìn e di stramûi son riportæ chi de sotta pe informaçión.",
+ "moveddeleted-notice-recent": "Me despiâxe, sta pàgina chi a l'é stæta scassâ recentemente (inte ùrtime 24 ôe).\n\nE açioìn de cancelaçión e spostaménto pe questa pàgina son disponibile chi aprêuvo pe referença.",
"log-fulllog": "Amîa o log completo",
"edit-hook-aborted": "A modifica a l'è stæta annullâ da l'hook.\nO no l'ha dæto arcun-a spiegassion.",
"edit-gone-missing": "Imposcibbile aggiornâ a paggina.\nPâ ch'a segge stæta scassâ.",
"diff-multi-sameuser": "({{PLURAL:$1|Una verscion intermedia|$1 De verscioin intermedie}} de 'n mæximo utente {{PLURAL:$1|a no l'è mostrâ|no son mostræ}})",
"diff-multi-otherusers": "({{PLURAL:$1|Una verscion intermedia|$1 De verscioin intermedie}} de {{PLURAL:$2|'n atro utente|$2 utenti}} {{PLURAL:$1|a no l'è mostrâ|no son mostræ}})",
"diff-multi-manyusers": "({{PLURAL:$1|Una verscion intermedia|$1 verscioin intermedie}} de ciu che $2 {{PLURAL:$2|utente|utenti}} non {{PLURAL:$1|mostrâ|mostræ}})",
+ "diff-paragraph-moved-tonew": "O teu paràgrafo o l'é stæto mesciòu. Clicca pe pasâ a-a nêuva poxiçión.",
+ "diff-paragraph-moved-toold": "O paràgrafo o l'é stæto mesciòu. Clicca chi pe pasâ a-a vêgia poxiçión.",
"difference-missing-revision": "{{PLURAL:$2|Una verscion|$2 verscioin}} de questa differença ($1) {{PLURAL:$2|a no l'è stæta atrovâ|no son stæte atrovæ}}.\n\nQuesto succede a l'uso se inta stoia ti sciacchi un vegio ingancio a una paggina scassâ.\n\nI dettaggi ti-i peu attrovâ into [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scançellaçioin].",
"searchresults": "Risultæ da riçerca",
"searchresults-title": "Risultæ da riçerca de \"$1\"",
"textmatches": "Corispondençe into scrito de paggine",
"notextmatches": "Nisciun-a corispondença into scrito de paggine",
"prevn": "Precedenti {{PLURAL:$1|$1}}",
- "nextn": "Proscima {{PLURAL:$1|$1}}",
+ "nextn": "{{PLURAL:$1|sucesîvo|sucesîvi $1}}",
"prev-page": "paggina precedente",
"next-page": "paggina succesciva",
"prevn-title": "{{PLURAL:$1|rezoltato precedénte|rezoltati precedénti}}",
"search-error": "S'è verificou 'n errô durante a riçerca: $1",
"search-warning": "Gh'è stæto in alerta durante a çerchia: $1",
"preferences": "Preferénse",
- "mypreferences": "Preferénse",
+ "mypreferences": "preferénse",
"prefs-edits": "Modiffiche effettuæ:",
"prefsnologintext2": "Pe modificâ e teu preferençe l'è necessaio effettuâ l'intrata.",
"prefs-skin": "Pelle",
"skin-preview": "Anteprimma",
"datedefault": "Nisciun-a preferença",
"prefs-labs": "Fonçionalitæ sperimentale",
- "prefs-user-pages": "Paggine utente",
+ "prefs-user-pages": "Pàgine uténte",
"prefs-personal": "Profî utente",
"prefs-rc": "Ùrtime modìfiche",
"prefs-watchlist": "Sotta oservaçion",
"prefs-editwatchlist-clear": "Scassa a teu lista sotta oservaçion",
"prefs-watchlist-days": "Nummero de giorni da fâ vedde inta lista sotta oservaçion",
"prefs-watchlist-days-max": "Mascimo $1 {{PLURAL:$1|giorno|giorni}}",
- "prefs-watchlist-edits": "Nummero de cangi da fâ vedde co-e fonçioin avançæ:",
+ "prefs-watchlist-edits": "Nùmero de cangiaménti da fâ vedde co-e fonçioìn avançæ:",
"prefs-watchlist-edits-max": "Nummero mascimo: 1000",
"prefs-watchlist-token": "Token lista sotta oservaçion:",
"prefs-misc": "Varrie",
"recentchangesdays-max": "Mascimo $1 {{PLURAL:$1|giorno|giorni}}",
"recentchangescount": "Nummero de modiffiche da mostrâ pe difetto:",
"prefs-help-recentchangescount": "Comprende i urtime modiffiche, paggine de stoie e registri.",
- "prefs-help-watchlist-token2": "Questa a l'è a ciave segretta pe-o feed web di to oservæ.\nChiunque a conosce saiâ in graddo de leze i to oservæ, quindi no stanni a condividdila. [[Special:ResetTokens|Clicca chi se ti g'hæ de besoeugno de rempostâla]].",
+ "prefs-help-watchlist-token2": "Questa a l'é a ciâve segrétta pe-o web feed di to oservæ.\nChiunque a conosce, saiâ in grà ddo de lêze i to oservæ, quindi no stanni a condivìddila. [[Special:ResetTokens|Clicca chi se ti g'hæ de bezéugno de rempostâla]].",
"savedprefs": "E teu preferençe son stæte sarvæ.",
"savedrights": "I groppi utente de {{GENDER:$1|$1}} son stæti sarvæ.",
"timezonelegend": "Fuso oraio:",
"timezoneregion-europe": "Eoröpa",
"timezoneregion-indian": "Òcéano Indiàn",
"timezoneregion-pacific": "Òcéano Pacìfico",
- "allowemail": "Permetti a posta elettronega da di ätri utenti",
+ "allowemail": "Permetti a pòsta eletrònica da di âtri uténti",
+ "email-allow-new-users-label": "Permetti a pòsta eletrònica da di uténti nêuvi",
"prefs-searchoptions": "Çerca",
"prefs-namespaces": "Namespace:",
"default": "Predefinïo",
"prefs-i18n": "Internaçionalizzaçion",
"prefs-signature": "Firma",
"prefs-dateformat": "Formato da dæta",
- "prefs-timeoffset": "Oe de differença",
+ "prefs-timeoffset": "Ôe de diferénsa",
"prefs-advancedediting": "Opçioin generæ",
"prefs-editor": "Editô",
"prefs-preview": "Anteprimma",
"action-purge": "aggiornâ questa paggina",
"nchanges": "$1 {{PLURAL:$1|modiffica|modiffiche}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|da l'urtima vixita}}",
- "enhancedrc-history": "cronologia",
+ "enhancedrc-history": "cronologîa",
"recentchanges": "Ùrtime modìfiche",
"recentchanges-legend": "Opçioin di ùrtimi cangiaménti",
"recentchanges-summary": "Questa pagina a te mostra i cangiamenti ciu reçenti a-i contegnui do scito.",
"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 paggina a fa védde i cangiaménti ciù reçenti a-e pàggine conligæ a questa.\nE pàggine che t'hæ in oservaçion inti [[Special:Watchlist|oservæ 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",
"uploadlogpage": "Log di file caregæ",
"uploadlogpagetext": "De sotta gh'è una lista di urtimi file caregæ.\nConsultâ a [[Special:NewFiles|galleria di noeuvi file]] pe 'na vixon d'insemme.",
"filename": "Nomme do file",
- "filedesc": "Detaggi",
+ "filedesc": "Detàggi",
"fileuploadsummary": "Detaggi do file:",
"filereuploadsummary": "Cangiamenti a-o file:",
"filestatus": "Informaçioin in sciô copyright:",
"usercreated": "{{GENDER:$3|Creòu/â}} o $1 a-a $2",
"newpages": "Nêuve pàgine",
"newpages-submit": "Mostra",
- "newpages-username": "Nómme uté�nte:",
+ "newpages-username": "Nómme uténte:",
"ancientpages": "Pàgine mêno recénti",
"move": "Mescia",
"movethispage": "Mescia 'sta paggina",
"magiclink-tracking-isbn-desc": "Sta paggina a l'adoeuvia di inganci maggichi ISBN. Amia [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sciu comme exeguî a migraçion.",
"specialloguserlabel": "Açion effettuâ da:",
"speciallogtitlelabel": "Açion effettuâ sciu (tittolo da paggina ò {{ns:user}}:Nomme utente):",
- "log": "Log",
+ "log": "Regìstri",
"logeventslist-submit": "Mostra",
"all-logs-page": "Tùtti i regìstri pùblici",
"alllogstext": "Presentaçion combinaa de tutti i registri de {{SITENAME}}.\nL'è poscibile restrenze i critei de riçerca seleçionando o tipo de registro, l'utente ch'o l'ha eseguio l'açion, e/ò a pagina interessâ (entrambi i campi son senscibbili a-o maiuscolo/minuscolo).",
"checkbox-none": "Nisciun",
"checkbox-invert": "Inverti",
"allpages": "Tùtte e pàgine",
- "nextpage": "Proscima paggina ($1)",
+ "nextpage": "Pàgina sucesîva ($1)",
"prevpage": "Paggina preçedente ($1)",
"allpagesfrom": "Fanni vedde e paggine comensando da:",
"allpagesto": "Mostra e paggine scin a:",
"emailuserfooter": "Questa email a l'è stæta {{GENDER:$1|inviâ}} da $1 a {{GENDER:$2|$2}} a traverso a fonçion \"{{int:emailuser}}\" insce {{SITENAME}}. Se {{GENDER:$2|ti ghe rispondi}}, a to email de risposta a saiâ spedia direttamente {{GENDER:$1|a-o|a-a}} mittente originâ, rivelando{{GENDER:$1|ghe}} o {{GENDER:$2|to}} adresso de posta elettronica.",
"usermessage-summary": "Messaggio de scistema",
"usermessage-editor": "Messaggê de scistema",
- "watchlist": "Sotta osservassion",
- "mywatchlist": "Sotta oservaçion",
+ "watchlist": "Òservòi speciâli",
+ "mywatchlist": "òservòi speciâli",
"watchlistfor2": "Pe $1 $2",
"nowatchlist": "A lista di öservæ speciali a l'è voeua.",
"watchlistanontext": "Pe vixualizzâ e modificâ l'elenco di öservæ l'è necessaio eseguî l'accesso.",
"unwatchthispage": "Smetti de öservâ",
"notanarticle": "Questa paggina a no l'è una voxe",
"notvisiblerev": "L'urtima revixon a l'è stæta scassâ",
- "watchlist-details": "A lista di öservæ speciali a conten {{PLURAL:$1|una pagina (e a rispettiva pagina de discuscion)|$1 pagine (e e rispettive pagine de discuscion)}}.",
+ "watchlist-details": "A lista di öservæ speciâli a contegne {{PLURAL:$1|unn-a pàgina (e a rispettiva pàgina de discusción)|$1 pàgine (e e rispettive pàgine de discusción)}}.",
"wlheader-enotif": "A notiffica via email a l'è attiva.",
"wlheader-showupdated": "E paggine che son stæte modificæ doppo l'urtima vixita son evidençiæ in '''grascetto'''.",
"wlnote": "De sotta {{PLURAL:$1|a l'è elencâ a modifica ciù reçente apportâ|son elencæ e <strong>$1</strong> modifiche ciù reçente apportæ}} {{PLURAL:$2|inte l'urtima oa|inti urtime <strong>$2</strong> oe}}; i dæti son aggiornæ a-e $4 do $3.",
"blanknamespace": "(Prinçipâ)",
"contributions": "Contribuçioin {{GENDER:$1|utente}}",
"contributions-title": "Contribuçioìn de $1",
- "mycontris": "Contribuçioin",
- "anoncontribs": "Contribuçioin",
+ "mycontris": "contribûti",
+ "anoncontribs": "contribûti",
"contribsub2": "Pe {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "L'utença \"$1\" a no l'è registrâ.",
"nocontribs": "Cangi che soddisfan i critei de riçerca no se n'è atrovou.",
"sp-contributions-newbies": "Fanni védde sôlo e contribuçioìn di nêuvi utenti",
"sp-contributions-newbies-sub": "Pe i nêuvi ûtenti",
"sp-contributions-newbies-title": "Contribuçioin di noeuvi utenti",
- "sp-contributions-blocklog": "Blòcchi",
+ "sp-contributions-blocklog": "blòcchi",
"sp-contributions-suppresslog": "contributi {{GENDER:$1|utente}} soppresci",
"sp-contributions-deleted": "contributi {{GENDER:$1|utente}} scassæ",
"sp-contributions-uploads": "caregaménti",
"sp-contributions-blocked-notice": "St'utente o l'è attualmente bloccòu.\nL'urtimo elemento into registro di blocchi o l'è riportòu chì de sotta pe rifeimento:",
"sp-contributions-blocked-notice-anon": "St'addreçço IP o l'è attoalmente bloccòu.\nL'urtimo elemento into registro di blocchi o l'è riportòu chì de sotta pe rifeimento:",
"sp-contributions-search": "Riçerca contribuçioìn",
- "sp-contributions-username": "Indirìsso IP ò nómme utente:",
+ "sp-contributions-username": "Indirìsso IP ò nómme uténte:",
"sp-contributions-toponly": "Fanni védde sôlo i cangiaménti ch'en i ùrtime revixoìn da pàgina",
"sp-contributions-newonly": "Fanni védde sôlo i cangiaménti ch'en de creaçioin de pàgina",
"sp-contributions-hideminor": "Ascondi e modifiche menoî",
"unblock": "Desblocca utente",
"blockip": "Blocca {{GENDER:$1|utente}}",
"blockiptext": "Doeuvia o moddulo sottostante pe bloccâ l'accesso in scrittua a un speciffico addreçço IP ò a un utente registrou.\nO blocco o dev'ese doeuviou pe prevegnî di atti de vandalismo e in streita öservança de [[{{MediaWiki:Policy-url}}|reggole de {{SITENAME}}]].\nIndica o motivo speçiffico pe-o quæ se procede a-o blocco (presempio, çitando i tittoli di eventuæ paggine ögetto de vandalismo).\nTi poeu bloccâ di ntervalli de IP doeuviando a scintasci [https://it.wikipedia.org/wiki/CIDR CIDR]; l'intervallo ciù ampio consentio o l'è /$1 pe IPv4 e /$2 pe IPv6.",
- "ipaddressorusername": "Adreçço IP ò nómme utente:",
+ "ipaddressorusername": "Indirìsso IP ò nómme uténte:",
"ipbexpiry": "Scadença:",
"ipbreason": "Raxon:",
"ipbreason-dropdown": "*Motivaçioni ciù comun-e pe-i blocchi\n** Inseimento de informaçioin fase\n** Rimoçion di contegnti da-e paggine\n** Collegamenti promoçionæ a di sciti esterni\n** Inseimento di contegnui privi de senso\n** Comportamenti intimidatoi ò molestie\n** Uso indebbito de utençe murtiple\n** Nomme utente inaçettabbile",
"blocklist-nousertalk": "o no poeu modificâ a proppia pagina de discuscion",
"ipblocklist-empty": "A lista di blocchi a l'è veua.",
"ipblocklist-no-results": "L'adreçço IP ô o nomme utente domandou o no l'è bloccou.",
- "blocklink": "Blocca",
+ "blocklink": "blòcca",
"unblocklink": "sblòcca",
"change-blocklink": "càngia blòcco",
"contribslink": "Contribuçioìn",
"javascripttest": "Sperimentaçion JavaScript",
"javascripttest-pagetext-unknownaction": "Açion sconosciua \"$1\".",
"javascripttest-qunit-intro": "Amia insce mediawiki.org a [$1 documentaçion riguardante i test].",
- "tooltip-pt-userpage": "A {{GENDER:|to}} pagina utente",
+ "tooltip-pt-userpage": "A {{GENDER:|teu}} pàgina uténte",
"tooltip-pt-anonuserpage": "A paggina utente de questo adreçço IP che t'ê aproeuvo a modificâ comme",
"tooltip-pt-mytalk": "A {{GENDER:|teu}} pàgina de discusción",
"tooltip-pt-anontalk": "Discuscioin insce e modiffiche fæte da questo adreçço IP",
"tooltip-ca-nstab-mediawiki": "Veddi o messaggio de scistema",
"tooltip-ca-nstab-template": "Veddi o template",
"tooltip-ca-nstab-help": "Veddi a paggina d'agiûtto",
- "tooltip-ca-nstab-category": "Veddi a paggina da categorîa",
+ "tooltip-ca-nstab-category": "Véddi a pàgina da categorîa",
"tooltip-minoredit": "Marchilo comme cangiaménto minô",
"tooltip-save": "Sarva i cangiaménti",
"tooltip-publish": "Pubbrica e to modiffiche",
"pageinfo-not-current": "Spiaxente, ma l'è imposcibbile fornî quest'informaçion pe de vege verscioin.",
"pageinfo-header-basic": "Informaçion de base",
"pageinfo-header-edits": "Cronologia de modiffiche",
- "pageinfo-header-restrictions": "Proteçion da paggina",
+ "pageinfo-header-restrictions": "Proteçión da pàgina",
"pageinfo-header-properties": "Propiêtæ da pàgina",
"pageinfo-display-title": "Tittolo vixualizzou",
"pageinfo-default-sort": "Criteio d'ordenamento predefinio",
"pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect}}; $3 {{PLURAL:$3|non redirect}})",
"pageinfo-firstuser": "Creatô da pàgina",
"pageinfo-firsttime": "Dæta de creaçion da paggina",
- "pageinfo-lastuser": "Urtimo contributô",
+ "pageinfo-lastuser": "Ùrtimo contributô",
"pageinfo-lasttime": "Dæta de l'urtima modiffica",
"pageinfo-edits": "Nummero totale de modiffiche",
"pageinfo-authors": "Nummero totale di aotoî distinti",
"img-lang-go": "Vanni",
"ascending_abbrev": "cresc",
"descending_abbrev": "decresc",
- "table_pager_next": "Proscima pagina",
+ "table_pager_next": "Pàgina sucesîva",
"table_pager_prev": "Pagina de primma",
"table_pager_first": "Primma pagina",
"table_pager_last": "Urtima pagina",
"redirectedfrom": "(ڤاگأردوٙنی د$1)",
"redirectpagesub": "بألگە ڤاگأردوٙنی",
"redirectto": "ڤاگأردوٙنی سی:",
- "lastmodifiedat": "ئÛ\8c بأÙ\84Ú¯Û\95 ئÛ\8cسئÙ\86Û\8cا ڤأض Ø¢Ù\84Û\8cشت بÛ\8cÛ\8cÛ\95 د $1، د $2.",
+ "lastmodifiedat": "اÛ\8c بÙ\84Ú¯Ù± اÛ\8cسÙ\86Û\8cا Ø¢Ù\84شت بÛ\8cÙ± د $1، د $2.",
"viewcount": "ئی بألگە ها د دأسرئسی {{PLURAL:$1|یئ گئل|$1 چأن گئل}}.",
"protectedpage": "بألگە پأر و پیم کاری بییە",
"jumpto": "پئرئستئن د:",
"pool-servererror": "پوٙل ئشمار خئذمأتگە د دأسرئس نی($1).",
"poolcounter-usage-error": "خأطا ڤئ کار گئرئتئن:$1",
"aboutsite": "دئبارە {{SITENAME}}",
- "aboutpage": "پوروجە:دئبارە",
+ "aboutpage": "پوروجٱ:دبارٱ",
"copyright": "مینوٙنە یا هان د دأسرئس $1 مأر یە کئ ڤئ یئ گئل شیڤە هأنی نیسأنە بوٙە.",
"copyrightpage": "{{ns:project}}:کوپی رایت",
"currentevents": "روخ ڤأنیا ئیسئنی",
"currentevents-url": "پوروجە یا:روخ ڤأنیا ئیسئنی",
"disclaimers": "تیە پوٙشکاریا",
- "disclaimerpage": "پوروجە: تیە پوٙشی کئردئن هأمە گئر",
+ "disclaimerpage": "پوروجٱ: تیٱپوشی کردن همٱگیر",
"edithelp": "هومياری سی ڤیرایئشت",
"helppage-top-gethelp": "هومياری",
"mainpage": "سأرآسوٙنە",
"mainpage-description": "سأرآسوٙنە",
"policy-url": "پوروجە:رأدیارجوٙری",
"portal": "دأرآسوٙنە کومولە یأکی",
- "portal-url": "پوروجە:دأرآسوٙنە کومولە یأکی",
+ "portal-url": "پوروجٱ:درآسۊنٱ کومولٱیکی",
"privacy": "پوٙلتیک رازینە داری",
- "privacypage": "پوروجە: رأگڤاری رازینە کاری کئردئن",
+ "privacypage": "پوروجٱ: راگوۋاری رازینٱ کاری کردن",
"badaccess": "خأطا صئلا دأئن",
"badaccess-group0": "شوما صئلا أنجوم دأئن کاری نە کئ میهایت ناریت.",
"badaccess-groups": "ئی کاری کئ شوما هاستیتە سی کاریاریایی کئ هان د {{PLURAL:$2|جأرغە|یئ گئل د جأرغە یا}}: $1 کأم بییە.",
"contributions": "{{GENDER:$1|کاریار}} هومیاریا",
"contributions-title": "ھومیاری كاریار سی $1",
"mycontris": "هومياریا",
+ "anoncontribs": "هومیاریا",
"contribsub2": "سي {{جنسيت:$3|$1}} ($2)",
"contributions-userdoesnotexist": "کاریار \"$1\" ثوت نام نکرده.",
"nocontribs": "هیچ آلشتی وا ای مشقصات دیاری نکرد.",
"whatlinkshere-prev": "{{PLURAL:$1|دمایی|دمایی $1}}",
"whatlinkshere-next": "{{PLURAL:$1|نهایی|نهایی $1}}",
"whatlinkshere-links": "هوم پیوندیا",
- "whatlinkshere-hideredirs": "$1 واگردونیا",
- "whatlinkshere-hidetrans": "$1 Ú\86Ù\86 Ù\86تÛ\8cجÙ\87 یی",
- "whatlinkshere-hidelinks": "هوم پیوندیا $1",
+ "whatlinkshere-hideredirs": "$1 ۋاگردۊنیا",
+ "whatlinkshere-hidetrans": "$1 Ú\86Ù±Ù\86 Ù\86تÛ\8cجٱیی",
+ "whatlinkshere-hidelinks": "هوم پیۋندیا $1",
"whatlinkshere-hideimages": "فایل هوم پیوندیا $1",
"whatlinkshere-filters": "فيلتريا",
"autoblockid": "خود نهاگری #$1",
"javascripttest": "ازمایشت کردن جاوا اسکریپت",
"javascripttest-pagetext-unknownaction": "کنشتکاری نادیار \"$1\".",
"javascripttest-qunit-intro": "[$1 مستندیا ازمایشت] نه د mediawiki.org سیل بکیت.",
- "tooltip-pt-userpage": "بÙ\84Ú¯Ù\87 کارÛ\8cارÛ\8cتÙ\88",
+ "tooltip-pt-userpage": "بÙ\84Ú¯Ù± کارÛ\8cارÛ\8cتÛ\8a",
"tooltip-pt-anonuserpage": "بلگه کاریاری تیرنشون آی پی ای که دش ویرایشت می کید",
- "tooltip-pt-mytalk": "بÙ\84Ú¯Ù\87 Ù\82سÙ\87 Ù\83ردÙ\86 Ø´ما",
+ "tooltip-pt-mytalk": "بÙ\84Ú¯Ù± Ù\82سٱ کردÙ\86 Ø´Ù\88ما",
"tooltip-pt-anontalk": "چک چنه دباره ویرایشتیا ای تیرنشون آی پی",
- "tooltip-pt-preferences": "اولويتيا شما",
+ "tooltip-pt-preferences": "اولۋیتیا شوما",
"tooltip-pt-watchlist": "نوم نوشت د بلگه يايی كه شما آلشتاشونه پيگئری ميكيد",
- "tooltip-pt-mycontris": "يه گل د هومياريا شما",
+ "tooltip-pt-mycontris": "یاٛ گاٛل د هومیاریا شوما",
"tooltip-pt-login": "ایما موئیم که روئیت وامین سامونگه؛ولی ای کار اژباری نئ",
"tooltip-pt-logout": "د سامونه دراومائن",
"tooltip-pt-createaccount": "شما تشویق بییته که یه گل حساو راست بکیت و بیایت وامین؛ د هر جور ای کار اژباری نئ",
"feedback-thanks": "منموندارتونیم! دمادار حوال حون شما د بلگه «[$1 $2]» ثبت بی.",
"feedback-thanks-title": "دتو منمونیم!",
"feedback-useragent": "راوط کاریا:",
- "searchsuggest-search": "پی جوری",
+ "searchsuggest-search": "پاٛی جۊری",
"searchsuggest-containing": "د حال و بار مینونه دار...",
"api-error-badtoken": "خطا مینجا:رازینه امنیتی اشتوا",
"api-error-emptypage": "یه گل بلگه تازه راس بکیت،بلگه یا حالی صلادار کاری نیئن.",
"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",
"permissionserrorstext": "Jūs neturite teisių tai daryti dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:",
"permissionserrorstext-withaction": "Jūs neturite leidimo $2 dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:",
"contentmodelediterror": "Jūs negalite redaguoti šios versijos, nes jos turinio modelis yra <code>$1</code>, kuris skiriasi nuo dabartinio puslapio turinio modelio, kuris yra <code>$2</code>.",
- "recreate-moveddeleted-warn": "'''Dėmesio: Jūs atkuriate puslapį, kuris anksčiau buvo ištrintas.'''\n\nTurėtumėte nuspręsti, ar reikėtų toliau redaguoti šį puslapį.\nJūsų patogumui čia pateikiamas šio puslapio šalinimų ir perkėlimų sąrašas:",
+ "recreate-moveddeleted-warn": "<strong>Dėmesio: Jūs atkuriate puslapį, kuris anksčiau buvo ištrintas.</strong>\n\nTurėtumėte nuspręsti, ar reikėtų toliau redaguoti šį puslapį.\nJūsų patogumui čia pateikiamas šio puslapio šalinimų ir perkėlimų sąrašas:",
"moveddeleted-notice": "Šis puslapis buvo ištrintas.\nŽemiau pateikiamas puslapio šalinimų, apsaugojimų, ir pervadinimų sąrašas.",
"moveddeleted-notice-recent": "Atsiprašome, šis puslapis buvo neseniai ištrintas (per pastarąsias 24 valandas). Žemiau pateikiama detali puslapio ištrynimo, rakinimo ir perkėlimo istorija.",
"log-fulllog": "Rodyti visą istoriją",
"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ą",
"doubleredirects": "Dvigubi peradresavimai",
"doubleredirectstext": "Šiame puslapyje yra puslapių, kurie nukreipia į kitus peradresavimo puslapius, sąrašas.\nKiekvienoje eilutėje yra nuorodos į pirmąjį ir antrąjį peradresavimą, taip pat antrojo peradresavimo paskirtis, kuris paprastai yra „tikrasis“ paskirties puslapis, į kurį pirmasis peradresavimas ir turėtų rodyti.\n<del>Išbraukti</del> įrašai yra išspręsti.",
"double-redirect-fixed-move": "[[$1]] buvo pervardytas; dabar tai peradresavimas į [[$2]].",
- "double-redirect-fixed-maintenance": "Tvarkomas dvigubas peradresavimas iš [[$1]] į [[$2]].",
+ "double-redirect-fixed-maintenance": "Tvarkomas dvigubas peradresavimas iš [[$1]] į [[$2]]",
"double-redirect-fixer": "Peradresavimų tvarkyklė",
"brokenredirects": "Peradresavimai į niekur",
"brokenredirectstext": "Šie peradresavimo puslapiai nurodo į neegzistuojančius puslapius:",
"sp-contributions-uploads": "įkėlimai",
"sp-contributions-logs": "specialiųjų veiksmų sąrašas",
"sp-contributions-talk": "aptarimas",
- "sp-contributions-userrights": "naudotojų teisių valdymas",
+ "sp-contributions-userrights": "{{GENDER:$1|naudotojų}} teisių valdymas",
"sp-contributions-blocked-notice": "Šis naudotojas šiuo metu užblokuotas.\nPateikiamas paskutinis blokavimo istorijos įrašas.",
"sp-contributions-blocked-notice-anon": "Šis IP adresas yra užblokuotas.\nPaskutinis blokavimo įrašas pateikiamas žemiau:",
"sp-contributions-search": "Ieškoti įnašų",
"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",
"lastmodifiedatby": "Šį puslapį paskutinį kartą redagavo $2, $1, $3.",
"othercontribs": "Paremta $1 darbu.",
"others": "kiti",
- "siteusers": "{{SITENAME}} {{PLURAL:$2|naudotojas|naudotojai}} $1",
+ "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|naudotojas|naudotoja}}|naudotojai}} $1",
"anonusers": "{{SITENAME}} {{PLURAL:$2|anoniminis naudotojas|anoniminiai naudotojai}} $1",
"creditspage": "Puslapio kūrėjai",
"nocredits": "Kūrėjų informacija negalima šiam puslapiui.",
"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.",
"feedback-thanks": "Ačiū! Jūsų atsiliepimas buvo užregistruotas puslapyje „[$2 $1]“.",
"feedback-thanks-title": "Ačiū!",
"feedback-useragent": "Vartotojo veiksnys:",
- "searchsuggest-search": "Ieškoti",
+ "searchsuggest-search": "Ieškoti {{SITENAME}}",
"searchsuggest-containing": "turintys",
"api-error-badtoken": "Vidinė klaida: blogai atpažinimo ženklas.",
"api-error-emptypage": "Kurti naujus, tuščius puslapius neleidžiama.",
"limitreport-expansiondepth": "Didžiausias plėtimosi gylis",
"limitreport-expensivefunctioncount": "Brangaus analizatoriaus funkcijos skaičius",
"expandtemplates": "Išplėsti šablonus",
- "expand_templates_intro": "Šis specialus puslapis pasirenką tekstą ir išplečia visus rekursyviai.\nJis taip pat išplečia palaikomas analizatoriaus funkcijas kaip\n<code><nowiki>{{</nowiki>#language:…}}</code> ir kintamuosius kaip\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nTiesą sakant, jis išplečia beveik viską dvigubuose skliaustuose.",
+ "expand_templates_intro": "Šis specialus puslapis pasirenką vikitekstą ir išplečia visus rekursyviai.\nJis taip pat išplečia palaikomas analizatoriaus funkcijas kaip\n<code><nowiki>{{</nowiki>#language:…}}</code> ir kintamuosius kaip\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nTiesą sakant, jis išplečia beveik viską dvigubuose skliaustuose.",
"expand_templates_title": "Aplinkybės pavadinimas, {{FULLPAGENAME}} ir pan.:",
"expand_templates_input": "Įvesti vikitekstą:",
"expand_templates_output": "Rezultatas",
"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."
}
"tog-watchlisthidebots": "Paslēpt botu labojumus uzraugāmo lapu sarakstā",
"tog-watchlisthideminor": "Paslēpt maznozīmīgos labojumus uzraugāmo lapu sarakstā",
"tog-watchlisthideliu": "Paslēpt reģistrēto dalībnieku labojumus uzraugāmo lapu sarakstā",
+ "tog-watchlistreloadautomatically": "Pārlādēt uzraugāmo rakstu sarakstu automātiski, ja tiek mainīts filtrs (nepieciešams JavaScript)",
"tog-watchlisthideanons": "Paslēpt anonīmo dalībnieku labojumus uzraugāmo lapu sarakstā",
"tog-watchlisthidepatrolled": "Paslēpt pārbaudītās lapas uzraugāmo lapu sarakstā",
"tog-watchlisthidecategorization": "Paslēpt lapu kategorizēšanu",
"revdelete-nooldid-title": "Nederīga mērķa versija",
"revdelete-no-file": "Norādītais fails neeksistē.",
"revdelete-show-file-submit": "Jā",
+ "revdelete-selected-text": "Lapas \"[[:$2]]\" {{PLURAL:$1|izvēlētās versijas|izvēlētā versija|izvēlētās versijas}}:",
+ "revdelete-selected-file": "Faila \"[[:$2]]\" {{PLURAL:$1|izvēlētās versijas|izvēlētā versija|izvēlētās versijas}}:",
"logdelete-selected": "{{PLURAL:$1|Izvēlētie reģistra ieraksti|Izvēlētais reģistra ieraksts|Izvēlētie reģistra ieraksti}}:",
"revdelete-confirm": "Lūdzu apstiprini, ka Tu zini, ko dari, Tu apzinies sekas, tāpat Tu to dari saskaņā ar vadlīnijām.",
"revdelete-suppress-text": "Paslēpšanu izmantot vienīgi šādos gadījumos:\n* potenciāli apmelojoša informācija\n* nepiemērotā personīgā informācija\n*: ''mājas adrese, telefona numuri u.c.''",
"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",
"version-libraries-description": "Apraksts",
"version-libraries-authors": "Autori",
"redirect": "Pāradresēt pēc faila, lietotāja, lapas, versijas vai žurnāla ieraksta ID",
+ "redirect-summary": "Šī īpašā lapa pāradresē uz failu (norādot faila nosaukumu), lapu (norādot versijas vai lapas ID), dalībnieka lapu (norādot dalībnieka skaitlisko ID) vai žurnāla ierakstu (norādot ieraksta ID). Izmantošana: [[{{#Special:Redirect}}/file/Piemers.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] vai [[{{#Special:Redirect}}/logid/186]].",
"redirect-submit": "Aiziet",
"redirect-lookup": "Meklēt:",
"redirect-value": "Vērtība:",
"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.",
"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": "Последниве часови",
"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": "Подолу {{PLURAL:$5|е прикажана промената|се прикажани промените}} почнувајќи од <strong>$3, $4</strong> (се прикажуваат до <b>$1</b>).",
"rclistfromreset": "Нов избор на датуми",
"rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
"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": "Следните пренасочувања водат до непостоечки страници.",
"version-poweredby-others": "други",
"version-poweredby-translators": "преведувачи на translatewiki.net",
"version-credits-summary": "Би сакале да им се заблагодариме на следниве лица за нивните придонеси кон [[Special:Version|МедијаВики]].",
- "version-license-info": "МедијаВики е слободна програмска опрема; можете да ја редистрибуирате и/или менувате под условите на ГНУ-овата општа јавна лиценца на Фондацијата за слободна програмска опрема; или верзија 2 на Лиценцата, или некоја понова верзија (по ваш избор).\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": "МедијаВики е слободна програмска опрема; можете да ја редистрибуирате и/или менувате под условите на ГНУ-овата општа јавна лиценца на Фондацијата за слободна програмска опрема; или верзија 2 на Лиценцата, или некоја понова верзија (по ваш избор).\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": "Верзија",
"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>-ознаките не може да се користат вон нормалните страници.",
"rcfilters-liveupdates-button-title-off": "घडल्याबरोबर, नवीन बदल दाखवा",
"rcfilters-watchlist-markseen-button": "सर्व बदल बघितले म्हणून खूण करा",
"rcfilters-watchlist-edit-watchlist-button": "आपल्या निरीक्षणसूचीमधील पानांची यादी संपादा",
+ "rcfilters-preference-label": "अलीकडील बदलाची सुधारीत आवृत्ती लपवा",
"rcfilters-target-page-placeholder": "पानाचे नाव (अथवा वर्ग) टाका",
"rcnotefrom": "खाली {{PLURAL:$5|हा बदल आहे|हे बदल आहेत}} <strong>$3, $4</strong>पासून ते(<strong>$1</strong>पर्यंतचे बदल दाखविले आहेत).",
"rclistfromreset": "दिनांक निवडीची पुनर्स्थापना करा",
"autosumm-replace": "पान '$1' वापरून बदलले.",
"autoredircomment": "[[$1]] कडे पुनर्निर्देशित",
"autosumm-removed-redirect": "[[$1]] ला असणारे पुनर्निर्देशन हटविले",
- "autosumm-changed-redirect-target": "पुनर्निर्देशन लक्ष्य [[$1]] पासून [[$2]]ला बदलविले",
+ "autosumm-changed-redirect-target": "पुनर्निर्देशन लक्ष्य [[$1]] पासून [[$2]] ला बदलविले",
"autosumm-new": "नवीन पान \"$1\"",
"autosumm-newblank": "रिकामे पान बनविले",
"size-bytes": "$1 बा.",
"sessionprovider-nocookies": "कुकिज अक्षम असू शकतात. याची खात्री करा कि कुकिज सक्षम केल्या आहेत व पुन्हा सुरुवात करा.",
"randomrootpage": "अविशिष्ट मूळ पान",
"log-action-filter-contentmodel": "आशय नमूना बदलाचा प्रकार",
+ "log-action-filter-delete": "वगळण्याचा प्रकार:",
"log-action-filter-rights-rights": "मानवी बदल",
"log-action-filter-suppress-block": "रोधामार्फत सदस्य दाबणे",
"changecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) बदला",
- "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा"
+ "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा",
+ "edit-error-short": "त्रुटी: $1",
+ "edit-error-long": "त्रुटी:$1"
}
"recentchangeslinked-feed": "Altaraçones relacionadas",
"recentchangeslinked-toolbox": "Altaraçones relacionadas",
"recentchangeslinked-title": "Altaraçones que ténen a ber cun \"$1\"",
- "recentchangeslinked-summary": "Esta páigina special amostra las redadeiras altaraçones de páiginas que téngan ua lhigaçon a outra (ó de nembros dua catadorie speceficada).\nLas páiginas que steian ne ls [[Special:Watchlist|tous begiados]] son amostradas an <strong>negrito</strong>.",
+ "recentchangeslinked-summary": "Scriba l nome dua páigina pa ber las altaraçones an todas las páiginas que téngan lhigaçones pa eilha ó pa las quales la páigina oufrecida ténen lhigaçones (pa ber ls nembros dua catadorie, scriba Catadorie:Nome de la catadorie). Las mudanças na sue [[Special:Watchlist|lhista de páiginas begiadas]] son amostradas an <strong>negro</strong>.",
"recentchangeslinked-page": "Nome de la páigina:",
"recentchangeslinked-to": "Amostrar antes altaraçones a páiginas que téngan a ber cula páigina dada",
"upload": "Cargar fexeiro",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁清單]])",
"rcfilters-legend-heading": "<strong>Kán-siá lia̍t-toaⁿ:</strong>",
"rcfilters-savedqueries-cancel-label": "Chhú-siau",
+ "rcfilters-filter-humans-label": "Jîn-lūi (m̄-sī bot)",
"rcnotefrom": "Ē-kha sī <b>$2</b> kàu taⁿ ê kái-piàn (ke̍k-ke hián-sī <b>$1</b> hāng).",
"rclistfrom": "Hián-sī tùi $3 $2 kàu taⁿ ê sin kái-piàn",
"rcshowhideminor": "$1 sió siu-kái",
"sp-contributions-logs": "Ji̍t-chì",
"sp-contributions-talk": "thó-lūn",
"sp-contributions-userrights": "{{GENDER:$1|iōng-chiá}} khoân-hān koán-lí",
- "sp-contributions-search": "Chhoē chhut kòng-kiàn",
+ "sp-contributions-search": "Chhoē chhut kòng-hiàn",
"sp-contributions-username": "IP Chū-chí a̍h iōng-chiá miâ:",
"sp-contributions-submit": "Chhoē",
"whatlinkshere": "Tó-ūi liân kàu chia",
"Candalua",
"Macofe",
"V6rg",
- "Nemo bis"
+ "Nemo bis",
+ "S4b1nuz E.656"
]
},
"tog-underline": "Sottolinia 'e jonte:",
"feedback-thanks": "Grazie! 'O feedback vuosto s'è mpizzato dint' 'a paggena \"[$2 $1]\".",
"feedback-thanks-title": "Ve ringraziammo!",
"feedback-useragent": "Aggente utente:",
- "searchsuggest-search": "Truova",
+ "searchsuggest-search": "Truova dint'ô {{SITENAME}}",
"searchsuggest-containing": "tène...",
"api-error-badtoken": "Errore interno: 'O token nun è buono.",
"api-error-emptypage": "'A criazione 'e paggene nuove abbacante nun è permessa.",
"rcfilters-activefilters": "Aktive filtre",
"rcfilters-advancedfilters": "Avanserte filtre",
"rcfilters-limit-title": "Antall resultater som skal vises",
- "rcfilters-limit-and-date-label": "{{PLURAL:$1|endring|$1 endringer}}, $2",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|endring|endringer}}, $2",
"rcfilters-date-popup-title": "Tidsperiode å søke i",
"rcfilters-days-title": "De siste dagene",
"rcfilters-hours-title": "De siste timene",
"lockmanager-fail-closelock": "Kunne ikke lukke låsefilen for «$1».",
"lockmanager-fail-deletelock": "Kunne ikke slette låsefilen for «$1».",
"lockmanager-fail-acquirelock": "Kunne ikke skaffe lås for «$1».",
- "lockmanager-fail-openlock": "Kunne ikke åpne låsefilen for «$1».",
+ "lockmanager-fail-openlock": "Kunne ikke åpne låsefilen for «$1». Sjekk at opplastingsmappa er konfigurert riktig og at nettjeneren din har tillatelse til å skrive til den mappa. Se https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory for mer informasjon.",
"lockmanager-fail-releaselock": "Kunne ikke frigi låsen for «$1».",
"lockmanager-fail-db-bucket": "Kunne ikke kontakte nok låsedatabaser i bøtten $1.",
"lockmanager-fail-db-release": "Kunne ikke frigi låser på databasen $1.",
"doubleredirects": "Doble omdirigeringer",
"doubleredirectstext": "Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.\nHver rad inneholder lenker til første og andre omdirigering, samt målet for den andre omdirigeringen, som vanligvis er den «virkelige» målsiden som den første omdirigeringen burde peke til.\n<del>Gjennomstrøkne</del> sider har blitt fikset.",
"double-redirect-fixed-move": "[[$1]] har blitt flyttet.\nDen ble automatisk oppdatert og er nå en omdirigering til [[$2]].",
- "double-redirect-fixed-maintenance": "Fikser automatisk dobbel omdirigering fra [[$1]] til [[$2]] som en del av en vedlikeholdsoppgave.",
+ "double-redirect-fixed-maintenance": "Fikser automatisk dobbel omdirigering fra [[$1]] til [[$2]] som en del av en vedlikeholdsoppgave",
"double-redirect-fixer": "Omdirigeringsfikser",
"brokenredirects": "Brutte omdirigeringer",
"brokenredirectstext": "Følgende omdirigeringer peker til ikkeeksisterende sider:",
"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.",
"action-unwatchedpages": "अवलोकन नगरिएका पृष्ठहरूको सूची हेर्ने",
"action-mergehistory": "यस पृष्ठको इतिहासलाई मिसाउने",
"action-userrights": "सबै प्रयोगकर्ताका अधिकारहरू सम्पादन गर्ने",
- "action-userrights-interwiki": "à¤\85रà¥\81 विà¤\95िका प्रयोगकर्ताहरूको प्रयोगकर्ता अधिकारलाई सम्पादन गर्ने",
+ "action-userrights-interwiki": "à¤\85रà¥\82 विà¤\95à¥\80का प्रयोगकर्ताहरूको प्रयोगकर्ता अधिकारलाई सम्पादन गर्ने",
"action-siteadmin": "डेटाबेस बन्दगर्ने वा खोल्ने",
"action-sendemail": "इमेलहरु पठाउने",
"action-editmywatchlist": "तपाईंको निगरानी सूची सम्पादन गर्नुहोस्",
"enhancedrc-history": "इतिहास",
"recentchanges": "नयाँ परिवर्तनहरू",
"recentchanges-legend": "हालैको परिवर्तन विकल्पहरू",
- "recentchanges-summary": "विà¤\95िà¤\95ा à¤à¤°à¥\8dà¤\96रà¤\95ा परिवरà¥\8dतनहरà¥\82लाà¤\88 यस पà¥\83षà¥\8dठमा पहिलà¥\8dयाà¤\89नà¥\87",
+ "recentchanges-summary": "विà¤\95à¥\80à¤\95ा à¤à¤°à¥\8dà¤\96रà¤\95ा परिवरà¥\8dतनहरà¥\82लाà¤\88 यस पà¥\83षà¥\8dठमा हà¥\87रà¥\8dन सà¤\95िनà¥\8dà¤\9b",
"recentchanges-noresult": "दिइएको मापदण्ड अवधिमा मिल्दो कुनै परिवर्तन छैन।",
"recentchanges-feed-description": "यो फिडमा रहेको विकीको सवैभन्दा अन्तिम परिवर्तनहरुको जानकारी राख्नुहोस्",
"recentchanges-label-newpage": "यो सम्पादनले नयाँ पृष्ठ निर्माण गरेको छ",
"statistics-header-hooks": "अन्य तथ्याङ्कहरू",
"statistics-articles": "सामग्री पृष्ठहरू",
"statistics-pages": "पृष्ठहरू",
- "statistics-pages-desc": "विà¤\95िà¤\95ा सबà¥\88 पà¥\83षà¥\8dठहरà¥\82, वारà¥\8dतापà¤\95ा पà¥\83षà¥\8dठहरà¥\82समà¥\87त, रिडाà¤\87रà¥\87à¤\95à¥\8dà¤\9f, à¤\87तà¥\8dयादि ।",
+ "statistics-pages-desc": "विà¤\95à¥\80à¤\95ा सबà¥\88 पà¥\83षà¥\8dठहरà¥\82, वारà¥\8dतापà¤\95ा पà¥\83षà¥\8dठहरà¥\82समà¥\87त, रिडाà¤\87रà¥\87à¤\95à¥\8dà¤\9f, à¤\87तà¥\8dयादि।",
"statistics-files": "उर्ध्वभरण गरिएका फाइलहरू",
"statistics-edits": "{{SITENAME}} स्थापना भए देखिको पृष्ठ सम्पादन",
"statistics-edits-average": "प्रतिपृष्ठ औसत सम्पादन",
]
},
"tog-underline": "Verwijzingen onderstrepen:",
- "tog-hideminor": "Kleine bewerkingen verbergen in recente wijzigingen",
- "tog-hidepatrolled": "Gemarkeerde wijzigingen verbergen in recente wijzigingen",
- "tog-newpageshidepatrolled": "Gemarkeerde pagina's verbergen in de lijst met nieuwe pagina's",
- "tog-hidecategorization": "Categorisatie van pagina's verbergen",
+ "tog-hideminor": "Kleine bewerkingen in recente wijzigingen verbergen",
+ "tog-hidepatrolled": "Gemarkeerde bewerkingen in recente wijzigingen verbergen",
+ "tog-newpageshidepatrolled": "Gemarkeerde pagina's in de lijst met nieuwe pagina's verbergen",
+ "tog-hidecategorization": "Categorisatie van pagina's in recente wijzigingen verbergen",
"tog-extendwatchlist": "Volglijst uitbreiden om alle wijzigingen te tonen, en niet alleen de recentste",
- "tog-usenewrc": "Wijzigingen per pagina weergeven in recente wijzigingen en volglijst",
+ "tog-usenewrc": "Wijzigingen per pagina groeperen in recente wijzigingen en op mijn volglijst",
"tog-numberheadings": "Koppen automatisch nummeren",
"tog-showtoolbar": "Bewerkingswerkbalk weergeven",
"tog-editondblclick": "Dubbelklikken voor bewerken",
"tog-editsectiononrightclick": "Bewerken van deelpagina’s mogelijk maken met een rechtermuisklik op een tussenkop",
"tog-watchcreations": "Pagina's die ik aanmaak en bestanden die ik upload aan mijn volglijst toevoegen",
- "tog-watchdefault": "Pagina’s en bestanden die ik bewerk aan mijn volglijst toevoegen",
- "tog-watchmoves": "Pagina’s en bestanden die ik hernoem automatisch volgen",
+ "tog-watchdefault": "Pagina's en bestanden die ik bewerk aan mijn volglijst toevoegen",
+ "tog-watchmoves": "Pagina's en bestanden die ik hernoem aan mijn volglijst toevoegen",
"tog-watchdeletion": "Pagina’s en bestanden die ik verwijder automatisch volgen",
"tog-watchuploads": "Nieuwe bestanden die ik upload aan mijn volglijst toevoegen",
"tog-watchrollback": "Pagina's waarop ik heb teruggedraaid automatisch volgen",
"tog-shownumberswatching": "Het aantal gebruikers weergeven dat deze pagina volgt",
"tog-oldsig": "Uw bestaande ondertekening:",
"tog-fancysig": "Handtekening als wikitekst behandelen (zonder automatische koppeling)",
- "tog-uselivepreview": "Voorvertoningen weergeven zonder de pagina opnieuw te laden",
+ "tog-uselivepreview": "Voorvertoning weergeven zonder de pagina opnieuw te laden",
"tog-forceeditsummary": "Een melding geven bij een lege bewerkingssamenvatting",
"tog-watchlisthideown": "Eigen bewerkingen op mijn volglijst verbergen",
"tog-watchlisthidebots": "Botbewerkingen op mijn volglijst verbergen",
"tog-watchlisthideminor": "Kleine bewerkingen op mijn volglijst verbergen",
"tog-watchlisthideliu": "Bewerkingen van aangemelde gebruikers op mijn volglijst verbergen",
"tog-watchlistreloadautomatically": "De volglijst automatisch herladen wanneer er een filter wordt veranderd (JavaScript vereist)",
- "tog-watchlistunwatchlinks": "Volgen/niet volgen-links toevoegen aan regels in de volglijst (JavaScript vereist voor schakelfunctionaliteit)",
+ "tog-watchlistunwatchlinks": "Volgen/niet volgen-links toevoegen aan regels in mijn volglijst (JavaScript vereist voor schakelfunctionaliteit)",
"tog-watchlisthideanons": "Bewerkingen van anonieme gebruikers op mijn volglijst verbergen",
"tog-watchlisthidepatrolled": "Gemarkeerde wijzigingen op mijn volglijst verbergen",
- "tog-watchlisthidecategorization": "Categorisatie van pagina's verbergen",
+ "tog-watchlisthidecategorization": "Categorisatie van pagina's op mijn volglijst verbergen",
"tog-ccmeonemails": "Mij een kopie zenden van e-mails die ik naar andere gebruikers stuur",
"tog-diffonly": "Pagina-inhoud onder wijzigingen niet weergeven",
"tog-showhiddencats": "Verborgen categorieën weergeven",
"prefs-watchlist": "Volglijst",
"prefs-editwatchlist": "Volglijst bewerken",
"prefs-editwatchlist-label": "Items op uw volglijst bewerken:",
- "prefs-editwatchlist-edit": "Items op uw volglijsten bekijken en verwijderen",
+ "prefs-editwatchlist-edit": "Titels op uw volglijst bekijken en verwijderen",
"prefs-editwatchlist-raw": "Ruwe volglijst bewerken",
"prefs-editwatchlist-clear": "Volglijst wissen",
- "prefs-watchlist-days": "Dagen weer te geven in de volglijst:",
+ "prefs-watchlist-days": "Weer te geven dagen in uw volglijst:",
"prefs-watchlist-days-max": "Maximaal $1 {{PLURAL:$1|dag|dagen}}",
- "prefs-watchlist-edits": "Maximaal aantal bewerkingen in de volglijst:",
+ "prefs-watchlist-edits": "Maximale aantal bewerkingen in uw volglijst:",
"prefs-watchlist-edits-max": "Maximale aantal: 1000",
"prefs-watchlist-token": "Volglijsttoken:",
"prefs-misc": "Diversen",
"stub-threshold": "Drempel voor markering als beginnetje ($1):",
"stub-threshold-sample-link": "voorbeeld",
"stub-threshold-disabled": "Uitgeschakeld",
- "recentchangesdays": "Aantal dagen weer te geven in de recente wijzigingen:",
- "recentchangesdays-max": "(maximaal $1 {{PLURAL:$1|dag|dagen}})",
+ "recentchangesdays": "Weer te geven dagen in recente wijzigingen:",
+ "recentchangesdays-max": "Maximaal $1 {{PLURAL:$1|dag|dagen}}",
"recentchangescount": "Standaard aantal weer te geven bewerkingen:",
- "prefs-help-recentchangescount": "Dit geldt voor recente wijzigingen, paginageschiedenis en logboekpagina's.",
+ "prefs-help-recentchangescount": "Dit geldt voor recente wijzigingen, paginageschiedenissen en logboekpagina's.",
"prefs-help-watchlist-token2": "Dit is de geheime sleutel voor de webfeed van uw volglijst.\nIedereen die het token kent, kan uw volglijst bekijken, dus deel dit token niet.\nIndien nodig kunt u [[Special:ResetTokens|tokens opnieuw instellen]].",
"savedprefs": "Uw voorkeuren zijn opgeslagen.",
"savedrights": "De gebruikergroepen van {{GENDER:$1|$1}} zijn opgeslagen.",
"email": "E-mail",
"prefs-help-realname": "Echte naam is optioneel.\nAls u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor uw werk.",
"prefs-help-email": "E-mailadres is optioneel, maar maakt het mogelijk om u uw wachtwoord te e-mailen als u het bent vergeten.",
- "prefs-help-email-others": "U kunt ook anderen in staat stellen per e-mail contact met u op te nemen via een koppeling op uw gebruikers- en overlegpagina.\nUw e-mailadres wordt niet prijsgegeven als andere gebruikers contact met u opnemen.",
+ "prefs-help-email-others": "Ook stelt u anderen in staat om per e-mail met u contact op te nemen via een koppeling op uw gebruikers- en overlegpagina's.\nUw e-mailadres wordt niet prijsgegeven als andere gebruikers contact met u opnemen.",
"prefs-help-email-required": "Hiervoor is een e-mailadres nodig.",
"prefs-info": "Basisgegevens",
"prefs-i18n": "Taalinstellingen",
"prefs-editor": "Tekstverwerker",
"prefs-preview": "Voorvertoning",
"prefs-advancedrc": "Gevorderde instellingen",
- "prefs-opt-out": "Niet deelnemen aan de verbeteringen",
+ "prefs-opt-out": "Niet deelnemen aan verbeteringen",
"prefs-advancedrendering": "Gevorderde instellingen",
"prefs-advancedsearchoptions": "Gevorderde instellingen",
"prefs-advancedwatchlist": "Gevorderde instellingen",
"rcfilters-watchlist-markseen-button": "Alle wijzigingen markeren als bezocht",
"rcfilters-watchlist-edit-watchlist-button": "Bewerk uw volglijst",
"rcfilters-watchlist-showupdated": "Wijzigingen aan pagina's die u niet hebt bezocht sinds de wijzigingen zijn aangebracht, worden <strong>vet</strong> en met gevulde opsommingstekens weergeven.",
- "rcfilters-preference-label": "Verberg de verbeterde versie van recente wijzigingen",
+ "rcfilters-preference-label": "De verbeterde versie van Recente wijzigingen verbergen",
"rcfilters-preference-help": "Zet het oude uiterlijk van de recente wijzigingen-pagina terug, inclusief alle hulpmiddelen die sindsdien zijn toegevoegd.",
"rcfilters-filter-showlinkedfrom-label": "Toon wijzigingen op pagina's gekoppeld aan",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>Paginas gekoppeld aan</strong> de geselecteerde pagina",
"lockmanager-fail-closelock": "Het was niet mogelijk het vergrendelingsbestand voor \"$1\" te sluiten.",
"lockmanager-fail-deletelock": "Het was niet mogelijk het vergrendelingsbestand voor \"$1\" te verwijderen.",
"lockmanager-fail-acquirelock": "Het was niet mogelijk \"$1\" te vergrendelen.",
- "lockmanager-fail-openlock": "Het was niet mogelijk het vergrendelingsbestand voor \"$1\" te openen.",
+ "lockmanager-fail-openlock": "Het was niet mogelijk het vergrendelingsbestand voor \"$1\" te openen. Verzeker uzelf ervan dat de uploadmap goed ingesteld is en uw webserver toestemming heeft om naar die map the schrijven. Zie https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory voor meer informatie.",
"lockmanager-fail-releaselock": "Het was niet mogelijk vergrendeling van \"$1\" op te heffen.",
"lockmanager-fail-db-bucket": "Het was niet mogelijk om in contact te komen met voldoende vergrendelingsdatabases in de bucket $1.",
"lockmanager-fail-db-release": "Het was niet mogelijk om de vergrendeling voor de database $1 op te heffen.",
"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.",
"exif-compression-2": "CCITT Groep 3 1-dimensionale aangepaste \"Huffman run length\"-codering",
"exif-compression-3": "CCITT Groep 3 faxcodering",
"exif-compression-4": "CCITT Groep 4 faxcodering",
+ "exif-compression-6": "JPEG (oud)",
"exif-copyrighted-true": "Auteursrechtelijk beschermd",
"exif-copyrighted-false": "Auteursrechtelijke status niet ingesteld",
"exif-photometricinterpretation-0": "Zwart en wit (Wit is 0)",
"exif-photometricinterpretation-1": "Zwart-wit (zwart is 0)",
"exif-photometricinterpretation-3": "Palet",
+ "exif-photometricinterpretation-4": "Transparantiemasker",
+ "exif-photometricinterpretation-5": "Gescheiden (waarschijnlijk CMYK)",
"exif-unknowndate": "Datum onbekend",
"exif-orientation-1": "Normaal",
"exif-orientation-2": "Horizontaal gespiegeld",
"restrictionsfield-badip": "Ongeldig IP-adres of range: $1",
"restrictionsfield-label": "Toegestane IP-ranges:",
"restrictionsfield-help": "Een IP-adres of CIDR bereik per lijn. Om alles toe te staan, gebruik:<pre>0.0.0.0/0\n::/0</pre>",
+ "edit-error-short": "Fout: $1",
+ "edit-error-long": "Fouten:\n\n$1",
"revid": "versie $1",
"pageid": "Pagina-ID $1",
"rawhtml-notallowed": "<html> tags kunnen alleen op normale pagina's geplaatst worden.",
"undo-success": "Endringa kan angrast.\nSjå på samanlikninga under for å stadfesta at dette er det du ynskjer å gjera. Deretter kan du lagra desse endringane for å fullføra angringa.",
"undo-failure": "Endringa kunne ikkje attenderullast grunna konflikt med endringar som er gjorde i mellomtida.",
"undo-norev": "Endringa kunne ikkje fjernast fordi han ikkje finst eller vart sletta",
+ "undo-nochange": "Det ser ut til at endringa alt er fjerna.",
"undo-summary": "Rullar attende versjon $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]])",
"cantcreateaccount-text": "Kontooppretting frå denne IP-adressa ('''$1''') er blokkert av [[User:$3|$3]].\n\nGrunnen som vart gjeven av $3 er ''$2''",
"viewpagelogs": "Vis loggane for sida",
"exbeforeblank": "innhaldet før sida vart tømd var: «$1»",
"delete-confirm": "Slett «$1»",
"delete-legend": "Slett",
- "historywarning": "<strong>Åtvaring:<strong> Sida du held på å slette har ein historikk med $1 {{PLURAL:$1|versjon|versjonar}}:",
+ "historywarning": "<strong>Åtvaring:</strong> Sida du held på å slette har ein historikk med $1 {{PLURAL:$1|versjon|versjonar}}:",
"historyaction-submit": "Vis",
"confirmdeletetext": "Du held på å varig slette ei side eller eit bilete saman med heile den tilhøyrande historikken frå databasen. Stadfest at du verkeleg vil gjere dette, at du skjønar konsekvensane, og at du gjer dette i tråd med [[{{MediaWiki:Policy-url}}|retningslinene]].",
"actioncomplete": "Ferdig",
"timezoneregion-indian": "Ocean Indyjski",
"timezoneregion-pacific": "Ocean Spokojny",
"allowemail": "Inni użytkownicy mogą przesyłać do mnie e‐maile",
+ "email-allow-new-users-label": "Zezwól na otrzymywanie e-maili od całkowicie nowych użytkowników",
"email-blacklist-label": "Zabroń tym użytkownikom na kontaktowanie się ze mną poprzez e-mail:",
"prefs-searchoptions": "Wyszukiwanie",
"prefs-namespaces": "Przestrzenie nazw",
"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": "د بنديز لگېدو سره دې د کارن د خبرو اترو مخ د سمولو مخنيوی هم پلي شي",
"anonymous": "د {{SITENAME}} {{PLURAL:$1|ورکنومی کارن|ورکنومي کارنان}}",
"siteuser": "د {{SITENAME}} کارن $1",
"anonuser": "د {{SITENAME}} ورکنومی کارن $1",
- "lastmodifiedatby": "دا مخ وروستی ځل د $3 لخوا په $2، $1 بدلون موندلی.",
+ "lastmodifiedatby": "دا مخ وروستی ځل $3 لخوا په $2، $1 بدلون موندلی.",
"othercontribs": "نور کار پر بنسټ",
"others": "نور",
"siteusers": "د {{SITENAME}} {{PLURAL:$2|کارن|کارنان}} $1",
"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 ساعتونه}}",
"lockmanager-fail-closelock": "Não foi possível encerrar a referência de bloqueio para \"$1\".",
"lockmanager-fail-deletelock": "Não foi possível eliminar a referência de bloqueio para \"$1\".",
"lockmanager-fail-acquirelock": "Não foi possível obter uma referência de bloqueio para \"$1\".",
- "lockmanager-fail-openlock": "Não foi possível abrir a referência de bloqueio para \"$1\".",
+ "lockmanager-fail-openlock": "Não foi possível abrir a referência de bloqueio para \"$1\". Certifique-se de que seu diretório de upload esteja configurado corretamente e seu servidor web tenha permissão para gravar nesse diretório. Veja https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory para maiores informações.",
"lockmanager-fail-releaselock": "Não foi possível liberar o bloqueio para \"$1\".",
"lockmanager-fail-db-bucket": "Não foi possível contatar suficientemente bloqueio das bases de dados no bucket $1 .",
"lockmanager-fail-db-release": "Não foi possível liberar os bloqueios para \"$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",
"expandtemplates": "Template spannute",
"expand_templates_intro": "Sta pàgena speciale pigghie quacche teste e spanne tutte le template jndr'à jidde recorsivamende.<br />\nJidde spanne pure le funziune de analise cumme<br />\n<code><nowiki>{{</nowiki>#language:…}}</code>, e variabbele cumme <br />\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.<br />\nIn pratiche tutte quidde ca stè jndr'à le doppie parendesi graffe.<br />",
"expand_templates_title": "Titele condestuale, pe {{FULLPAGENAME}} ecc.:",
- "expand_templates_input": "Teste de input:",
+ "expand_templates_input": "Uicchiteste de input:",
"expand_templates_output": "Resultete",
"expand_templates_xml_output": "XML de output",
"expand_templates_html_output": "Resultate HTML grezze",
"Wertuose",
"Helpau",
"Staspotanin2",
- "Edible Melon"
+ "Edible Melon",
+ "Adam-Yourist",
+ "MaksimPinigin"
]
},
"tog-underline": "Подчёркивание ссылок:",
"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": "Ошибки:\n\n$1",
"revid": "версия $1",
"pageid": "ID страницы $1",
"rawhtml-notallowed": "<html> теги могут быть использованы только в пределах обычных страниц.",
"tog-shownumberswatching": "Сирэйи кэтээн көрөр дьон ахсаанын көрдөр",
"tog-oldsig": "Билигин туттар илии баттааһынын",
"tog-fancysig": "Бэйэ илии баттааһына (сигэтэ суох)",
- "tog-uselivepreview": "ХайдаÑ\85 бÑ\83олÑ\83оÑ\85Ñ\82ааÒ\95Ñ\8bн Ñ\82Ñ\83Ñ\82аÑ\82Ñ\8bна Ñ\8dÑ\80дÑ\8d көÑ\80үүнү Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83Ñ\83",
+ "tog-uselivepreview": "ХайдаÑ\85 бÑ\83олÑ\83оÑ\85Ñ\82ааÒ\95Ñ\8bн Ñ\81иÑ\80Ñ\8dйи Ñ\85оÑ\81 Ñ\85аÑ\87айдаабакка көÑ\80дөÑ\80",
"tog-forceeditsummary": "Тугу уларыппытым туһунан суруйбатахпына сэрэт",
"tog-watchlisthideown": "Кэтээн көрүү тиһигэр бэйэм уларытыыларбын көрдөрүмэ",
"tog-watchlisthidebots": "Кэтээн көрүү тиһигэр робот уларытыытын көрдөрүмэ",
"nosuchusershort": "Маннык - \"$1\" - ааттаах кыттааччы суох. Аатыҥ сөпкө суруллубутун көр.",
"nouserspecified": "Кыттааччы аатын киллэриэхтээххин.",
"login-userblocked": "Бу кыттааччы бобуллубут. Тиһиккэ киирии көҥүллэммэт.",
- "wrongpassword": "Аһарыгыҥ сыыһалаах. Өссө киллэрэн көр.",
+ "wrongpassword": "Аһарыгыҥ дуу, аатыҥ дуу сыыһалаах. \nХатылаан көр.",
"wrongpasswordempty": "Аһарыккын суруйбатаххын. Хат киирэн көр.",
"passwordtooshort": "Аһарыгыҥ наһаа кылгас.\nКырата {{PLURAL:$1|1 бэлиэлээх|$1 бэлиэлээх}} буолуохтаах.",
"passwordtoolong": "Аһарык {{PLURAL:$1|1 бэлиэттэн|$1 бэлиэттэн}} уһун буолуо суохтаах.",
"botpasswords-insert-failed": "«$1» диэн ааттаах оруобаты эбэр табыллыбата. Баҕар хайыы-үйэ эбиллибитэ буолаарай?",
"botpasswords-update-failed": "\"$1\" диэн ааттаах ботаны кыайан саҥардыбатыбыт. Баҕар, сотторуллубута буолуо?",
"botpasswords-created-title": "Оруобат аһарыга оҥоһулунна",
- "botpasswords-created-body": "«$2» кыттааччы «$1» оруобатын аһарыга оҥоһулунна.",
+ "botpasswords-created-body": "«$2» {{GENDER:$2|кыттааччы}} «$1» оруобатын аһарыга оҥоһулунна.",
"botpasswords-updated-title": "Оруобат аһарыга саҥардылынна",
- "botpasswords-updated-body": "«$2» кыттааччы «$1» оруобатын аһарыга уларытылынна.",
+ "botpasswords-updated-body": "«$2» {{GENDER:$2|кыттааччы}} «$1» оруобатын аһарыга уларытылынна.",
"botpasswords-deleted-title": "Оруобат аһарыга сотулунна",
- "botpasswords-deleted-body": "«$2» кыттааччы «$1» оруобатын аһарыга сотулунна.",
+ "botpasswords-deleted-body": "«$2» {{GENDER:$2|кыттааччы}} «$1» оруобатын аһарыга сотулунна.",
"botpasswords-newpassword": "<strong>$1</strong> — <strong>$2</strong> аатынан киирэргэ саҥа аһарык. <em>Кэлин туттарга сурунан кэбис.</em> <br /> (Эргэ оруобаттар кыттааччы аата уонна саҥа киирэр киһи аата сөп түбэллэрин ирдиир буоллахтарына, <strong>$3</strong> кыттааччы аатын уонна маны <strong>$4</strong> аһарык курдук туттуохха сөп.)",
"botpasswords-no-provider": "BotPasswordsSessionProvider кыаллыбат.",
"botpasswords-restriction-failed": "Буот аһарыгын кытта сыһыаннаах хааччахтан киирии сатаммата.",
"yourtext": "Тиэкиһиҥ",
"storedversion": "Суруллубут барыл",
"editingold": "'''СЭРЭТИИ: Эргэрбит барылы көннөрө олороҕун.\nУларытыыны киллэрдэххинэ кэнники уларытыылар суох буолуохтара.'''",
+ "unicode-support-fail": "Браузерыҥ Юникуоду өйөөбөт эбит. Ол сирэйи уларытарга ирдэнэр, онон улурыппытыҥ бигэргэммэтэ.",
"yourdiff": "Уратылар",
"copyrightwarning": "Болҕой, манна оҥоһуллубут эбиилэр уонна уларытыылар $2 лицензиялаахтар (сиһ. маны көр $1). Өскө эн ыстатыйаларыҥ көҥүл тарҕаналларын уонна туһаныллалларын баҕарбат буоллаххына манна суруйума.<br />\nЭбиитин манна суруйар матырыйаалгын эбэтэр бэйэҥ суруйуохтааххын, эбэтэр көҥүл туһаныллары уонна көҥүл уларытары көҥүллүүр сиртэн ылбыт буолуохтааххын.\n'''КИМ ЭРЭ БАС БИЛЭР МАТЫРЫЙААЛЫН КИНИТТЭН КӨҤҮЛЭ СУОХ МАННА УГУМА!'''",
"copyrightwarning2": "Болҕой, эн суруйбут матырыйаалгын ким баҕарар уларытар уонна суох гынар бырааптаах. Суруйбуккун уларыталларын сөбүлээбэт буоллаххына манна суруйума.<br />\nЭбиитин манна суруйдаххына, уларытыы ааптара мин буолабын, эбэтэр көҥүл туһанары уонна уларытары көҥүллүүр сиртэн ыллым диэн бигэргэтэҕин (маны көр $1).<br /> '''КИМ ЭРЭ БАС БИЛИИТИН МАННА КИНИТТЭН КӨҤҮЛЭ СУОХ УГУМА!'''",
"contentmodelediterror": "Бу торуму уларытар кыаҕыҥ суох эбит, тоҕо диэтэххэ иһинээҕитин мадьыала маннык <code>$1</code>, оттон сирэй иһинээҕитин мадьыала билиҥҥитэ уратылаах — <code>$2</code>.",
"recreate-moveddeleted-warn": "'''Болҕой: сотулубут сирэйи төттөрү оҥорон эрэҕин.'''\n\nТолкуйдаан көр, кырдьык бу сирэйи оҥорор туһалаах дуо.\nАллара сотуулар уонна аат уларыйыытын сурунааллара көрдөрүлүннэ.",
"moveddeleted-notice": "Бу сирэй сотуллубут.\nАллара сотуу, көһөрүү уонна аат уларытыытын сурунаалларыгар онно сыһыаннаах туох суруллубута көстөр.",
- "moveddeleted-notice-recent": "Бу сирэй соторутааҕыта (тиһэх 24 чаас иһигэр) сотуллубут эбит.\nАллара сотуу уонна көһөрүү сурунаалларыгар сигэлэр көстөллөр.",
+ "moveddeleted-notice-recent": "Бу сирэй соторутааҕыта (тиһэх 24 чаас иһигэр) сотуллубут эбит.\nАллара манна сыһыаннаах сотуу, көмүскэл уонна көһөрүү сурунаалларыгар сигэлэр көстөллөр.",
"log-fulllog": "Сурунаалы барытын көрүү",
"edit-hook-aborted": "Көннөрүү төттөрү көннөрүллүбүт.\nЭбии туох да быһаарыллыбатах.",
"edit-gone-missing": "Сирэйи саҥардар кыах суох.\nАрааһа сотуллубут быһыылаах.",
"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": "Түмүктэрин ахсаана аһара барбыт сирэйдэр",
"diff-multi-sameuser": "(эмиэ бу кыттааччы оҥорбут {{PLURAL:$1|биир барыла көрдөрүллүбэтэ|$1 быыс барыллара көрдөрүллүбэтилэр}})",
"diff-multi-otherusers": "(атын {{PLURAL:$2|кыттааччы|$2 кыттааччы}} оҥорбут {{PLURAL:$1|биир барыла көрдөрүллүбэтэ|$1 быыс барыллара көрдөрүллүбэтилэр}})",
"diff-multi-manyusers": "(Кырата {{PLURAL:$2|$1 кыттааччы|$2 ахсааннаах кыттааччы}} оҥорбут {{PLURAL:$1|ыккардынааҕы $1 барыла|ыккардынааҕы $1 барыллара}} көрдөрүллүбэтэ)",
+ "diff-paragraph-moved-tonew": "Параграф көһөрүллүбүт. Баттаан саҥа сиргэ көс.",
+ "diff-paragraph-moved-toold": "Параграф көһөрүллүбүт. Баттаан урукку сиригэр көс.",
"difference-missing-revision": "$2 барыл бу тэҥнээһиҥҥэ ($1) көстүбэтэ.\n\nБу үксүн хайыы-үйэ сотуллубут сирэйи кытта тэҥнээри эргэрбит сигэнэн кэллэххэ баар буолааччы.\nСиһилии баҕар [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} сотуу сурунаалыгар] баара буолуо.",
"searchresults": "Булулунна",
"searchresults-title": "Көрдөөһүн түмүгэ \"$1\"",
"prefs-editwatchlist-clear": "Кэтэбил тиһилигин ыраастаа",
"prefs-watchlist-days": "Хас хонуктааҕы уларыйыылар кэтээһин испииһэгэр көстөллөрө:",
"prefs-watchlist-days-max": "Уһаабыта {{PLURAL:$1|биир күн|$1 күн}}",
- "prefs-watchlist-edits": "ХаÑ\81 Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8bнÑ\8b Ñ\82Ñ\83пÑ\81аÑ\80Ñ\8bллÑ\8bбÑ\8bÑ\82 кÑ\8dÑ\82Ñ\8dÑ\8dһиҥҥÑ\8d көÑ\80дөÑ\80Ó©Ñ\80Ó©:",
+ "prefs-watchlist-edits": "Ð\9aÑ\8dÑ\82Ñ\8dÑ\8dбил Ñ\82иһигÑ\8dÑ\80 Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b көÑ\81Ñ\82Ò¯Ò¯Ñ\82үн мÑ\83Ò¥Ñ\83Ñ\82Ñ\83Ñ\83Ñ\80 аÑ\85Ñ\81аана:",
"prefs-watchlist-edits-max": "Улааппыта: 1000",
"prefs-watchlist-token": "Кэтэбил тиһигин бэлиэтэ (токен):",
"prefs-misc": "Атын туруоруулар",
"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": "Бу улахан суолтата суох уларытыы",
"recentchanges-legend-heading": "<strong>Легендата:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
"recentchanges-submit": "Көрдөр",
+ "rcfilters-tag-remove": "Маны '$1' сот",
"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-date-popup-title": "Көрдүүр болдьох",
+ "rcfilters-days-title": "Тиһэх күннэргэ",
+ "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-new-name-label": "Аата",
"rcfilters-savedqueries-new-name-placeholder": "Сиидэ сорудаҕын ойуулаа",
"rcfilters-savedqueries-apply-label": "Сиидэни оҥоруу",
+ "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-search-placeholder": "Сиидэлэри кэнники уларытыы (көр биитэр киллэр)",
+ "rcfilters-show-new-changes": "Тиһэх уларытыылар",
+ "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-watchednew-description": "Уларытыыларын көрө илик испииһэккэр баар сирэйдэриҥ.",
"rcfilters-filter-watchlist-notwatched-label": "Кэтэбилгэ суох",
"rcfilters-filter-watchlist-notwatched-description": "Кэтэбил тиһилигэр киирбит ыстатыйалары уларытыыттан уратыны барытын.",
+ "rcfilters-filtergroup-watchlistactivity": "Кэтэбил тиһилигин көҕө",
+ "rcfilters-filter-watchlistactivity-unseen-label": "Көрүллэ илик уларытыылар",
+ "rcfilters-filter-watchlistactivity-unseen-description": "Тиһэх киирииҥ кэнниттэн оҥоһуллубут уларытыылар.",
+ "rcfilters-filter-watchlistactivity-seen-label": "Көрүллүбүт уларытыылар",
+ "rcfilters-filter-watchlistactivity-seen-description": "Тиһэх киирииҥ иннинэ оҥоһуллубут уларытыылар.",
"rcfilters-filtergroup-changetype": "Уларытыы көрүҥэ",
"rcfilters-filter-pageedits-label": "Сирэй уларытыылара",
"rcfilters-filter-pageedits-description": "Ис хоһоонун, ырытыылары, категорияны ойуулааһыны эҥин уларытыы...",
"rcfilters-hideminor-conflicts-typeofchange-global": "\"Кыра көннөрүүлэр\" сиидэ атын сиидэни эбэтэр сиидэлэри кытта сөп түбэспэтэ, \nтоҕо диэтэххэ сорох көннөрүүлэр кыра дэнэллэрэ сатаммат эбит.\nСөп түбэспэт сиидэлэр үөһэ, Холбоммут сиидэлэр хонууларыгар бэлиэтэммиттэр.",
"rcfilters-hideminor-conflicts-typeofchange": "Сорох көннөрүүлэр \"кыра\" диэн ааттанар кыахтара суох, онон сиидэ бу сиидэни кытта сөп түбэспэтэ: $1",
"rcfilters-typeofchange-conflicts-hideminor": "Сиидэ бу көрүҥэ кыра көннөрүүлэр сиидэлэрин кытта тапсыбат. Сорох көннөрүүлэр \"кыра\" курдук бэлиэтэнэр кыахтара суох.",
- "rcfilters-filtergroup-lastRevision": "Тиһэх барыл",
+ "rcfilters-filtergroup-lastRevision": "Тиһэх барыллар",
"rcfilters-filter-lastrevision-label": "Тиһэх барыл",
- "rcfilters-filter-lastrevision-description": "Сирэй тиһэх уларыйыыта.",
- "rcfilters-filter-previousrevision-label": "ÐÑ\80дÑ\8d оҥоһÑ\83ллÑ\83бÑ\83Ñ\82 көннөÑ\80үүлÑ\8dÑ\80",
+ "rcfilters-filter-lastrevision-description": "Сирэй тиһэх уларыйыыта эрэ.",
+ "rcfilters-filter-previousrevision-label": "ТиһÑ\8dÑ\85 баÑ\80Ñ\8bл бÑ\83олбаÑ\82аÑ\85",
"rcfilters-filter-previousrevision-description": "Тиһэх көннөрүүттэн ураты бары уларытыылар.",
"rcfilters-filter-excluded": "Мантан ураты",
"rcfilters-tag-prefix-namespace-inverted": "<strong>:not</strong> $1",
+ "rcfilters-exclude-button-off": "Талбыппыттан уратыны",
+ "rcfilters-exclude-button-on": "Талбыппын киллэримэ",
"rcfilters-view-tags": "Бэлиэтэммит (тиэктээх) уларытыылар",
+ "rcfilters-view-namespaces-tooltip": "Аат далларынан сиидэлээһин түмүгэ",
+ "rcfilters-view-tags-tooltip": "Уларытыы бэлиэтинэн сиидэлээ",
+ "rcfilters-view-return-to-default-tooltip": "Сиидэ сүрүн талбатыгар төннүү",
+ "rcfilters-liveupdates-button": "Бэйэтэ саҥардыллан истин",
+ "rcfilters-liveupdates-button-title-on": "Бэйэтэ саҥардылларын араар",
+ "rcfilters-liveupdates-button-title-off": "Саҥа уларытыылары тута көрдөр",
+ "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-refresh": "Билэлэр тиһиктэрин саҥардан биэр",
"uploadstash-thumbnail": "ойуучааны көрдөр",
"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-аадырыһа:",
"emailccsubject": "Эн суругуҥ куоппуйата $1: $2",
"emailsent": "Сурук барда",
"emailsenttext": "Эн суругуҥ ыытылынна.",
- "emailuserfooter": "Бу сурук {{GENDER:$2|$2}} кыттааччыга {{GENDER:$1|$1}} кыттааччыттан «Сурукта ыыт» (\"{{int:emailuser}}\") диэн тэрил көмөтүнэн {{SITENAME}} ситим-сиртэн ыытыллыбыт. {{GENDER:$2|Эн}} электрон аадырыһыҥ ыыппыт {{GENDER:$1|киһигэр}} көстүөҕэ.",
+ "emailuserfooter": "Бу сурук {{GENDER:$2|$2}} кыттааччыга {{GENDER:$1|$1}} кыттааччыттан «Сурукта ыыт» (\"{{int:emailuser}}\") диэн тэрил көмөтүнэн {{SITENAME}} ситим-сиртэн ыытыллыбыт. Өскөтө {{GENDER:$2|Эн}} киниэхэ суруйдаххына, электрон аадырыһыҥ {{GENDER:$1|киһигэр}} көстүөҕэ.",
"usermessage-summary": "Тиһилик биллэриитин хааллар.",
"usermessage-editor": "Тиһилик биллэрээччитэ",
"watchlist": "Кэтэбилим тиһигэ",
"enotif_body_intro_moved": "$PAGEEDITDATE «{{SITENAME}}» бырайыак «$1» ааттаах сирэйин бу {{gender:$2|кыттааччы|кыттааччы}} аатын уларыппыт - $2, билиҥҥи барылын манна көр: $3",
"enotif_body_intro_restored": "$PAGEEDITDATE «{{SITENAME}}» бырайыак «$1» ааттаах сирэйин бу {{gender:$2|кыттааччы|кыттааччы}} соппут - $2, билиҥҥи барылын манна көр: $3",
"enotif_body_intro_changed": "$PAGEEDITDATE «{{SITENAME}}» бырайыак «$1» ааттаах сирэйин бу {{gender:$2|кыттааччы|кыттааччы}} айбыт - $2, билиҥҥи барылын манна көр: $3",
- "enotif_lastvisited": "Бутэһик киирииҥ кэнниттэн оҥоһуллубут уларыйыылары барытын көрөргө манна киир: $1.",
+ "enotif_lastvisited": "Бүтэһик киирииҥ кэнниттэн оҥоһуллубут уларыйыылары барытын көрөргө манна киир: $1.",
"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": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.",
"changecontentmodel-emptymodels-title": "Ис хоһоононун холобура суох",
"changecontentmodel-emptymodels-text": "[[:$1]] иһинээҕитэ ханнык да атын көрүҥҥэ уларыйар кыаҕа суох эбит.",
"log-name-contentmodel": "Иһинээҕитин киэбин уларытыы сурунаала",
- "log-description-contentmodel": "СиÑ\80Ñ\8dй иһинÑ\8dÑ\8dÒ\95иÑ\82ин киÑ\8dбин кÑ\8bÑ\82Ñ\82а Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85",
+ "log-description-contentmodel": "Ð\9cанна Ñ\81иÑ\80Ñ\8dй иһинÑ\8dÑ\8dÒ\95иÑ\82ин киÑ\8dбин Ñ\83лаÑ\80Ñ\8bйÑ\8bÑ\8bÑ\82Ñ\8bн кÑ\8bÑ\82Ñ\82а Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85 Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8bлаÑ\80 көÑ\81Ñ\82өллөÑ\80.",
"logentry-contentmodel-new": "$1 $3 диэн сирэйи маны туһанан «$5» {{GENDER:$2|айбыт}}",
"logentry-contentmodel-change": "$1 кыттааччы $3 сирэй иһинээҕитин мадьыалын мантан «$4» манна «$5» {{GENDER:$2|уларыппыт}}",
"logentry-contentmodel-change-revertlink": "төннөрүү",
"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-гар аһаҕас прокси быһыытынан сылдьар.",
"delete_and_move_text": "==Сотуохха наада==\n\nМаннык ааттаах сирэй [[:$1|«$1»]] бэлиэр баар. Эн ону суох гынан баран аатын уларытаары гынаҕын дуо?",
"delete_and_move_confirm": "Сөп, бу сирэйи суох гын",
"delete_and_move_reason": "Аатын уларытаары сотулунна \"[[$1]]\"",
- "selfmove": "Аатын уларытар сатаммат. Эргэ уонна саҥа аата биирдэр.",
+ "selfmove": "Аатын уларытар сатаммата; \nэргэ уонна саҥа аата биирдэр.",
"immobile-source-namespace": "\"$1\" аат далыгар баар сирэйдэр ааттарын уларытар кыах суох.",
"immobile-target-namespace": "\"$1\" аат далыгар сирэйи көһөрөр кыах суох",
"immobile-target-namespace-iw": "Интервики сигэтэ ааты уларытыыга туһаныллыбат.",
"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": "Импортааһын түмүктэннэ!",
"import-nonewrevisions": "Биир да уларытыы импортаммата (бу иннинэ таҥастаммыттар, биитэр алҕастаах буолан көтүтүллүбүттэр).",
"xml-error-string": "$1 - $2 строка, $3 колонка ($4 байт): $5",
"import-upload": "XML-дааннайдары киллэр",
- "import-token-mismatch": "Арахсан хаалбыт. \n\nБаҕар тахсан хаалбытыҥ буолуо. <strong>Бэлиэтэммит ааккынан киирэн олороргун тургутан баран хатылаан көр.</strong>.\nӨскөтө син биир көмөлөспөтөҕүнэ [[Special:UserLogout|тахсан баран]] төттөрү киирэн көр уонна браузерыҥ куукалары ыларын тургут.",
+ "import-token-mismatch": "Арахсан хаалбыт. \n\nБаҕар тахсан хаалбытыҥ буолуо. <strong>Бэлиэтэммит ааккынан киирэн олороргун тургутан баран хатылаан көр.</strong>.\nӨскөтө син биир сатамматаҕына [[Special:UserLogout|тахсан баран]] төттөрү киирэн көр уонна браузерыҥ кууканы ыларын тургут.",
"import-invalid-interwiki": "Бу биикиттэн импорт оҥорор сатаммат(а).",
"import-error-edit": "«$1» сирэй көһөрүллүбэтэ, тоҕо диэтэххэ кинини уларытарыҥ көҥүллэммэт эбит.",
"import-error-create": "«$1» сирэй киллэриллибэтэ, тоҕо диэтэххэ кинини айарыҥ сатаммат эбит.",
"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 байт",
"version-poweredby-others": "атыттар",
"version-poweredby-translators": "translatewiki.net тылбаасчыттара",
"version-credits-summary": "[[Special:Version|MediaWiki]] сайдыытыгар үлэлэрин иһин манна ахтыллыбыт дьоҥҥо махтанабыт.",
- "version-license-info": "MediaWiki көҥүл Ñ\82аÑ\80Ò\95анаÑ\80 бÑ\8bÑ\80агÑ\8bÑ\80ааммалаÑ\80га кииÑ\80Ñ\8dÑ\80, кинини көмпүүÑ\82Ñ\8dÑ\80 аһаÒ\95аÑ\81 бÑ\8bÑ\80агÑ\8bÑ\80ааммалаÑ\80Ñ\8bн пÑ\83ондаÑ\82Ñ\8bн GNU General Public License Ñ\83Ñ\81Ñ\83лÑ\83обÑ\83йаÑ\82Ñ\8bнан көҥүл Ñ\82аÑ\80Ò\95аÑ\82аÑ\80гÑ\8bÑ\82 Ñ\83онна/Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80гÑ\8bÑ\82 көҥүллÑ\8dнÑ\8dÑ\80; иккиÑ\81 Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 онÑ\82он Ñ\85ойÑ\83ккÑ\83 Ñ\85аннÑ\8bк баÒ\95аÑ\80аÑ\80 баÑ\80Ñ\8bлÑ\8bÑ\82Ñ\82ан Ñ\81аÒ\95алаан.\n\nMediaWiki Ñ\82Ñ\83һалааÑ\85 бÑ\83оллÑ\83н диÑ\8dн Ñ\82аÑ\80Ò\95аÑ\82Ñ\8bллаÑ\80, ол Ñ\8dÑ\80Ñ\8dÑ\8dÑ\80и Ð\90ТЫЫÐ\9bÐ\90Ð\9dÐ\90РСЫÐ\90Ð\9dÐ\9dÐ\90ÒºÐ\90 Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ð¥Ð\90Ð\9dÐ\9dЫÐ\9a ÐРРЧÐ\9eÐ\9fЧУ СÐ\9eРУÐ\9aÐ\9aÐ\90 СӨÐ\9f ТҮÐ\91ÐÒºÐ\98Ð\98ТРбигÑ\8dÑ\80гÑ\8dÑ\82иллибÑ\8dÑ\82 (гаÑ\80анÑ\82иÑ\8fÑ\82а Ñ\81Ñ\83оÑ\85). Сиһилии GNU General Public License Ñ\83Ñ\81Ñ\83лÑ\83обÑ\83йаÑ\82Ñ\8bн көÑ\80Ò¯Ò¥.\n\n[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License копиÑ\8fÑ\82Ñ\8bн] бÑ\83 бÑ\8bÑ\80агÑ\8bÑ\80аамманÑ\8b кÑ\8bÑ\82Ñ\82а Ñ\8bлÑ\8bаÑ\85Ñ\82ааÑ\85 Ñ\8dÑ\82игиÑ\82, ол Ñ\81аÑ\82аммаÑ\82аÑ\85 бÑ\83оллаÒ\95Ñ\8bна Free Software Foundation, Inc. Ñ\82Ñ\8dÑ\80илÑ\82Ñ\8dÒ\95Ñ\8d Ñ\81Ñ\83Ñ\80Ñ\83кÑ\82а Ñ\81Ñ\83Ñ\80Ñ\83йÑ\83Ò¥, бÑ\83 аадÑ\8bÑ\80Ñ\8bÑ\81ка: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html Ñ\81аайка кииÑ\80Ñ\8dн ааÒ\95Ñ\8bÒ¥].",
+ "version-license-info": "MediaWiki көҥүл Ñ\82аÑ\80Ò\95анаÑ\80 бÑ\8bÑ\80агÑ\8bÑ\80аама. Ð\9eнон GNU General Public License (иккиÑ\81 Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 онÑ\82он Ñ\85ойÑ\83ккÑ\83 Ñ\85аннÑ\8bк баÒ\95аÑ\80аÑ\80 баÑ\80Ñ\8bлÑ\8bÑ\82Ñ\82ан Ñ\81аÒ\95алаан) Ñ\83Ñ\81Ñ\83лÑ\83обÑ\83йаÑ\82Ñ\8bнан көҥүл Ñ\82аÑ\80Ò\95аÑ\82аÑ\80 Ñ\83онна/Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 көҥүллÑ\8dнÑ\8dÑ\80.\n\nMediaWiki Ñ\82Ñ\83һалааÑ\85 бÑ\83оллÑ\83н диÑ\8dн Ñ\82аÑ\80Ò\95аÑ\82Ñ\8bллаÑ\80, ол Ñ\8dÑ\80Ñ\8dÑ\8dÑ\80и <strong>Ð\90ТЫЫÐ\9bÐ\90Ð\9dÐ\90РСЫÐ\90Ð\9dÐ\9dÐ\90ÒºÐ\90</strong> Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 <strong>Ð¥Ð\90Ð\9dÐ\9dЫÐ\9a ÐРРЧÐ\9eÐ\9fЧУ СÐ\9eРУÐ\9aÐ\9aÐ\90 СӨÐ\9f ТҮÐ\91ÐÒºÐ\98Ð\98ТÐ</strong> <em>бигÑ\8dÑ\80гÑ\8dÑ\82иллибÑ\8dÑ\82</em> (гаÑ\80анÑ\82иÑ\8fÑ\82а Ñ\81Ñ\83оÑ\85). Сиһилии GNU General Public License Ñ\83Ñ\81Ñ\83лÑ\83обÑ\83йаÑ\82Ñ\8bн көÑ\80.\n\n[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License кÑ\83опÑ\83йаÑ\82Ñ\8bн] бÑ\83 бÑ\8bÑ\80агÑ\8bÑ\80ааманÑ\8b кÑ\8bÑ\82Ñ\82а Ñ\8bлÑ\8bаÑ\85Ñ\82ааÑ\85 Ñ\8dÑ\82иҥ, ол Ñ\81аÑ\82аммаÑ\82аÑ\85 бÑ\83оллаÒ\95Ñ\8bна Free Software Foundation, Inc. Ñ\82Ñ\8dÑ\80илÑ\82Ñ\8dÒ\95Ñ\8d Ñ\81Ñ\83Ñ\80Ñ\83кÑ\82а Ñ\81Ñ\83Ñ\80Ñ\83й, бÑ\83 аадÑ\8bÑ\80Ñ\8bÑ\81ка: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 манна кииÑ\80Ñ\8dн [//www.gnu.org/licenses/old-licenses/gpl-2.0.html ааÑ\85].",
"version-software": "Туруоруллубут бырагырааммалар",
"version-software-product": "Бородуукта",
"version-software-version": "Барыл (торум)",
"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."
}
"sourcefilename": "ذريعي جي فائيل جو نالو:",
"upload-description": "فائيل جي تشريح",
"upload-options": "چاڙھ جا چارا",
- "watchthisupload": "Ù\87Ù\8aØ¡Ù\8f Ù\81ائÙ\8aÙ\84 Ù½Ù\8aÙ½Ù\8aو",
+ "watchthisupload": "Ù\87Ù\8aØ¡Ù\8f Ù\81ائÙ\8aÙ\84 Ù\86ظر Û¾ رکو",
"upload-file-error": "اندروني چُڪَ",
"upload-http-error": "ايڇ ٽي ٽي پي جي چُڪَ ٿي آهي: $1",
"upload-dialog-title": "فائيل چاڙهيو",
"nrevisions": "$1 {{PLURAL:$1|مسودو|مسودا}}",
"nimagelinks": "$1 {{PLURAL:$1|صفحي|صفحن}} ۾ استعمال ٿيل",
"ntransclusions": "$1 {{PLURAL:$1|صفحي|صفحن}} ۾ استعمال ٿيل",
+ "specialpage-empty": "ھن رپورٽ لاءِ ڪي-بہ نتيجا ناھن.",
"lonelypages": "يتيم صفحا",
"uncategorizedpages": "اڻ زمريل صفحا",
"uncategorizedcategories": "اڻزمرايل زمرا",
"wlshowhideanons": "گمنام واپررائيندڙ",
"wlshowhidepatr": "گشت-ڪيل ترميمون",
"wlshowhidemine": "منھنجون ترميمون",
+ "wlshowhidecategorization": "صفحاتي زمراڪاري",
"watchlist-options": "نظر ۾ فھرست جا چارا",
"watching": "نظر ۾ رکندي...",
"unwatching": "نظر مان ڪڍندي...",
"restriction-level-sysop": "مڪمل طور تحفظيل",
"restriction-level-autoconfirmed": "نيم تحفظيل",
"viewdeletedpage": "ڊاٺل صفحا ڏسو",
+ "undelete-nodiff": "ڪوبہ پويون مسودو نہ لڌو",
"undeletebtn": "بحاليو",
"undeleteviewlink": "ڏسو",
"undeletecomment": "سبب:",
"sp-contributions-uploads": "چاڙھَ",
"sp-contributions-logs": "لاگس",
"sp-contributions-talk": "ڳالھ",
- "sp-contributions-userrights": "{{GENDER:$1|Ù\8aÙ\88Ù\8fزر}} ØÙ\82Ù\86 جي سنڀال",
+ "sp-contributions-userrights": "{{GENDER:$1|Ù\88اپرائÙ\8aÙ\86دÚ\99}} ØÙ\82Ù\86-جي سنڀال",
"sp-contributions-search": "ڀاڱيدارين لاءِ ڳولا ڪريو",
"sp-contributions-username": "آءِپي پتو يا واپرائيندڙ-نانءُ:",
"sp-contributions-toponly": "صرف اھي ترميمون ڏيکاريو جيڪي تازا ترين مسودا آھن",
"movenotallowed": "توهان کي صفحا چورڻ جي اجازت حاصل ڪانهي.",
"movenotallowedfile": "توهان کي فائيلس چورڻ جي اجازت حاصل ڪانهي.",
"newtitle": "نئون عنوان:",
- "move-watch": "هيءُ صفحو ٽيٽيو",
+ "move-watch": "ذريعي وارو صفحو ۽ ھدف وارو صفحو نظر ۾ رکو",
"movepagebtn": "صفحو چوريو",
"pagemovedsub": "چورڻ جو عمل ڪامياب ٿيو",
"movepage-moved": "'''\"$1\" کي چوري \"$2\" تي رکيو ويو آهي'''",
"special-characters-group-thai": "ٿائي",
"special-characters-group-lao": "لائو",
"mw-widgets-dateinput-no-date": "ڪا بہ تاريخ نہ چونڊيل",
+ "mw-widgets-mediasearch-noresults": "ڪي-بہ نتيجا نہ لڌا.",
"mw-widgets-titleinput-description-new-page": "اڃا اهو صفحو وجود نہ ٿو رکي",
"mw-widgets-titleinput-description-redirect": "$1 ڏانهن چوريل",
+ "date-range-from": "تاريخ کان:",
+ "date-range-to": "تاريخ تائين:",
"log-action-filter-all": "سڀ"
}
"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": "Подвлачење веза:",
- "tog-hideminor": "СакÑ\80иÑ\98 маÑ\9aе измене Ñ\83 Ñ\81пиÑ\81кÑ\83 скорашњих измена",
- "tog-hidepatrolled": "СакÑ\80иÑ\98 паÑ\82Ñ\80олиÑ\80ане измене Ñ\83 Ñ\81пиÑ\81кÑ\83 скорашњих измена",
+ "tog-hideminor": "СакÑ\80иÑ\98 маÑ\9aе измене Ñ\81а Ñ\81пиÑ\81ка скорашњих измена",
+ "tog-hidepatrolled": "СакÑ\80иÑ\98 паÑ\82Ñ\80олиÑ\80ане измене Ñ\81а Ñ\81пиÑ\81ка скорашњих измена",
"tog-newpageshidepatrolled": "Сакриј патролиране странице са списка нових страница",
"tog-hidecategorization": "Сакриј категоризацију страница",
"tog-extendwatchlist": "Прошири списак надгледања за приказ свих измена, не само скорашњих",
"tog-showtoolbar": "Прикажи траку с алаткама за уређивање",
"tog-editondblclick": "Уређивање страница двоструким кликом",
"tog-editsectiononrightclick": "Уређивање одељака десним кликом на њихове наслове",
- "tog-watchcreations": "Додај странице које направим и датотеке које пошаљем у списак надгледања",
- "tog-watchdefault": "Додај странице и датотеке које изменим у списак надгледања",
- "tog-watchmoves": "Додај странице и датотеке које преместим у списак надгледања",
- "tog-watchdeletion": "Додај странице и датотеке које обришем у списак надгледања",
- "tog-watchuploads": "Додај датотеке које отпремим у списак надгледања",
- "tog-watchrollback": "Додај странице на којима сам вратио измене у списак надгледања",
+ "tog-watchcreations": "Додај странице које направим и датотеке које пошаљем у мој списак надгледања",
+ "tog-watchdefault": "Додај странице и датотеке које изменим у мој списак надгледања",
+ "tog-watchmoves": "Додај странице и датотеке које преместим у мој списак надгледања",
+ "tog-watchdeletion": "Додај странице и датотеке које обришем у мој списак надгледања",
+ "tog-watchuploads": "Додај датотеке које отпремим у мој списак надгледања",
+ "tog-watchrollback": "Додај странице на којима сам вратио измене у мој списак надгледања",
"tog-minordefault": "Означавај све измене као мање",
- "tog-previewontop": "Прикажи преглед пре оквира за уређивање",
+ "tog-previewontop": "Прикажи претпреглед пре оквира за уређивање",
"tog-previewonfirst": "Прикажи преглед на првој измени",
- "tog-enotifwatchlistpages": "Пошаљи ми имејл када се промени страница/датотека коју надгледам",
- "tog-enotifusertalkpages": "Ð\9fоÑ\88аÑ\99и ми имеÑ\98л када Ñ\81е пÑ\80омени моÑ\98а Ñ\81Ñ\82Ñ\80аниÑ\86а за Ñ\80азговоÑ\80",
+ "tog-enotifwatchlistpages": "Пошаљи ми имејл када се страница или датотека коју надгледам измени",
+ "tog-enotifusertalkpages": "Ð\9fоÑ\88аÑ\99и ми имеÑ\98л када Ñ\81е моÑ\98а Ñ\81Ñ\82Ñ\80аниÑ\86а за Ñ\80азговоÑ\80 измени",
"tog-enotifminoredits": "Пошаљи ми имејл и за мање измене у страницама и датотекама",
"tog-enotifrevealaddr": "Прикажи моју имејл адресу у порукама обавештења",
"tog-shownumberswatching": "Прикажи број корисника који надгледају",
- "tog-oldsig": "ТекÑ\83Ñ\9bи потпис:",
+ "tog-oldsig": "Ð\92аÑ\88 Ñ\82Ñ\80енÑ\83Ñ\82ни потпис:",
"tog-fancysig": "Сматрај потпис као викитекст (без самоповезивања)",
- "tog-uselivepreview": "Прикажи преглед без освежавања стране",
+ "tog-uselivepreview": "Прикажи претпреглед без освежавања стране",
"tog-forceeditsummary": "Упозори ме када не унесем опис измене",
"tog-watchlisthideown": "Сакриј моје измене са списка надгледања",
"tog-watchlisthidebots": "Сакриј измене ботова са списка надгледања",
"tog-watchlisthideminor": "Сакриј мање измене са списка надгледања",
"tog-watchlisthideliu": "Сакриј измене пријављених корисника са списка надгледања",
"tog-watchlistreloadautomatically": "Аутоматски освежи списак надгледања кад год се филтер измени (потребан JavaScript)",
- "tog-watchlistunwatchlinks": "Ð\94одаÑ\98 дÑ\83гме за Ñ\83кÑ\99Ñ\83Ñ\87еÑ\9aе/иÑ\81кÑ\99Ñ\83Ñ\87еÑ\9aе надгледаÑ\9aа Ñ\81вакоÑ\98 Ñ\81Ñ\82Ñ\80ани на Ñ\81пиÑ\81кÑ\83 надгледаÑ\9aа (поÑ\82Ñ\80ебан Ð\88аваÑ\81кÑ\80ипÑ\82 за еÑ\84екаÑ\82 Ñ\83кÑ\99Ñ\83Ñ\87и/иÑ\81кÑ\99Ñ\83Ñ\87и)",
+ "tog-watchlistunwatchlinks": "Ð\94одаÑ\98 везе за диÑ\80екÑ\82но додаваÑ\9aе/Ñ\83клаÑ\9aаÑ\9aе Ñ\81Ñ\82авки Ñ\81а Ñ\81пиÑ\81ка надгледаÑ\9aа (поÑ\82Ñ\80ебан Ð\88аваСкÑ\80ипÑ\82)",
"tog-watchlisthideanons": "Сакриј измене анонимних корисника са списка надгледања",
"tog-watchlisthidepatrolled": "Сакриј патролиране измене са списка надгледања",
"tog-watchlisthidecategorization": "Сакриј категоризацију страница",
"tog-diffonly": "Не приказуј садржај странице испод разлика",
"tog-showhiddencats": "Прикажи скривене категорије",
"tog-norollbackdiff": "Не приказуј разлику након извршеног враћања",
- "tog-useeditwarning": "УпозоÑ\80и ме када напÑ\83Ñ\88Ñ\82ам Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ñ\81а неÑ\81аÑ\87Ñ\83ваним пÑ\80оменама",
+ "tog-useeditwarning": "УпозоÑ\80и ме када напÑ\83Ñ\88Ñ\82ам Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ñ\81а неÑ\81аÑ\87Ñ\83ваним изменама",
"tog-prefershttps": "Увек користи сигурну конекцију када сам пријављен.",
- "underline-always": "Увек подвлачи",
- "underline-never": "Никад не подвлачи",
+ "underline-always": "Увек",
+ "underline-never": "Никад",
"underline-default": "Према теми или прегледачу",
"editfont-style": "Изглед фонта у уређивачком оквиру:",
"editfont-monospace": "Сразмерно широк фонт",
"fri": "пет",
"sat": "суб",
"january": "јануар",
- "february": "Фебруар",
+ "february": "фебруар",
"march": "март",
"april": "април",
"may_long": "мај",
"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 децембар",
"category-file-count-limited": "{{PLURAL:$1|1=Следећа датотека је|Следеће $1 датотеке су|Следећих $1 датотека је}} у овој категорији.",
"listingcontinuesabbrev": "наст.",
"index-category": "Пописане странице",
- "noindex-category": "Ð\9dеиндекÑ\81иÑ\80ане странице",
+ "noindex-category": "Ð\9dепопиÑ\81ане странице",
"broken-file-category": "Странице с неисправним везама до датотека",
"about": "О нама",
"article": "Страница са садржајем",
"newwindow": "(отвара се у новом прозору)",
"cancel": "Откажи",
"moredotdotdot": "Више…",
- "morenotlisted": "Ð\9eваÑ\98 Ñ\81пиÑ\81ак ниÑ\98е комплеÑ\82ан.",
+ "morenotlisted": "Ð\9eваÑ\98 Ñ\81пиÑ\81ак можда ниÑ\98е поÑ\82пÑ\83н.",
"mypage": "Страница",
"mytalk": "Разговор",
"anontalk": "Разговор",
"navigation-heading": "Навигациони мени",
"errorpagetitle": "Грешка",
"returnto": "Назад на $1.",
- "tagline": "Извор: {{SITENAME}}",
+ "tagline": "Из {{SITENAME}}",
"help": "Помоћ",
- "search": "Ð\9fÑ\80еÑ\82Ñ\80ага",
+ "search": "Ð\9fÑ\80еÑ\82Ñ\80ажи",
"searchbutton": "Претражи",
"go": "Иди",
"searcharticle": "Иди",
"talk": "Разговор",
"views": "Прегледи",
"toolbox": "Алатке",
- "tool-link-userrights": "УÑ\80еди {{GENDER:$1|корисничке}} групе",
- "tool-link-userrights-readonly": "{{GENDER:$1|Корисничке}} групе",
- "tool-link-emailuser": "Пошаљи {{GENDER:$1|имејл}}",
+ "tool-link-userrights": "Ð\9fÑ\80омени {{GENDER:$1|корисничке}} групе",
+ "tool-link-userrights-readonly": "Погледај {{GENDER:$1|корисничке}} групе",
+ "tool-link-emailuser": "Пошаљи имејл {{GENDER:$1|кориснику|корисници}}",
"imagepage": "Погледај страницу датотеке",
"mediawikipage": "Погледај страницу поруке",
"templatepage": "Погледај страницу шаблона",
"viewhelppage": "Погледај страницу помоћи",
- "categorypage": "Ð\9fогледаÑ\98 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 каÑ\82егоÑ\80иÑ\98а",
+ "categorypage": "Ð\9fогледаÑ\98 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 каÑ\82егоÑ\80иÑ\98е",
"viewtalkpage": "Погледај разговор",
"otherlanguages": "На другим језицима",
"redirectedfrom": "(преусмерено са $1)",
"pool-timeout": "Истек времена чека на закључавање",
"pool-queuefull": "Ред је пун захтева",
"pool-errorunknown": "Непозната грешка",
- "pool-servererror": "Услуга бројача пула није доступна ($1).",
+ "pool-servererror": "Услуга бројача редова није доступна ($1).",
"poolcounter-usage-error": "Грешка при употреби: $1",
"aboutsite": "О пројекту {{SITENAME}}",
"aboutpage": "Project:О нама",
"title-invalid-utf8": "Тражени назив странице садржи неважећи UTF-8 знак.",
"title-invalid-interwiki": "Тражени наслов странице садржи унутрашњу вики везу која не може бити кориштена у насловима.",
"title-invalid-talk-namespace": "Тражени наслов странице се односи на страницу за разговор која не може постојати.",
- "title-invalid-characters": "ТÑ\80ажени наÑ\81лов има неважеÑ\9bе каÑ\80акÑ\82еÑ\80е: „$1“.",
+ "title-invalid-characters": "ТÑ\80ажени наÑ\81лов има неважеÑ\9bе знакове: „$1“.",
"title-invalid-relative": "Наслов има релативну путању. Релативни наслови страница (./, ../) нису важећи јер ће често бити недоступни у корисничком прегледачу.",
"title-invalid-magic-tilde": "Тражени наслов странице садржи неважећи след магичног знака тилда (<nowiki>~~~</nowiki>).",
"title-invalid-too-long": "Тражени назив странице је предугачак. Не сме бити дужи од $1 {{PLURAL:$1|бајта|бајтова}} у UTF-8 кодирању.",
"actionthrottledtext": "У циљу борбе против непожељних порука, ограничене су вам измене у одређеном времену, а управо сте прешли то ограничење. Покушајте поново за неколико минута.",
"protectedpagetext": "Ова страница је закључана за измене и друге радње.",
"viewsourcetext": "Можете читати и копирати изворник ове странице.",
- "viewyourtext": "Можете да погледате и копирате изворни текст <strong>ваших измена</strong> на овој страници.",
+ "viewyourtext": "Можете да погледате и копирате изворник <strong>ваших измена</strong> на овој страници.",
"protectedinterface": "Ова страница садржи текст интерфејса за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или изменили преводе било којег викија, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију Медијавикија.",
"editinginterface": "<strong>Упозорење:</strong> уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.",
"translateinterface": "Да додате или промените преводе за све викије, посетите [https://translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
"cascadeprotected": "Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:\n$2",
- "namespaceprotected": "Немате дозволу да уређујете странице у именском простору <strong>$1</strong>.",
+ "namespaceprotected": "Немате дозволу да уређујете странице у именском простору: <strong>$1</strong>.",
"customcssprotected": "Немате дозволу да мењате ову CSS страницу јер садржи лична подешавања другог корисника.",
- "customjsprotected": "Немате дозволу да мењате ову страницу јаваскрипта јер садржи личне поставке другог корисника.",
+ "customjsprotected": "Немате дозволу да мењате ову страницу JavaScript јер садржи лична подешавања другог корисника.",
"mycustomcssprotected": "Немате дозволу за мењање ове CSS странице.",
"mycustomjsprotected": "Немате дозволу за мењање ове JavaScript странице.",
"myprivateinfoprotected": "Немате дозволу за мењање ваших личних информација.",
"exception-nologin": "Нисте пријављени",
"exception-nologin-text": "Пријавите се да бисте приступили овој страници или радњи.",
"exception-nologin-text-manual": "Морате бити $1 да бисте приступили овој страници или радњи.",
- "virus-badscanner": "Неисправна поставка: непознати скенер за вирусе: ''$1''",
+ "virus-badscanner": "Неисправна поставка: непознати скенер за вирусе: <em>$1</em>",
"virus-scanfailed": "неуспешно скенирање (код $1)",
"virus-unknownscanner": "непознати антивирус:",
- "logouttext": "<strong>Одјављени сте.</strong>\n\nИмајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију свог прегледача.",
+ "logouttext": "<strong>Одјављени сте.</strong>\n\nИмајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију Вашег прегледача.",
"cannotlogoutnow-title": "Одјава тренутно није могућа",
"cannotlogoutnow-text": "Одјава није могућа током употребе $1.",
"welcomeuser": "Добро дошли, $1!",
"userlogin-yourpassword": "Лозинка",
"userlogin-yourpassword-ph": "Унесите вашу лозинку",
"createacct-yourpassword-ph": "Унесите лозинку",
- "yourpasswordagain": "Потврда лозинке:",
- "createacct-yourpasswordagain": "Потврдите лозинку",
- "createacct-yourpasswordagain-ph": "Унесите лозинку још једном",
+ "yourpasswordagain": "Поново унеси лозинку:",
+ "createacct-yourpasswordagain": "Потврди лозинку",
+ "createacct-yourpasswordagain-ph": "Унесите лозинку поново",
"userlogin-remembermypassword": "Остави ме пријављеног/у",
"userlogin-signwithsecure": "Користите сигурну конекцију",
"cannotlogin-title": "Пријава није могућа",
"userlogin-reauth": "Морате се поново пријавити да би верификовали да сте {{GENDER:$1|$1}}.",
"userlogin-createanother": "Отвори још један налог",
"createacct-emailrequired": "Имејл адреса",
- "createacct-emailoptional": "Ð\98меÑ\98л адÑ\80еÑ\81а (опÑ\86ионо)",
+ "createacct-emailoptional": "Ð\98меÑ\98л адÑ\80еÑ\81а (необавезно)",
"createacct-email-ph": "Унесите Вашу имејл адресу",
"createacct-another-email-ph": "Унесите имејл адресу",
"createaccountmail": "Користите привремену, случајно створену лозинку и пошаљите на наведену имејл адресу",
- "createacct-realname": "Ð\9fÑ\80аво име (опÑ\86ионо)",
+ "createacct-realname": "Ð\9fÑ\80аво име (необавезно)",
"createacct-reason": "Разлог",
"createacct-reason-ph": "Зашто правите још један налог?",
"createacct-submit": "Отвори налог",
"createacct-benefit-body2": "{{PLURAL:$1|страница|странице|страница}}",
"createacct-benefit-body3": "недавно {{PLURAL:$1|активни корисник|активна корисника|активних корисника}}",
"badretype": "Унете лозинке се не поклапају.",
- "usernameinprogress": "Налог за ово корисничко име се већ прави, молимо сачекајте.",
+ "usernameinprogress": "Налог за ово корисничко име се већ прави, сачекајте.",
"userexists": "Корисничко име је заузето. Изаберите друго.",
"loginerror": "Грешка при пријављивању",
"createacct-error": "Дошло је до грешке при отварању налога",
"nocookiesforlogin": "{{int:nocookieslogin}}",
"noname": "Унели сте неисправно корисничко име.",
"loginsuccesstitle": "Успешно пријављивање",
- "loginsuccess": "'''Пријављени сте као „$1“.'''",
+ "loginsuccess": "<strong>Пријављени сте на {{SITENAME}} као „$1”.</strong>",
"nosuchuser": "Не постоји корисник с именом „$1“.\nКорисничка имена су осетљива на мала и велика слова.\nПроверите да ли сте га добро унели или [[Special:CreateAccount|отворите нови налог]].",
"nosuchusershort": "Корисник с именом „$1“ не постоји.\nПроверите да ли сте правилно написали.",
"nouserspecified": "Морате навести корисничко име.",
"login-userblocked": "{{GENDER:$1|Овај корисник је блокиран|Ова корисница је блокирана|Овај корисник је блокиран}}. Пријава није дозвољена.",
- "wrongpassword": "Унели сте неисправну лозинку. Покушајте поново.",
+ "wrongpassword": "Унели сте неисправно корисничко име или лозинку. Покушајте поново.",
"wrongpasswordempty": "Нисте унели лозинку. Покушајте поново.",
"passwordtooshort": "Лозинка мора имати најмање {{PLURAL:$1|један знак|$1 знака|$1 знакова}}.",
"passwordtoolong": "Лозинке не могу бити дуже од {{PLURAL:$1|$1 знака|$1 знакова}}.",
+ "passwordtoopopular": "Често коришћене шифре не могу бити коришћене. Молимо изаберите сложенију лозинку.",
"password-name-match": "Лозинка се мора разликовати од корисничког имена.",
"password-login-forbidden": "Коришћење овог корисничког имена и лозинке је забрањено.",
"mailmypassword": "Ресетуј лозинку",
"passwordremindertitle": "{{SITENAME}} — привремена лозинка",
- "passwordremindertext": "Неко, вероватно ви, са ИП адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСтворена је привремена лозинка за {{GENDER:$2|корисника|корисницу|корисника}} $2 која гласи $3.\nУколико је ово ваш захтев, сада се пријавите и поставите нову лозинку.\nПривремена лозинка истиче за {{PLURAL:$5|један дан|$5 дана|$5 дана}}.\n\nАко је неко други затражио промену лозинке, или сте се сетили ваше лозинке и не желите да је мењате, занемарите ову поруку.",
+ "passwordremindertext": "Неко, вероватно ви, са IP адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСтворена је привремена лозинка за {{GENDER:$2|корисника|корисницу|корисника}} $2 која гласи $3.\nУколико је ово ваш захтев, сада се пријавите и поставите нову лозинку.\nПривремена лозинка истиче за {{PLURAL:$5|један дан|$5 дана}}.\n\nАко је неко други затражио промену лозинке, или сте се сетили ваше лозинке и не желите да је мењате, занемарите ову поруку.",
"noemail": "Не постоји имејл адреса за {{GENDER:$1|корисника|корисницу}} $1.",
"noemailcreate": "Морате навести исправну имејл адресу.",
"passwordsent": "Нова лозинка је послата на имејл адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
"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Имејл неће бити послат ни у једном од следећих случајева.",
+ "emailnotauthenticated": "Ваша имејл адреса још увек није потврђена.\nИмејл неће бити послат ни у једном од следећих случајева.",
"noemailprefs": "Унесите имејл адресу како би ове могућности радиле.",
"emailconfirmlink": "Потврдите своју имејл адресу",
"invalidemailaddress": "Имејл адреса не може бити прихваћена јер је неисправног облика.\nУнесите исправну адресу или оставите празно поље.",
"botpasswords-label-delete": "Обриши",
"botpasswords-label-resetpassword": "Ресетуј лозинку",
"botpasswords-label-grants-column": "Одобрено",
- "botpasswords-bad-appid": "â\80\9e$1â\80\9d ниÑ\98е валидан назив бота.",
+ "botpasswords-bad-appid": "â\80\9e$1â\80\9d ниÑ\98е иÑ\81пÑ\80аван назив бота.",
"botpasswords-insert-failed": "Неуспешно додавање бота \"$1\". Да ли је већ додат?",
"botpasswords-update-failed": "Није могуће ажурирати бота \"$1\". Да ли је обрисан?",
"botpasswords-created-title": "Направљена лозинка бота",
- "botpasswords-created-body": "Лозинка за бота \"$1\" корисника \"$2\" је направљена.",
+ "botpasswords-created-body": "Лозинка за бота „$1” корисника „$2” је направљена.",
"botpasswords-updated-title": "Лозинка бота промењена",
- "botpasswords-updated-body": "Лозинка за бота \"$1\" корисника \"$2\" је ажурирана.",
+ "botpasswords-updated-body": "Лозинка за бота „$1” корисника „$2” је ажурирана.",
"botpasswords-deleted-title": "Обрисана лозинка бота",
- "botpasswords-deleted-body": "Лозинка за бота \"$1\" корисника \"$2\" је обрисана.",
+ "botpasswords-deleted-body": "Лозинка за бота „$1” корисника „$2” је обрисана.",
"botpasswords-no-provider": "BotPasswordsSessionProvider није доступан.",
"resetpass_forbidden": "Лозинка не може бити промењена",
"resetpass_forbidden-reason": "Лозинке није могуће променити: $1",
"resetpass-abort-generic": "Промену лозинке је спречио додатак.",
"resetpass-expired": "Ваша лозинка је истекла. Поставите нову лозинку да бисте се пријавили.",
"resetpass-expired-soft": "Ваша лозинка је истекла и морате поставити нову. Поставите нову лозинку или кликните „{{int:authprovider-resetpass-skip-label}}“ да је поставите касније.",
- "resetpass-validity-soft": "Ð\92аÑ\88а лозинка ниÑ\98е ваÑ\99ана: $1\n\nМолимо изаберите нову или кликните „{{int:authprovider-resetpass-skip-label}}“ да ресетујете касније.",
+ "resetpass-validity-soft": "Ð\92аÑ\88а лозинка ниÑ\98е иÑ\81пÑ\80авна: $1\n\nМолимо изаберите нову или кликните „{{int:authprovider-resetpass-skip-label}}“ да ресетујете касније.",
"passwordreset": "Обнављање лозинке",
"passwordreset-text-one": "Попуните овај образац да бисте добили привремену лозинку на имејл.",
"passwordreset-text-many": "{{PLURAL:$1|Испуните једно од поља како бисте добили привремену лозинку на имејл.}}",
"passwordreset-domain": "Домен:",
"passwordreset-email": "Имејл адреса:",
"passwordreset-emailtitle": "Детаљи налога на викију {{SITENAME}}",
- "passwordreset-emailtext-ip": "Неко (вероватно Ви, са ИП адресе $1) је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
+ "passwordreset-emailtext-ip": "Неко (вероватно Ви, са IP адресе $1) је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
"passwordreset-emailtext-user": "{{GENDER:$1|Корисник је затражио|Корисница је затражила}} подсетник о подацима за пријаву на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.",
"passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
"passwordreset-emailsentemail": "Ако је ово имејл адреса повезана са Вашим налогом, подсетник о лозинци ће бити послат на имејл.",
"resettokens-no-tokens": "Нема жетона за ресетовање.",
"resettokens-tokens": "Жетони:",
"resettokens-token-label": "$1 (тренутна вредност: $2)",
- "resettokens-watchlist-token": "Жетон за веб довод (Atom/RSS) вашег [[Special:Watchlist|списка надгледања]]",
+ "resettokens-watchlist-token": "Жетон за веб довод (Atom/RSS) [[Special:Watchlist|измена на страницама у вашем списку надгледања]]",
"resettokens-done": "Жетони су ресетовани",
"resettokens-resetbutton": "Ресетуј изабране жетоне",
"bold_sample": "Подебљан текст",
"bold_tip": "Подебљан текст",
- "italic_sample": "Искошени текст",
- "italic_tip": "Искошени текст",
+ "italic_sample": "Искошен текст",
+ "italic_tip": "Искошен текст",
"link_sample": "Наслов везе",
"link_tip": "Унутрашња веза",
- "extlink_sample": "http://www.example.com/ наслов везе",
+ "extlink_sample": "http://www.пример.com наслов везе",
"extlink_tip": "Спољашња веза (с префиксом http://)",
"headline_sample": "Текст наслова",
"headline_tip": "Поднаслов (ниво 2)",
"nowiki_sample": "Убаците необликован текст овде",
"nowiki_tip": "Занемари вики обликовање",
"image_sample": "Пример.jpg",
- "image_tip": "УгÑ\80аÑ\92ивање датотеке",
+ "image_tip": "УбаÑ\86ивање датотеке",
"media_sample": "Пример.ogg",
"media_tip": "Веза",
"sig_tip": "Ваш потпис са тренутним временом",
- "hr_tip": "Ð\92одоÑ\80авна линиÑ\98а (коÑ\80иÑ\81Ñ\82иÑ\82и ретко)",
+ "hr_tip": "Ð\92одоÑ\80авна линиÑ\98а (коÑ\80иÑ\81Ñ\82иÑ\82е ретко)",
"summary": "Опис измене:",
"subject": "Тема:",
"minoredit": "Ово је мања измена",
"preview": "Претпреглед",
"showpreview": "Прикажи претпреглед",
"showdiff": "Прикажи измене",
- "blankarticle": "<strong>Упозорење:</strong> Страница коју правите је празна.\nАко још једном притиснете „$1”, страница ће бити направљена без икаквог садржаја.",
- "anoneditwarning": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð\9dисте пријављени. Ако објавите страницу, Ваша IP адреса ће бити јавно видљива у њеној историји измена и другде. Ако се <strong>[$1 пријавите]</strong> или <strong>[$2 отворите налог]</strong>, поред осталих погодности које добијате Ваше измене ће бити приписиване Вашем корисничком имену.",
+ "blankarticle": "<strong>Упозорење:</strong> страница коју правите је празна.\nАко још једном притиснете „$1”, страница ће бити направљена без икаквог садржаја.",
+ "anoneditwarning": "<strong>УпозоÑ\80еÑ\9aе:</strong> нисте пријављени. Ако објавите страницу, Ваша IP адреса ће бити јавно видљива у њеној историји измена и другде. Ако се <strong>[$1 пријавите]</strong> или <strong>[$2 отворите налог]</strong>, поред осталих погодности које добијате Ваше измене ће бити приписиване Вашем корисничком имену.",
"anonpreviewwarning": "<em>Нисте пријављени. Ако објавите страницу, Ваша IP адреса ће бити јавно видљива у њеној историји измена и другде.</em>",
- "missingsummary": "'''Подсетник:''' Нисте унели опис измене.\nАко поново кликнете на „$1”, Ваша измена ће бити сачувана без описа.",
- "selfredirect": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð\9fреусмеравате ову страницу на њу саму.\nМожда вам је одредишна страница за преусмерење погрешна или уређујете погрешну страницу.\nАко још једном притиснете „$1”, преусмерење ће свеједно бити направљено.",
+ "missingsummary": "<strong>Подсетник:</strong> нисте унели опис измене.\nАко поново кликнете на „$1”, Ваша измена ће бити сачувана без описа.",
+ "selfredirect": "<strong>УпозоÑ\80еÑ\9aе:</strong> преусмеравате ову страницу на њу саму.\nМожда вам је одредишна страница за преусмерење погрешна или уређујете погрешну страницу.\nАко још једном притиснете „$1”, преусмерење ће свеједно бити направљено.",
"missingcommenttext": "Молимо унесите коментар.",
- "missingcommentheader": "<strong>Ð\9dапомена:</strong> Ð\9dисте унели наслов теме овог коментара.\nАко поново кликнете на „$1”, измена ће бити сачувана без наслова.",
+ "missingcommentheader": "<strong>Ð\9dапомена:</strong> нисте унели наслов теме овог коментара.\nАко поново кликнете на „$1”, измена ће бити сачувана без наслова.",
"summary-preview": "Преглед описа измене:",
"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|подешавања]].",
"accmailtext": "Лозинка за {{GENDER:$1|корисника|корисницу}} [[User talk:$1|$1]] је послата на $2. Након пријаве, лозинка се може променити [[Special:ChangePassword|овде]].",
"newarticle": "(нови)",
"newarticletext": "Дошли сте на страницу која још не постоји.\nДа бисте је направили, почните да куцате у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
- "anontalkpagetext": "----\n<em>Ово је страница за разговор с анонимним корисником који још нема налог или га не користи.</em>\nЗбог тога морамо да користимо бројчану ИП адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:CreateAccount|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.",
+ "anontalkpagetext": "----\n<em>Ово је страница за разговор с анонимним корисником који још нема налог или га не користи.</em>\nЗбог тога морамо да користимо бројчану IP адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:CreateAccount|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.",
"noarticletext": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} направити ову страницу]</span>.",
"noarticletext-nopermission": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама или <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне дневнике]</span>, али немате дозволу да направите ову страницу.",
"missing-revision": "Не могу да пронађем измену бр. $1 на страници под називом „{{FULLPAGENAME}}“.\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
"sitecsspreview": "'''Ово је само преглед CSS-а.'''\n'''Страница још није сачувана!'''",
"sitejspreview": "'''Ово је само преглед јаваскрипта.'''\n'''Страница још није сачувана!'''",
"userinvalidcssjstitle": "<strong>Упозорење:</strong> не постоји тема „$1“.\nПрилагођене странице CSS и јаваскрипт почињу малим словом, нпр. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
- "updated": "(Ð\90журирано)",
+ "updated": "(ажурирано)",
"note": "<strong>Напомена:</strong>",
"previewnote": "<strong>Не заборавите да је ово само претпреглед.</strong>\nВаше измене још нису сачуване!",
"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",
"content-model-text": "чист текст",
"content-model-javascript": "јаваскрипт",
"content-model-css": "CSS",
+ "content-model-json": "JSON",
"content-json-empty-object": "Празан објекат",
"content-json-empty-array": "Празан низ",
- "deprecated-self-close-category": "СÑ\82Ñ\80аниÑ\86е коÑ\98е коÑ\80иÑ\81Ñ\82е невалидне самозатварајуће HTML тагове",
+ "deprecated-self-close-category": "СÑ\82Ñ\80аниÑ\86е коÑ\98е коÑ\80иÑ\81Ñ\82е неиÑ\81пÑ\80авне самозатварајуће HTML тагове",
"duplicate-args-warning": "<strong>Упозорење:</strong> [[:$1]] позива [[:$2]] са више од једне вредности за параметар „$3“. Само последња наведена вредност ће бити коришћена.",
"duplicate-args-category": "Странице с дуплираним аргументима код позива шаблона",
"duplicate-args-category-desc": "Страница садржи позиве шаблона који користе двоструке аргументе, као што су <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"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": "најстарије",
"mergehistory-done": "$3 {{PLURAL:$3|измена странице $1 је спојена|измене странице $1 су спојене|измена странице $1 је спојено}} у [[:$2]].",
"mergehistory-fail": "Не могу да спојим историје. Проверите страницу и временске параметре.",
"mergehistory-fail-bad-timestamp": "Временска ознака није исправна.",
- "mergehistory-fail-invalid-source": "Ð\98звоÑ\80на Ñ\81Ñ\82Ñ\80аниÑ\86а ниÑ\98е валидна.",
- "mergehistory-fail-invalid-dest": "Ð\9eдÑ\80едиÑ\88на Ñ\81Ñ\82Ñ\80аниÑ\86а ниÑ\98е валидна.",
+ "mergehistory-fail-invalid-source": "Ð\98звоÑ\80на Ñ\81Ñ\82Ñ\80аниÑ\86а ниÑ\98е иÑ\81пÑ\80авна.",
+ "mergehistory-fail-invalid-dest": "Ð\9eдÑ\80едиÑ\88на Ñ\81Ñ\82Ñ\80аниÑ\86а ниÑ\98е иÑ\81пÑ\80авна.",
"mergehistory-fail-permission": "Немате овлашћење за спајање историје.",
"mergehistory-fail-self-merge": "Изворна и одредишна страница не могу бити исте.",
"mergehistory-fail-toobig": "Није могуће спојити историје јер више од $1 {{PLURAL:$1|измене ће бити премештене|измена ће бити премештено}}.",
"prefs-resetpass": "Промени лозинку",
"prefs-changeemail": "Промени или уклони имејл адресу",
"prefs-setemail": "Постави имејл адресу",
- "prefs-email": "Поставке имејла",
+ "prefs-email": "Подешавања имејла",
"prefs-rendering": "Изглед",
"saveprefs": "Сачувај",
"restoreprefs": "Врати све на подразумевано (у свим одељцима)",
"prefs-advancedediting": "Главна подешавања",
"prefs-editor": "Уређивач",
"prefs-preview": "Претпреглед",
- "prefs-advancedrc": "Ð\9dапÑ\80едне поÑ\81Ñ\82авке",
+ "prefs-advancedrc": "Ð\9dапÑ\80една подеÑ\88аваÑ\9aа",
"prefs-opt-out": "Онемогућавање побољшања",
- "prefs-advancedrendering": "Ð\9dапÑ\80едне поÑ\81Ñ\82авке",
- "prefs-advancedsearchoptions": "Ð\9dапÑ\80едне поÑ\81Ñ\82авке",
- "prefs-advancedwatchlist": "Ð\9dапÑ\80едне поÑ\81Ñ\82авке",
- "prefs-displayrc": "Поставке приказа",
- "prefs-displaywatchlist": "Поставке приказа",
+ "prefs-advancedrendering": "Ð\9dапÑ\80една подеÑ\88аваÑ\9aа",
+ "prefs-advancedsearchoptions": "Ð\9dапÑ\80една подеÑ\88аваÑ\9aа",
+ "prefs-advancedwatchlist": "Ð\9dапÑ\80една подеÑ\88аваÑ\9aа",
+ "prefs-displayrc": "Подешавања приказа",
+ "prefs-displaywatchlist": "Подешавања приказа",
"prefs-tokenwatchlist": "Жетон",
"prefs-diffs": "Разлике",
"prefs-help-prefershttps": "Ова подешавања ће ступити на снагу при следећој пријави.",
"right-editmyuserjs": "уређивање сопствених JavaScript датотека",
"right-viewmywatchlist": "види сопствени списак надгледања",
"right-editmywatchlist": "уређивање сопственог списка надгледања; неке предузете радње ће свеједно додати странице на списак и без овог права",
- "right-viewmyprivateinfo": "Ð\92идите своје личне податке (нпр. имејл адресу, право име)",
- "right-editmyprivateinfo": "Уређивање сопствених личних података (нпр. имејл адреса, право име)",
+ "right-viewmyprivateinfo": "видите своје личне податке (нпр. имејл адресу, право име)",
+ "right-editmyprivateinfo": "уређивање сопствених личних података (нпр. имејл адреса, право име)",
"right-editmyoptions": "уређивање сопствених подешавања",
"right-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу",
"right-markbotedits": "означавање враћених измена као измене бота",
"action-deletechangetags": "Обриши ознаке из базе података",
"action-purge": "чишћење привремене меморије ове странице",
"nchanges": "$1 {{PLURAL:$1|измена|измене|измена}}",
+ "ntimes": "$1×",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|измена од ваше последње посете}}",
"enhancedrc-history": "историја",
"recentchanges": "Скорашње измене",
"rcfilters-activefilters": "Активни филтери",
"rcfilters-advancedfilters": "Напредни филтери",
"rcfilters-limit-title": "Приказати измена",
- "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|измена|измена}}, $2",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|измена|измене}}, $2",
"rcfilters-date-popup-title": "Временски оквир",
"rcfilters-days-title": "Претходних неколико дана",
"rcfilters-hours-title": "Претходних неколико сати",
"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": "Погледајте најновије измене",
"rcfilters-search-placeholder": "Филтрирај скорашње измене (употребите мени или потражите име филтра)",
- "rcfilters-invalid-filter": "Ð\9dевалидан филтер",
+ "rcfilters-invalid-filter": "Ð\9dеиÑ\81пÑ\80аван филтер",
"rcfilters-empty-filter": "Нема активних филтера. Сви доприноси су приказани.",
"rcfilters-filterlist-title": "Филтери",
"rcfilters-filterlist-whatsthis": "Како ово функционише?",
"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": "Овај филтер типа измене је у сукобу са филтером за „мање” измене. Одређени типови измена не могу да се означе као „мање”.",
"uploaded-script-svg": "Пронађен скриптни елеменат „$1“ у постављеној SVG датотеци.",
"uploaded-hostile-svg": "Пронађен небезбедан CSS у стилском елементу постављене SVG датотеке.",
"uploaded-event-handler-on-svg": "Није дозвољено постављање атрибута који контролишу догађаје <code>$1=\"$2\"</code> у SVG датотекама.",
- "uploaded-href-unsafe-target-svg": "Ð\9fÑ\80онаÑ\92ен href Ñ\81а неÑ\81игÑ\83Ñ\80ном меÑ\82ом <code><$1 $2=\"$3\"></code> у постављеној SVG датотеци.",
+ "uploaded-href-unsafe-target-svg": "Ð\9fÑ\80онаÑ\92ен href Ñ\81а неÑ\81игÑ\83Ñ\80ним подаÑ\86има: URI одÑ\80едиÑ\88Ñ\82е <code><$1 $2=\"$3\"></code> у постављеној SVG датотеци.",
"uploaded-animate-svg": "Пронађена „animate“ ознака која можда мења href користећи се „from“ атрибутом <code><$1 $2=\"$3\"></code> у постављеној SVG датотеци.",
"uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „<nowiki>$1</nowiki>“",
"uploadvirus": "Датотека садржи вирус!\nДетаљи: $1",
"destfilename": "Назив:",
"upload-maxfilesize": "Максимална величина датотеке: $1",
"upload-description": "Опис датотеке",
- "upload-options": "Поставке отпремања",
+ "upload-options": "Подешавања отпремања",
"watchthisupload": "Надгледај ову датотеку",
"filewasdeleted": "Датотека с овим називом је раније послата, али је обрисана.\nПроверите $1 пре него што наставите с поновним слањем.",
"filename-bad-prefix": "Назив датотеке коју шаљете почиње са <strong>„$1“</strong>, а њега обично додељују дигитални фотоапарати.\nИзаберите назив датотеке који описује њен садржај.",
"upload-form-label-infoform-title": "Детаљи",
"upload-form-label-infoform-name": "Назив",
"upload-form-label-infoform-description": "Опис",
+ "upload-form-label-usage-title": "Употребе",
"upload-form-label-usage-filename": "Назив датотеке",
"upload-form-label-own-work": "Ово је моје сопствено дело",
"upload-form-label-infoform-categories": "Категорије",
"uploadstash-badtoken": "Извршавање дате радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.",
"uploadstash-errclear": "Чишћење датотека није успело.",
"uploadstash-refresh": "Освежи списак датотека",
+ "uploadstash-bad-path": "Путања не постоји.",
+ "uploadstash-bad-path-invalid": "Путања није исправна.",
+ "uploadstash-bad-path-unknown-type": "Непознат тип „$1“.",
"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?uselang=sr-ec.",
"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": "Линкови за помоћ",
"apisandbox-dynamic-error-exists": "Параметар под називом \"$1\" већ постоји.",
"apisandbox-deprecated-parameters": "Застарели параметри",
"apisandbox-fetch-token": "Аутоматски попуни токен",
- "apisandbox-submit-invalid-fields-title": "Ð\9dека поÑ\99а ниÑ\81Ñ\83 валидна",
+ "apisandbox-submit-invalid-fields-title": "Ð\9dека поÑ\99а ниÑ\81Ñ\83 иÑ\81пÑ\80авна",
"apisandbox-submit-invalid-fields-message": "Молимо Вас поправите означена поља и покушајте поново.",
"apisandbox-results": "Резултати",
"apisandbox-sending-request": "Слање API захтева...",
"enotif_lastvisited": "За све измене од ваше последње посете, погледајте $1.",
"enotif_lastdiff": "Да видите ову измену, погледајте $1.",
"enotif_anon_editor": "анониман корисник $1",
- "enotif_body": "Поштовани $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nОпис: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nмејл: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\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_body": "Поштовани $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nОпис: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nмејл: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\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": "измењена",
"changecontentmodel-cannot-convert": "Модел садржаја странице [[:$1]] се не може претворити у врсту $2.",
"changecontentmodel-nodirectediting": "Модел садржаја $1 не подржава изравно уређивање",
"log-name-contentmodel": "Дневник промене модела садржаја",
- "log-description-contentmodel": "Ð\94огаÑ\92аÑ\98и коÑ\98и имаÑ\98Ñ\83 везÑ\83 Ñ\81а моделима Ñ\81адÑ\80жаÑ\98а Ñ\81Ñ\82Ñ\80аниÑ\86а",
+ "log-description-contentmodel": "Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а пÑ\80иказÑ\83Ñ\98е измене Ñ\83 моделима Ñ\81адÑ\80жаÑ\98а Ñ\81Ñ\82Ñ\80аниÑ\86а и Ñ\81Ñ\82Ñ\80аниÑ\86е коÑ\98е Ñ\81Ñ\83 напÑ\80авÑ\99ене Ñ\81а моделом Ñ\81адÑ\80жаÑ\98а коÑ\98и Ñ\81е Ñ\80азликÑ\83Ñ\98е од подÑ\80азÑ\83меваног.",
"logentry-contentmodel-change": "$1 је {{GENDER:$2|променио|променила}} модел садржаја странице $3 из „$4“ у „$5“",
"logentry-contentmodel-change-revertlink": "врати",
"logentry-contentmodel-change-revert": "врати",
"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.",
- "ipaddressorusername": "ИП адреса или корисничко име:",
+ "blockiptext": "Користите доњи образац да бисте забранили приступ за писање с одређене IP адресе или корисничког имена.\nОво би требало да вршите само ради спречавања вандализма, у складу са [[{{MediaWiki:Policy-url}}|смерницама]].\nИзаберите конкретан разлог испод (пример: навођење конкретних страница које су вандализоване). Можете блокирати опсеге IP адреса помоћу [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] синтаксе, највећи дозвољени опсег за IPv4 је /$1 односно /$2 за IPv6.",
+ "ipaddressorusername": "IP адреса или корисничко име:",
"ipbexpiry": "Истиче:",
"ipbreason": "Разлог:",
"ipbreason-dropdown": "*Најчешћи разлози за блокирање\n** Уношење лажних информација\n** Уклањање садржаја са страница\n** Постављање веза до спољашњих сајтова\n** Уношење бесмислица у странице\n** Непристојно понашање\n** Употреба више налога\n** Неприхватљиво корисничко име",
"ipb-disableusertalk": "Онемогући кориснику да уређује своју страницу за разговор",
"ipb-change-block": "Поново блокирај корисника с овим поставкама",
"ipb-confirm": "Потврди блокирање",
- "badipaddress": "Неисправна ИП адреса",
+ "badipaddress": "Неисправна IP адреса",
"blockipsuccesssub": "Блокирање је успело",
"blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана|блокиран}}.<br />\nБлокирања можете да погледате [[Special:BlockList|овде]].",
"ipb-blockingself": "Овом радњом ћете блокирати себе! Јесте ли сигурни да то желите?",
"emailblock": "имејл је онемогућен",
"blocklist-nousertalk": "забрањено уређивање сопствене странице за разговор",
"ipblocklist-empty": "Списак блокирања је празан.",
- "ipblocklist-no-results": "Тражена ИП адреса или корисничко име није блокирано.",
+ "ipblocklist-no-results": "Тражена IP адреса или корисничко име није блокирано.",
"blocklink": "блокирај",
"unblocklink": "деблокирај",
"change-blocklink": "промени блокаду",
"ipb-otherblocks-header": "{{PLURAL:$1|Друге блокаде}}",
"unblock-hideuser": "Не можете деблокирати овог корисника јер је његово корисничко име сакривено.",
"ipb_cant_unblock": "Грешка: блокада $1 не постоји. Можда је корисник деблокиран.",
- "ipb_blocked_as_range": "Грешка: ИП адреса $1 није директно блокирана и не може да се деблокира.\nОна је блокирана као део блокаде $2, која може бити деблокирана.",
- "ip_range_invalid": "Неисправан распон ИП адреса.",
+ "ipb_blocked_as_range": "Грешка: IP адреса $1 није директно блокирана и не може да се деблокира.\nОна је блокирана као део блокаде $2, која може бити деблокирана.",
+ "ip_range_invalid": "Неисправан распон IP адреса.",
"ip_range_toolarge": "Опсежна блокирања већа од /$1 нису дозвољена.",
"proxyblocker": "Блокер посредника",
"proxyblockreason": "Ваша ИП адреса је блокирана јер представља отворени посредник.\nОбратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.",
"delete_and_move_text": "Одредишна страница „[[:$1]]“ већ постоји. \nЖелите ли да је обришете да бисте ослободили место за премештање?",
"delete_and_move_confirm": "Да, обриши страницу",
"delete_and_move_reason": "Обрисано да се ослободи место за премештање из „[[$1]]“",
- "selfmove": "Ð\98звоÑ\80ни и одÑ\80едиÑ\88ни наÑ\81лови Ñ\81Ñ\83 иÑ\81Ñ\82овеÑ\82ни;\nне могÑ\83 да пÑ\80емеÑ\81Ñ\82им страницу преко саме себе.",
+ "selfmove": "Ð\9dаÑ\81лов Ñ\98е иÑ\81Ñ\82овеÑ\82ан;\nне можеÑ\82е пÑ\80емеÑ\81Ñ\82иÑ\82и страницу преко саме себе.",
"immobile-source-namespace": "Не могу преместити странице у именски простор „$1“.",
"immobile-target-namespace": "Не могу преместити странице у именски простор „$1“.",
"immobile-target-namespace-iw": "Међувики веза није исправно одредиште за премештање странице.",
"import-nonewrevisions": "Измене нису увезене (све су већ биле или присутне или прескочене због грешки).",
"xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5",
"import-upload": "Отпремање XML података",
- "import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени.\n<strong>Молимо Вас проверите да ли сте још увек пријављени и покушајте поново<strong>.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли Ваш веб-пртраживач дозвољава колачиће са овог сајта.",
+ "import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени. '''Молимо Вас проверите да ли сте још увек пријављени и покушајте поново'''.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли Ваш веб-пртраживач дозвољава колачиће са овог сајта.",
"import-invalid-interwiki": "Не могу да увозим с наведеног викија.",
"import-error-edit": "Страница „$1“ није увезена јер вам није дозвољено да је уређујете.",
"import-error-create": "Страница „$1“ није увезена јер вам није дозвољено да је направите.",
"version-poweredby-others": "остали",
"version-poweredby-translators": "translatewiki.net преводиоци",
"version-credits-summary": "Желели бисмо да захвалимо следећим људима на њиховом доприносу [[Special:Version|Медијавикији]].",
- "version-license-info": "Медијавики је слободан софтвер можете га редистрибуирати и/или модификовати под условима ГНУ-ове опште јавне лиценце верзија 2 или сваке следеће коју објави Задужбина за слободан софтвер.\n\nМедијавики се редистрибуира у нади да ће бити од користи, али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ чак и без ПОДРАЗУМЕВАНЕ ГАРАНЦИЈЕ ФУНКЦИОНАЛНОСТИ или ПРИКЛАДНОСТИ ЗА ОДРЕЂЕНЕУ НАМЕНУ. Погледајте ГНУ-ову општу јавну лиценцу за више информација.\n\nТребало би да сте добили [{{SERVER}}{{SCRIPTPATH}}/COPYING примерак ГНУ-ове опште јавне лиценце] заједно са овим програмом. Ако нисте, пишите на Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитајте овде].",
+ "version-license-info": "Медијавики је слободан софтвер можете га редистрибуирати и/или модификовати под условима ГНУ-ове опште јавне лиценце верзија 2 или сваке следеће коју објави Задужбина за слободан софтвер.\n\nМедијавики се редистрибуира у нади да ће бити од користи, али <em>БЕЗ ИКАКВЕ ГАРАНЦИЈЕ</em> чак и без <strong>ПОДРАЗУМЕВАНЕ ГАРАНЦИЈЕ ФУНКЦИОНАЛНОСТИ</strong> или <strong>ПРИКЛАДНОСТИ ЗА ОДРЕЂЕНЕУ НАМЕНУ</strong>. Погледајте ГНУ-ову општу јавну лиценцу за више информација.\n\nТребало би да сте добили [{{SERVER}}{{SCRIPTPATH}}/COPYING примерак ГНУ-ове опште јавне лиценце] заједно са овим програмом. Ако нисте, пишите на Free Software Foundation, Inc., 51 Franklin St, 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-libraries-description": "Опис",
"version-libraries-authors": "Аутори",
"redirect": "Преусмерење на датотеку, корисника, страницу, измену или дневник (ID)",
- "redirect-summary": "Ова специјална страница преусмерава до датотеке (са датим именом датотеке), странице (са датим ID-ом измене или ID-ом странице), корисничке странице (са датим нумеричким корисничким ID-ом), или уноса у дневнику (са датим дневничким ID-ом). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
+ "redirect-summary": "Ова посебна страница преусмерава до датотеке (са датим именом датотеке), странице (са датим ID-ом измене или ID-ом странице), корисничке странице (са датим нумеричким корисничким ID-ом), или уноса у дневнику (са датим дневничким ID-ом). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
"redirect-submit": "Иди",
"redirect-lookup": "Тип вредности:",
"redirect-value": "Вредност:",
"tag-mw-contentmodelchange": "промена модела садржаја",
"tag-mw-contentmodelchange-description": "Измене које мењају модел садржаја странице",
"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-rollback-description": "Измене које враћају страницу на претходне измене",
"tag-mw-undo": "Поништена претходна измена",
+ "tag-mw-undo-description": "Измене које поништавају претходне измене",
"tags-title": "Ознаке",
"tags-intro": "На овој страници је наведен списак ознака с којима програм може да означи измене и његово значење.",
"tags-tag": "Назив ознаке",
"compare-invalid-title": "Наведени наслов је неисправан.",
"compare-title-not-exists": "Наведени наслов не постоји.",
"compare-revision-not-exists": "Наведена измена не постоји.",
- "diff-form": "'''форма'''",
+ "diff-form": "Разлике",
"permanentlink": "Стална веза",
"dberr-problems": "Дошло је до техничких проблема.",
"dberr-again": "Сачекајте неколико минута и поново учитајте страницу.",
"logentry-newusers-create2": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог $3",
"logentry-newusers-byemail": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог $3 и лозинка је послата на имејл",
"logentry-newusers-autocreate": "Кориснички налог $1 је аутоматски {{GENDER:$2|отворен}}",
- "logentry-protect-move_prot": "$1 је {{GENDER:$2|преместио|преместила}} поставке заштите са $4 на $3",
+ "logentry-protect-move_prot": "$1 је {{GENDER:$2|преместио|преместила}} подешавања заштите са $4 на $3",
"logentry-protect-unprotect": "$1 je {{GENDER:$2|скинуо|скинула}} заштиту са странице $3",
"logentry-protect-protect": "$1 је {{GENDER:$2|заштитио|заштитила}} $3 $4",
"logentry-protect-protect-cascade": "$1 је {{GENDER:$2|заштитио|заштитила}} $3 $4 [преносива заштита]",
"feedback-bugornote": "Ако сте спремни да детаљно опишете технички проблем, онда [$1 пријавите грешку].\nУ супротном, послужите се једноставним обрасцем испод. Ваш коментар ће стајати на страници „[$3 $2]“, заједно с корисничким именом и прегледачем који користите.",
"feedback-cancel": "Откажи",
"feedback-close": "Урађено",
- "feedback-external-bug-report-button": "Пријави баг",
+ "feedback-external-bug-report-button": "Пријави грешку",
+ "feedback-dialog-title": "Пошаљи повратну информацију",
"feedback-error1": "Грешка: непрепознат резултат од АПИ-ја",
"feedback-error2": "Грешка: уређивање није успело",
"feedback-error3": "Грешка: нема одговора од АПИ-ја",
"limitreport-expansiondepth": "Највећа дубина проширења",
"limitreport-expensivefunctioncount": "Број „скупих” функција анализатора",
"expandtemplates": "Замена шаблона",
- "expand_templates_intro": "Ова посебна страница узима текст и мења све шаблоне у њему рекурзивно.\nТакође мења функције парсера као што је <code><nowiki>{{</nowiki>#language:…}}</code> и променљиве као што је <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nЗаправо практично све што се налази између витичастих заграда.",
+ "expand_templates_intro": "Ова посебна страница узима викитекст и мења све шаблоне у њему рекурзивно.\nТакође мења функције парсера као што је <code><nowiki>{{</nowiki>#language:…}}</code> и променљиве као што је <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nЗаправо практично све што се налази између витичастих заграда.",
"expand_templates_title": "Назив контекста; за {{СТРАНИЦА}} итд.:",
"expand_templates_input": "Унос:",
"expand_templates_output": "Резултат",
"usercssispublic": "Напомена: CSS подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.",
"rawhtml-notallowed": "<html> тагови не могу да се користе ван нормалних страница.",
"gotointerwiki": "Напуштам пројекат {{SITENAME}}",
- "gotointerwiki-invalid": "Ð\9eдабÑ\80ани наÑ\81лов Ñ\98е невалидан.",
+ "gotointerwiki-invalid": "Ð\9eдабÑ\80ани наÑ\81лов Ñ\98е неиÑ\81пÑ\80аван.",
"gotointerwiki-external": "Управо ћете да напустите пројекат {{SITENAME}} да бисте на засебном веб-сајту посетили [[$2]].\n\n'''[$1 Продужи на $1]'''",
"undelete-cantedit": "Не можете повратити ову страницу јер немате дозволу да је уређујете.",
- "undelete-cantcreate": "Не можете повратити ову страницу јер нема постојеће странице са овим именом и немате дозволу да направите ову страницу."
+ "undelete-cantcreate": "Не можете повратити ову страницу јер нема постојеће странице са овим именом и немате дозволу да направите ову страницу.",
+ "pagedata-title": "Подаци странице",
+ "pagedata-bad-title": "Неисправан наслов: $1."
}
"Obsuser",
"Zoranzoki21",
"Prevodim",
- "Bugoslav"
+ "Bugoslav",
+ "Acamicamacaraca"
]
},
"tog-underline": "Podvlačenje veza:",
"right-editmyuserjs": "uređivanje sopstvenih JavaScript datoteka",
"right-viewmywatchlist": "vidi sopstveni spisak nadgledanja",
"right-editmywatchlist": "uređivanje sopstvenog spiska nadgledanja; neke preduzete radnje će svejedno dodati stranice na spisak i bez ovog prava",
- "right-viewmyprivateinfo": "Vidite svoje lične podatke (npr. imejl adresu, pravo ime)",
- "right-editmyprivateinfo": "Уređivanje sopstvenih ličnih podataka (npr. imejl adresa, pravo ime)",
+ "right-viewmyprivateinfo": "vidite svoje lične podatke (npr. imejl adresu, pravo ime)",
+ "right-editmyprivateinfo": "uređivanje sopstvenih ličnih podataka (npr. imejl adresa, pravo ime)",
"right-editmyoptions": "uređivanje sopstvenih podešavanja",
"right-rollback": "brzo vraćanje izmena poslednjeg korisnika koji je menjao određenu stranicu",
"right-markbotedits": "označavanje vraćenih izmena kao izmene bota",
"rcfilters-activefilters": "Aktiva filter",
"rcfilters-advancedfilters": "Avancerade filter",
"rcfilters-limit-title": "Resultat att visa",
- "rcfilters-limit-and-date-label": "{{PLURAL:$1|ändring|$1 ändringar}}, $2",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|ändring|ändringar}}, $2",
"rcfilters-date-popup-title": "Tidsperiod att söka",
"rcfilters-days-title": "Senaste dagarna",
"rcfilters-hours-title": "Senaste timmarna",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>Sidor som länkas från</strong> den valda sidan",
"rcfilters-filter-showlinkedto-label": "Visa ändringar på sidor som länkar till",
"rcfilters-filter-showlinkedto-option-label": "<strong>Sidor som länkar till</strong> den valda sidan",
- "rcfilters-target-page-placeholder": "Ange namnet på en sida",
+ "rcfilters-target-page-placeholder": "Ange namnet på en sida (eller kategori)",
"rcnotefrom": "Nedan visas {{PLURAL:$5|ändringen|ändringar}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
"rclistfromreset": "Återställ datumval",
"rclistfrom": "Visa nya ändringar från och med $2 $3",
"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",
"doubleredirects": "Dubbla omdirigeringar",
"doubleredirectstext": "Det här är en lista över sidor som omdirigerar till andra omdirigeringssidor. \nVarje rad innehåller länkar till den första och andra omdirigeringssidan, samt till målet för den andra omdirigeringen. Målet för den andra omdirigeringen är ofta den \"riktiga\" sidan som den första omdirigeringen egentligen ska leda till.\n<del>Överstrukna</del> poster har åtgärdats.",
"double-redirect-fixed-move": "[[$1]] har flyttats.\nDen uppdaterades automatiskt och är nu en omdirigering till [[$2]].",
- "double-redirect-fixed-maintenance": "Fixar automatiskt dubbel omdirigering från [[$1]] till [[$2]] i ett underhållsjobb.",
+ "double-redirect-fixed-maintenance": "Fixar automatiskt dubbel omdirigering från [[$1]] till [[$2]] i ett underhållsjobb",
"double-redirect-fixer": "Omdirigeringsrättaren",
"brokenredirects": "Trasiga omdirigeringar",
"brokenredirectstext": "Följande omdirigeringar länkar till ej existerande sidor:",
"version-poweredby-others": "andra",
"version-poweredby-translators": "översättare från translatewiki.net",
"version-credits-summary": "Vi skulle vilja tacka följande personer för deras bidrag till [[Special:Version|MediaWiki]].",
- "version-license-info": "MediaWiki är fri programvara; du kan distribuera det och/eller modifiera det under villkoren i GNU General Public License, publicerad av Free Software Foundation; antingen version 2 av licensen, eller (om du önskar) någon senare version. \n\nMediaWiki distribueras i hopp om att det ska vara användbart, men UTAN NÅGON GARANTI, även utan underförstådd garanti om SÄLJBARHET eller LÄMPLIGHET FÖR ETT VISST SYFTE. Se GNU General Public License för fler detaljer. \n\nDu bör ha fått [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopia av GNU General Public License] tillsammans med detta program; om inte, skriv till Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [//www.gnu.org/licenses/old-licenses/gpl-2.0.html läs den online].",
+ "version-license-info": "MediaWiki är fri programvara; du kan distribuera det och/eller modifiera det under villkoren i GNU General Public License, publicerad av Free Software Foundation; antingen version 2 av licensen, eller (om du önskar) någon senare version. \n\nMediaWiki distribueras i hopp om att det ska vara användbart, men <em>UTAN NÅGON GARANTI</em>, även utan underförstådd garanti om <strong>SÄLJBARHET</strong> eller <strong>LÄMPLIGHET FÖR ETT VISST SYFTE</strong>. Se GNU General Public License för fler detaljer. \n\nDu bör ha fått [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopia av GNU General Public License] tillsammans med detta program; om inte, skriv till Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [//www.gnu.org/licenses/old-licenses/gpl-2.0.html läs den online].",
"version-software": "Installerad programvara",
"version-software-product": "Produkt",
"version-software-version": "Version",
"diff-form": "Skillnader",
"diff-form-oldid": "Gammalt versions-ID (valfritt)",
"diff-form-revid": "Versions-ID för diff",
- "diff-form-submit": "Visa differenser",
+ "diff-form-submit": "Visa skillnad",
"permanentlink": "Permanent länk",
"permanentlink-revid": "Sidversions-ID",
"permanentlink-submit": "Gå till sidversion",
"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.",
"currentevents": "Рӯйдодҳои кунунӣ",
"currentevents-url": "Лоиҳа:Рӯйдодҳои кунунӣ",
"disclaimers": "Такзибнома",
- "disclaimerpage": "Project:Такзибномаи умумӣ",
+ "disclaimerpage": "Википедия:Такзибномаи умумӣ",
"edithelp": "Роҳнамои вироиш",
"mainpage": "Саҳифаи аслӣ",
"mainpage-description": "Саҳифаи аслӣ",
"enterlockreason": "ใส่เหตุแห่งการล็อก ทั้งเวลาที่คาดว่าจะปลดล็อก",
"readonlytext": "ขณะนี้ฐานข้อมูลถูกล็อกรายการใหม่และการแก้ไขเพิ่มเติมอื่น อาจเป็นเพราะการบำรุงรักษาฐานข้อมูลรูทีน หลังแล้วเสร็จจะกลับมาใช้งานได้ตามปกติ\n\nผู้ดูแลระบบที่ล็อกได้ให้คำอธิบายดังนี้: $1",
"missing-article": "ฐานข้อมูลไม่พบข้อความของหน้าที่ควรมี ชื่อ \"$1\" $2\n\nสาเหตุมักเกิดจากผลต่างที่ล้าสมัย หรือการเชื่อมโยงประวัติไปยังหน้านั้นถูกลบแล้ว\n\nหากไม่ใช่กรณีดังกล่าว คุณอาจพบจุดบกพร่องในซอฟต์แวร์ กรุณารายงานต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]] พร้อมระบุยูอาร์แอล",
- "missingarticle-rev": "(รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87#: $1)",
+ "missingarticle-rev": "(รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82#: $1)",
"missingarticle-diff": "(ต่าง: $1, $2)",
"readonly_lag": "ฐานข้อมูลถูกล็อกอัตโนมัติขณะที่เซิร์ฟเวอร์ฐานข้อมูลรองกำลังปรับปรุงตามฐานข้อมูลหลัก",
"internalerror": "ข้อผิดพลาดภายใน",
"cannotdelete": "ไม่สามารถลบหน้าหรือไฟล์ \"$1\" \nผู้อื่นอาจลบไปแล้ว",
"cannotdelete-title": "ไม่สามารถลบหน้า ''$1''",
"delete-hook-aborted": "การลบถูกฮุกยกเลิก\nโดยไม่มีคำชี้แจง",
- "no-null-revision": "ไม่สามารถสร้างรุ่นว่างใหม่ของหน้า \"$1\"",
+ "no-null-revision": "à¹\84มà¹\88สามารà¸\96สรà¹\89าà¸\87รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82วà¹\88าà¸\87à¹\83หมà¹\88à¸\82à¸à¸\87หà¸\99à¹\89า \"$1\"",
"badtitle": "ใช้ชื่อเรื่องนี้ไม่ได้",
"badtitletext": "ชื่อหน้าที่ขอไม่ถูกต้อง เป็นชื่อว่าง หรือชื่อข้ามภาษาหรือข้ามวิกิที่เชื่อมโยงไม่ถูกต้อง\nอาจมีอักขระที่ไม่สามารถใช้ในชื่อเรื่องได้",
"title-invalid-empty": "ชื่อเรื่องหน้าที่ขอว่างหรือมีเฉพาะชื่อเนมสเปซ",
"throttled-mailpassword": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา \nอีเมลตั้งรหัสผ่านใหม่จะส่งไปหนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำผิด",
"mailerror": "ข้อผิดพลาดในการส่งเมล: $1",
"acct_creation_throttle_hit": "ผู้เข้าชมวิกินี้ที่ใช้เลขที่อยู่ไอพีของคุณ ได้สร้าง {{PLURAL:$1|1 บัญชี|$1 บัญชี}}แล้วเมื่อ $2 ผ่านมา ซึ่งเป็นจำนวนสูงสุดที่อนุญาตในช่วงเวลาดังกล่าว\nจึงส่งผลให้ผู้เข้าชมที่ใช้เลขที่อยู่ไอพีนี้ ไม่สามารถสร้างบัญชีได้อีกในขณะนี้",
- "emailauthenticated": "ยืนยันที่อยู่อีเมลของคุณเมื่อวันที่ $2 เวลา $3",
+ "emailauthenticated": "ยืà¸\99ยัà¸\99à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¸à¸µà¹\80มลà¸\82à¸à¸\87à¸\84ุà¸\93à¹\81ลà¹\89วà¹\80มืà¹\88à¸à¸§à¸±à¸\99à¸\97ีà¹\88 $2 à¹\80วลา $3",
"emailnotauthenticated": "ที่อยู่อีเมลของคุณยังไม่ได้รับการยืนยัน \nจะไม่มีการส่งอีเมลสำหรับคุณลักษณะใด ๆ ต่อไปนี้",
"noemailprefs": "ระบุที่อยู่อีเมลในการตั้งค่าของคุณเพื่อให้คุณลักษณะเหล่านี้ทำงานได้",
"emailconfirmlink": "ยืนยันที่อยู่อีเมลของคุณ",
"anontalkpagetext": "----\n<em>หน้านี้เป็นหน้าคุยกับผู้ใช้สำหรับผู้ใช้นิรนามซึ่งยังไม่ได้สร้างหรือใช้บัญชี</em>\nดังนั้นเราจึงระบุตัวตนโดยใช้เลขที่อยู่ไอพีแทน\nเลขที่อยู่ไอพีนี้อาจมีผู้ใช้ร่วมกันหลายคน\nถ้าคุณเป็นผู้ใช้นิรนาม และรู้สึกว่าคุณได้รับความเห็นที่ไม่เกี่ยวข้องส่งหาคุณ กรุณา[[Special:CreateAccount|สร้างบัญชี]]หรือ[[Special:UserLogin|ล็อกอิน]] เพื่อป้องกันการสับสนกับผู้ใช้นิรนามรายอื่นในอนาคต",
"noarticletext": "ปัจจุบันไม่มีข้อความในหน้านี้\nคุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อเรื่องหน้านี้]]ในหน้าอื่น <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง] หรือ[{{fullurl:{{FULLPAGENAME}}|action=edit}} แก้ไขหน้านี้]</span>",
"noarticletext-nopermission": "ปัจจุบันไม่มีข้อความในหน้านี้\nคุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อหน้านี้]]ในหน้าอื่น หรือ<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง]</span> แต่คุณไม่มีสิทธิสร้างหน้านี้",
- "missing-revision": "à¹\84มà¹\88มีรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87 #$1 ของหน้าชื่อ \"{{FULLPAGENAME}}\" \n\nปกติเกิดจากการตามการโยงประวัติเก่าไปยังหน้าที่ถูกลบแล้ว\nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
+ "missing-revision": "à¹\84มà¹\88มีรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82 #$1 ของหน้าชื่อ \"{{FULLPAGENAME}}\" \n\nปกติเกิดจากการตามการโยงประวัติเก่าไปยังหน้าที่ถูกลบแล้ว\nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
"userpage-userdoesnotexist": "บัญชีผู้ใช้ \"$1\" มิได้ลงทะเบียน \nกรุณาตรวจสอบหากคุณต้องการสร้าง/แก้ไขหน้านี้",
"userpage-userdoesnotexist-view": "บัญชีผู้ใช้ \"$1\" มิได้ลงทะเบียน",
"blocked-notice-logextract": "ปัจจุบันผู้ใช้นี้ถูกบล็อก\nหน่วยปูมการบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:",
"editconflict": "แก้ไขชนกัน: $1",
"explainconflict": "มีผู้เปลี่ยนแปลงหน้านี้ตั้งแต่คุณเริ่มแก้ไข\nพื้นที่ข้อความส่วนบนมีข้อความหน้าที่มีอยู่ในปัจจุบัน\nการแก้ไขของคุณแสดงอยู่ในพื้นที่ข้อความส่วนล่าง\nคุณจะต้องรวมการเปลี่ยนแปลงของคุณเข้ากับข้อความที่มีอยู่\n<strong>เฉพาะ</strong>ข้อความในพื้นที่ข้อความส่วนบนเท่านั้นที่จะถูกบันทึก เมื่อกด \"$1\"",
"yourtext": "ข้อความของคุณ",
- "storedversion": "รุ่นที่เก็บไว้",
+ "storedversion": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ีà¹\88à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89",
"editingold": "<strong>คำเตือน: คุณกำลังแก้ไขรุ่นที่ล้าสมัยของหน้านี้</strong> ถ้าคุณบันทึก การเปลี่ยนแปลงใด ๆ หลังรุ่นนี้จะหาย",
"yourdiff": "ความแตกต่าง",
"copyrightwarning": "โปรดระลึกว่างานเขียนทั้งหมดใน {{SITENAME}} ถือว่าเผยแพร่ภายใต้ $2 (ดูรายละเอียดทาง $1)\nหากคุณไม่ต้องการให้งานของคุณถูกแก้ไขและกระจายได้ตามใจ ก็อย่าส่งเข้ามา<br />\nนอกจากนี้ คุณยังสัญญาเราว่าคุณเขียนงานด้วยตนเอง หรือคัดลอกจากสาธารณสมบัติหรือทรัพยากรเสรีที่คล้ายกัน\n<strong>อย่าส่งงานมีลิขสิทธิ์โดยไม่ได้รับอนุญาต!</strong>",
"undo-failure": "การแก้ไขนี้ไม่สามารถย้อนกลับได้ เนื่องจากขัดแย้งกับการแก้ไขระหว่างกลาง",
"undo-norev": "ไม่สามารถย้อนการแก้ไขนี้กลับ เพราะไม่มีหรือถูกลบไปแล้ว",
"undo-nochange": "ดูเหมือนว่าการแก้ไขดังกล่าวถูกย้อนกลับแล้ว",
- "undo-summary": "ย้อนรุ่น $1 ที่ [[Special:Contributions/$2|$2]] ([[User talk:$2|คุย]]) สร้าง",
+ "undo-summary": "ย้อนรุ่นแก้ไข $1 ที่ [[Special:Contributions/$2|$2]] ([[User talk:$2|คุย]]) สร้าง",
"undo-summary-username-hidden": "ย้อนการแก้ไข $1 ที่สร้างโดยผู้ใช้ปกปิดชื่อ",
"cantcreateaccount-text": "การสร้างบัญชีใหม่จากที่อยู่ไอพีนี้ ('''$1''') ถูกระงับโดย [[User:$3|$3]]\n\nเหตุผลที่ $3 ให้ไว้ คือ ''$2''",
"cantcreateaccount-range-text": "การสร้างบัญชีจากเลขที่อยู่ไอพีในช่วง <strong>$1</strong> ซึ่งรวมเลขที่อยู่ไอพีของคุณ (<strong>$4</strong>) ถูกบล็อกโดย [[User:$3|$3]] \n\nเหตุผลที่ $3 ชี้แจง คือ <em>$2</em>",
"viewpagelogs": "ดูปูมของหน้านี้",
"nohistory": "ไม่มีประวัติการแก้ไขสำหรับหน้านี้",
- "currentrev": "รุà¹\88à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99",
+ "currentrev": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ลà¹\88าสุà¸\94",
"currentrev-asof": "รุ่นปัจจุบัน เมื่อ $1",
- "revisionasof": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87เมื่อ $1",
- "revision-info": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87เมื่อ $1 โดย {{GENDER:$6|$2}}$7",
- "previousrevision": "â\86\90รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ก่อนหน้า",
- "nextrevision": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ถัดไป→",
- "currentrevisionlink": "รุ่นล่าสุด",
+ "revisionasof": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82เมื่อ $1",
+ "revision-info": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82เมื่อ $1 โดย {{GENDER:$6|$2}}$7",
+ "previousrevision": "â\86\90รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ก่อนหน้า",
+ "nextrevision": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ถัดไป→",
+ "currentrevisionlink": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ลà¹\88าสุà¸\94",
"cur": "ป",
"next": "ถัดไป",
"last": "ก",
"page_first": "แรกสุด",
"page_last": "ท้ายสุด",
- "histlegend": "à¸\81ารà¹\80ลืà¸à¸\81à¸\9cลà¸\95à¹\88าà¸\87: à¹\80ลืà¸à¸\81à¸\9bุà¹\88มà¸\82à¸à¸\87สà¸à¸\87รุà¹\88à¸\99à¸\97ีà¹\88à¸\95à¹\89à¸à¸\87à¸\81ารà¹\80à¸\9bรียà¸\9aà¹\80à¸\97ียà¸\9a à¹\81ละà¸\81à¸\94à¸\9bà¹\89à¸à¸\99à¹\80à¸\82à¹\89าหรืà¸à¸\9bุà¹\88มà¸\94à¹\89าà¸\99ลà¹\88าà¸\87<br />\nà¸\84ำà¸à¸\98ิà¸\9aาย: <strong>({{int:cur}})</strong> = à¸\9cลà¸\95à¹\88าà¸\87à¸\81ัà¸\9aรุà¹\88à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99, <strong>({{int:last}})</strong> = à¸\9cลà¸\95à¹\88าà¸\87à¸\81ัà¸\9aรุà¹\88à¸\99ก่อนหน้า, <strong>{{int:minoreditletter}}</strong> = การแก้ไขเล็กน้อย",
+ "histlegend": "à¸\81ารà¹\80ลืà¸à¸\81à¸\9cลà¸\95à¹\88าà¸\87: à¹\80ลืà¸à¸\81à¸\9bุà¹\88มà¸\82à¸à¸\87สà¸à¸\87รุà¹\88à¸\99à¸\97ีà¹\88à¸\95à¹\89à¸à¸\87à¸\81ารà¹\80à¸\9bรียà¸\9aà¹\80à¸\97ียà¸\9a à¹\81ละà¸\81à¸\94à¸\9bà¹\89à¸à¸\99à¹\80à¸\82à¹\89าหรืà¸à¸\9bุà¹\88มà¸\94à¹\89าà¸\99ลà¹\88าà¸\87<br />\nà¸\84ำà¸à¸\98ิà¸\9aาย: <strong>({{int:cur}})</strong> = à¸\9cลà¸\95à¹\88าà¸\87à¸\81ัà¸\9aรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ลà¹\88าสุà¸\94, <strong>({{int:last}})</strong> = à¸\9cลà¸\95à¹\88าà¸\87à¸\81ัà¸\9aรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ก่อนหน้า, <strong>{{int:minoreditletter}}</strong> = การแก้ไขเล็กน้อย",
"history-fieldset-title": "ค้นหารุ่นปรับปรุง",
- "history-show-deleted": "เฉพาะรุ่นที่ถูกลบ",
+ "history-show-deleted": "à¹\80à¸\89à¸\9eาะรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9a",
"histfirst": "แรกสุด",
"histlast": "ล่าสุด",
"historysize": "($1 ไบต์)",
"historyempty": "(ว่าง)",
- "history-feed-title": "à¸\9bระวัà¸\95ิรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87",
+ "history-feed-title": "à¸\9bระวัà¸\95ิรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82",
"history-feed-description": "ประวัติรุ่นปรับปรุงของหน้านี้ในวิกิ",
"history-feed-item-nocomment": "$1 เมื่อ $2",
"history-feed-empty": "ไม่มีหน้าที่ต้องการ \nซึ่งอาจถูกลบหรือเปลี่ยนชื่อแล้ว \nลอง[[Special:Search|ค้นวิกินี้]]หาหน้าใหม่ที่เกี่ยวข้อง",
- "history-edit-tags": "à¸\9bà¹\89ายระà¸\9aุà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87รุ่นแก้ไขที่เลือก",
+ "history-edit-tags": "à¹\81à¸\81à¹\89à¹\84à¸\82à¸\9bà¹\89ายระà¸\9aุรุ่นแก้ไขที่เลือก",
"rev-deleted-comment": "(คำอธิบายอย่างย่อถูกลบออก)",
"rev-deleted-user": "(ชื่อผู้ใช้ถูกลบออก)",
"rev-deleted-event": "(รายละเอียดปูมถูกลบ)",
"rev-deleted-user-contribs": "[นำชื่อผู้ใช้หรือเลขที่อยู่ไอพีออกแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]",
- "rev-deleted-text-permission": "รุ่นหน้านี้ <strong>ถูกลบ</strong>\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
+ "rev-deleted-text-permission": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\99ีà¹\89 <strong>à¸\96ูà¸\81ลà¸\9a</strong>\nà¸\9eà¸\9aรายละà¹\80à¸à¸µà¸¢à¸\94à¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9bูมà¸\81ารลà¸\9a]",
"rev-suppressed-text-permission": "รุ่นหน้านี้ถูก<strong>ยับยั้ง</strong> \nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
- "rev-deleted-text-unhide": "รุà¹\88à¸\99หà¸\99à¹\89าà¸\99ีà¹\89<strong>à¸\96ูà¸\81ลà¸\9a</strong>\nà¸\9eà¸\9aรายละà¹\80à¸à¸µà¸¢à¸\94à¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9bูมà¸\81ารลà¸\9a]\nà¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูรุà¹\88à¸\99นี้]ได้ถ้าคุณต้องการดำเนินต่อ",
- "rev-suppressed-text-unhide": "รุà¹\88à¸\99หà¸\99à¹\89าà¸\99ีà¹\89<strong>à¸\96ูà¸\81ยัà¸\9aยัà¹\89à¸\87</strong>\nà¸\9eà¸\9aรายละà¹\80à¸à¸µà¸¢à¸\94à¸\9eà¸\9aà¹\83à¸\99[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¸\9bูมà¸\81ารยัà¸\9aยัà¹\89à¸\87]\nà¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูรุà¹\88à¸\99นี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+ "rev-deleted-text-unhide": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\99ีà¹\89<strong>à¸\96ูà¸\81ลà¸\9a</strong>\nà¸\9eà¸\9aรายละà¹\80à¸à¸µà¸¢à¸\94à¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9bูมà¸\81ารลà¸\9a]\nà¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82นี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+ "rev-suppressed-text-unhide": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\99ีà¹\89<strong>à¸\96ูà¸\81ยัà¸\9aยัà¹\89à¸\87</strong>\nà¸\9eà¸\9aรายละà¹\80à¸à¸µà¸¢à¸\94à¸\9eà¸\9aà¹\83à¸\99[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¸\9bูมà¸\81ารยัà¸\9aยัà¹\89à¸\87]\nà¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82นี้]ได้ถ้าคุณต้องการดำเนินต่อ",
"rev-deleted-text-view": "รุ่นหน้านี้<strong>ถูกลบ</strong>\nคุณสามารถดูรุ่นนี้ได้ พบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
- "rev-suppressed-text-view": "รุà¹\88à¸\99หà¸\99à¹\89าà¸\99ีà¹\89strong>à¸\96ูà¸\81ยัà¸\9aยัà¹\89à¸\87</strong>\nà¸\84ุà¸\93สามารà¸\96à¸\94ูรุà¹\88à¸\99นี้ได้ พบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
- "rev-deleted-no-diff": "คุณไม่สามารถเรียกดูผลต่างนี้ เพราะมีรุ่นหนึ่ง<strong>ถูกลบ</strong>\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
+ "rev-suppressed-text-view": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\99ีà¹\89<strong>à¸\96ูà¸\81ยัà¸\9aยัà¹\89à¸\87</strong>\nà¸\84ุà¸\93สามารà¸\96à¸\94ูรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82นี้ได้ พบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
+ "rev-deleted-no-diff": "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80รียà¸\81à¸\94ูà¸\9cลà¸\95à¹\88าà¸\87à¸\99ีà¹\89 à¹\80à¸\9eราะมีรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99ึà¹\88à¸\87<strong>à¸\96ูà¸\81ลà¸\9a</strong>\nà¸\9eà¸\9aรายละà¹\80à¸à¸µà¸¢à¸\94à¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9bูมà¸\81ารลà¸\9a]",
"rev-suppressed-no-diff": "คุณไม่สามารถดูผลต่างนี้ได้ เพราะมีรุ่นหนึ่งที่<strong>ถูกลบ</strong>",
- "rev-deleted-unhide-diff": "รุ่นหนึ่งของผลต่างนี้<strong>ถูกลบ</strong>\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]\nคุณยังสามารถ[$1 ดูผลต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+ "rev-deleted-unhide-diff": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87à¸\9cลà¸\95à¹\88าà¸\87à¸\99ีà¹\89<strong>à¸\96ูà¸\81ลà¸\9a</strong>\nà¸\9eà¸\9aรายละà¹\80à¸à¸µà¸¢à¸\94à¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9bูมà¸\81ารลà¸\9a]\nà¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\9cลà¸\95à¹\88าà¸\87à¸\99ีà¹\89]à¹\84à¸\94à¹\89à¸\96à¹\89าà¸\84ุà¸\93à¸\95à¹\89à¸à¸\87à¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\95à¹\88à¸",
"rev-suppressed-unhide-diff": "รุ่นหนึ่งของผลต่างนี้<strong>ถูกยับยั้ง</strong>\nพบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]\nคุณยังสามารถ[$1 ดูผลต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
- "rev-deleted-diff-view": "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87à¸\9cลà¸\95à¹\88าà¸\87à¸\99ีà¹\89'''à¸\96ูà¸\81ลà¸\9a'''\nคุณสามารถดูผลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
+ "rev-deleted-diff-view": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87à¸\9cลà¸\95à¹\88าà¸\87à¸\99ีà¹\89<strong>à¸\96ูà¸\81ลà¸\9a</strong>\nคุณสามารถดูผลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
"rev-suppressed-diff-view": "รุ่นหนึ่งของผลต่างนี้<strong>ถูกยับยั้ง</strong>\nคุณสามารถดูผลต่างนี้ได้ พบรายละเอียดได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
"rev-delundel": "เปลี่ยนทัศนวิสัย",
"rev-showdeleted": "แสดง",
- "revisiondelete": "ลà¸\9a/à¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87",
- "revdelete-nooldid-title": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87เป้าหมายไม่สมเหตุสมผล",
- "revdelete-nooldid-text": "à¸\84ุà¸\93มิà¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¹\80à¸\9bà¹\89าหมายà¹\80à¸\9eืà¹\88à¸à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\99ีà¹\89 หรืà¸à¹\84มà¹\88มีรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¹\80à¸\88าะà¸\88à¸\87 หรืà¸à¸\84ุà¸\93à¸\81ำลัà¸\87à¸\9eยายามà¸\8bà¹\88à¸à¸\99รุà¹\88à¸\99ปัจจุบันอย่างใดอย่างหนึ่ง",
+ "revisiondelete": "ลà¸\9a/à¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82",
+ "revdelete-nooldid-title": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82เป้าหมายไม่สมเหตุสมผล",
+ "revdelete-nooldid-text": "à¸\84ุà¸\93มิà¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¹\80à¸\9bà¹\89าหมายà¹\80à¸\9eืà¹\88à¸à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\99ีà¹\89 หรืà¸à¹\84มà¹\88มีรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82à¸\97ีà¹\88à¹\80à¸\88าะà¸\88à¸\87 หรืà¸à¸\84ุà¸\93à¸\81ำลัà¸\87à¸\9eยายามà¸\8bà¹\88à¸à¸\99รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ปัจจุบันอย่างใดอย่างหนึ่ง",
"revdelete-no-file": "ไม่มีไฟล์ที่ระบุ",
"revdelete-show-file-confirm": "คุณแน่ใจว่าต้องการดูรุ่นที่ถูกลบของไฟล์ \"<nowiki>$1</nowiki>\" เมื่อวันที่ $2 เวลา $3 หรือไม่",
"revdelete-show-file-submit": "ใช่",
- "revdelete-selected-text": "{{PLURAL:$1|รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ที่เลือก}}ของ [[:$2]]:",
+ "revdelete-selected-text": "{{PLURAL:$1|รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ที่เลือก}}ของ [[:$2]]:",
"revdelete-selected-file": "{{PLURAL:$1|รุ่นไฟล์ที่เลือก}}ของ [[:$2]]:",
"logdelete-selected": "{{PLURAL:$1|เหตุการณ์ปูมที่เลือก|เหตุการณ์ปูมที่เลือก}} :",
- "revdelete-text-text": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ที่ถูกลบจะยังปรากฏในประวัติหน้า แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
+ "revdelete-text-text": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ที่ถูกลบจะยังปรากฏในประวัติหน้า แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
"revdelete-text-file": "รุ่นไฟล์ที่ถูกลบจะยังปรากฏในประวัติไฟล์ แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
"logdelete-text": "เหตุการณ์ปูมที่ถูกลบจะยังปรากฏในปูม แต่สาธารณะจะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้",
"revdelete-text-others": "ผู้ดูแลระบบคนอื่นจะยังสามารถเข้าถึงและกู้คืนเนื้อหาที่ถูกซ่อนได้ ยกเว้นตั้งข้อจำกัดเพิ่มเติม",
"revdelete-confirm": "กรุณายืนยันว่าคุณมีเจตนาลบ คุณเข้าใจผลลัพธ์ และคุณปฏิบัติการต้องกับ[[{{MediaWiki:Policy-url}}|นโยบาย]]",
"revdelete-suppress-text": "การระงับควรใช้<strong>เฉพาะ</strong>กรณีต่อไปนี้:\n* ข้อมูลที่อาจหมิ่นประมาท\n* ข้อมูลส่วนบุคคลที่ไม่เหมาะสม\n*: <em>ที่อยู่บ้านและหมายเลขโทรศัพท์บ้าน, หมายเลขการประกันสังคมแห่งชาติ ฯลฯ</em>",
"revdelete-legend": "ตั้งการจำกัดทัศนวิสัย",
- "revdelete-hide-text": "à¸\82à¹\89à¸à¸\84วามรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87",
+ "revdelete-hide-text": "à¸\82à¹\89à¸à¸\84วามรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82",
"revdelete-hide-image": "ซ่อนเนื้อหาไฟล์",
"revdelete-hide-name": "ซ่อนเป้าหมายและพารามิเตอร์",
"revdelete-hide-comment": "คำอธิบายอย่างย่อ",
"revdelete-radio-set": "ซ่อน",
"revdelete-radio-unset": "เปิดเผย",
"revdelete-suppress": "ยับยั้งข้อมูลจากผู้ดูแลระบบเช่นเดียวกับผู้ใช้อื่น",
- "revdelete-unsuppress": "ลà¸\9aà¸\81ารà¸\88ำà¸\81ัà¸\94à¹\81à¸\81à¹\88รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ที่กู้คืน",
+ "revdelete-unsuppress": "ลà¸\9aà¸\81ารà¸\88ำà¸\81ัà¸\94à¹\81à¸\81à¹\88รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ที่กู้คืน",
"revdelete-log": "เหตุผล:",
- "revdelete-submit": "à¹\83à¸\8aà¹\89à¸\81ัà¸\9aรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87{{PLURAL:$1|}}ที่เลือก",
+ "revdelete-submit": "à¹\83à¸\8aà¹\89à¸\81ัà¸\9aรุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82{{PLURAL:$1|}}ที่เลือก",
"revdelete-success": "ปรับทัศนวิสัยรุ่นปรับปรุงสำเร็จ",
- "revdelete-failure": "à¹\84มà¹\88สามารà¸\96à¸\9bรัà¸\9aà¸\97ัศà¸\99วิสัยà¸\82à¸à¸\87รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ได้:\n$1",
+ "revdelete-failure": "à¹\84มà¹\88สามารà¸\96à¸\9bรัà¸\9aà¸\97ัศà¸\99วิสัยà¸\82à¸à¸\87รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ได้:\n$1",
"logdelete-success": "ตั้งทัศนวิสัยปูมสำเร็จ",
"logdelete-failure": "ไม่สามารถตั้งทัศนวิสัยของปูม:\n$1",
"revdel-restore": "เปลี่ยนทัศนวิสัย",
"pagehist": "ประวัติหน้า",
"deletedhist": "ประวัติที่ถูกลบ",
- "revdelete-hide-current": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\8bà¹\88à¸à¸\99รายà¸\81ารลà¸\87วัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸\99ีà¹\88à¸\84ืà¸à¸£à¸¸à¹\88à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99\nà¹\84มà¹\88สามารà¸\96à¸\8bà¹\88à¸à¸\99à¹\84à¸\94à¹\89",
+ "revdelete-hide-current": "เกิดความผิดพลาดในการซ่อนรายการลงวันที่ $2 เวลา $1: นี่คือรุ่นแก้ไขปัจจุบัน\nไม่สามารถซ่อนได้",
"revdelete-show-no-access": "มีข้อผิดพลาดในการแสดงรายการวันที่ $2 เวลา $1: รายการนี้ถูกทำเครื่องหมายเป็น \"ถูกจำกัด\"\nคุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว",
"revdelete-modify-no-access": "มีข้อผิดพลาดในการดัดแปรรายการวันที่ $2 เวลา $1: รายการนี้ถูกทำเครื่องหมายเป็น \"ถูกจำกัด\"\nคุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว",
"revdelete-modify-missing": "มีข้อผิดพลาดในการดัดแปรรายการหมายเลข $1: รายการนี้สูญหายจากฐานข้อมูล!",
"mergehistory-go": "แสดงการแก้ไขที่รวมได้",
"mergehistory-submit": "รวมรุ่นปรับปรุง",
"mergehistory-empty": "ไม่มีรุ่นปรับปรุงที่รวมได้",
- "mergehistory-done": "รวม $3 รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87ของ $1 เข้ากับ [[:$2]] แล้ว",
+ "mergehistory-done": "รวม $3 รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82ของ $1 เข้ากับ [[:$2]] แล้ว",
"mergehistory-fail": "ไม่สามารถรวมประวัติได้ โปรดตรวจสอบตัวแปรเสริมหน้าและเวลาอีกครั้ง",
"mergehistory-fail-bad-timestamp": "สแตมป์เวลาไม่ถูกต้อง",
"mergehistory-fail-invalid-source": "หน้าต้นทางไม่ถูกต้อง",
"timezoneregion-indian": "มหาสมุทรอินเดีย",
"timezoneregion-pacific": "มหาสมุทรแปซิฟิก",
"allowemail": "อนุญาตให้ผู้ใช้อื่นอีเมลหา",
+ "email-allow-new-users-label": "อนุญาตอีเมลจากผู้ใช้ใหม่",
"email-blacklist-label": "ห้ามผู้ใช้เหล่านี้มิให้อีเมลหา:",
"prefs-searchoptions": "ค้นหา",
"prefs-namespaces": "เนมสเปซ",
"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-label": "ซ่อนรุ่นปรับปรุงของรายการเปลี่ยนแปลงล่าสุด",
"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-option-label": "แสดงการเปลี่ยนแปลงในหน้าที่ลิงก์<strong>มา</strong>ยังหน้าหนึ่ง",
+ "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à¹\84à¸\9b",
+ "rcfilters-filter-showlinkedto-option-label": "<strong>หน้าที่ลิงก์ไป</strong>หน้าที่เลือก",
"rcfilters-target-page-placeholder": "กรอกชื่อหน้า (หรือหมวดหมู่)",
"rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$3, $4</strong> (แสดงมากสุด <strong>$1</strong>)",
"rclistfromreset": "กลับค่าเดิมของการเลือกวันที่",
"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\" ได้",
"nlinks": "$1 ลิงก์",
"nmembers": "$1 หน้า",
"nmemberschanged": "$1 → $2 สมาชิก",
- "nrevisions": "$1 รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87",
+ "nrevisions": "$1 รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82",
"nimagelinks": "ใช้ใน $1 {{PLURAL:$1|หน้า|หน้า}}",
"ntransclusions": "ใช้ใน $1 {{PLURAL:$1|หน้า|หน้า}}",
"specialpage-empty": "ไม่มีผลลัพธ์รายงานนี้",
"undeletehistorynoadmin": "หน้านี้ถูกลบแล้ว\nสาเหตุการลบแสดงในความย่อด้านล่าง ร่วมกับรายละเอียดผู้ใช้ที่เคยแก้ไขหน้านี้ก่อนลบ\nเฉพาะผู้ดูแลระบบที่ดูข้อความแท้จริงของรุ่นที่ถูกลบเหล่านี้ได้",
"undelete-revision": "รุ่นที่ถูกลบของหน้า $1 (ตั้งแต่ $4 เมื่อ $5) โดย $3:",
"undeleterevision-missing": "รุ่นไม่ถูกต้องหรือสูญหาย\nคุณอาจมีลิงก์เสีย หรือรุ่นอาจถูกกู้คืนหรือนำออกจากกรุ",
+ "undeleterevision-duplicate-revid": "ไม่สามารถกู้คืน $1 รุ่นการแก้ไข เพราะ <code>rev_id</code> ของรุ่นดังกล่าวมีใช้อยู่",
"undelete-nodiff": "ไม่พบรุ่นก่อนหน้า",
"undeletebtn": "กู้คืน",
"undeletelink": "ดู/กู้คืน",
"cant-move-to-user-page": "คุณไม่มีสิทธิย้ายหน้าใด ๆ ไปเป็นหน้าผู้ใช้ (ยกเว้นหน้าย่อยของผู้ใช้)",
"cant-move-category-page": "คุณไม่มีสิทธิย้ายหน้าหมวดหมู่",
"cant-move-to-category-page": "คุณไม่มีสิทธิย้ายหน้าไปหน้าหมวดหมู่",
+ "namespace-nosubpages": "เนมสเปซ \"$1\" ไม่อนุญาตให้มีหน้าย่อย",
"newtitle": "ชื่อเรื่องใหม่:",
"move-watch": "เฝ้าดูหน้าต้นทางและหน้าปลายทาง",
"movepagebtn": "เปลี่ยนชื่อ",
"import-nonewrevisions": "ทุกรุ่นมาจากการนำเข้าข้อมูลก่อนหน้านี้",
"xml-error-string": "$1 ที่บรรทัด $2 คอลัมน์ $3 (ไบต์ที่ $4): $5",
"import-upload": "อัปโหลดข้อมูล XML",
- "import-token-mismatch": "ข้อมูลเซชชันสูญหาย ให้ลองใหม่อีกครั้ง",
+ "import-token-mismatch": "ข้อมูลเซชชันสูญหาย\n\nคุณอาจล็อกเอาต์ '''กรุณายืนยันว่าคุณยังล็อกอินและลองอีกครั้ง'''\nหากยังไม่เป็นผล ให้ลอง[[Special:UserLogout|ล็อกเอาต์]]ก่อนแล้วล็อกอินกลับมา และตรวจสอบว่าเบราว์เซอร์ของคุณอนุญาตคุกกี้จากเว็บไซต์นี้",
"import-invalid-interwiki": "ไม่สามารถนำข้อมูลเข้าจากวิกิที่กำหนดได้",
"import-error-create": "หน้า \"$1\" ยังไม่ได้ถูกนำเข้า เนื่องจากคุณไม่ได้รับอนุญาตให้สามารถสร้างได้",
"import-options-wrong": "{{PLURAL:$2|ตัวเลือก|ตัวเลือก}}ผิด:<nowiki>$1</nowiki>",
"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": "บิตต่อคอมโพเนนต์",
"confirmemail_body_set": "ใครสักคนจากที่อยู่ไอพี $1 ซึ่งอาจเป็นคุณ\nได้กำหนดที่อยู่อีเมลของบัญชี \"$2\" บน {{SITENAME}} มายังที่อยู่อีเมลนี้\n\nเพื่อยืนยันว่าบัญชีนี้เป็นของคุณจริง ๆ\nและเปิดใช้งานคุณสมบัติอีเมลบน {{SITENAME}} อีกครั้ง\nให้เปิดลิงก์ต่อไปนี้ในเบราว์เซอร์ของคุณ:\n\n$3\n\nหากบัญชีดังกล่าว *ไม่ใช่* ของคุณ\nให้เปิดลิงก์ต่อไปนี้เพื่อยกเลิกการยืนยันที่อยู่อีเมล:\n\n$5\n\nรหัสยืนยันนี้จะหมดอายุเมื่อ $4",
"confirmemail_invalidated": "ยกเลิกการยืนยันที่อยู่อีเมลแล้ว",
"invalidateemail": "ยกเลิกการยืนยันอีเมล",
+ "notificationemail_subject_changed": "มีการเปลี่ยนที่อยู่อีเมลลงทะเบียนของ {{SITENAME}}",
+ "notificationemail_subject_removed": "มีการลบที่อยู่อีเมลลงทะเบียนของ {{SITENAME}}",
"scarytranscludedisabled": "[ส่งค่าของอินเตอร์วิกิถูกระงับ]",
"scarytranscludefailed": "[ไม่สามารถดึงแม่แบบมาได้สำหรับ $1]",
"scarytranscludetoolong": "[ยูอาร์แอลยาวเกินไป]",
"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": "ไป",
"redirect-value": "ค่า:",
"redirect-user": "รหัสผู้ใช้",
"redirect-page": "รหัสหน้า",
- "redirect-revision": "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87หน้า",
+ "redirect-revision": "รุà¹\88à¸\99à¹\81à¸\81à¹\89à¹\84à¸\82หน้า",
"redirect-file": "ชื่อไฟล์",
"redirect-logid": "เลขปูม",
"redirect-not-exists": "ไม่พบค่า",
"logentry-move-move-noredirect": "$1 ย้ายหน้า $3 ไปยัง $4 โดยไม่สร้างหน้าเปลี่ยนทางตามมา",
"logentry-move-move_redir": "$1 ย้ายหน้า $3 ไปยัง $4 ทับหน้าเปลี่ยนทาง",
"logentry-move-move_redir-noredirect": "$1 ย้ายหน้า $3 ไปยัง $4 ทับหน้าเปลี่ยนทาง โดยไม่สร้างหน้าเปลี่ยนทางตามมา",
- "logentry-patrol-patrol": "$1 ทำเครื่องหมายว่ารุ่น $4 ของหน้า $3 ได้รับการตรวจสอบแล้ว",
+ "logentry-patrol-patrol": "$1 ทำเครื่องหมายว่ารุ่นแก้ไข $4 ของหน้า $3 ได้รับการตรวจสอบแล้ว",
"logentry-patrol-patrol-auto": "$1 {{GENDER:$2|ทำเครื่องหมาย}}โดยอัตโนมัติว่ารุ่น $4 ของหน้า $3 ได้รับการตรวจสอบแล้ว",
"logentry-newusers-newusers": "บัญชีผู้ใช้ $1 ถูกสร้าง",
"logentry-newusers-create": "บัญชีผู้ใช้ $1 ถูกสร้าง",
"duration-decades": "$1 ทศวรรษ",
"duration-centuries": "$1 ศตวรรษ",
"duration-millennia": "$1 สหัสวรรษ",
+ "limitreport-title": "ข้อมูลบันทึกตัวแจงส่วน:",
+ "limitreport-cputime": "การใช้เวลาของซีพียู",
+ "limitreport-cputime-value": "$1 วินาที",
+ "limitreport-walltime": "การใช้เวลาจริง",
+ "limitreport-walltime-value": "$1 วินาที",
+ "limitreport-ppvisitednodes": "จำนวนปมที่เข้าชมแล้วของตัวประมวลก่อน",
+ "limitreport-ppgeneratednodes": "จำนวนปมที่สร้างแล้วของตัวประมวลก่อน",
+ "limitreport-postexpandincludesize": "ขนาดเมื่อรวมขยายแล้ว",
+ "limitreport-postexpandincludesize-value": "$1/$2 ไบต์",
+ "limitreport-templateargumentsize": "ขนาดอาร์กิวเมนต์แม่แบบ",
+ "limitreport-templateargumentsize-value": "$1/$2 ไบต์",
+ "limitreport-expansiondepth": "ความลึกการขยายสูงสุด",
"expandtemplates": "ขยายแม่แบบ",
"expand_templates_output": "ผลลัพธ์",
"expand_templates_ok": "ตกลง",
"log-action-filter-delete-delete_redir": "การเขียนทับการเปลี่ยนทาง",
"log-action-filter-delete-restore": "การกู้คืนหน้า",
"log-action-filter-delete-event": "การลบปูม",
- "log-action-filter-delete-revision": "การลบรุ่น",
+ "log-action-filter-delete-revision": "การลบรุ่นแก้ไข",
"log-action-filter-import-interwiki": "การนำเข้าข้ามวิกิ",
"log-action-filter-managetags-create": "การสร้างป้ายระบุ",
"log-action-filter-managetags-delete": "การลบป้ายระบุ",
"log-action-filter-suppress-event": "การระงับปูม",
"log-action-filter-upload-upload": "อัปโหลดใหม่",
"log-action-filter-upload-overwrite": "อัปโหลดใหม่",
- "revid": "รุ่น $1",
+ "edit-error-short": "ข้อผิดพลาด: $1",
+ "edit-error-long": "ข้อผิดพลาด: $1",
+ "revid": "รุ่นแก้ไข $1",
"pageid": "เลขประจำหน้า $1",
"gotointerwiki": "กำลังออกจาก {{SITENAME}}",
+ "gotointerwiki-external": "คุณกำลังออกจาก {{SITENAME}} ไป [[$2]] ซึ่งเป็นอีกเว็บไซต์หนึ่ง\n\n'''[$1 ดำเนินการต่อไป $1]'''",
+ "undelete-cantedit": "คุณไม่สามารถกู้คืนหน้านี้ได้เพราะคุณไม่ได้รับอนุญาตให้แก้ไขหน้านี้",
"undelete-cantcreate": "คุณไม่สามารถกู้คืนหน้านี้เพราะไม่มีหน้าชื่อนี้อยู่ และคุณไม่ได้รับอนุญาตให้สร้างหน้านี้",
"pagedata-title": "ข้อมูลหน้า"
}
"LR Guanzon"
]
},
- "tog-underline": "Pagsasalungguhit ng link:",
+ "tog-underline": "Pagsasalungguhit ng kawing:",
"tog-hideminor": "Itago ang mga maliliit na pagbabago mula sa mga huling pagbabago",
"tog-hidepatrolled": "Itago ang mga napatrolyang pagbabago mula sa mga huling pagbabago",
"tog-newpageshidepatrolled": "Itago ang mga napatrolyang pahina mula talaan ng bagong pahina",
"history_small": "kasaysayan",
"updatedmarker": "isinapanahon mula noong huli kong pagdalaw",
"printableversion": "Bersiyong maililimbag",
- "permalink": "Permanenteng link",
+ "permalink": "Permanenteng kawing",
"print": "Ilimbag",
"view": "Tingnan",
"view-foreign": "Tingnan sa $1",
"pagetitle": "$1 - {{SITENAME}}",
"pagetitle-view-mainpage": "{{SITENAME}}",
"backlinksubtitle": "← $1",
- "retrievedfrom": "Ikinuha mula sa \"$1\"",
- "youhavenewmessages": "Mayroon kang $1 ($2).",
- "youhavenewmessagesfromusers": "{{PLURAL:$4|Mayroon kang}} $1 magmula sa {{PLURAL:$3|ibang tagagamit|$3 mga tagagamit}} ($2).",
- "youhavenewmessagesmanyusers": "Mayroon kang $1 magmula sa maraming mga tagagamit ($2).",
+ "retrievedfrom": "Kinuha mula sa \"$1\"",
+ "youhavenewmessages": "{{PLURAL:$3|Mayroon kang}} $1 ($2).",
+ "youhavenewmessagesfromusers": "{{PLURAL:$4|Mayroon kang}} $1 mula sa {{PLURAL:$3|ibang tagagamit|$3 mga tagagamit}} ($2).",
+ "youhavenewmessagesmanyusers": "Mayroon kang $1 mula sa maraming tagagamit ($2).",
"newmessageslinkplural": "{{PLURAL:$1|isang bagong mensahe|999=bagong mensahe}}",
"newmessagesdifflinkplural": "huling {{PLURAL:$1|pagbabago|999=mga pagbabago}}",
"youhavenewmessagesmulti": "Mayroon kang mga bagong mensahe sa $1",
"nosuchusershort": "Walang tagagamit na may pangalang \"$1\".\nPakitingnan ang iyong pagbabaybay.",
"nouserspecified": "Kailangang tukuyin mo ang isang pangalang pantagagamit.",
"login-userblocked": "Hinarang ang tagagamit na ito. Hindi pinahihintulutan ang paglalagda.",
- "wrongpassword": "Mali ang ipinasok na password.\nPakisubok muli.",
+ "wrongpassword": "Mali ang ipinasok na password o pangalan ng tagagamit.\nPakisubok muli.",
"wrongpasswordempty": "Walang laman ang ipinasok na password.\nPakisubok muli.",
"passwordtooshort": "Ang mga password ay dapat mayroong {{PLURAL:$1|1 panitik|$1 panitik}} (karakter).",
"passwordtoolong": "Ang mga password ay hindi maaaring mas mahaba sa {{PLURAL:$1|1 panitik|$1 panitik}}.",
"anoneditwarning": "<stromg>Babala:</strong> Hindi ka nakalagda.\nMakikita ng publiko ang iyong IP address kung gagawa ka ng mga pagbabago. Kung <strong>[$1 mag-login]</strong> ka o <strong>[$2 lumikha ng account]</strong>, maiuugnay ang iyong mga pagbabago sa iyong account, kasama ang ibang pakinabang.",
"anonpreviewwarning": "''Hindi ka nakalagda. Itatala sa inyong pagtatala ang inyong direksiyong IP sa kasaysayan ng pagbabago ng pahinang ito.''",
"missingsummary": "'''Paalala:''' Hindi ka nagbigay ng buod ng pagbabago.\nKapag pinindot mo uli ang Sagip, masasagip ang pagbabago mo na wala nito.",
- "missingcommenttext": "Magbigay ng isang kumento/puna sa ibaba.",
+ "missingcommenttext": "Maaaring magbigay ng komento.",
"missingcommentheader": "'''Paalala:''' Hindi ka nagbigay ng isang paksa/paulo para sa punang ito.\nKapag pinindot mo uli ang \"$1\", masasagip ang pagbabago mo na wala nito.",
"summary-preview": "Paunang tingin sa buod:",
"subject-preview": "Paunang tingin sa paksa:",
"continue-editing": "Pumunta sa pook ng pamamatnugot",
"previewconflict": "Ipinamamalas ng paunang tinging ito ang teksto sa loob ng pangitaas na pook-patnugutan ng teksto ayon sa lilitaw na anyo nito kapag pinili mo ang pagsagip.",
"session_fail_preview": "Paumanhin! Hindi namin maproseso ang iyong pagbabago hinggil sa pagkawala ng datos ng sesyon.\n\nIkaw ay maaaring nailagda palabas. <strong>Maaaring patunayan na ikaw ay nakalagda pa rin at subukang muli</strong>.\nKung hindi ito gumana, subukang [[Special:UserLogout|umalis sa pagkalagda]] at bumalik muli, at tingnan kung ang iyong browser ay pumapayag sa mga cookie mula sa site na ito.",
- "session_fail_preview_html": "'''Paumanhin! Hindi namin maproseso ang iyong pagbabago hinggil sa pagkawala ng datos ng sesyon.'''\n\n''Dahil naka-andar ang hilaw na HTML sa {{SITENAME}}, nakatago ang paunang tingin bilang pag-iingat sa mga paglusob ng JavaScript.''\n\n'''Kung lehitimong pagbabago ito, paki-ulit muli.'''\nKung hindi pa rin ito gumagana, subukang [[Special:UserLogout|mag-logout]] at mag-login muli.",
+ "session_fail_preview_html": "Paumanhin! Hindi namin maproseso ang iyong pagbabago hinggil sa pagkawala ng datos ng sesyon.\n\n<em>Dahil naka-andar ang hilaw na HTML sa {{SITENAME}}, nakatago ang paunang tingin bilang pag-iingat sa mga paglusob ng JavaScript.</em>\n\n<strong>Kung lehitimong pagbabago ito, paki-ulit muli.</strong>\nKung hindi pa rin ito gumagana, subukang [[Special:UserLogout|mag-logout]] at mag-login muli, at pakitingnan kung pinapayagan ng iyong browser ang mga cookie mula sa site na ito.",
"token_suffix_mismatch": "'''Hindi tinanggap ang iyong pagbabago dahil sinira ng kliyente ang mga karakter na bantas sa ''token'' ng mamatnugot.\nTinanggihan ang pagbabago upang maiwasan ang korapsyon ng teksto ng artikulo.\nKadalasang nangyayari ito kapag gumagamit ka ng masurot na serbisyo ng hindi-nakikilalang apoderadong (''anonymous proxy'') nasa web.",
"edit_form_incomplete": "'''Ilan sa mga bahagi ng pormularyong pampatnugot ay hindi nakarating sa tagapaghain; suriing muli na ang iyong mga pagbabago ay buo at subukang muli.'''",
"editing": "Binabago ang $1",
"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."
}
"recentchanges-legend-heading": "<strong>Gösterge:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ayrıca [[Special:NewPages|yeni sayfalar listesine]] bakınız)",
"recentchanges-submit": "Göster",
+ "rcfilters-other-review-tools": "Diğer inceleme araçları",
"rcfilters-group-results-by-page": "Sayfalandırılmış grup sonuçları",
"rcfilters-activefilters": "Etkin süzgeçler",
"rcfilters-advancedfilters": "Gelişmiş süzgeçler",
+ "rcfilters-limit-title": "Gösterilecek sonuçlar",
+ "rcfilters-days-title": "Son günler",
+ "rcfilters-hours-title": "Son saatler",
"rcfilters-quickfilters": "Kaydedilmiş süzgeçler",
"rcfilters-quickfilters-placeholder-title": "Henüz hiçbir süzgeç kaydedilmedi",
"rcfilters-quickfilters-placeholder-description": "Süzgeç ayarlarınızı kaydetmek ve sonrasında bunları kullanmak için, aşağıda Aktif Süzgeçler alanındaki yer imi simgesine tıklayın.",
"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": "صارفین",
"right-nominornewtalk": "تبادلۂ خیال صفحات میں معمولی ترامیم کرنے پر نئے پیغام کے اعلان کی عدم نمائش",
"right-apihighlimits": "API کا بڑے پیمانے پر استعمال",
"right-writeapi": "اے پی آئی تحریر کا استعمال",
- "right-delete": "صÙ\81Øات ØØ°Ù\81 کرÛ\8cÚº",
+ "right-delete": "ØØ°Ù\81 صÙ\81Øات",
"right-bigdelete": "بڑے تاریخچوں پر مشتمل صفحات کی حذف شدگی",
"right-deletelogentry": "نوشتہ کے مخصوص اندراجات کی حذف شدگی و بحالی",
"right-deleterevision": "صفحات کے مخصوص نسخوں کی حذف شدگی و بحالی",
"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.",
"tog-extendwatchlist": "Ragrandi l' djivêye po mostrer tos les candjmints, nén seulmint les dierins",
"tog-usenewrc": "Relére par pådje dins les dierins candjmints et l' djivêye des shuvous (i fåt JavaScript)",
"tog-numberheadings": "Limerotaedje otomatike des tites",
- "tog-showtoolbar": "Mostrer l' bår d' usteyes e môde candjmint (JavaScript)",
- "tog-editondblclick": "Candjî les pådjes avou on dobe-clitch (JavaScript)",
- "tog-editsectiononrightclick": "Candjî les seccions avou on dobe-clitch sol tite (JavaScript)",
- "tog-watchcreations": "Mete les pådjes ki dj' askepeye dins l' djivêye des pådjes shuvowes",
- "tog-watchdefault": "Shuve les årtikes ki dj' fwai ou ki dj' candje",
- "tog-watchmoves": "Radjouter a m' djivêye des shuvous les pådjes ki dji displaece",
- "tog-watchdeletion": "Radjouter a m' djivêye des shuvous les pådjes ki dji disface",
+ "tog-showtoolbar": "Mostrer l' bår d' usteyes e môde candjmint",
+ "tog-editondblclick": "Candjî les pådjes avou on dobe-clitch",
+ "tog-editsectiononrightclick": "Candjî les seccions avou on dobe-clitch so les tites",
+ "tog-watchcreations": "Radjouter a m' djivêye des shuvous les pådjes ki dj' askepeye et les fitchîs ki dj' eberwete",
+ "tog-watchdefault": "Radjouter a m' djivêye des shuvous les pådjes et les fitchîs ki dj' candje",
+ "tog-watchmoves": "Radjouter a m' djivêye des shuvous les pådjes et les fitchîs ki dji displaece",
+ "tog-watchdeletion": "Radjouter a m' djivêye des shuvous les pådjes et les fitchîs ki dji disface",
+ "tog-watchuploads": "Radjouter a m' djivêye des shuvous les fitchîs ki dj' eberwete",
+ "tog-watchrollback": "Radjouter a m' djivêye des shuvous les pådjes wice ki dj' a disfé on candjmint",
"tog-minordefault": "Prémete mes candjmints come mineurs",
"tog-previewontop": "Prévey l' årtike å dzeu del boesse d' aspougnaedje",
"tog-previewonfirst": "Prévey l' årtike å prumî candjmint",
- "tog-enotifwatchlistpages": "M' emiler cwand ene pådje shuvowe candje",
- "tog-enotifusertalkpages": "M' emiler cwand l' pådje di copene da minne candje",
- "tog-enotifminoredits": "M' emiler eto po les ptits candjmints",
+ "tog-enotifwatchlistpages": "M' emiler cwand ene pådje u on fitchî d' èm djivêye des shuvous candje",
+ "tog-enotifusertalkpages": "M' emiler cwand m' pådje di copene da minne candje",
+ "tog-enotifminoredits": "M' emiler eto po les ptits candjmints des pådjes u des fitchîs",
"tog-enotifrevealaddr": "Mostrer mi adresse emile dins les emiles di notifiaedje",
"tog-shownumberswatching": "Mostrer l' nombe d' uzeus ki shuvèt l' pådje",
"tog-oldsig": "Siné pol moumint:",
"welcomeuser": "Bénvnowe, $1!",
"yourname": "Vosse no d' elodjaedje:",
"userlogin-yourname": "No d' uzeu",
+ "userlogin-yourname-ph": "Tapez vosse no d' uzeu",
"yourpassword": "Vosse sicret",
"userlogin-yourpassword": "Sicret",
"yourpasswordagain": "Ritapez vosse sicret",
"rightslog": "Djournå des droets des uzeus",
"rightslogtext": "Çouchal, c' est on djournå des candjmints des droets des uzeus.",
"action-read": "lére cisse pådje ci",
- "action-edit": "candjî l' pådje",
+ "action-edit": "candjî cisse pådje ci",
"action-createpage": "ahiver des pådjes",
"action-createtalk": "ahiver des pådjes di copinaedje",
"action-createaccount": "ahiver ci conte d' uzeu ci",
"action-protect": "candjî les liveas d' protedjaedje del pådje",
"action-autopatrol": "aveur vosse candjmint marké come ricoridjî",
"nchanges": "$1 {{PLURAL:$1|candjmint|candjmints}}",
+ "enhancedrc-history": "Istwere",
"recentchanges": "Dierins candjmints",
"recentchanges-legend": "Tchuzes po les dierins candjmints",
"recentchanges-summary": "Shuvoz chal les dierins candjmints k' i gn a yeu dsu {{SITENAME}}.",
"uploadnewversion-linktext": "Eberweter ene nouve modêye di ci fitchî ci",
"shared-repo-from": "vént d' $1",
"shared-repo": "on depot pårtaedjî",
+ "upload-disallowed-here": "Vos n' ploz nén språtchî ci fitchî ci.",
"filerevert": "Rimete come divant $1",
"filerevert-legend": "Rapexhî l' fitchî",
"filerevert-intro": "Vos estoz k' alez rapexhî l' fitchî <strong>[[Media:$1|$1]]</strong> al [$4 modêye do $3, a $2].",
"contributions": "Ovraedjes di l' {{GENDER:$1|uzeu|uzeuse}}",
"contributions-title": "Djivêye des ovraedjes di l' {{GENDER:$1|uzeu|uzeuse}} $1",
"mycontris": "Mi ovraedje",
+ "anoncontribs": "Mi ovraedje",
"contribsub2": "Po l' uzeu $1 ($2)",
"nocontribs": "Nou candjmint di trové ki corespondreut a ç' critere la.",
"uctop": "(dierinne)",
"feedback-message": "Messaedje",
"feedback-subject": "Sudjet",
"feedback-submit": "Evoyî",
- "searchsuggest-search": "Cweri",
+ "searchsuggest-search": "Cweri so {{SITENAME}}",
"searchsuggest-containing": "ki contént...",
"api-error-emptypage": "C' est nén permetou d' ahiver ene novele pådje et l' leyî vude.",
"api-error-stashfailed": "Aroke divintrinne : li sierveu a pierdou les dnêyes provizweres",
"rcfilters-filter-excluded": "אויסגעשלאסן",
"rcfilters-tag-prefix-namespace-inverted": "<strong>:נישט</strong> $1",
"rcfilters-liveupdates-button": "לעבעדיקע דערהיינטיקונגען",
- "rcfilters-target-page-placeholder": "×\90×²Ö·× ×\92×¢×\91×\9f ×\91×\9c×\90×\98× ×\90×\9e×¢×\9f",
+ "rcfilters-target-page-placeholder": "×\90×²Ö·× ×\92×¢×\91×\9f ×\90 ×\91×\9c×\90×\98× ×\90×\9e×¢×\9f (×\90×\93ער ק×\90×\98×¢×\92×\90ר×\99×¢)",
"rcnotefrom": "פֿאלגנד {{PLURAL:$5|איז די ענדערונג| זענען די ענדערונגען}} זײַט <strong>$3, $4</strong> (ביז <strong>$1</strong>).",
"rclistfrom": "װײַזן נײַע ענדערונגען פֿון $3 $2",
"rcshowhideminor": "$1 מינערדיגע ענדערונגען",
"limitreport-expansiondepth": "גרעסטע אויסשפרייט טיף",
"limitreport-expensivefunctioncount": "צאל פזרנישע פארזער־פֿונקציעס",
"expandtemplates": "פרואוו מוסטערן",
- "expand_templates_input": "אײַנגעבן טעקסט",
+ "expand_templates_input": "×\90×²Ö·× ×\92×¢×\91×\9f ×\95×\95×\99ק×\99×\98עקס×\98",
"expand_templates_output": "רעזולטאט",
"expand_templates_xml_output": "XML אויסגאָב",
"expand_templates_ok": "אויספֿירן",
"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": "用户名:",
"lockmanager-fail-closelock": "无法关闭“$1”的锁文件。",
"lockmanager-fail-deletelock": "无法删除“$1”的锁文件。",
"lockmanager-fail-acquirelock": "无法为“$1”获取锁。",
- "lockmanager-fail-openlock": "无法打开“$1”的锁文件。",
+ "lockmanager-fail-openlock": "无法打开“$1”的锁定文件。请确保您的上传目录正确配置,并且您的web服务器有权限写入至那个目录。参见https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory获取更多信息。",
"lockmanager-fail-releaselock": "无法为“$1”释放锁。",
"lockmanager-fail-db-bucket": "不能在$1池中联系到足够锁数据库。",
"lockmanager-fail-db-release": "不能在数据库$1上释放锁。",
"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": "使用者名稱:",
"recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
"recentchangescount": "預設顯示的編輯數:",
"prefs-help-recentchangescount": "這包含近期變更、頁面歷史以及日誌。",
- "prefs-help-watchlist-token2": "訂閱您的監視清單所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視清單,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
+ "prefs-help-watchlist-token2": "這是您的監視清單的網路訊息源所需密鑰。\n任何人只要知道密鑰就能夠讀取您的監視清單,所以請勿任意與它人共享。\n若有需要[[Special:ResetTokens|您可重設密鑰]]。",
"savedprefs": "已儲存您的偏好設定。",
"savedrights": "已儲存 {{GENDER:$1|$1}} 的使用者權限。",
"timezonelegend": "時區:",
"rcfilters-filter-user-experience-level-newcomer-label": "新手",
"rcfilters-filter-user-experience-level-newcomer-description": "少於10次編輯或4天活躍的註冊編輯者。",
"rcfilters-filter-user-experience-level-learner-label": "初學者",
- "rcfilters-filter-user-experience-level-learner-description": "比「新手」資深,但比「有經驗的使用者」資淺。",
+ "rcfilters-filter-user-experience-level-learner-description": "已註冊編輯者比「新手」資深,但比「有經驗的使用者」資淺。",
"rcfilters-filter-user-experience-level-experienced-label": "有經驗的使用者",
"rcfilters-filter-user-experience-level-experienced-description": "活躍超過30天且編輯超過500次的註冊編輯者。",
"rcfilters-filtergroup-automated": "自動化貢獻",
"uploaded-script-svg": "於已上傳的 SVG 檔案中找到可程式的腳本標籤 \"$1\"。",
"uploaded-hostile-svg": "於已上傳的 SVG 檔案的樣式標籤中找到不安全的 CSS。",
"uploaded-event-handler-on-svg": "不允許在 SVG 檔案設定 event-handler 屬性 <code>$1=\"$2\"</code>。",
- "uploaded-href-attribute-svg": "發現 SVG 檔案中的 href 屬性為 <code><$1 $2=\"$3\"></code>,僅允許連結至 http:// 或 https:// 的目標。",
+ "uploaded-href-attribute-svg": "<a> 元素僅可用來連結(href)內嵌檔案(data:)、超文本傳輸協定(http://)、超文本傳輸安全協定(https://),或是片段(#,相同文件)目標。對於其它像是 <image> 元素僅允許內嵌檔案和片段。嘗試當匯出您的 SVG 時嵌入圖片。找尋<code><$1 $2=\"$3\"></code>.",
"uploaded-href-unsafe-target-svg": "於已上傳的 SVG 檔案中找到 href 連結至不安全的資料:URI 目標為 <code><$1 $2=\"$3\"></code>。",
"uploaded-animate-svg": "於已上傳的 SVG 檔案中找到 \"animate\" 標籤可能會使用 \"from\" 屬性 <code><$1 $2=\"$3\"></code> 更改 href。",
"uploaded-setting-event-handler-svg": "於已上傳的 SVG 檔案中找到 <code><$1 $2=\"$3\"></code>,已禁止設定 event-handler 屬性。",
"uploadstash-bad-path-invalid": "路徑無效。",
"uploadstash-bad-path-unknown-type": "不明類型「$1」。",
"uploadstash-bad-path-unrecognized-thumb-name": "無法識別的縮圖名稱。",
+ "uploadstash-bad-path-no-handler": "找不到用於檔案 $2 的 MIME $1 處理器。",
+ "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-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": "拒絕存取",
"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": "以下的重新導向頁面連結的頁面不存在:",
"withoutinterwiki-legend": "字首",
"withoutinterwiki-submit": "顯示",
"fewestrevisions": "最少修訂的頁面",
- "nbytes": "$1 個位元組",
+ "nbytes": "$1{{PLURAL:$1|位元組}}",
"ncategories": "$1 個分類",
"ninterwikis": "$1 個 Interwiki 連結",
"nlinks": "$1 個連結",
"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:",
"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": "全部",
"import-mapping-subpage": "匯入做為以下頁面的子頁面:",
"import-upload-filename": "檔案名稱:",
"import-upload-username-prefix": "跨 wiki 字首:",
+ "import-assign-known-users": "分配編輯至所命名使用者已存在本地的本地使用者",
"import-comment": "評論:",
"importtext": "請使用 [[Special:Export|匯出工具]] 從來源 Wiki 匯出檔案,\n儲存至您的電腦後再上傳到這裡。",
"importstart": "正在匯入頁面...",
"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 更改頁面的內容模型]。",
"tag-mw-rollback": "回退",
"tag-mw-rollback-description": "使用回退連結回退上一編輯的編輯",
"tag-mw-undo": "撤銷",
+ "tag-mw-undo-description": "使用撤銷連結來撤銷上一筆編輯的編輯數",
"tags-title": "標籤",
"tags-intro": "此頁面列出所有可用來標示編輯內容的標籤以及這些標籤所代表的意思。",
"tags-tag": "標籤名稱",
"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> 標籤無法在一般頁面之外使用。",
"undelete-cantedit": "您無法取消刪除此頁面,由於您並不被允許編輯此頁。",
"undelete-cantcreate": "您無法取消刪除此頁面,由於使用此名稱的頁面並不存在且您並不被允許建立此頁面。",
"pagedata-title": "頁面資料",
+ "pagedata-text": "此頁面提供了至頁面的資料介面。請使用子頁面語法在 URL 裡提供頁面標題。\n* 內容協商會基於您客戶端接受標頭來套用,這代表頁面資料會以由您客戶端所首選格式來提供。",
"pagedata-not-acceptable": "查無符合的格式,支援的 MIME 類型有:$1",
"pagedata-bad-title": "無效的標題:$1。"
}
<?php
/** Ingush (ГӀалгӀай)
- *
- * To improve a translation please visit https://translatewiki.net
- *
- * @ingroup Language
- * @file
- *
- */
+*
+* To improve a translation please visit https://translatewiki.net
+*
+* @ingroup Language
+* @file
+*
+*/
$fallback = 'ru';
+
+$namespaceNames = [
+ NS_MEDIA => 'Медиа',
+ NS_SPECIAL => 'Гӏулакха',
+ NS_MAIN => '',
+ NS_TALK => 'Ювцар',
+ NS_USER => 'Доакъашхо',
+ NS_USER_TALK => 'Доакъашхочун_дувцар',
+ NS_PROJECT_TALK => '$1_ювцар',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'Файл_ювцар',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_ювцар',
+ NS_TEMPLATE => 'Ло',
+ NS_TEMPLATE_TALK => 'Ло_бувцар',
+ NS_HELP => 'Новкъостал',
+ NS_HELP_TALK => 'Новкъостал_дувцар',
+ NS_CATEGORY => 'ОагӀат',
+ NS_CATEGORY_TALK => 'ОагӀат_ювцар',
+];
'Protectedpages' => [ '頁錮' ],
'Randompage' => [ '清風翻書' ],
'Randomredirect' => [ '任渡' ],
- 'Recentchanges' => [ '近易' ],
+ 'Recentchanges' => [ '監修', '近易' ],
'Recentchangeslinked' => [ '援引' ],
'Search' => [ '尋' ],
'Shortpages' => [ '短篇' ],
}
}
-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>].',
* @ingroup Benchmark
*/
+use Wikimedia\RunningStat;
+
// @codeCoverageIgnoreStart
require_once __DIR__ . '/../Maintenance.php';
// @codeCoverageIgnoreEnd
}
// Run benchmarks
- $times = [];
+ $stat = new RunningStat();
for ( $i = 0; $i < $count; $i++ ) {
$t = microtime( true );
call_user_func_array( $bench['function'], $bench['args'] );
if ( $verbose ) {
$this->verboseRun( $i );
}
- $times[] = $t;
- }
-
- // Collect metrics
- sort( $times, SORT_NUMERIC );
- $min = $times[0];
- $max = end( $times );
- if ( $count % 2 ) {
- $median = $times[ ( $count - 1 ) / 2 ];
- } else {
- $median = ( $times[$count / 2] + $times[$count / 2 - 1] ) / 2;
+ $stat->addObservation( $t );
}
- $total = array_sum( $times );
- $mean = $total / $count;
// Name defaults to name of called function
if ( is_string( $key ) ) {
$this->addResult( [
'name' => $name,
- 'count' => $count,
- 'total' => $total,
- 'min' => $min,
- 'median' => $median,
- 'mean' => $mean,
- 'max' => $max,
+ 'count' => $stat->getCount(),
+ // Get rate per second from mean (in ms)
+ 'rate' => 1.0 / ( $stat->getMean() / 1000.0 ),
+ 'total' => $stat->getMean() * $stat->getCount(),
+ 'mean' => $stat->getMean(),
+ 'max' => $stat->max,
+ 'stddev' => $stat->getStdDev(),
'usage' => [
'mem' => memory_get_usage( true ),
'mempeak' => memory_get_peak_usage( true ),
public function addResult( $res ) {
$ret = sprintf( "%s\n %' 6s: %d\n",
$res['name'],
- 'times',
+ 'count',
$res['count']
);
-
- foreach ( [ 'total', 'min', 'median', 'mean', 'max' ] as $metric ) {
- $ret .= sprintf( " %' 6s: %6.2fms\n",
+ $ret .= sprintf( " %' 6s: %8.1f/s\n",
+ 'rate',
+ $res['rate']
+ );
+ foreach ( [ 'total', 'mean', 'max', 'stddev' ] as $metric ) {
+ $ret .= sprintf( " %' 6s: %8.2fms\n",
$metric,
$res[$metric]
);
+++ /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;
--- /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
+ * @ingroup Benchmark
+ */
+
+require_once __DIR__ . '/Benchmarker.php';
+
+/**
+ * Maintenance script that benchmarks Sanitizer methods.
+ *
+ * @ingroup Benchmark
+ */
+class BenchmarkSanitizer extends Benchmarker {
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Benchmark for Sanitizer methods.' );
+ $this->addOption( 'method', 'One of "validateEmail", "encodeAttribute", '
+ . '"safeEncodeAttribute", "removeHTMLtags", or "stripAllTags". '
+ . 'Default: (All)', false, true );
+ }
+
+ public function execute() {
+ $textWithHtmlSm = 'Before <wrap><in>and</in> another <unclose> <in>word</in></wrap>.';
+ $textWithHtmlLg = str_repeat(
+ // 28K (28 chars * 1000)
+ wfRandomString( 3 ) . ' <tag>' . wfRandomString( 5 ) . '</tag> ' . wfRandomString( 7 ),
+ 1000
+ );
+
+ $method = $this->getOption( 'method' );
+ $benches = [];
+
+ if ( !$method || $method === 'validateEmail' ) {
+ $benches['Sanitizer::validateEmail (valid)'] = function () {
+ Sanitizer::validateEmail( 'user@example.org' );
+ };
+ $benches['Sanitizer::validateEmail (invalid)'] = function () {
+ Sanitizer::validateEmail( 'username@example! org' );
+ };
+ }
+ if ( !$method || $method === 'encodeAttribute' ) {
+ $benches['Sanitizer::encodeAttribute (simple)'] = function () {
+ Sanitizer::encodeAttribute( 'simple' );
+ };
+ $benches['Sanitizer::encodeAttribute (special)'] = function () {
+ Sanitizer::encodeAttribute( ":'\"\n https://example" );
+ };
+ }
+ if ( !$method || $method === 'safeEncodeAttribute' ) {
+ $benches['Sanitizer::safeEncodeAttribute (simple)'] = function () {
+ Sanitizer::safeEncodeAttribute( 'simple' );
+ };
+ $benches['Sanitizer::safeEncodeAttribute (special)'] = function () {
+ Sanitizer::safeEncodeAttribute( ":'\"\n https://example" );
+ };
+ }
+ if ( !$method || $method === 'removeHTMLtags' ) {
+ $sm = strlen( $textWithHtmlSm );
+ $lg = round( strlen( $textWithHtmlLg ) / 1000 ) . 'K';
+ $benches["Sanitizer::removeHTMLtags (input: $sm)"] = function () use ( $textWithHtmlSm ) {
+ Sanitizer::removeHTMLtags( $textWithHtmlSm );
+ };
+ $benches["Sanitizer::removeHTMLtags (input: $lg)"] = function () use ( $textWithHtmlLg ) {
+ Sanitizer::removeHTMLtags( $textWithHtmlLg );
+ };
+ }
+ if ( !$method || $method === 'stripAllTags' ) {
+ $sm = strlen( $textWithHtmlSm );
+ $lg = round( strlen( $textWithHtmlLg ) / 1000 ) . 'K';
+ $benches["Sanitizer::stripAllTags (input: $sm)"] = function () use ( $textWithHtmlSm ) {
+ Sanitizer::stripAllTags( $textWithHtmlSm );
+ };
+ $benches["Sanitizer::stripAllTags (input: $lg)"] = function () use ( $textWithHtmlLg ) {
+ Sanitizer::stripAllTags( $textWithHtmlLg );
+ };
+ }
+
+ $this->bench( $benches );
+ }
+}
+
+$maintClass = BenchmarkSanitizer::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;
|| $title->getInterwiki()
|| !$title->canExist()
) {
- if ( $title->getInterwiki() || !$title->canExist() ) {
+ $titleImpossible = $title->getInterwiki() || !$title->canExist();
+ if ( $titleImpossible ) {
$prior = $title->getPrefixedDBkey();
} else {
$prior = $title->getDBkey();
$ns = 0;
}
- $clean = 'Broken/' . $prior;
+ if ( !$titleImpossible && !$title->exists() ) {
+ // Looks like the current title, after cleaning it up, is valid and available
+ $clean = $prior;
+ } else {
+ $clean = 'Broken/' . $prior;
+ }
$verified = Title::makeTitleSafe( $ns, $clean );
if ( !$verified || $verified->exists() ) {
$blah = "Broken/id:" . $row->page_id;
}
}
-$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;
public function getCategoryIterator( IDatabase $dbr ) {
$it = new BatchRowIterator(
$dbr,
- 'page',
+ [ 'page', 'page_props', 'category' ],
[ 'page_title' ],
$this->getBatchSize()
);
$it->addConditions( [
'page_namespace' => NS_CATEGORY,
] );
- $it->setFetchColumns( [ 'page_title', 'page_id' ] );
+ $it->setFetchColumns( [
+ 'page_title',
+ 'page_id',
+ 'pp_propname',
+ 'cat_pages',
+ 'cat_subcats',
+ 'cat_files'
+ ] );
+ $it->addJoinConditions(
+ [
+ 'page_props' => [
+ 'LEFT JOIN', [ 'pp_propname' => 'hiddencat', 'pp_page = page_id' ]
+ ],
+ 'category' => [
+ 'LEFT JOIN', [ 'cat_title = page_title' ]
+ ]
+ ]
+
+ );
return $it;
}
return new RecursiveIteratorIterator( $it );
}
+ /**
+ * @param int $timestamp
+ */
public function addDumpHeader( $timestamp ) {
global $wgRightsUrl;
$licenseUrl = $wgRightsUrl;
foreach ( $this->getCategoryIterator( $dbr ) as $batch ) {
$pages = [];
foreach ( $batch as $row ) {
- $this->categoriesRdf->writeCategoryData( $row->page_title );
+ $this->categoriesRdf->writeCategoryData(
+ $row->page_title,
+ $row->pp_propname === 'hiddencat',
+ (int)$row->cat_pages - (int)$row->cat_subcats - (int)$row->cat_files,
+ (int)$row->cat_subcats
+ );
$pages[$row->page_id] = $row->page_title;
}
}
}
-$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;
--- /dev/null
+--
+-- patch-comment-table.sql
+--
+-- T166732. Add a `comment` table and various columns (and temporary tables) to reference it.
+
+CREATE TABLE /*_*/comment (
+ comment_id bigint unsigned NOT NULL PRIMARY KEY IDENTITY(0,1),
+ comment_hash INT NOT NULL,
+ comment_text nvarchar(max) NOT NULL,
+ comment_data nvarchar(max)
+);
+CREATE INDEX /*i*/comment_hash ON /*_*/comment (comment_hash);
+
+-- dummy row for FKs. Hash is intentionally wrong so CommentStore won't match it.
+INSERT INTO /*_*/comment (comment_hash, comment_text) VALUES (-1, '** dummy **');
+
+
+CREATE TABLE /*_*/revision_comment_temp (
+ revcomment_rev INT NOT NULL CONSTRAINT FK_revcomment_rev FOREIGN KEY REFERENCES /*_*/revision(rev_id) ON DELETE CASCADE,
+ revcomment_comment_id bigint unsigned NOT NULL CONSTRAINT FK_revcomment_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
+ CONSTRAINT PK_revision_comment_temp PRIMARY KEY (revcomment_rev, revcomment_comment_id)
+);
+CREATE UNIQUE INDEX /*i*/revcomment_rev ON /*_*/revision_comment_temp (revcomment_rev);
+
+
+CREATE TABLE /*_*/image_comment_temp (
+ imgcomment_name nvarchar(255) NOT NULL CONSTRAINT FK_imgcomment_name FOREIGN KEY REFERENCES /*_*/image(imgcomment_name) ON DELETE CASCADE,
+ imgcomment_description_id bigint unsigned NOT NULL CONSTRAINT FK_imgcomment_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
+ CONSTRAINT PK_image_comment_temp PRIMARY KEY (imgcomment_name, imgcomment_description_id)
+);
+CREATE UNIQUE INDEX /*i*/imgcomment_name ON /*_*/image_comment_temp (imgcomment_name);
+
+
+ALTER TABLE /*_*/revision ADD CONSTRAINT DF_rev_comment DEFAULT '' FOR rev_comment;
+
+ALTER TABLE /*_*/archive ADD CONSTRAINT DF_ar_comment DEFAULT '' FOR ar_comment;
+ALTER TABLE /*_*/archive ADD ar_comment_id bigint unsigned NOT NULL CONSTRAINT DF_ar_comment_id DEFAULT 0 CONSTRAINT FK_ar_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
+
+ALTER TABLE /*_*/ipblocks ADD CONSTRAINT DF_ipb_reason DEFAULT '' FOR ipb_reason;
+ALTER TABLE /*_*/ipblocks ADD ipb_reason_id bigint unsigned NOT NULL CONSTRAINT DF_ipb_reason_id DEFAULT 0 CONSTRAINT FK_ipb_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
+
+ALTER TABLE /*_*/image ADD CONSTRAINT DF_img_description DEFAULT '' FOR img_description;
+
+ALTER TABLE /*_*/oldimage ADD CONSTRAINT DF_oi_description DEFAULT '' FOR oi_description;
+ALTER TABLE /*_*/oldimage ADD oi_description_id bigint unsigned NOT NULL CONSTRAINT DF_oi_description_id DEFAULT 0 CONSTRAINT FK_oi_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
+
+ALTER TABLE /*_*/filearchive ADD CONSTRAINT DF_fa_deleted_reason DEFAULT '' FOR fa_deleted_reason;
+ALTER TABLE /*_*/filearchive ADD fa_deleted_reason_id bigint unsigned NOT NULL CONSTRAINT DF_fa_deleted_reason_id DEFAULT 0 CONSTRAINT FK_fa_deleted_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
+ALTER TABLE /*_*/filearchive ADD CONSTRAINT DF_fa_description DEFAULT '' FOR fa_description;
+ALTER TABLE /*_*/filearchive ADD fa_description_id bigint unsigned NOT NULL CONSTRAINT DF_fa_description_id DEFAULT 0 CONSTRAINT FK_fa_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
+
+ALTER TABLE /*_*/recentchanges ADD rc_comment_id bigint unsigned NOT NULL CONSTRAINT DF_rc_comment_id DEFAULT 0 CONSTRAINT FK_rc_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
+
+ALTER TABLE /*_*/logging ADD log_comment_id bigint unsigned NOT NULL CONSTRAINT DF_log_comment_id DEFAULT 0 CONSTRAINT FK_log_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
+
+ALTER TABLE /*_*/protected_titles ADD CONSTRAINT DF_pt_reason DEFAULT '' FOR pt_reason;
+ALTER TABLE /*_*/protected_titles ADD pt_reason_id bigint unsigned NOT NULL CONSTRAINT DF_pt_reason_id DEFAULT 0 CONSTRAINT FK_pt_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
);
+--
+-- Edits, blocks, and other actions typically have a textual comment describing
+-- the action. They are stored here to reduce the size of the main tables, and
+-- to allow for deduplication.
+--
+-- Deduplication is currently best-effort to avoid locking on inserts that
+-- would be required for strict deduplication. There MAY be multiple rows with
+-- the same comment_text and comment_data.
+--
+CREATE TABLE /*_*/comment (
+ comment_id bigint unsigned NOT NULL PRIMARY KEY IDENTITY(0,1),
+ comment_hash INT NOT NULL,
+ comment_text nvarchar(max) NOT NULL,
+ comment_data nvarchar(max)
+);
+-- Index used for deduplication.
+CREATE INDEX /*i*/comment_hash ON /*_*/comment (comment_hash);
+
+-- dummy row for FKs. Hash is intentionally wrong so CommentStore won't match it.
+INSERT INTO /*_*/comment (comment_hash, comment_text) VALUES (-1, '** dummy **');
+
+
--
-- Core of the wiki: each page has an entry here which identifies
-- it by title and contains some essential metadata.
rev_id INT NOT NULL UNIQUE IDENTITY(0,1),
rev_page INT NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
rev_text_id INT NOT NULL, -- FK added later
- rev_comment NVARCHAR(255) NOT NULL,
+ rev_comment NVARCHAR(255) NOT NULL CONSTRAINT DF_rev_comment DEFAULT '',
rev_user INT REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
rev_user_text NVARCHAR(255) NOT NULL DEFAULT '',
rev_timestamp varchar(14) NOT NULL default '',
ALTER TABLE /*_*/page ADD CONSTRAINT FK_page_latest_page_id FOREIGN KEY (page_latest) REFERENCES /*_*/revision(rev_id);
+--
+-- Temporary table to avoid blocking on an alter of revision.
+--
+-- On large wikis like the English Wikipedia, altering the revision table is a
+-- months-long process. This table is being created to avoid such an alter, and
+-- will be merged back into revision in the future.
+--
+CREATE TABLE /*_*/revision_comment_temp (
+ revcomment_rev INT NOT NULL CONSTRAINT FK_revcomment_rev FOREIGN KEY REFERENCES /*_*/revision(rev_id) ON DELETE CASCADE,
+ revcomment_comment_id bigint unsigned NOT NULL CONSTRAINT FK_revcomment_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
+ CONSTRAINT PK_revision_comment_temp PRIMARY KEY (revcomment_rev, revcomment_comment_id)
+);
+CREATE UNIQUE INDEX /*i*/revcomment_rev ON /*_*/revision_comment_temp (revcomment_rev);
+
--
-- Holds TEXT of individual page revisions.
--
ar_namespace SMALLINT NOT NULL DEFAULT 0,
ar_title NVARCHAR(255) NOT NULL DEFAULT '',
ar_text NVARCHAR(MAX) NOT NULL,
- ar_comment NVARCHAR(255) NOT NULL,
+ ar_comment NVARCHAR(255) NOT NULL CONSTRAINT DF_ar_comment DEFAULT '',
+ ar_comment_id bigint unsigned NOT NULL CONSTRAINT DF_ar_comment_id DEFAULT 0 CONSTRAINT FK_ar_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
ar_user INT CONSTRAINT ar_user__user_id__fk FOREIGN KEY REFERENCES /*_*/mwuser(user_id),
ar_user_text NVARCHAR(255) NOT NULL,
ar_timestamp varchar(14) NOT NULL default '',
ipb_by_text nvarchar(255) NOT NULL default '',
-- Text comment made by blocker.
- ipb_reason nvarchar(255) NOT NULL,
+ ipb_reason nvarchar(255) NOT NULL CONSTRAINT DF_ipb_reason DEFAULT '',
+
+ -- Key to comment_id. Text comment made by blocker.
+ -- ("DEFAULT 0" is temporary, signaling that ipb_reason should be used)
+ ipb_reason_id bigint unsigned NOT NULL CONSTRAINT DF_ipb_reason_id DEFAULT 0 CONSTRAINT FK_ipb_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-- Creation (or refresh) date in standard YMDHMS form.
-- IP blocks expire automatically.
-- Description field as entered by the uploader.
-- This is displayed in image upload history and logs.
- img_description nvarchar(255) NOT NULL,
+ img_description nvarchar(255) NOT NULL CONSTRAINT DF_img_description DEFAULT '',
-- user_id and user_name of uploader.
img_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
-- Used to get media of one type
CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
+--
+-- Temporary table to avoid blocking on an alter of image.
+--
+-- On large wikis like Wikimedia Commons, altering the image table is a
+-- months-long process. This table is being created to avoid such an alter, and
+-- will be merged back into image in the future.
+--
+CREATE TABLE /*_*/image_comment_temp (
+ imgcomment_name nvarchar(255) NOT NULL CONSTRAINT FK_imgcomment_name FOREIGN KEY REFERENCES /*_*/image(imgcomment_name) ON DELETE CASCADE,
+ imgcomment_description_id bigint unsigned NOT NULL CONSTRAINT FK_imgcomment_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
+ CONSTRAINT PK_image_comment_temp PRIMARY KEY (imgcomment_name, imgcomment_description_id)
+);
+CREATE UNIQUE INDEX /*i*/imgcomment_name ON /*_*/image_comment_temp (imgcomment_name);
+
--
-- Previous revisions of uploaded files.
oi_width int NOT NULL default 0,
oi_height int NOT NULL default 0,
oi_bits int NOT NULL default 0,
- oi_description nvarchar(255) NOT NULL,
+ oi_description nvarchar(255) NOT NULL CONSTRAINT DF_oi_description DEFAULT '',
+ oi_description_id bigint unsigned NOT NULL CONSTRAINT DF_oi_description_id DEFAULT 0 CONSTRAINT FK_oi_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
oi_user int REFERENCES /*_*/mwuser(user_id),
oi_user_text nvarchar(255) NOT NULL,
oi_timestamp varchar(14) NOT NULL default '',
-- Deletion information, if this file is deleted.
fa_deleted_user int,
fa_deleted_timestamp varchar(14) default '',
- fa_deleted_reason nvarchar(max),
+ fa_deleted_reason nvarchar(max) CONSTRAINT DF_fa_deleted_reason DEFAULT '',
+ fa_deleted_reason_id bigint unsigned NOT NULL CONSTRAINT DF_fa_deleted_reason_id DEFAULT 0 CONSTRAINT FK_fa_deleted_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-- Duped fields from image
fa_size int default 0,
fa_media_type varchar(16) default null,
fa_major_mime varchar(16) not null default 'unknown',
fa_minor_mime nvarchar(100) default 'unknown',
- fa_description nvarchar(255),
+ fa_description nvarchar(255) CONSTRAINT DF_fa_description DEFAULT '',
+ fa_description_id bigint unsigned NOT NULL CONSTRAINT DF_fa_description DEFAULT 0 CONSTRAINT FK_fa_description FOREIGN KEY REFERENCES /*_*/comment(comment_id),
fa_user int default 0 REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
fa_user_text nvarchar(255),
fa_timestamp varchar(14) default '',
-- as in revision...
rc_comment nvarchar(255) NOT NULL default '',
+ rc_comment_id bigint unsigned NOT NULL CONSTRAINT DF_rc_comment_id DEFAULT 0 CONSTRAINT FK_rc_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
rc_minor bit NOT NULL default 0,
-- Edits by user accounts with the 'bot' rights key are
-- Freeform text. Interpreted as edit history comments.
log_comment nvarchar(255) NOT NULL default '',
+ -- Key to comment_id. Comment summarizing the change.
+ -- ("DEFAULT 0" is temporary, signaling that log_comment should be used)
+ log_comment_id bigint unsigned NOT NULL CONSTRAINT DF_log_comment_id DEFAULT 0 CONSTRAINT FK_log_comment_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
+
-- miscellaneous parameters:
-- LF separated list (old system) or serialized PHP array (new system)
log_params nvarchar(max) NOT NULL,
pt_namespace int NOT NULL,
pt_title nvarchar(255) NOT NULL,
pt_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
- pt_reason nvarchar(255),
+ pt_reason nvarchar(255) CONSTRAINT DF_pt_reason DEFAULT '',
+ pt_reason_id bigint unsigned NOT NULL CONSTRAINT DF_pt_reason_id DEFAULT 0 CONSTRAINT FK_pt_reason_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
pt_timestamp varchar(14) NOT NULL,
pt_expiry varchar(14) NOT NULL,
pt_create_perm nvarchar(60) NOT NULL
}
}
-$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;
--- /dev/null
+--
+-- patch-comment-table.sql
+--
+-- T166732. Add a `comment` table and various columns (and temporary tables) to reference it.
+
+CREATE SEQUENCE comment_comment_id_seq;
+CREATE TABLE &mw_prefix."COMMENT" (
+ comment_id NUMBER NOT NULL,
+ comment_hash NUMBER NOT NULL,
+ comment_text CLOB,
+ comment_data CLOB
+);
+CREATE INDEX &mw_prefix.comment_hash ON &mw_prefix."COMMENT" (comment_hash);
+/*$mw$*/
+CREATE TRIGGER &mw_prefix.comment_seq_trg BEFORE INSERT ON &mw_prefix."COMMENT"
+ FOR EACH ROW WHEN (new.comment_id IS NULL)
+BEGIN
+ &mw_prefix.lastval_pkg.setLastval(comment_comment_id_seq.nextval, :new.comment_id);
+END;
+/*$mw$*/
+
+-- dummy row for FKs. Hash is intentionally wrong so CommentStore won't match it.
+INSERT INTO &mw_prefix."COMMENT" (comment_hash, comment_text) VALUES (-1, '** dummy **');
+
+
+CREATE TABLE &mw_prefix.revision_comment_temp (
+ revcomment_rev NUMBER NOT NULL,
+ revcomment_comment_id NUMBER NOT NULL
+);
+ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_pk PRIMARY KEY (revcomment_rev, revcomment_comment_id);
+ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_fk1 FOREIGN KEY (revcomment_rev) REFERENCES &mw_prefix.revision(rev_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_fk2 FOREIGN KEY (revcomment_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+CREATE UNIQUE INDEX &mw_prefix.revcomment_rev ON &mw_prefix.revision_comment_temp (revcomment_rev);
+
+
+CREATE TABLE &mw_prefix.image_comment_temp (
+ imgcomment_name VARCHAR2(255) NOT NULL,
+ imgcomment_description_id NUMBER NOT NULL
+);
+ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_pk PRIMARY KEY (imgcomment_name, imgcomment_description_id);
+ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_fk1 FOREIGN KEY (imgcomment_name) REFERENCES &mw_prefix.image(img_name) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_fk2 FOREIGN KEY (imgcomment_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+CREATE UNIQUE INDEX &mw_prefix.imgcomment_name ON &mw_prefix.image_comment_temp (imgcomment_name);
+
+
+ALTER TABLE &mw_prefix.archive ADD COLUMN ar_comment_id NUMBER DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk2 FOREIGN KEY (ar_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
+ALTER TABLE &mw_prefix.ipblocks ALTER COLUMN ipb_reason VARCHAR2(255) NULL;
+ALTER TABLE &mw_prefix.ipblocks ADD COLUMN ipb_reason_id NUMBER DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk3 FOREIGN KEY (ipb_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
+ALTER TABLE &mw_prefix.oldimage ADD COLUMN oi_description_id NUMBER DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk3 FOREIGN KEY (oi_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
+ALTER TABLE &mw_prefix.filearchive ADD COLUMN fa_deleted_reason_id NUMBER DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.filearchive ADD COLUMN fa_description_id NUMBER DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk3 FOREIGN KEY (fa_deleted_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk4 FOREIGN KEY (fa_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
+ALTER TABLE &mw_prefix.recentchanges ADD COLUMN rc_comment_id NUMBER DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk3 FOREIGN KEY (rc_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
+ALTER TABLE &mw_prefix.logging ADD COLUMN log_comment_id NUMBER DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk2 FOREIGN KEY (log_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+
+ALTER TABLE &mw_prefix.protected_titles ADD COLUMN pt_reason_id NUMBER DEFAULT 0 NOT NULL;
+ALTER TABLE &mw_prefix.protected_titles ADD CONSTRAINT &mw_prefix.protected_titles_fk1 FOREIGN KEY (pt_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
END;
/*$mw$*/
+CREATE SEQUENCE comment_comment_id_seq;
+CREATE TABLE &mw_prefix."COMMENT" (
+ comment_id NUMBER NOT NULL,
+ comment_hash NUMBER NOT NULL,
+ comment_text CLOB,
+ comment_data CLOB
+);
+CREATE INDEX &mw_prefix.comment_hash ON &mw_prefix."COMMENT" (comment_hash);
+/*$mw$*/
+CREATE TRIGGER &mw_prefix.comment_seq_trg BEFORE INSERT ON &mw_prefix."COMMENT"
+ FOR EACH ROW WHEN (new.comment_id IS NULL)
+BEGIN
+ &mw_prefix.lastval_pkg.setLastval(comment_comment_id_seq.nextval, :new.comment_id);
+END;
+/*$mw$*/
+
+-- dummy row for FKs. Hash is intentionally wrong so CommentStore won't match it.
+INSERT INTO &mw_prefix."COMMENT" (comment_hash, comment_text) VALUES (-1, '** dummy **');
+
CREATE SEQUENCE revision_rev_id_seq;
CREATE TABLE &mw_prefix.revision (
rev_id NUMBER NOT NULL,
END;
/*$mw$*/
+CREATE TABLE &mw_prefix.revision_comment_temp (
+ revcomment_rev NUMBER NOT NULL,
+ revcomment_comment_id NUMBER NOT NULL
+);
+ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_pk PRIMARY KEY (revcomment_rev, revcomment_comment_id);
+ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_fk1 FOREIGN KEY (revcomment_rev) REFERENCES &mw_prefix.revision(rev_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.revision_comment_temp ADD CONSTRAINT &mw_prefix.revision_comment_temp_fk2 FOREIGN KEY (revcomment_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+CREATE UNIQUE INDEX &mw_prefix.revcomment_rev ON &mw_prefix.revision_comment_temp (revcomment_rev);
+
CREATE SEQUENCE text_old_id_seq;
CREATE TABLE &mw_prefix.pagecontent ( -- replaces reserved word 'text'
old_id NUMBER NOT NULL,
ar_title VARCHAR2(255) NOT NULL,
ar_text CLOB,
ar_comment VARCHAR2(255),
+ ar_comment_id NUMBER DEFAULT 0 NOT NULL,
ar_user NUMBER DEFAULT 0 NOT NULL,
ar_user_text VARCHAR2(255) NOT NULL,
ar_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
);
ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id);
ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk2 FOREIGN KEY (ar_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp);
CREATE INDEX &mw_prefix.archive_i02 ON &mw_prefix.archive (ar_user_text,ar_timestamp);
CREATE INDEX &mw_prefix.archive_i03 ON &mw_prefix.archive (ar_rev_id);
ipb_user NUMBER DEFAULT 0 NOT NULL,
ipb_by NUMBER DEFAULT 0 NOT NULL,
ipb_by_text VARCHAR2(255) NULL,
- ipb_reason VARCHAR2(255) NOT NULL,
+ ipb_reason VARCHAR2(255) NULL,
+ ipb_reason_id NUMBER DEFAULT 0 NOT NULL,
ipb_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
ipb_auto CHAR(1) DEFAULT '0' NOT NULL,
ipb_anon_only CHAR(1) DEFAULT '0' NOT NULL,
ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_pk PRIMARY KEY (ipb_id);
ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk1 FOREIGN KEY (ipb_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk2 FOREIGN KEY (ipb_by) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk3 FOREIGN KEY (ipb_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.ipblocks_u01 ON &mw_prefix.ipblocks (ipb_address, ipb_user, ipb_auto, ipb_anon_only);
CREATE INDEX &mw_prefix.ipblocks_i01 ON &mw_prefix.ipblocks (ipb_user);
CREATE INDEX &mw_prefix.ipblocks_i02 ON &mw_prefix.ipblocks (ipb_range_start, ipb_range_end);
CREATE INDEX &mw_prefix.image_i03 ON &mw_prefix.image (img_timestamp);
CREATE INDEX &mw_prefix.image_i04 ON &mw_prefix.image (img_sha1);
+CREATE TABLE &mw_prefix.image_comment_temp (
+ imgcomment_name VARCHAR2(255) NOT NULL,
+ imgcomment_description_id NUMBER NOT NULL
+);
+ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_pk PRIMARY KEY (imgcomment_name, imgcomment_description_id);
+ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_fk1 FOREIGN KEY (imgcomment_name) REFERENCES &mw_prefix.image(img_name) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.image_comment_temp ADD CONSTRAINT &mw_prefix.image_comment_temp_fk2 FOREIGN KEY (imgcomment_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+CREATE UNIQUE INDEX &mw_prefix.imgcomment_name ON &mw_prefix.image_comment_temp (imgcomment_name);
+
CREATE TABLE &mw_prefix.oldimage (
oi_name VARCHAR2(255) DEFAULT 0 NOT NULL,
oi_height NUMBER DEFAULT 0 NOT NULL,
oi_bits NUMBER DEFAULT 0 NOT NULL,
oi_description VARCHAR2(255),
+ oi_description_id NUMBER DEFAULT 0 NOT NULL,
oi_user NUMBER DEFAULT 0 NOT NULL,
oi_user_text VARCHAR2(255) NOT NULL,
oi_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
);
ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk1 FOREIGN KEY (oi_name) REFERENCES &mw_prefix.image(img_name) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk2 FOREIGN KEY (oi_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.oldimage ADD CONSTRAINT &mw_prefix.oldimage_fk3 FOREIGN KEY (oi_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.oldimage_i01 ON &mw_prefix.oldimage (oi_user_text,oi_timestamp);
CREATE INDEX &mw_prefix.oldimage_i02 ON &mw_prefix.oldimage (oi_name,oi_timestamp);
CREATE INDEX &mw_prefix.oldimage_i03 ON &mw_prefix.oldimage (oi_name,oi_archive_name);
fa_deleted_user NUMBER DEFAULT 0 NOT NULL,
fa_deleted_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
fa_deleted_reason CLOB,
+ fa_deleted_reason_id NUMBER DEFAULT 0 NOT NULL,
fa_size NUMBER DEFAULT 0 NOT NULL,
fa_width NUMBER DEFAULT 0 NOT NULL,
fa_height NUMBER DEFAULT 0 NOT NULL,
fa_major_mime VARCHAR2(32) DEFAULT 'unknown',
fa_minor_mime VARCHAR2(100) DEFAULT 'unknown',
fa_description VARCHAR2(255),
+ fa_description_id NUMBER DEFAULT 0 NOT NULL,
fa_user NUMBER DEFAULT 0 NOT NULL,
fa_user_text VARCHAR2(255) NOT NULL,
fa_timestamp TIMESTAMP(6) WITH TIME ZONE,
ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_pk PRIMARY KEY (fa_id);
ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk1 FOREIGN KEY (fa_deleted_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk2 FOREIGN KEY (fa_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk3 FOREIGN KEY (fa_deleted_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk4 FOREIGN KEY (fa_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.filearchive_i01 ON &mw_prefix.filearchive (fa_name, fa_timestamp);
CREATE INDEX &mw_prefix.filearchive_i02 ON &mw_prefix.filearchive (fa_storage_group, fa_storage_key);
CREATE INDEX &mw_prefix.filearchive_i03 ON &mw_prefix.filearchive (fa_deleted_timestamp);
rc_namespace NUMBER DEFAULT 0 NOT NULL,
rc_title VARCHAR2(255) NOT NULL,
rc_comment VARCHAR2(255),
+ rc_comment_id NUMBER DEFAULT 0 NOT NULL,
rc_minor CHAR(1) DEFAULT '0' NOT NULL,
rc_bot CHAR(1) DEFAULT '0' NOT NULL,
rc_new CHAR(1) DEFAULT '0' NOT NULL,
ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_pk PRIMARY KEY (rc_id);
ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk1 FOREIGN KEY (rc_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk2 FOREIGN KEY (rc_cur_id) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk3 FOREIGN KEY (rc_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.recentchanges_i01 ON &mw_prefix.recentchanges (rc_timestamp);
CREATE INDEX &mw_prefix.recentchanges_i02 ON &mw_prefix.recentchanges (rc_namespace, rc_title);
CREATE INDEX &mw_prefix.recentchanges_i03 ON &mw_prefix.recentchanges (rc_cur_id);
log_title VARCHAR2(255) NOT NULL,
log_page NUMBER,
log_comment VARCHAR2(255),
+ log_comment_id NUMBER DEFAULT 0 NOT NULL,
log_params CLOB,
log_deleted CHAR(1) DEFAULT '0' NOT NULL
);
ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_pk PRIMARY KEY (log_id);
ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk1 FOREIGN KEY (log_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk2 FOREIGN KEY (log_comment_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.logging_i01 ON &mw_prefix.logging (log_type, log_timestamp);
CREATE INDEX &mw_prefix.logging_i02 ON &mw_prefix.logging (log_user, log_timestamp);
CREATE INDEX &mw_prefix.logging_i03 ON &mw_prefix.logging (log_namespace, log_title, log_timestamp);
pt_title VARCHAR2(255) NOT NULL,
pt_user NUMBER NOT NULL,
pt_reason VARCHAR2(255),
+ pt_reason_id NUMBER DEFAULT 0 NOT NULL,
pt_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
pt_expiry VARCHAR2(14) NOT NULL,
pt_create_perm VARCHAR2(60) NOT NULL
);
+ALTER TABLE &mw_prefix.protected_titles ADD CONSTRAINT &mw_prefix.protected_titles_fk1 FOREIGN KEY (pt_reason_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.protected_titles_u01 ON &mw_prefix.protected_titles (pt_namespace,pt_title);
CREATE INDEX &mw_prefix.protected_titles_i01 ON &mw_prefix.protected_titles (pt_timestamp);
}
}
-$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;
/**
* Special modules who have their own classes
*/
- 'startup' => [ 'class' => 'ResourceLoaderStartUpModule' ],
+ 'startup' => [ 'class' => ResourceLoaderStartUpModule::class ],
// Scripts managed by the local wiki (stored in the MediaWiki namespace)
- 'site' => [ 'class' => 'ResourceLoaderSiteModule' ],
- 'site.styles' => [ 'class' => 'ResourceLoaderSiteStylesModule' ],
+ 'site' => [ 'class' => ResourceLoaderSiteModule::class ],
+ 'site.styles' => [ 'class' => ResourceLoaderSiteStylesModule::class ],
'noscript' => [
- 'class' => 'ResourceLoaderWikiModule',
+ 'class' => ResourceLoaderWikiModule::class,
'styles' => [ 'MediaWiki:Noscript.css' ],
'group' => 'noscript',
],
'filepage' => [
- 'class' => 'ResourceLoaderWikiModule',
+ 'class' => ResourceLoaderWikiModule::class,
'styles' => [ 'MediaWiki:Filepage.css' ],
],
'user.groups' => [
],
// Scripts managed by the current user (stored in their user space)
- 'user' => [ 'class' => 'ResourceLoaderUserModule' ],
- 'user.styles' => [ 'class' => 'ResourceLoaderUserStylesModule' ],
+ 'user' => [ 'class' => ResourceLoaderUserModule::class ],
+ 'user.styles' => [ 'class' => ResourceLoaderUserStylesModule::class ],
// Populate mediawiki.user placeholders with information about the current user
- 'user.defaults' => [ 'class' => 'ResourceLoaderUserDefaultsModule' ],
- 'user.options' => [ 'class' => 'ResourceLoaderUserOptionsModule' ],
- 'user.tokens' => [ 'class' => 'ResourceLoaderUserTokensModule' ],
+ 'user.defaults' => [ 'class' => ResourceLoaderUserDefaultsModule::class ],
+ 'user.options' => [ 'class' => ResourceLoaderUserOptionsModule::class ],
+ 'user.tokens' => [ 'class' => ResourceLoaderUserTokensModule::class ],
// Scripts for the dynamic language specific data, like grammar forms.
- 'mediawiki.language.data' => [ 'class' => 'ResourceLoaderLanguageDataModule' ],
+ 'mediawiki.language.data' => [ 'class' => ResourceLoaderLanguageDataModule::class ],
/* MediaWiki base skinning modules */
],
// Used in the web installer. Test it after modifying this definition!
'mediawiki.skinning.interface' => [
- 'class' => 'ResourceLoaderSkinModule',
+ 'class' => ResourceLoaderSkinModule::class,
'styles' => [
'resources/src/mediawiki.skinning/elements.css' => [ 'media' => 'screen' ],
'resources/src/mediawiki.skinning/content.css' => [ 'media' => 'screen' ],
/* MediaWiki */
'mediawiki' => [
- 'class' => 'ResourceLoaderRawFileModule',
+ 'class' => ResourceLoaderRawFileModule::class,
// Keep in sync with maintenance/jsduck/eg-iframe.html
'scripts' => [
'resources/src/mediawiki/mediawiki.js',
],
'mediawiki.ForeignApi' => [
'targets' => [ 'desktop', 'mobile' ],
- 'class' => 'ResourceLoaderForeignApiModule',
+ 'class' => ResourceLoaderForeignApiModule::class,
// Additional dependencies generated dynamically
'dependencies' => 'mediawiki.ForeignApi.core',
],
]
],
'mediawiki.ForeignStructuredUpload.config' => [
- 'class' => 'ResourceLoaderUploadDialogModule',
+ 'class' => ResourceLoaderUploadDialogModule::class,
],
'mediawiki.ForeignStructuredUpload' => [
'scripts' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js',
]
],
'mediawiki.util' => [
- 'class' => 'ResourceLoaderMediaWikiUtilModule',
+ 'class' => ResourceLoaderMediaWikiUtilModule::class,
'scripts' => 'resources/src/mediawiki/mediawiki.util.js',
'dependencies' => [
'jquery.accessKeyLabel',
'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.toolbar' => [
- 'class' => 'ResourceLoaderEditToolbarModule',
+ 'class' => ResourceLoaderEditToolbarModule::class,
'scripts' => 'resources/src/mediawiki.toolbar/toolbar.js',
'styles' => 'resources/src/mediawiki.toolbar/toolbar.less',
'dependencies' => 'jquery.textSelection',
'mediawiki.jqueryMsg' => [
// Add data for mediawiki.jqueryMsg, such as allowed tags
- 'class' => 'ResourceLoaderJqueryMsgModule',
+ 'class' => ResourceLoaderJqueryMsgModule::class,
'scripts' => 'resources/src/mediawiki/mediawiki.jqueryMsg.js',
'dependencies' => [
'mediawiki.util',
)
],
- 'mediawiki.language.names' => [ 'class' => 'ResourceLoaderLanguageNamesModule' ],
+ 'mediawiki.language.names' => [ 'class' => ResourceLoaderLanguageNamesModule::class ],
'mediawiki.language.specialCharacters' => [
- 'class' => 'ResourceLoaderSpecialCharacterDataModule'
+ 'class' => ResourceLoaderSpecialCharacterDataModule::class
],
/* MediaWiki Libs */
'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',
// The core JavaScript library.
'oojs-ui-core' => [
- 'class' => 'ResourceLoaderOOUIFileModule',
+ 'class' => ResourceLoaderOOUIFileModule::class,
'scripts' => [
'resources/lib/oojs-ui/oojs-ui-core.js',
'resources/src/oojs-ui-local.js',
],
// This contains only the styles required by core widgets.
'oojs-ui-core.styles' => [
- 'class' => 'ResourceLoaderOOUIFileModule',
+ 'class' => ResourceLoaderOOUIFileModule::class,
'styles' => [
'resources/lib/oojs-ui/wikimedia-ui-base.less', // Providing Wikimedia UI LESS variables to all
'resources/src/oojs-ui-local.css', // HACK, see inside the file
],
// Additional widgets and layouts module.
'oojs-ui-widgets' => [
- 'class' => 'ResourceLoaderOOUIFileModule',
+ 'class' => ResourceLoaderOOUIFileModule::class,
'scripts' => 'resources/lib/oojs-ui/oojs-ui-widgets.js',
'themeStyles' => 'widgets',
'dependencies' => [
],
// Toolbar and tools module.
'oojs-ui-toolbars' => [
- 'class' => 'ResourceLoaderOOUIFileModule',
+ 'class' => ResourceLoaderOOUIFileModule::class,
'scripts' => 'resources/lib/oojs-ui/oojs-ui-toolbars.js',
'themeStyles' => 'toolbars',
'dependencies' => [
],
// Windows and dialogs module.
'oojs-ui-windows' => [
- 'class' => 'ResourceLoaderOOUIFileModule',
+ 'class' => ResourceLoaderOOUIFileModule::class,
'scripts' => 'resources/lib/oojs-ui/oojs-ui-windows.js',
'themeStyles' => 'windows',
'dependencies' => [
],
'oojs-ui.styles.indicators' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'indicators',
],
'oojs-ui.styles.textures' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'textures',
],
'oojs-ui.styles.icons-accessibility' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-accessibility',
],
'oojs-ui.styles.icons-alerts' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-alerts',
],
'oojs-ui.styles.icons-content' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-content',
],
'oojs-ui.styles.icons-editing-advanced' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-editing-advanced',
],
'oojs-ui.styles.icons-editing-core' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-editing-core',
],
'oojs-ui.styles.icons-editing-list' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-editing-list',
],
'oojs-ui.styles.icons-editing-styling' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-editing-styling',
],
'oojs-ui.styles.icons-interactions' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-interactions',
],
'oojs-ui.styles.icons-layout' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-layout',
],
'oojs-ui.styles.icons-location' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-location',
],
'oojs-ui.styles.icons-media' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-media',
],
'oojs-ui.styles.icons-moderation' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-moderation',
],
'oojs-ui.styles.icons-movement' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-movement',
],
'oojs-ui.styles.icons-user' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-user',
],
'oojs-ui.styles.icons-wikimedia' => [
- 'class' => 'ResourceLoaderOOUIImageModule',
+ 'class' => ResourceLoaderOOUIImageModule::class,
'themeImages' => 'icons-wikimedia',
],
];
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 );
// Return [start, end] instead of just start
startAndEnd: false
}, options );
- // FIXME: We may not need character position-based functions if we insert markers in the right places
break;
case 'setSelection':
options = $.extend( {
if ( options.end === undefined ) {
options.end = options.start;
}
- // FIXME: We may not need character position-based functions if we insert markers in the right places
break;
case 'scrollToCaretPosition':
options = $.extend( {
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();
mw.hook( 'RcFilters.popup.open' ).fire();
- if ( !this.getMenu().getSelectedItem() ) {
+ if ( !this.getMenu().findSelectedItem() ) {
// If there are no selected items, scroll menu to top
// This has to be in a setTimeout so the menu has time
// to be positioned and fixed
*/
mw.rcfilters.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {
var nextItem,
- currentItem = this.findHighlightedItem() || this.getSelectedItem();
+ currentItem = this.findHighlightedItem() || this.findSelectedItem();
// Call parent
mw.rcfilters.ui.MenuSelectWidget.parent.prototype.onKeyDown.call( this, e );
padding: 0.5em;
}
+#mw-apisandbox-ui .mw-apisandbox-link {
+ display: none;
+}
+
.mw-apisandbox-popup .oo-ui-popupWidget-body > .oo-ui-widget {
vertical-align: middle;
}
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'
+ iiprop: 'uploadwarning',
+ errorformat: 'html',
+ errorlang: mw.config.get( 'wgUserLanguage' )
} ).done( function ( result ) {
var
resultOut = '',
if ( page.imageinfo ) {
resultOut = page.imageinfo[ 0 ].html;
} else if ( page.invalidreason ) {
- resultOut = mw.html.escape( page.invalidreason );
+ resultOut = page.invalidreason.html;
}
uploadWarning.processResult( resultOut, uploadWarning.nameToCheck );
} ).always( function () {
$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
//
// To use icons you must be using a browser that supports pseudo elements.
// This includes support for IE 8.
-// http://caniuse.com/#feat=css-gencontent
+// https://caniuse.com/#feat=css-gencontent
//
// For elements that are intended to have both an icon and text, browsers that
// do not support pseudo-selectors will degrade to text-only.
*/
( 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( {} );
} );
}
uri.query = q;
+
+ // Decode uri.fragment, otherwise it gets double-encoded when serializing
+ if ( uri.fragment !== undefined ) {
+ uri.fragment = Uri.decode( uri.fragment );
+ }
},
/**
* @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() ) );
}
};
}
window.isCompatible = function ( str ) {
var ua = str || navigator.userAgent;
return !!(
- // http://caniuse.com/#feat=es5
- // http://caniuse.com/#feat=use-strict
- // http://caniuse.com/#feat=json / https://phabricator.wikimedia.org/T141344#2784065
+ // https://caniuse.com/#feat=es5
+ // https://caniuse.com/#feat=use-strict
+ // https://caniuse.com/#feat=json / https://phabricator.wikimedia.org/T141344#2784065
( function () {
'use strict';
return !this && !!Function.prototype.bind && !!window.JSON;
}() ) &&
- // http://caniuse.com/#feat=queryselector
+ // https://caniuse.com/#feat=queryselector
'querySelector' in document &&
- // http://caniuse.com/#feat=namevalue-storage
+ // https://caniuse.com/#feat=namevalue-storage
// https://developer.blackberry.com/html5/apis/v1_0/localstorage.html
// https://blog.whatwg.org/this-week-in-html-5-episode-30
'localStorage' in window &&
- // http://caniuse.com/#feat=addeventlistener
+ // https://caniuse.com/#feat=addeventlistener
'addEventListener' in window &&
// Hardcoded exceptions for browsers that pass the requirement but we don't want to
$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;
}
}
<http://acme.test/wiki/Special:CategoryDump> <http://www.w3.org/2002/07/owl#imports> <https://www.mediawiki.org/ontology/ontology.owl> .
<http://acme.test/wiki/Category:Category_One> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.mediawiki.org/ontology#Category> .
<http://acme.test/wiki/Category:Category_One> <http://www.w3.org/2000/01/rdf-schema#label> "Category One" .
+<http://acme.test/wiki/Category:Category_One> <https://www.mediawiki.org/ontology#pages> "7"^^<http://www.w3.org/2001/XMLSchema#integer> .
+<http://acme.test/wiki/Category:Category_One> <https://www.mediawiki.org/ontology#subcategories> "10"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://acme.test/wiki/Category:2_Category_Two> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.mediawiki.org/ontology#Category> .
+<http://acme.test/wiki/Category:2_Category_Two> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.mediawiki.org/ontology#HiddenCategory> .
<http://acme.test/wiki/Category:2_Category_Two> <http://www.w3.org/2000/01/rdf-schema#label> "2 Category Two" .
+<http://acme.test/wiki/Category:2_Category_Two> <https://www.mediawiki.org/ontology#pages> "17"^^<http://www.w3.org/2001/XMLSchema#integer> .
+<http://acme.test/wiki/Category:2_Category_Two> <https://www.mediawiki.org/ontology#subcategories> "0"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://acme.test/wiki/Category:Category_One> <https://www.mediawiki.org/ontology#isInCategory> <http://acme.test/wiki/Category:Parent_of_1> .
<http://acme.test/wiki/Category:2_Category_Two> <https://www.mediawiki.org/ontology#isInCategory> <http://acme.test/wiki/Category:Parent_of_2> .
<http://acme.test/wiki/Category:%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.mediawiki.org/ontology#Category> .
<http://acme.test/wiki/Category:%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F> <http://www.w3.org/2000/01/rdf-schema#label> "\u0422\u0440\u0435\u0442\u044C\u044F \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F" .
+<http://acme.test/wiki/Category:%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F> <https://www.mediawiki.org/ontology#pages> "0"^^<http://www.w3.org/2001/XMLSchema#integer> .
+<http://acme.test/wiki/Category:%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F> <https://www.mediawiki.org/ontology#subcategories> "0"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://acme.test/wiki/Category:%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F> <https://www.mediawiki.org/ontology#isInCategory> <http://acme.test/wiki/Category:Parent_of_3> .
] );
/** @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() );
}
use Title;
use WANObjectCache;
use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DatabaseDomain;
use Wikimedia\Rdbms\DatabaseSqlite;
use Wikimedia\Rdbms\FakeResultWrapper;
use Wikimedia\Rdbms\LoadBalancer;
private function getLoadBalancerMock( array $server ) {
$lb = $this->getMockBuilder( LoadBalancer::class )
->setMethods( [ 'reallyOpenConnection' ] )
- ->setConstructorArgs( [ [ 'servers' => [ $server ] ] ] )
+ ->setConstructorArgs( [ [
+ 'servers' => [ $server ],
+ 'localDomain' => new DatabaseDomain(
+ $server['dbname'], null, $server['tablePrefix']
+ ),
+ ] ] )
->getMock();
$lb->method( 'reallyOpenConnection' )->willReturnCallback(
[ '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 ] );
--- /dev/null
+<?php
+
+/**
+ * Tests for MediaWiki api.php?action=delete.
+ *
+ * @author Yifei He
+ *
+ * @group API
+ * @group Database
+ * @group medium
+ *
+ * @covers ApiDelete
+ */
+class ApiDeleteTest extends ApiTestCase {
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->doLogin();
+ }
+
+ public function testDelete() {
+ $name = 'Help:ApiDeleteTest_testDelete';
+
+ // test non-existing page
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'delete',
+ 'title' => $name,
+ ] );
+ $this->fail( "Should have raised an ApiUsageException" );
+ } catch ( ApiUsageException $e ) {
+ $this->assertTrue( self::apiExceptionHasCode( $e, 'missingtitle' ) );
+ }
+
+ // create new page
+ $this->editPage( $name, 'Some text' );
+
+ // test deletion
+ $apiResult = $this->doApiRequestWithToken( [
+ 'action' => 'delete',
+ 'title' => $name,
+ ] );
+ $apiResult = $apiResult[0];
+
+ $this->assertArrayHasKey( 'delete', $apiResult );
+ $this->assertArrayHasKey( 'title', $apiResult['delete'] );
+ // Normalized $name is used
+ $this->assertSame(
+ 'Help:ApiDeleteTest testDelete',
+ $apiResult['delete']['title']
+ );
+ $this->assertArrayHasKey( 'logid', $apiResult['delete'] );
+
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ }
+
+ public function testDeletionWithoutPermission() {
+ $name = 'Help:ApiDeleteTest_testDeleteWithoutPermission';
+
+ // create new page
+ $this->editPage( $name, 'Some text' );
+
+ // test deletion without permission
+ try {
+ $user = new User();
+ $apiResult = $this->doApiRequest( [
+ 'action' => 'delete',
+ 'title' => $name,
+ 'token' => $user->getEditToken(),
+ ], null, null, $user );
+ $this->fail( "Should have raised an ApiUsageException" );
+ } catch ( ApiUsageException $e ) {
+ $this->assertTrue( self::apiExceptionHasCode( $e, 'permissiondenied' ) );
+ }
+
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+ }
+}
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
$this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
}
+ public function testTitlesWithWhitespaces() {
+ $data = $this->doApiRequest( [
+ 'action' => 'query',
+ 'titles' => ' '
+ ] );
+
+ $this->assertArrayHasKey( 'query', $data[0] );
+ $this->assertArrayHasKey( 'pages', $data[0]['query'] );
+ $this->assertEquals( 1, count( $data[0]['query']['pages'] ) );
+ $this->assertArrayHasKey( -1, $data[0]['query']['pages'] );
+ $this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
+ }
+
/**
* Test the ApiBase::titlePartToKey function
*
<?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' );
}
+ /**
+ * @covers ConfigFactory::register
+ */
+ public function testRegisterInvalidInstance() {
+ $factory = new ConfigFactory();
+ $this->setExpectedException( InvalidArgumentException::class );
+ $factory->register( 'invalidInstance', new stdClass );
+ }
+
/**
* @covers ConfigFactory::register
*/
$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 );
}
"var a=this\nfor(b=0;c<d;b++){}"
],
+ // Cover failure case of incomplete regexp at end of file (T75556)
+ // FIXME: This is invalid, but currently tolerated
+ [ "*/", "*/", false ],
+
+ // Cover failure case of incomplete string at end of file (T75556)
+ // FIXME: This is invalid, but currently tolerated
+ [ "'a", "'a", false ],
+
// Token separation
[ "x in y", "x in y" ],
[ "/x/g in y", "/x/g in y" ],
* 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;
/**
protected function doQuery( $sql ) {
}
- // From DatabaseMysql
+ // From DatabaseMysqli
protected function mysqlConnect( $realServer ) {
}
}
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,
] );
namespace MediaWiki\Session;
+use Config;
use MediaWikiTestCase;
use User;
use Wikimedia\TestingAccessWrapper;
class SessionBackendTest extends MediaWikiTestCase {
const SESSIONID = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
+ /** @var SessionManager */
protected $manager;
+
+ /** @var Config */
protected $config;
+
+ /** @var SessionProvider */
protected $provider;
+
+ /** @var TestBagOStuff */
protected $store;
protected $onSessionMetadataCalled = false;
* Returns a non-persistent backend that thinks it has at least one session active
* @param User|null $user
* @param string $id
+ * @return SessionBackend
*/
protected function getBackend( User $user = null, $id = null ) {
if ( !$this->config ) {
$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( $info->forceHTTPS(), $backend->shouldForceHTTPS() );
$expire = time() + 100;
- $this->store->setSessionMeta( self::SESSIONID, [ 'expires' => $expire ], 2 );
+ $this->store->setSessionMeta( self::SESSIONID, [ 'expires' => $expire ] );
$info = new SessionInfo( SessionInfo::MIN_PRIORITY, [
'provider' => $this->provider,
$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' )
*/
class SessionManagerTest extends MediaWikiTestCase {
- protected $config, $logger, $store;
+ /** @var \HashConfig */
+ private $config;
+
+ /** @var \TestLogger */
+ private $logger;
+
+ /** @var TestBagOStuff */
+ private $store;
protected function getManager() {
\ObjectCache::$instances['testSessionStore'] = new TestBagOStuff();
'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();
/**
* @param string $id Session ID
* @param array $data Session data
- * @param int $expiry
- * @param User $user User for metadata
*/
- public function setSessionData( $id, array $data, $expiry = 0, User $user = null ) {
- $this->setSession( $id, [ 'data' => $data ], $expiry, $user );
+ public function setSessionData( $id, array $data ) {
+ $this->setSession( $id, [ 'data' => $data ] );
}
/**
* @param string $id Session ID
* @param array $metadata Session metadata
- * @param int $expiry
*/
- public function setSessionMeta( $id, array $metadata, $expiry = 0 ) {
- $this->setSession( $id, [ 'metadata' => $metadata ], $expiry );
+ public function setSessionMeta( $id, array $metadata ) {
+ $this->setSession( $id, [ 'metadata' => $metadata ] );
}
/**
* @param string $id Session ID
* @param array $blob Session metadata and data
- * @param int $expiry
- * @param User $user User for metadata
*/
- public function setSession( $id, array $blob, $expiry = 0, User $user = null ) {
+ public function setSession( $id, array $blob ) {
$blob += [
'data' => [],
'metadata' => [],
];
$blob['metadata'] += [
- 'userId' => $user ? $user->getId() : 0,
- 'userName' => $user ? $user->getName() : null,
- 'userToken' => $user ? $user->getToken( true ) : null,
+ 'userId' => 0,
+ 'userName' => null,
+ 'userToken' => null,
'provider' => 'DummySessionProvider',
];
- $this->setRawSession( $id, $blob, $expiry, $user );
+ $this->setRawSession( $id, $blob );
}
/**
* @param string $id Session ID
* @param array|mixed $blob Session metadata and data
- * @param int $expiry
*/
- public function setRawSession( $id, $blob, $expiry = 0 ) {
- if ( $expiry <= 0 ) {
- $expiry = \RequestContext::getMain()->getConfig()->get( 'ObjectCacheSessionExpiry' );
- }
-
+ public function setRawSession( $id, $blob ) {
+ $expiry = \RequestContext::getMain()->getConfig()->get( 'ObjectCacheSessionExpiry' );
$this->set( $this->makeKey( 'MWSession', $id ), $blob, $expiry );
}
$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,
$this->changesListSpecialPage->registerFilters();
}
+ abstract protected function getPage();
+
protected function tearDown() {
global $wgGroupPermissions;
}
}
+ abstract public function provideParseParameters();
+
/**
* @dataProvider provideParseParameters
*/
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' );
--- /dev/null
+<?php
+
+use MediaWiki\Interwiki\InterwikiLookup;
+
+/**
+ * @covers ExternalUserNames
+ */
+class ExternalUserNamesTest extends MediaWikiTestCase {
+
+ public function provideGetUserLinkTitle() {
+ return [
+ [ 'valid:>User1', Title::makeTitle( NS_MAIN, ':User:User1', '', 'valid' ) ],
+ [
+ 'valid:valid:>User1',
+ Title::makeTitle( NS_MAIN, 'valid::User:User1', '', 'valid' )
+ ],
+ [
+ '127.0.0.1',
+ Title::makeTitle( NS_SPECIAL, 'Contributions/127.0.0.1', '', '' )
+ ],
+ [ 'invalid:>User1', null ]
+ ];
+ }
+
+ /**
+ * @covers ExternalUserNames::getUserLinkTitle
+ * @dataProvider provideGetUserLinkTitle
+ */
+ public function testGetUserLinkTitle( $username, $expected ) {
+ $interwikiLookupMock = $this->getMockBuilder( InterwikiLookup::class )
+ ->getMock();
+
+ $interwikiValueMap = [
+ [ 'valid', true ],
+ [ 'invalid', false ]
+ ];
+ $interwikiLookupMock->expects( $this->any() )
+ ->method( 'isValidInterwiki' )
+ ->will( $this->returnValueMap( $interwikiValueMap ) );
+
+ $this->setService( 'InterwikiLookup', $interwikiLookupMock );
+
+ $this->assertEquals(
+ $expected,
+ ExternalUserNames::getUserLinkTitle( $username )
+ );
+ }
+
+ public function provideApplyPrefix() {
+ return [
+ [ 'User1', 'prefix', 'prefix>User1' ],
+ [ 'User1', 'prefix:>', 'prefix>User1' ],
+ [ 'User1', 'prefix:', 'prefix>User1' ],
+ ];
+ }
+
+ /**
+ * @covers ExternalUserNames::applyPrefix
+ * @dataProvider provideApplyPrefix
+ */
+ public function testApplyPrefix( $username, $prefix, $expected ) {
+ $externalUserNames = new ExternalUserNames( $prefix, true );
+
+ $this->assertSame(
+ $expected,
+ $externalUserNames->applyPrefix( $username )
+ );
+ }
+
+ public function provideAddPrefix() {
+ return [
+ [ 'User1', 'prefix', 'prefix>User1' ],
+ [ 'User2', 'prefix2', 'prefix2>User2' ],
+ [ 'User3', 'prefix3', 'prefix3>User3' ],
+ ];
+ }
+
+ /**
+ * @covers ExternalUserNames::addPrefix
+ * @dataProvider provideAddPrefix
+ */
+ public function testAddPrefix( $username, $prefix, $expected ) {
+ $externalUserNames = new ExternalUserNames( $prefix, true );
+
+ $this->assertSame(
+ $expected,
+ $externalUserNames->addPrefix( $username )
+ );
+ }
+
+ public function provideIsExternal() {
+ return [
+ [ 'User1', false ],
+ [ '>User1', true ],
+ [ 'prefix>User1', true ],
+ [ 'prefix:>User1', true ],
+ ];
+ }
+
+ /**
+ * @covers ExternalUserNames::isExternal
+ * @dataProvider provideIsExternal
+ */
+ public function testIsExternal( $username, $expected ) {
+ $this->assertSame(
+ $expected,
+ ExternalUserNames::isExternal( $username )
+ );
+ }
+
+}
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' ]
namespace MediaWiki\Tests\Maintenance;
use Benchmarker;
+use MediaWikiCoversValidator;
use PHPUnit_Framework_TestCase;
use Wikimedia\TestingAccessWrapper;
*/
class BenchmarkerTest extends PHPUnit_Framework_TestCase {
+ use MediaWikiCoversValidator;
+
public function testBenchSimple() {
$bench = $this->getMockBuilder( Benchmarker::class )
->setMethods( [ 'execute', 'output' ] )
--- /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();
return [
// batch 1
[
- (object)[ 'page_title' => 'Category One', 'page_id' => 1 ],
- (object)[ 'page_title' => '2 Category Two', 'page_id' => 2 ],
+ (object)[
+ 'page_title' => 'Category One',
+ 'page_id' => 1,
+ 'pp_propname' => null,
+ 'cat_pages' => '20',
+ 'cat_subcats' => '10',
+ 'cat_files' => '3'
+ ],
+ (object)[
+ 'page_title' => '2 Category Two',
+ 'page_id' => 2,
+ 'pp_propname' => 'hiddencat',
+ 'cat_pages' => 20,
+ 'cat_subcats' => 0,
+ 'cat_files' => 3
+ ],
],
// batch 2
[
- (object)[ 'page_title' => 'Третья категория', 'page_id' => 3 ],
+ (object)[
+ 'page_title' => 'Третья категория',
+ 'page_id' => 3,
+ 'pp_propname' => null,
+ 'cat_pages' => '0',
+ 'cat_subcats' => '0',
+ 'cat_files' => '0'
+ ],
]
];
}
*/
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 );
}
/**
uri = uriBase.clone();
uri.fragment = 'frag';
assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php#frag', 'add a fragment' );
+ uri.fragment = 'café';
+ assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php#caf%C3%A9', 'fragment is url-encoded' );
uri = uriBase.clone();
uri.host = 'fr.wiki.local';
QUnit.test( 'Advanced URL', function ( assert ) {
var uri, queryString, relativePath;
- uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
+ uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#caf%C3%A9' );
assert.deepEqual(
{
port: '81',
path: '/dir/dir.2/index.htm',
query: { q1: '0', test1: null, test2: 'value (escaped)' },
- fragment: 'top'
+ fragment: 'café'
},
'basic object properties'
);
relativePath = uri.getRelativePath();
assert.ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
assert.ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
- assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragment in relative path' );
+ assert.ok( relativePath.indexOf( mw.Uri.encode( uri.fragment ) ) >= 0, 'escaped fragment in relative path' );
} );
QUnit.test( 'Parse a uri with an @ symbol in the path and query', function ( assert ) {
--- /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();
'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.' );
+
+ } );
+
} );
* @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 = '';