Merge "mediawiki.util: Optimise addPortletLink"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 18 Sep 2018 21:41:32 +0000 (21:41 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 18 Sep 2018 21:41:32 +0000 (21:41 +0000)
29 files changed:
includes/DefaultSettings.php
includes/Storage/RevisionStore.php
includes/api/i18n/ar.json
includes/installer/i18n/nap.json
includes/page/Article.php
includes/watcheditem/WatchedItemStore.php
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/cdo.json
languages/i18n/cs.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/it.json
languages/i18n/jv.json
languages/i18n/ko.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/my.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/pt.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/uk.json
languages/i18n/zh-hans.json
maintenance/edit.php
resources/src/mediawiki.Title/Title.js
tests/phpunit/includes/Storage/RevisionStoreDbTestBase.php
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js

index 343e80d..ab67225 100644 (file)
@@ -3288,7 +3288,7 @@ $wgUseMediaWikiUIEverywhere = false;
  *
  * @since 1.32
  */
-$wgOOUIPreferences = false;
+$wgOOUIPreferences = true;
 
 /**
  * Whether to label the store-to-database-and-show-to-others button in the editor
@@ -4833,7 +4833,7 @@ $wgReservedUsernames = [
        'Maintenance script', // Maintenance scripts which perform editing, image import script
        'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
        'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
-       'Unknown user', // Used in WikiImporter when importing revisions with no author
+       'Unknown user', // Used in WikiImporter and RevisionStore for revisions with no author
        'msg:double-redirect-fixer', // Automatic double redirect fix
        'msg:usermessage-editor', // Default user for leaving user messages
        'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
index 879f322..61b428f 100644 (file)
@@ -1711,8 +1711,8 @@ class RevisionStore
                                $row->ar_actor ?? null
                        );
                } catch ( InvalidArgumentException $ex ) {
-                       wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
-                       $user = new UserIdentityValue( 0, '', 0 );
+                       wfWarn( __METHOD__ . ': ' . $title->getPrefixedDBkey() . ': ' . $ex->getMessage() );
+                       $user = new UserIdentityValue( 0, 'Unknown user', 0 );
                }
 
                $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
@@ -1759,8 +1759,8 @@ class RevisionStore
                                $row->rev_actor ?? null
                        );
                } catch ( InvalidArgumentException $ex ) {
-                       wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
-                       $user = new UserIdentityValue( 0, '', 0 );
+                       wfWarn( __METHOD__ . ': ' . $title->getPrefixedDBkey() . ': ' . $ex->getMessage() );
+                       $user = new UserIdentityValue( 0, 'Unknown user', 0 );
                }
 
                $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
index fd1a765..d6af2f1 100644 (file)
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "يضيف بادئة الإنترويكي.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "يضيف عنوان الإنترويكي.",
        "apihelp-query+iwbacklinks-param-dir": "الاتجاه للإدراج فيه.",
+       "apihelp-query+iwbacklinks-example-simple": "الحصول على الصفحات التي تصل إلى [[wikibooks:Test]].",
+       "apihelp-query+iwbacklinks-example-generator": "الحصول على معلومات عن الصفحات التي تصل إلى [[wikibooks:Test]].",
        "apihelp-query+iwlinks-summary": "يعرض جميع روابط الإنترويكي من الصفحات المحددة.",
        "apihelp-query+iwlinks-param-url": "ما إذا كنت تريد الحصول على المسار الكامل (لا يمكن استخدامه مع $1prop).",
        "apihelp-query+iwlinks-param-prop": "الخصائص الإضافية التي يمكنك الحصول عليها لكل رابط بين اللغات:",
index e391609..8183ed7 100644 (file)
@@ -61,6 +61,7 @@
        "config-memory-raised": "'O valore 'e PHP <code>memory_limit</code> è $1, aumentato a $2.",
        "config-memory-bad": "<strong>Attenziò:</strong> 'o valore 'e PHP <code>memory_limit</code> è $1.\nProbabbilmente troppo basso.\n'A installazione se putesse scassà!",
        "config-apc": "[https://secure.php.net/apc APC] è installato",
+       "config-apcu": "[https://secure.php.net/apcu APCu] è installato",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] è installato",
        "config-no-cache-apcu": "<strong>Attenziò:</strong> [https://secure.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [https://www.iis.net/downloads/microsoft/wincache-extension WinCache] nun so' state truvate.\n'A funziona caching 'e ll'oggette non è apicciata.",
        "config-mod-security": "<strong>Attenziò:</strong> 'O servitore web vuosto téne [https://modsecurity.org/ mod_security]/mod_security2 appicciato. Ce stanno tante mpustaziune commune ca 'o facessero causà prubbleme a MediaWiki e ll'ati software ca permettessero ll'utente 'e pubbrecà cuntenute.\nSi putite, stutate sta funziona. Sinò, riferite 'a [https://modsecurity.org/documentation/ documentaziona ncopp' 'o mod_security] o cuntattate 'o host vuosto pe' ve dà supporto quanno se scummogliasse cocch'errore.",
@@ -78,6 +79,7 @@
        "config-no-cli-uploads-check": "<strong>Attenziò:</strong> 'a cartella predefinita p' 'e carreche (<code>$1</code>) nun è stata cuntrullata p' 'a vulnerabbelità ncopp'a l'esecuzione arbitraria 'e script pe' tramente ca se fà l'installazione 'a linea 'e commando.",
        "config-brokenlibxml": "'O sistema vuosto ave na combinazione 'e verziune 'e PHP e libxml2 nguacchiata ca putesse scassà 'e date 'e MediaWiki 'n manera annascunnusa e pure l'ati apprecaziune p' 'o web.\nAgghiurnate a libxml2 2.7.3 o cchiù muderno ([https://bugs.php.net/bug.php?id=45996 'o bug studiato d' 'o lato PHP]).\nInstallaziona spezzata.",
        "config-suhosin-max-value-length": "Suhosin è installato e miette lemmeto 'o parametro GET <code>length</code> a $1 byte.\n'O componente MediaWiki ResourceLoader funzionarrà aggirann'a stu lemmeto, ma luvanno prestaziune.\nSi pussibile, avit'a mpustà <code>suhosin.get.max_value_length</code> a 1024 o cchiù auto 'n <code>php.ini</code>, e mpustà <code>$wgResourceLoaderMaxQueryLength</code> a 'o stesso valore 'n <code>LocalSettings.php</code>.",
+       "config-using-32bit": "<strong>Attenziò:</strong> 'o sistema vuosto pare c'ausasse nummere sane 'e 32-bit. Chest' [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit è scunzigliat].",
        "config-db-type": "Tipo 'e database:",
        "config-db-host": "Host d' 'o database:",
        "config-db-host-help": "Si 'o server database vuosto stà mpizzato dint' 'a nu server differente, miette 'o nomme d' 'o host o l'indirizzo IP sujo.\n\nSi state ausanno nu servizio spartuto web hosting, 'aggenzia 'e hosting v'avess'a dà 'o nomme buono 'e nomme host dint' 'a documentaziona suoja.\n\nSi state installanno chisto dint'a nu server Windows cu MySQL, ausanno \"localhost\" può darse ca nun funziona p' 'o nomme server. Si chisto nun funziona, mettite \"127.0.0.1\" p' 'o ndirizzo locale vuosto.\n\nSi state ausanno PostgreSQL, lassate abbacante stu campo pe' v'accucchià cu nu socket Unix.",
        "config-type-mysql": "MariaDB, MySQL o compatibbele",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki supporta 'e sisteme 'e database ccà abbascio:\n\n$1\n\nSi nfra chiste ccà nun vedite 'o sistema 'e database ca vulite ausà, allora avite liegge 'e instruziune ccà ncoppa pe' ne dà supporto.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] è 'a configurazione cchiù mmeglio p' 'o MediaWiki e è chilla meglio suppurtata. MediaWiki può faticà pure cu' [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], ca fossero MySQL cumpatibbele. ([https://secure.php.net/manual/en/mysqli.installation.php Comme s'adda fà pe' cumpilà PHP cu suppuorto MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] è nu sistema canusciuto 'e database open source ca fosse n'alternativa a MySQL. Putess'avé cocch'errore p'arricettà, e nun è cunzigliato 'e ll'ausà dint'a n'ambiente 'e produziona. ([https://secure.php.net/manual/en/pgsql.installation.php Comme s'avess'a cumpilà PHP cu suppuorto PostgreSQL])",
-       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]  è nu sistema 'e database leggero, ca fosse assaje buono suppurtato. ([http://www.php.net/manual/en/pdo.installation.php Comme cumpilà PHP cu suppuorto SQLite], aùsa PDO)",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] è nu database 'e na fraveca commerciale. ([http://www.php.net/manual/en/oci8.installation.php Comme cumpilà PHP cu suppuorto OCI8])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] è 'a configurazione cchiù mmeglio p' 'o MediaWiki e è chilla meglio suppurtata. MediaWiki può faticà pure cu' [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], ca fossero MariaDB cumpatibbele. ([https://secure.php.net/manual/en/mysqli.installation.php Comme s'adda fà pe' cumpilà PHP cu suppuorto MySQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] è nu sistema canusciuto 'e database open source ca fosse n'alternativa a MySQL.\n([https://secure.php.net/manual/en/pgsql.installation.php Comme s'avess'a cumpilà PHP cu suppuorto PostgreSQL])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]  è nu sistema 'e database leggero, ca fosse assaje buono suppurtato.\n([https://secure.php.net/manual/en/pdo.installation.php Comme cumpilà PHP cu suppuorto SQLite], aùsa PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] è nu database 'e na fraveca commerciale. ([https://secure.php.net/manual/en/oci8.installation.php Comme cumpilà PHP cu suppuorto OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] è nu database 'e na fraveca commerciale p' 'o Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Comme cumpilà PHP cu suppuorto SQLSRV])",
-       "config-header-mysql": "Mpustaziune MySQL",
+       "config-header-mysql": "Mpustaziune MariaDB/MySQL",
        "config-header-postgres": "Mpustaziune PostgreSQL",
        "config-header-sqlite": "Mpustaziune SQLite",
        "config-header-oracle": "Mpustaziune Oracle",
        "config-db-web-create": "Crìa 'o cunto si nun esiste ancora",
        "config-db-web-no-create-privs": "'O cunto ausato pe' ne fà l'installazione nun tene diritte necessarie pe' ne putè crià n'atu cunto.\n'O cunto zegnàto ccà adda esistere già.",
        "config-mysql-engine": "Mutore d'astipo:",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB (fosse 'o cunzigliato)",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "<strong>Attenziò:</strong> avite scigliuto MyISAM comm' 'o mutore 'archiviaziona MySQL, ca nun è raccummannato pe' l'ausà cu MediaWiki, pecché:\n* supporta debolmente 'a concorrenza p' 'o blocco d' 'a tabbella\n* è cchiù inchine 'a corruzione 'e l'ati mutore\n* 'o codece 'e base 'e MediaWiki nun gestisce sempe MyISAM comme l'avess'a gistiunà\n\nSi ll'installazione vosta MySQL suppuorta InnoDB, è autamente raccummandato ca si scigliesse a 'o posto suo.\nSi 'a installazione MySQL nun suppurtasse InnoDB, forse è 'o mumento 'e ll'agghiurnà.",
        "config-mysql-only-myisam-dep": "<strong>Attenziò:</strong> MyISAM è l'uneco mutore p'astipà date ca se trova mo' a disposizione p' 'o MySQL dint'a sta macchina, e nun fosse raccumandato 'e s'ausà cu MediaWiki, pecché:\n* suppurtasse minimamente concorrenza pe' bbìa 'e bluccà tabbelle\n* è cchiù facile ca jesse a se scassà cchiù 'e l'ati mutore\n* 'o codece MediaWiki nun maniasse sempe MyISAM comme l'avesse 'e manià\n\nL'installazione MySQL nun suppurtasse InnoDB, può darse ca chist'è 'o mumento pe' ve ll'agghiurnà.",
        "config-subscribe": "Mettiteve dint' 'a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list 'e ll'annunciazione 'e verziune d' 'o software rilassate].",
        "config-subscribe-help": "Chest'è na mailing list a basso traffeco ca se dedicasse a se ffà annunzie 'e verziune nove, piglianno pure mpurtante nutarelle ca riguardassero 'a sicurezza.\nFosse cunzigliato 'e se nzegnà e s'agghiurnà l'installazione 'e MediaWiki quanno na verziona nova fosse pubbreca.",
        "config-subscribe-noemail": "Vuje avite tentato 'e ve trasì dint' 'a mailing list addedecata a se fà annunzie ncopp' 'e verziune nove senza ve dà n'indirizzo email.\nNzertanno n'indirizzo email se vulite affettuà l'iscrizione dint'a mailing list.",
+       "config-pingback": "Sparte 'e date 'e st'installazione ch' 'e sviluppature 'e MediaWiki.",
+       "config-pingback-help": "Si vuje sciglite st'opzione, MediaWiki cuntattasse spisso https://www.mediawiki.org ch' 'e date 'e base e st'istanza MediaWiki. Dint' 'a sta categoria 'e date, tràseno, p'esempie, 'o tipo 'e sistema, 'a virziona 'e PHP e database 'e backend scigliuto. 'A Wikimedia Foundation spartisse sti date ch' 'e sviluppature Mediawiki p' 'a puté aiutà a guidà 'e fatiche 'e sviluppo future. P' 'o sistema d' 'o vuosto 'e date se mannan'accussì:\n<pre>$1</pre>",
        "config-almost-done": "Avite quase fernuto!\nMo' putite zumpà 'a parta r' 'a configurazione e sempricemente installà 'a wiki.",
        "config-optional-continue": "Spiate cchiù dimanne.",
        "config-optional-skip": "Me so' scucciato già, installa surtanto 'o wiki.",
        "config-cache-options": "Mpustaziune p' 'a cache d'oggette:",
        "config-cache-help": "'O caching 'uggette s'ausa pe' puté migliurà 'a velocità 'e MediaWiki a fforza 'e ffà caching d' 'e date cchiù spisso ausàte.\nE Mezze a gruosse site se songo ncuraggiate a ll'appiccià chiste, e site piccerilli vedarranno migliuramente pure.",
        "config-cache-none": "Nisciuna memorizzazione n cache (nisciuna funziunalità è luvata, ma 'a velocità se putesse ffà a meno dint' 'e wiki cchiù gruosse)",
-       "config-cache-accel": "Mettere 'n cache oggette PHP (APC, XCache o WinCache)",
+       "config-cache-accel": "Mettere 'n cache oggette PHP (APC, APCu o WinCache)",
        "config-cache-memcached": "Aúsa 'o Memcached (richiede cchiù mpustaziune 'installazione e configuraziona)",
        "config-memcached-servers": "Server memcached:",
        "config-memcached-help": "Elenco 'e ll'indirizzi IP p' 'e putè ausà p' 'o Memcached.\nS'avess'a specificà uno pe' riga e scrivere 'a porta 'e trasuta. P'esempio:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-install-subscribe-fail": "Nun se pò sottoscrivere mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL nun è installato e <code>allow_url_fopen</code> nun è disponibbele.",
        "config-install-mainpage": "Crianno 'a paggena prencepale ch' 'e cuntenute predefinite",
+       "config-install-mainpage-exists": "'A paggena principale esiste già, è zumpata",
        "config-install-extension-tables": "Crianno tabelle pe' estenziune appicciate",
        "config-install-mainpage-failed": "Nun se pò nzertà 'a paggena prencepale: $1",
-       "config-install-done": "<strong>Cumplimente!</strong>\nAvite installato MediaWiki apposto.\n\n'O prugramma 'installazione ha generato nu file <code>LocalSettings.php</code> ca cuntene tuttuquante 'e mpustaziune.\n\nAvit'a scarrecà chisto e 'o nzertà dint' 'a cartella bbase d' 'o wiki vuosto ('a stessa addò fosse prisente l' index.php). 'A scarreca avess'a partì automaticamente.\n\nSi nu download nun s'avviasse, o si è stato annullato, putite riavvià cliccanno ncopp' 'o cullegamento 'e seguito:\n\n$3\n\n<strong>Nota:</strong> si ascite mò 'a ll'installazione senza manco scarrecà 'o file 'e configurazione che s'è criato, po chesto nun sarrà cchiù dispunibbele.\n\nQuanno fosse tutto fernuto allora <strong>[$2 trasite dint' 'o wiki vuosto]</strong>.",
+       "config-install-done": "<strong>Cumplimente!</strong>\nAvite installato MediaWiki.\n\n'O prugramma 'installazione ha generato nu file <code>LocalSettings.php</code> ca cuntene tuttuquante 'e mpustaziune.\n\nAvit'a scarrecà chisto e 'o nzertà dint' 'a cartella bbase d' 'o wiki vuosto ('a stessa addò fosse prisente l' index.php). 'A scarreca avess'a partì automaticamente.\n\nSi nu download nun s'avviasse, o si è stato annullato, putite riavvià cliccanno ncopp' 'o cullegamento 'e seguito:\n\n$3\n\n<strong>Nota:</strong> si ascite mò 'a ll'installazione senza manco scarrecà 'o file 'e configurazione che s'è criato, po chesto nun sarrà cchiù dispunibbele.\n\nQuanno fosse tutto fernuto allora <strong>[$2 trasite dint' 'o wiki vuosto]</strong>.",
+       "config-install-done-path": "<strong>Cumplimente!</strong>\nAvite installato MediaWiki.\n\n'O prugramma 'installazione ha generato nu file <code>LocalSettings.php</code> ca cuntene tuttuquante 'e mpustaziune.\n\nAvit'a scarrecà chisto, e l'avit'azzeccà dint' 'o <code>$4</code>. 'A scarreca avess'a partì automaticamente.\n\nSi nu download nun s'avviasse, o si è stato annullato, putite riavvià cliccanno ncopp' 'o cullegamento 'e seguito:\n\n$3\n\n<strong>Nota:</strong> si ascite mò 'a ll'installazione senza manco scarrecà 'o file 'e configurazione che s'è criato, po chesto nun sarrà cchiù dispunibbele.\n\nQuanno fosse tutto fernuto allora <strong>[$2 trasite dint' 'o wiki vuosto]</strong>.",
+       "config-install-success": "Avite installato MediaWiki apposto. Mo' putite vedé ncopp'a <$1$2> 'o wiki vuosto.\nSi avite cocche dubbio, vedite 'e trasí dint' 'a l'elenco 'e quistione FAQ:\n<https://www.mediawiki.org/wiki/Manual:FAQ> o vedite 'e cuntattà cocche forum 'e suppuorto dint' 'a chilla paggena.",
        "config-download-localsettings": "Scarreca <code>LocalSettings.php</code>",
        "config-help": "ajùto",
        "config-help-tooltip": "cliccà pe' 'o spannere",
        "config-nofile": "'O file \"$1\" nun se trova. Forse è stato scancellato?",
        "config-extension-link": "'O sapevate ch' 'o wiki vuosto suppurtasse 'e [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensiune]?\n\nPutite navigà nfra chiste [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensiune pe' categurìa].",
-       "mainpagetext": "<strong>MediaWiki è stato nstallato.</strong>",
-       "mainpagedocfooter": "Iate a cunzultà [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] pe' n'avé nfurmaziune ncopp' 'o modo aùso d' 'o software wiki.\n\n== P'accummincià ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenco 'e mpustaziune pe' sta configuraziona]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ 'e Mediawiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenco 'e nutizie 'e Mediawiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione 'e MediaWiki p' 'a lengua vuosta]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Mparate a cumbattere 'o spammo dint' 'a wiki d' 'a vosta]"
+       "config-skins-screenshots": "$1 (screenshots: $2)",
+       "config-extensions-requires": "$1 (vuless' 'o $2)",
+       "config-screenshot": "screenshot",
+       "mainpagetext": "<strong>MediaWiki è stato installato.</strong>",
+       "mainpagedocfooter": "Iate a cunzultà [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] pe' n'avé nfurmaziune ncopp' 'o modo aùso d' 'o software wiki.\n\n== P'accummincià ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenco 'e mpustaziune pe' sta configuraziona]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ 'e Mediawiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenco 'e nutizie 'e Mediawiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione 'e MediaWiki p' 'a lengua vuosta]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Mparate a cumbattere 'o spammo dint' 'a wiki d' 'a vosta]"
 }
index 9d651f4..6a42d58 100644 (file)
@@ -2156,7 +2156,7 @@ class Article implements Page {
 
        /**
         * Lightweight method to get the parser output for a page, checking the parser cache
-        * and so on. Doesn't consider most of the stuff that WikiPage::view is forced to
+        * and so on. Doesn't consider most of the stuff that Article::view() is forced to
         * consider, so it's not appropriate to use there.
         *
         * @since 1.16 (r52326) for LiquidThreads
index 6e907de..6b0c2aa 100644 (file)
@@ -407,6 +407,11 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac
                array $targetsWithVisitThresholds,
                $minimumWatchers = null
        ) {
+               if ( $targetsWithVisitThresholds === [] ) {
+                       // No titles requested => no results returned
+                       return [];
+               }
+
                $dbr = $this->getConnectionRef( DB_REPLICA );
 
                $conds = $this->getVisitingWatchersCondition( $dbr, $targetsWithVisitThresholds );
index 33383e2..f07f30c 100644 (file)
        "redirect-file": "Назва файлу",
        "redirect-logid": "ID журнала",
        "redirect-not-exists": "Значэньне ня знойдзена",
+       "redirect-not-numeric": "Значэньне ня лікавае",
        "fileduplicatesearch": "Пошук дублікатаў файлаў",
        "fileduplicatesearch-summary": "Пошук аднолькавых файлаў на падставе іх хэшаў.",
        "fileduplicatesearch-filename": "Назва файла:",
index e63b7a1..e833d9d 100644 (file)
        "brokenredirects-edit": "редактиране",
        "brokenredirects-delete": "изтриване",
        "withoutinterwiki": "Страници без междуезикови препратки",
-       "withoutinterwiki-summary": "Следните страници не препращат към версии на други езици:",
+       "withoutinterwiki-summary": "Следните страници не са свързани с версии на други езици:",
        "withoutinterwiki-legend": "Представка",
        "withoutinterwiki-submit": "Показване",
        "fewestrevisions": "Страници с най-малко редакции",
        "listusers-noresult": "Няма намерени потребители.",
        "listusers-blocked": "(блокиран)",
        "activeusers": "Списък на активните потребители",
-       "activeusers-intro": "Това Ðµ Ñ\81пиÑ\81Ñ\8aк Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елиÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81а Ð´ÐµÐ¼Ð¾Ð½Ñ\81Ñ\82Ñ\80иÑ\80али някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.",
+       "activeusers-intro": "Това Ðµ Ñ\81пиÑ\81Ñ\8aк Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елиÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81а Ð¸Ð¼али някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.",
        "activeusers-count": "$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}",
        "activeusers-from": "Показване на потребителите, започвайки от:",
        "activeusers-groups": "Показване на потребителите, принадлежащи към групи:",
        "emailuser-title-target": "Писмо до {{GENDER:$1|потребителя}}",
        "emailuser-title-notarget": "Изпращане на е-писмо на потребител",
        "emailpagetext": "Можете да използвате формуляра по-долу, за да изпратите електронно писмо на {{GENDER:$1|този потребител}}.\nАдресът, който се въвели в [[Special:Preferences|настройките си]], ще се появи в полето „От“ на писмото, така че получателят ще е в състояние да ви отговори директно.",
-       "defemailsubject": "Писмо от потребител $1 в {{SITENAME}}",
+       "defemailsubject": "Писмо от потребител „$1“ в {{SITENAME}}",
        "usermaildisabled": "Потребителят не е разрешил да получава електронна поща",
        "usermaildisabledtext": "Не можете да изпращате електронна поща на други потребители от това уики",
        "noemailtitle": "Няма електронна поща",
        "noemailtext": "Този потребител не е посочил валиден адрес за електронна поща.",
        "nowikiemailtext": "Този потребител е избрал да не получава електронна поща от други потребители.",
-       "emailnotarget": "Несъществуващ или невалиден получател на е-писмото.",
+       "emailnotarget": "Несъществуващо или невалидно потребителско име за получател.",
        "emailtarget": "Въвежда се получателят на е-писмото",
        "emailusername": "Потребителско име:",
        "emailusernamesubmit": "Изпращане",
        "emailmessage": "Съобщение:",
        "emailsend": "Изпращане",
        "emailccme": "Изпращане на копие на писмото до автора.",
-       "emailccsubject": "Ð\9aопие Ð½Ð° Ð¿Ð¸Ñ\81моÑ\82о Ð²и до $1: $2",
+       "emailccsubject": "Ð\9aопие Ð½Ð° Ð¿Ð¸Ñ\81моÑ\82о Ð\92и до $1: $2",
        "emailsent": "Писмото е изпратено",
        "emailsenttext": "Писмото Ви беше изпратено.",
        "emailuserfooter": "Това писмо беше изпратено от $1 на {{GENDER:$2|$2}} чрез функцията „{{int:emailuser}}“ на {{SITENAME}}. Ако отговорите на писмото, вашето писмо ще бъде изпратено директно на {{GENDER:$1|първоначалния подател}}, показвайки адреса на ел. Ви поща на получателя.",
        "protectexpiry": "Изтича на:",
        "protect_expiry_invalid": "Невалиден срок на изтичане.",
        "protect_expiry_old": "Срокът на изтичане е минал.",
-       "protect-unchain-permissions": "Ð\9fозволÑ\8fване Ð½Ð° Ð¿Ð¾-наÑ\82аÑ\82Ñ\8aÑ\88ни възможности за защита",
+       "protect-unchain-permissions": "Ð\9fозволÑ\8fване Ð½Ð° Ð´Ð¾Ð¿Ñ\8aлниÑ\82елни възможности за защита",
        "protect-text": "Тук можете да прегледате и промените нивото на защита на страницата <strong>$1</strong>.",
        "protect-locked-blocked": "Не можете да променяте нивата на защита на страниците, докато сте блокиран(а).\nТекущите настройки за страницата <strong>$1</strong> са:",
        "protect-locked-dblock": "Нивата на защита на страниците не могат да бъдат променяни, защото базата от данни е заключена.\nЕто текущите настройки за страницата <strong>$1</strong>:",
-       "protect-locked-access": "Нямате правото да променяте нивата на защита на страниците. Ето текущите настройки за страницата „'''$1'''“:",
+       "protect-locked-access": "Нямате правото да променяте нивата на защита на страниците. Ето текущите настройки за страницата <strong>$1</strong>:",
        "protect-cascadeon": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита.\nМожете да промените нивото на защита на страницата, но това няма да повлияе върху каскадната защита.",
        "protect-default": "Позволяване за всички потребители",
        "protect-fallback": "Позволяване само за потребители с права на „$1“",
        "viewdeletedpage": "Преглед на изтрити страници",
        "undeletepagetext": "{{PLURAL:$1|Следната страница беше изтрита, но все още се намира в архива и може да бъде възстановена|Следните $1 страници бяха изтрити, но все още се намират в архива и могат да бъдат възстановени}}. Архивът може да се почиства от време на време.",
        "undelete-fieldset-title": "Възстановяване на версии",
-       "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска '''''{{int:undeletebtn}}'''''.\nЗа частично възстановяване се поставят отметки на тези версии на страницата, които трябва да бъдат възстановени, след което се натиска '''''{{int:undeletebtn}}'''''.",
+       "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска <strong><em>{{int:undeletebtn}}</em></strong>.\nЗа частично възстановяване се поставят отметки на тези версии на страницата, които трябва да бъдат възстановени, след което се натиска <strong><em>{{int:undeletebtn}}</em></strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|версия беше изтрита|версии бяха изтрити}}",
        "undeletehistory": "Ако възстановите страницата, всички версии ще бъдат върнати в историята.\nАко след изтриването е създадена страница със същото име, възстановените версии ще се появят като по-ранна история, а текущата версия на страницата няма да бъде заменена автоматично. Също така обърнете внимание, че ограниченията, приложени върху версиите, ще се загубят след възстановяването.",
        "undeleterevdel": "Възстановяването няма да бъде изпълнено, ако би довело до частично изтриване на актуалната версия. В такъв случай актуалната версия не трябва да бъде избирана или пък състоянието ѝ трябва да бъде променено на нормална (нескрита) версия. Версиите на файлове, които нямате право да преглеждате, няма да бъдат възстановени.",
        "undeletehistorynoadmin": "Тази страница е била изтрита. В резюмето отдолу е посочена причината за това, заедно с информация за потребителите, редактирали страницата преди изтриването ѝ. Конкретното съдържание на изтритите версии е достъпно само за администратори.",
        "undelete-revision": "Изтрита версия на $1 (към $4, в $5) от $3:",
-       "undeleterevision-missing": "Неправилна или липсваща версия. Може да сте последвали грешна препратка или указаната версия да е била възстановена или премахната от архива",
+       "undeleterevision-missing": "Неправилна или липсваща версия.\nМоже да сте последвали грешна препратка или указаната версия да е била възстановена или премахната от архива.",
        "undelete-nodiff": "Не е открита предишна редакция.",
        "undeletebtn": "Възстановяване",
        "undeletelink": "преглед/възстановяване",
        "undeleteinvert": "Обръщане на избора",
        "undeletecomment": "Причина:",
        "cannotundelete": "Една или повече операции по възстановяване се провалиха:\n$1",
-       "undeletedpage": "'''Страницата „$1“ беше възстановена.'''\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
+       "undeletedpage": "<strong>Страницата $1 беше възстановена</strong>\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
        "undelete-header": "Прегледайте [[Special:Log/delete|дневника на изтриванията]] за текущо изтритите страници.",
        "undelete-search-title": "Търсене на изтрити страници",
        "undelete-search-box": "Търсене на изтрити страници",
        "undelete-filename-mismatch": "Не е възможно възстановяването на файловата версия с времева отметка $1: несъответствие в името на файла",
        "undelete-bad-store-key": "Не е възможно възстановяването на файловата версия с времева отметка $1: файлът е липсвал преди изтриването.",
        "undelete-cleanup-error": "Грешка при изтриване на неизползвания архивен файл „$1“.",
-       "undelete-missing-filearchive": "Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни. Вероятно вече е възстановен.",
+       "undelete-missing-filearchive": "Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни.\nВероятно вече е възстановен.",
        "undelete-error": "Грешка при възстановяване на страницата",
        "undelete-error-short": "Грешка при възстановяването на изтрития файл: $1",
        "undelete-error-long": "Възникнаха грешки при възстановяването на изтрития файл:\n\n$1",
        "year": "От година (и по-рано):",
        "date": "От дата (и по-рано):",
        "sp-contributions-newbies": "Показване само на приносите на нови потребители",
-       "sp-contributions-newbies-sub": "на Ð½Ð¾Ð²Ð¸ Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82ели",
+       "sp-contributions-newbies-sub": "Ð\97а Ð½Ð¾Ð²Ð¸ Ñ\81меÑ\82ки",
        "sp-contributions-newbies-title": "Потребителски приноси за нови сметки",
        "sp-contributions-blocklog": "дневник на блокиранията",
        "sp-contributions-deleted": "изтрити приноси на {{GENDER:$1|потребител}}",
        "blockipsuccesssub": "Блокирането беше успешно",
        "blockipsuccesstext": "Потребител [[Special:Contributions/$1|$1]] беше блокиран(а).<br />\nМожете да прегледате пълния [[Special:BlockList|списък на блокираните потребители]].",
        "ipb-blockingself": "На път сте да блокирате себе си! Наистина ли желаете да извършите това действие?",
-       "ipb-confirmhideuser": "На път сте да блокирате потребител, който е \"скрит потребител\". Това действие ще заличи потребителското име от всички списъци и дневници. Наистина ли желаете да направите това?",
+       "ipb-confirmhideuser": "На път сте да блокирате потребител, който е „скрит потребител“. Това действие ще заличи потребителското име от всички списъци и дневници. Наистина ли желаете да направите това?",
        "ipb-edit-dropdown": "Редактиране на причините за блокиране",
        "ipb-unblock-addr": "Отблокиране на $1",
        "ipb-unblock": "Отблокиране на потребителско име или IP-адрес",
        "autoblocklist-empty": "Списъкът на автоматичните блокирания е празен.",
        "ipblocklist": "Блокирани потребители",
        "ipblocklist-legend": "Търсене на блокиран потребител",
-       "blocklist-userblocks": "СкÑ\80иване Ð½Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80ани потребителски сметки",
+       "blocklist-userblocks": "СкÑ\80иване Ð±Ð»Ð¾ÐºÐ¸Ñ\80анеÑ\82о Ð½Ð° потребителски сметки",
        "blocklist-tempblocks": "Скриване на временни блокирания",
-       "blocklist-addressblocks": "Скриване на отделни блокирани IP адреси",
+       "blocklist-addressblocks": "Скриване на отделни блокирания на IP адреси",
        "blocklist-rangeblocks": "Скриване на блокиранията по IP диапазон",
        "blocklist-timestamp": "Дата и час",
        "blocklist-target": "Цел",
index fd92516..1224672 100644 (file)
        "unwatch": "伓使監視",
        "unwatchthispage": "停止監視",
        "watchlist-details": "Nṳ̄ gì găng-sê-dăng {{PLURAL:$1|ô $1 gó|dŭ liāng ô $1 gó}} hiĕk-miêng (bău-guák tō̤-lâung-hiĕk).",
+       "wlheader-enotif": "Ī-gĭng kŭi kó̤ diêng-piĕ tŭng-dĭ.",
+       "wlheader-showupdated": "Ṳ̀-guō ô diê-siŏh-hiĕk, găk nṳ̄ muōi-muōi siŏh-huòi káng guó cī-hâiu, bô ké̤ṳk nè̤ng gāi kó̤, hī-siŏh-hiĕk gì biĕu-dà̤ cêu-sê <strong>cū-tā̤</strong>.",
        "wlshowlast": "顯示最$1點鐘$2日",
        "watchlist-options": "監視單選項",
        "watching": "監視...",
index 9271047..8bc287d 100644 (file)
        "redirect-file": "Jméno souboru",
        "redirect-logid": "ID protokolovacího záznamu",
        "redirect-not-exists": "Hodnota nenalezena",
+       "redirect-not-numeric": "Hodnota není číslo",
        "fileduplicatesearch": "Hledání duplicitních souborů",
        "fileduplicatesearch-summary": "Hledání duplicitních souborů podle jejich hašů.",
        "fileduplicatesearch-filename": "Jméno souboru:",
index 2582776..f60c136 100644 (file)
        "redirect-file": "Nom du fichier",
        "redirect-logid": "ID de journal",
        "redirect-not-exists": "Valeur non trouvée",
+       "redirect-not-numeric": "Valeur non numérique",
        "fileduplicatesearch": "Recherche de doublons",
        "fileduplicatesearch-summary": "Recherche des copies de fichiers identiques d'après leur empreinte de hachage.",
        "fileduplicatesearch-filename": "Nom du fichier :",
index d964196..4f8282a 100644 (file)
        "customcssprotected": "Non ten os permisos necesarios para modificar esta páxina de CSS, dado que contén a configuración persoal doutro usuario.",
        "customjsonprotected": "Non ten os permisos necesarios para modificar esta páxina JSON xa que contén a configuración persoal doutro usuario.",
        "customjsprotected": "Non ten os permisos necesarios para modificar esta páxina de JavaScript, dado que contén a configuración persoal doutro usuario.",
-       "sitecssprotected": "Non ten permiso para editar esta páxina CSS xa que pode afectar a tódolos visitantes",
-       "sitejsonprotected": "Non ten permiso para editar esta páxina JSON xa que pode afectar a tódolos visitantes",
-       "sitejsprotected": "Non ten permiso para editar esta páxina JavaScript xa que pode afectar a tódolos visitantes",
+       "sitecssprotected": "Non ten permiso para editar esta páxina CSS xa que isto pode afectar a tódolos visitantes.",
+       "sitejsonprotected": "Non ten permiso para editar esta páxina JSON xa que isto pode afectar a tódolos visitantes.",
+       "sitejsprotected": "Non ten permiso para editar esta páxina JavaScript xa que isto pode afectar a tódolos visitantes.",
        "mycustomcssprotected": "Non ten os permisos necesarios para editar esta páxina de CSS.",
        "mycustomjsonprotected": "Non ten permisos para editar esta páxina JSON.",
        "mycustomjsprotected": "Non ten os permisos necesarios para editar esta páxina de JavaScript.",
        "redirect-file": "Nome de ficheiro",
        "redirect-logid": "Identificador de rexistro",
        "redirect-not-exists": "Non se atopou o valor",
+       "redirect-not-numeric": "Valor non numérico",
        "fileduplicatesearch": "Procurar ficheiros duplicados",
        "fileduplicatesearch-summary": "Procurar ficheiros duplicados a partir do valor de <i>hash</i> (un mecanismo de comprobación).",
        "fileduplicatesearch-filename": "Nome do ficheiro:",
        "edit-error-long": "Erros:\n\n$1",
        "revid": "revisión $1",
        "pageid": "identificador de páxina $1",
-       "interfaceadmin-info": "$1\n\nOs permisos para editar os ficheiros CSS/JS/JSON separáronse recentemente do dereito <code>editinterface</code>. Se non comprende porqué está vendo este erro, vexa [[mw:MediaWiki_1.32/interface-admin]].",
+       "interfaceadmin-info": "$1\n\nOs permisos para editar os ficheiros CSS/JS/JSON globais separáronse recentemente do dereito <code>editinterface</code>. Se non comprende porqué está vendo este erro, vexa [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "As marcas &lt;html&gt; non poden usarse fóra das páxinas normais.",
        "gotointerwiki": "Deixando {{SITENAME}}",
        "gotointerwiki-invalid": "O título especificado non é válido.",
index f7e8441..b6541f8 100644 (file)
        "redirect-file": "Nome del file",
        "redirect-logid": "ID registro",
        "redirect-not-exists": "Valore non trovato",
+       "redirect-not-numeric": "Valore non numerico",
        "fileduplicatesearch": "Ricerca dei file duplicati",
        "fileduplicatesearch-summary": "Ricerca di eventuali duplicati del file in base al valore di ''hash''.",
        "fileduplicatesearch-filename": "Nome del file:",
index 083fd5f..a7a291f 100644 (file)
        "index-category": "Kaca kaindhèks",
        "noindex-category": "Kaca ora kaindhèks",
        "broken-file-category": "Kaca mawa pranala barkas rusak",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Bab",
        "article": "Kaca isi",
        "newwindow": "(buka mawa jendhéla anyar)",
        "versionrequired": "Dibutuhaké MediaWiki vèrsi $1",
        "versionrequiredtext": "MediaWiki vèrsi $1 dibutuhaké kanggo nggunakaké kaca iki. Mangga mirsani [[Special:Version|kaca iki]]",
        "ok": "Oké",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Dijupuk saka \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|Panjenengan duwé}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Panjenengan duwé}} $1 saka {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
        "site-atom-feed": "Lebon atom $1",
        "page-rss-feed": "\"$1\" ''RSS Feed''",
        "page-atom-feed": "Pakan atom \"$1\"",
+       "feed-atom": "Atom",
        "red-link-title": "$1 (kaca ora ana)",
        "sort-descending": "Urutaké medhun",
        "sort-ascending": "Urutaké munggah",
        "botpasswords-existing": "Tembung wadiné bot sing cumepak",
        "botpasswords-createnew": "Gawé anyar tembung wadiné bot",
        "botpasswords-editexisting": "Besut tembung wadiné bot sing anyar",
+       "botpasswords-label-needsreset": "(tembung wadi kudu panjenengan ambali setèl)",
        "botpasswords-label-appid": "Jeneng bot:",
        "botpasswords-label-create": "Gawé",
        "botpasswords-label-update": "Anyari",
        "savechanges": "Simpen owahan",
        "publishpage": "Babar kaca",
        "publishchanges": "Babar owahan",
+       "savearticle-start": "Simpen kaca...",
+       "savechanges-start": "Simpen owahan...",
+       "publishpage-start": "Babar kaca...",
        "publishchanges-start": "Babar owahan...",
        "preview": "Pratuduh",
        "showpreview": "Deleng pratuduh",
        "template-semiprotected": "(semu kareksa)",
        "hiddencategories": "Kaca iki anggotaning {{PLURAL:$1|1 kategori wadi|$1 kategori wadi}}:",
        "edittools": "<!-- Tèks ing ngisor iki bakal ditudhuhaké ing ngisoring isènan suntingan lan pangemotan.-->",
+       "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}} matesi bisané panjenengan nggawé kaca anyar.\nPanjenengan bisa bali lan mbesut kaca sing ana, utawa [[Special:UserLogin|mlebu log utawa nggawé akun]].",
        "nocreate-loggedin": "Panjenengan ora kagungan idin kanggo nggawé kaca anyar.",
        "sectioneditnotsupported-title": "Panyuntingan bagéyan ora kasengkuyungan",
        "content-model-text": "tulisan barès",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "expensive-parserfunction-warning": "Pènget: Kaca iki ngandhut kakèhan panggunan fungsi ''parser'' sing larang.\n\nSajatiné kuduné duwé kurang saka {{PLURAL:$2|panggilan|panggilan}}, saiki ana {{PLURAL:$1|$1 panggilan|$1 panggilan}}.",
        "expensive-parserfunction-category": "Kaca-kaca mawa panggunan fungsi ''parser'' sing kakèhan",
        "post-expand-template-inclusion-warning": "Pènget: Cithakan klebu ukurané kegedhèn.\nSawetara cithakan bakal dilirwakaké.",
        "diff-multi-manyusers": "({{PLURAL:$1|Siji révisi langsung|$1 révisi langsung}} déning {{PLURAL:$2|panganggo|panganggo}} $2 ora katuduhaké)",
        "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
        "searchresults": "Kasiling golèk",
+       "search-filter-title-prefix-reset": "Golèk kabèh kaca",
        "searchresults-title": "Kasiling golèk \"$1\"",
        "titlematches": "Sesirah kaca cocog",
        "textmatches": "Tèks artikel sing cocog",
        "youremail": "Layang-èl:",
        "username": "{{GENDER:$1|Jeneng panganggo}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anggota}} saka {{PLURAL:$1|golongan}}:",
+       "prefs-memberingroups-type": "$1",
        "group-membership-link-with-expiry": "$1 (tekan $2)",
        "prefs-registration": "Wektu régistrasi:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "Jeneng asli:",
        "yourlanguage": "Basa sing dianggo:",
        "yourvariant": "Werna basa isi:",
        "saveusergroups": "Simpen golongan {{GENDER:$1|panganggo}}",
        "userrights-groupsmember": "Anggota saka:",
        "userrights-groupsmember-auto": "Anggota implisit saka:",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "Panjenengan bisa ngowahi grup-grup sing ana panganggoné iki.\n* Kothak sing dicenthang tegesé panganggo iki ana sajroné grup iku.\n* Kothak sing ora dicenthang tegesé panganggo iku ora ana ing grup iku.\n* Tandha bintang * tegesé panjenengan ora bisa ngilangi grup iku yèn wis tau nambah, utawa sawalikané.",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Panjenengan ora ana hak kanggo ngowahi hak panganggo ing wiki liyané.",
        "userrights-nodatabase": "Basis data $1 ora ana utawa ora lokal.",
        "userrights-changeable-col": "Grup sing bisa panjenengan owahi",
        "userrights-unchangeable-col": "Grup sing ora bisa diowahi panjenengan",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-no-shorten-expiry-marker": "$1#",
        "userrights-expiry-current": "Kadaluwarsa $1",
        "userrights-expiry-none": "Ora kadaluwarsa",
        "userrights-expiry": "Kadaluwarsa:",
        "action-deletechangetags": "busak tag saka sasana dhata",
        "action-purge": "buwang kaca iki",
        "nchanges": "$1 {{PLURAL:$1|pangowahan|owah-owahan}}",
+       "ntimes": "$1×",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|saka keri dhewe mrene}}",
        "enhancedrc-history": "sajarah",
        "recentchanges": "Owahan-owahan anyar",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uga delengen [[Special:NewPages|pratélané kaca-kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Tuduhaké",
+       "rcfilters-tag-remove": "Busek '$1'",
        "rcfilters-legend-heading": "<strong>Pratélané cekakan:</strong>",
        "rcfilters-other-review-tools": "Piranti pamriksa liyané",
        "rcfilters-group-results-by-page": "Golongaké kasilé miturut kacané",
        "rcfilters-activefilters": "Saringan murub",
+       "rcfilters-activefilters-hide": "Dhelikaké",
+       "rcfilters-activefilters-show": "Tuduhaké",
        "rcfilters-advancedfilters": "Saringan lanjutan",
        "rcfilters-limit-title": "Kasil kang arep dituduhaké",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|owahan|owahan}}, $2",
+       "rcfilters-date-popup-title": "Dawané wektu kang arep panjenengan golèki",
        "rcfilters-days-title": "Dina-dina sing mentas waé",
        "rcfilters-hours-title": "Jam-jam sing mentas waé",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|dina|dina}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|jam|jam}}",
+       "rcfilters-highlighted-filters-list": "Kasuwur: $1",
        "rcfilters-quickfilters": "Saringan sumimpen",
        "rcfilters-quickfilters-placeholder-title": "Durung ana saringan kang kasimpen",
        "rcfilters-quickfilters-placeholder-description": "Saperlu nyimpen setèlaning saringan lan nganggo setèlan iku manèh ing tembé, kliken ikon markah buku ing babagan Saringan Murub ing ngisor.",
        "rcfilters-savedqueries-unsetdefault": "Wutung ndadèkaké baku",
        "rcfilters-savedqueries-remove": "Busak",
        "rcfilters-savedqueries-new-name-label": "Jeneng",
+       "rcfilters-savedqueries-new-name-placeholder": "Wedharaké ancasé saringané",
        "rcfilters-savedqueries-apply-label": "Gawé saringan",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Gawé saringan baku",
        "rcfilters-savedqueries-cancel-label": "Wurung",
        "rcfilters-savedqueries-add-new-title": "Simpen setèlané saringan sing saiki",
+       "rcfilters-savedqueries-already-saved": "Saringan iki wis kasimpen. Ganti setèlané panjenengan saperlu nggawé Saringan Kasimpen kang anyar.",
        "rcfilters-restore-default-filters": "Pulihaké saringan gawan",
        "rcfilters-clear-all-filters": "Resiki kabèh saringan",
+       "rcfilters-show-new-changes": "Deleng owah-owahan anyar dhéwé",
        "rcfilters-search-placeholder": "Owah-owahan saringan (anggo menu utawa golèk jeneng saringan)",
        "rcfilters-invalid-filter": "Saringan ora sah",
        "rcfilters-empty-filter": "Ora ana saringan sing aktif. Kabèh sumbangan katuduhaké.",
        "rcfilters-filter-editsbyself-description": "Pisumbangé panjenengan dhéwé.",
        "rcfilters-filter-editsbyother-label": "Owah-owahané liyan",
        "rcfilters-filter-editsbyother-description": "Kabèh owahan kajaba duwèké panjenengan.",
-       "rcfilters-filtergroup-userExpLevel": "Tataran pangalaman (mung kanggo panganggo kadhaftar)",
+       "rcfilters-filtergroup-userExpLevel": "Pandhaftaran lan pangalaman pangguna",
        "rcfilters-filter-user-experience-level-registered-label": "Kadhaftar",
-       "rcfilters-filter-user-experience-level-registered-description": "Pambesut sing mlebu log.",
+       "rcfilters-filter-user-experience-level-registered-description": "Pambesut kang mlebu log.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Ora kadhaftar",
-       "rcfilters-filter-user-experience-level-unregistered-description": "Pambesut sing ora mlebu log.",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Pambesut kang ora mlebu log.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Wong neneka anyar",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Kurang saka 10 besutan lan 4 dina kagiyatan.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Pambesut kadhartar mawa besutan kurang saka 10 utawa aktif kurang saka 4 dina.",
        "rcfilters-filter-user-experience-level-learner-label": "Wong sinau",
        "rcfilters-filter-user-experience-level-learner-description": "Luwih akèh pangalamané tinimbang \"Wong neneka anyar\" nanging durung ngèmperi \"Panganggo kawakan\".",
        "rcfilters-filter-user-experience-level-experienced-label": "Panganggo kawakan",
        "apisandbox-dynamic-error-exists": "Paramèter aran \"$1\" wis ana.",
        "apisandbox-deprecated-parameters": "Paramèter lawas",
        "apisandbox-fetch-token": "Isi otomatis tokené",
+       "apisandbox-add-multi": "Wuwuh",
        "apisandbox-submit-invalid-fields-title": "Sawenèh babagan ora trep",
        "apisandbox-submit-invalid-fields-message": "Jajal dandanana babagan sing ditandhani lan jajalen manèh.",
        "apisandbox-results": "Kasil",
        "apisandbox-results-error": "Ana masalah nalika ngamot wangsulan kanggo panyuwuné API: $1.",
        "apisandbox-request-selectformat-label": "Tuduhaké dhata suwunan minangka:",
        "apisandbox-request-url-label": "URL dikarepaké:",
+       "apisandbox-request-format-json-label": "JSON",
        "apisandbox-request-json-label": "Nyuwun JSON:",
        "apisandbox-request-time": "Suwéné panyuwunan: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Dandanana tokené lan balènana numpuk",
        "apisandbox-multivalue-all-values": "$1 (Kabèh aji)",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Golèk sumber buku",
+       "booksources-isbn": "ISBN:",
        "booksources-search": "Golèk",
        "booksources-text": "Ing ngisor iki kapacak daftar pranala menyang situs liyané sing ngadol buku anyar lan bekas, lan mbok-menawa uga ndarbèni informasi sabanjuré ngenani buku-buku sing lagi panjenengan golèki:",
        "booksources-invalid-isbn": "ISBN sing diwènèhaké katonané ora trep; priksanen bokmanawa ana masalah nalika nurun sumber asli.",
        "speciallogtitlelabel": "Paran (sesirah utawa {{ns:user}}:jeneng panganggo):",
        "log": "Log",
        "logeventslist-submit": "Tuduhaké",
+       "logeventslist-tag-log": "Log tenger",
        "all-logs-page": "Kabèh log umum",
        "alllogstext": "Pitontonan gabungan log-log sing ana ing {{SITENAME}}.\nPanjenengan bisa nyiyutaké sesawangané kanthi milih sawijining jinis log, jeneng panganggo (sènsitif-case), utawa kaca sing gegayutan (uga sènsitif-case).",
        "logempty": "Ora tinemu wiji kang cocog ing log",
        "listgrants": "Idin",
        "listgrants-grant": "Idin",
        "listgrants-rights": "Hak",
+       "listgrants-grant-display": "$1 <code>($2)</code>",
        "trackingcategories": "Kategori panglacak",
        "trackingcategories-msg": "Kategori panglacak",
        "trackingcategories-name": "Jeneng layang",
+       "trackingcategories-nodesc": "Ora ana wedharané.",
+       "trackingcategories-disabled": "Kategori ora kaurubaké",
        "mailnologin": "Ora ana alamat kirim",
        "mailnologintext": "Panjenengan kudu [[Special:UserLogin|mlebu log]] lan duwé alamat layang-èl sing trep ing [[Special:Preferences|pilalané]] panjenengan kanggo nglayangi panganggo liyané.",
        "emailuser": "Kirimi panganggo iki layang-èl",
        "emailuserfooter": "Layang-e iki dikirimaké déning $1 marang $2 migunakaké fungsi \"Layangpanganggo\" ing {{SITENAME}}.",
        "usermessage-summary": "Tinggalaké layang sistem.",
        "usermessage-editor": "Pawartaning layang sistem",
+       "usermessage-template": "MediaWiki:UserMessage",
        "watchlist": "Pawawangan",
        "mywatchlist": "Pawawangan",
        "watchlistfor2": "Kanggo $1 $2",
        "enotif_lastdiff": "Saperlu ndeleng owahan iki, tilikana $1",
        "enotif_anon_editor": "panganggo anonim $1",
        "enotif_body": "Sing minulya $WATCHINGUSERNAME,\n\nKaca $PAGETITLE ing {{SITENAME}} wis $CHANGEDORCREATED ing $PAGEEDITDATE déning $PAGEEDITOR, mangga mirsani $PAGETITLE_URL kanggo vèrsi pungkasan.\n\n$NEWPAGE\n\nSajarah suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungana panyunting:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKita ora bakal ngandhani manèh yèn diowahi manèh, kejaba panjenengan wis mirsani kaca iku. Panjenengan uga bisa mbusak tandha notifikasi kanggo kabèh kaca pangawasan ing daftar pangawasan panjenengan.\n\n             Sistém notifikasi {{SITENAME}}\n\n--\nKanggo ngowahi préferènsi ing daftar pangawasan panjenengan, mangga mirsani\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUmpan balik lan pitulung sabanjuré:\n$HELPPAGE",
+       "enotif_minoredit": "Iki besutan cilik",
        "created": "kadamel",
        "changed": "kaubah",
        "deletepage": "Busak kaca",
        "dellogpage": "Log busak",
        "dellogpagetext": "Ing ngisor iki kapacak log pambusakan kaca sing anyar dhéwé.",
        "deletionlog": "log busak",
+       "log-name-create": "Log panggawéning kaca",
+       "log-description-create": "Ing isor iki pratélan kaca kang mentas kagawé.",
+       "logentry-create-create": "$1 {{GENDER:$2|nggawé}} kaca $3",
        "reverted": "Dibalèkaké ing revisi sadurungé",
        "deletecomment": "Alesan:",
        "deleteotherreason": "Alesan liya utawa tambahan:",
        "delete-toobig": "Kaca iki darbé sajarah besutan sing dawa, punjul $1 {{PLURAL:$1|owahan}}.\nMbusak kaca sing kaya mangkono wis ora diidinaké kanggo njagani supaya ora ana sing rusak ing {{SITENAME}}.",
        "delete-warning-toobig": "Kaca iki duwé sajarah besut sing dawa, punjul $1 {{PLURAL:$1|révisi}}.\nMbusak kaca iki bisa ngrusak lakuné basis dhata ing {{SITENAME}};\nkudu diayahi kanthi ngati-ati.",
        "deleteprotected": "Panjenengan ora bisa mbusak kaca iki amarga direksa.",
-       "deleting-backlinks-warning": "'''Awas:''' Kaca liyane mungkin ana sing nautake ing kaca sing arep sampeyan busak.",
+       "deleting-backlinks-warning": "<strong>Pepéling:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Ana kaca liya]] kang nggayut utawa tranklud marang kaca kang arep panjenengan busek.",
        "rollback": "Pulihaké besutan",
        "rollbacklink": "balèkaké",
        "rollbacklinkcount": "balèkaké $1 {{PLURAL:$1|besutan|besutan}}",
index 9945fe5..91d5477 100644 (file)
        "redirect-file": "파일 이름",
        "redirect-logid": "기록 ID",
        "redirect-not-exists": "값을 찾을 수 없습니다",
+       "redirect-not-numeric": "값이 숫자가 아닙니다",
        "fileduplicatesearch": "중복된 파일 검색",
        "fileduplicatesearch-summary": "파일 해시값을 이용해 중복 파일을 검색합니다.",
        "fileduplicatesearch-filename": "파일 이름:",
index dcd8560..e2ded5c 100644 (file)
        "mypreferencesprotected": "Jums nav tiesību rediģēt savus iestatījumus.",
        "ns-specialprotected": "Nevar izmainīt īpašās lapas.",
        "titleprotected": "Šī lapa ir aizsargāta pret izveidošanu. To aizsargāja [[User:$1|$1]].\nNorādītais iemesls bija <em>$2</em>.",
+       "invalidtitle": "Nekorekts nosaukums",
        "invalidtitle-knownnamespace": "Nederīgs nosaukums ar vārdtelpu \"$2\" un tekstu \"$3\"",
        "invalidtitle-unknownnamespace": "Nederīgs nosaukums ar nezināmu vārdtelpas numuru \"$1\" un tekstu \"$2\"",
        "exception-nologin": "Neesat pieslēdzies",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrāti",
        "grouppage-suppress": "{{ns:project}}:Cenzētāji",
        "right-read": "Lasīt lapas",
-       "right-edit": "Izmainīt lapas",
+       "right-edit": "Labot lapas",
        "right-createpage": "Izveidot lapas (kuras nav diskusiju lapas)",
        "right-createtalk": "Izveidot diskusiju lapas",
        "right-createaccount": "Izveidot jaunus dalībnieka kontus",
        "rcfilters-other-review-tools": "Citi pārskatīšanas rīki",
        "rcfilters-group-results-by-page": "Grupēt rezultātus pēc lapas",
        "rcfilters-activefilters": "Aktīvie filtri",
+       "rcfilters-activefilters-hide": "Paslēpt",
+       "rcfilters-activefilters-show": "Parādīt",
        "rcfilters-advancedfilters": "Paplašinātie filtri",
        "rcfilters-limit-title": "Rādāmie rezultāti",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|izmaiņas|izmaiņa|izmaiņas}}, $2",
        "rcfilters-savedqueries-rename": "Pārsaukt",
        "rcfilters-savedqueries-setdefault": "Uzstādīt kā noklusēto",
        "rcfilters-savedqueries-unsetdefault": "Noņemt kā noklusēto",
-       "rcfilters-savedqueries-remove": "Noņemt",
+       "rcfilters-savedqueries-remove": "Dzēst",
        "rcfilters-savedqueries-new-name-label": "Nosaukums",
        "rcfilters-savedqueries-new-name-placeholder": "Apraksti filtra būtību",
        "rcfilters-savedqueries-apply-label": "Izveidot filtru",
        "rcfilters-watchlist-edit-watchlist-button": "Labot manu uzraugāmo lapu sarakstu",
        "rcfilters-watchlist-showupdated": "Izmaiņas lapās, kuras nav apmeklētas kopš izmaiņu veikšanas, ir <strong>trekninātā rakstā</strong>.",
        "rcfilters-preference-label": "Paslēpt uzlaboto pēdējo izmaiņu versiju",
+       "rcfilters-target-page-placeholder": "Ievadi lapas nosaukumu (vai kategoriju)",
        "rcnotefrom": "Zemāk {{PLURAL:$5|redzamas izmaiņas|redzama izmaiņa|redzamas izmaiņas}} kopš <strong>$3, $4</strong> (parādītas ne vairāk kā <strong>$1</strong>).",
        "rclistfromreset": "Atiestatīt datuma izvēli",
        "rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
        "filehist-filesize": "Faila izmērs",
        "filehist-comment": "Komentārs",
        "imagelinks": "Faila lietojums",
-       "linkstoimage": "{{PLURAL:$1|Šajās $1 lapās ir saites|Šajā lapā ir saite|Šajās $1 lapās ir saites}} uz šo failu:",
+       "linkstoimage": "Šo failu izmanto {{PLURAL:$1|šajās $1 lapās|šajā $1 lapā|šajās $1 lapās}}:",
        "linkstoimage-more": "Uz šo failu ir saites vairāk nekā $1 {{PLURAL:$1|lapās|lapā|lapās}}.\nŠajā sarakstā ir tikai {{PLURAL:$1|pirmās $1 saistītās lapas|pirmā $1 saistītā lapa|pirmās $1 saistītās lapas}} uz šo failu.\nPieejams arī [[Special:WhatLinksHere/$2|pilns saraksts]].",
-       "nolinkstoimage": "Nevienā lapā nav norāžu uz šo attēlu.",
+       "nolinkstoimage": "Šo failu neizmanto nevienā lapā.",
        "morelinkstoimage": "Skatīt [[Special:WhatLinksHere/$1|vairāk saites]] uz šo failu.",
        "linkstoimage-redirect": "$1 (faila pāradresācija) $2",
        "duplicatesoffile": "{{PLURAL:$1|1=Šis fails ir šī faila dublikāts|Šie $1 faili ir šī faila dublikāti|Šis $1 fails ir šī faila dublikāts|Šie $1 faili ir šī faila dublikāti}} ([[Special:FileDuplicateSearch/$2|vairāk informācijas]]):",
        "expandtemplates": "Izvērst veidnes",
        "expand_templates_output": "Rezultāts",
        "expand_templates_ok": "Labi",
+       "expand_templates_remove_comments": "Noņemt komentārus",
        "expand_templates_remove_nowiki": "Cenzēt <nowiki> iezīmes rezultātā",
        "expand_templates_preview": "Pirmskats",
        "pagelanguage": "Mainīt lapas valodu",
index bd06d3c..91203e9 100644 (file)
        "redirect-file": "Име на податотека",
        "redirect-logid": "Назнака на дневникот",
        "redirect-not-exists": "Вредноста не е најдена",
+       "redirect-not-numeric": "Вредноста не е бројчена",
        "fileduplicatesearch": "Барање на дуплирани податотеки",
        "fileduplicatesearch-summary": "Пребарување на дуплирани податотеки по тарабни вредности.",
        "fileduplicatesearch-filename": "Податотека:",
index 023c049..22264d6 100644 (file)
        "next": "နောက်ထပ်",
        "last": "ယခုမတိုင်မီ",
        "page_first": "ပထမဆုံး",
-       "page_last": "á\80¡á\80\94á\80±á\80¬á\80\80á\80ºá\80\86á\80¯á\80¶á\80¸",
+       "page_last": "နောက်ဆုံး",
        "histlegend": "တည်းဖြတ်မူများကို နှိုင်းယှဉ်ရန် radio boxes လေးများကို မှတ်သားပြီးနောက် Enter ရိုက်ချပါ သို့ အောက်ခြေမှ ခလုတ်ကို နှိပ်ပါ။<br />\nLegend: <strong>({{int:cur}})</strong> = နောက်ဆုံးမူနှင့် ကွဲပြားချက် <strong>({{int:last}})</strong> = ယင်းရှေ့မူနှင့် ကွဲပြားချက်, <strong>{{int:minoreditletter}}</strong> = အရေးမကြီးသော ပြုပြင်မှု.",
        "history-fieldset-title": "ယခင်မူများ ရှာဖွေရန်",
        "history-show-deleted": "ဖျက်ထားသော မူများသာ",
index bc1eb57..68cea82 100644 (file)
        "customcssprotected": "Nun v'è permesso 'a cagnà sta paggena CSS, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
        "customjsonprotected": "Nun v'è permesso 'a cagnà sta paggena JSON, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
        "customjsprotected": "Nun v'è permesso 'a cagnà sta paggena JavaScript, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
-       "sitecssprotected": "Nun téne premmesse pe' puté cagnà sta paggena CSS pecché putesse dà prubbleme a 'e vvisite",
-       "sitejsonprotected": "Nun téne premmesse pe' puté cagnà sta paggena JSON pecché putesse dà prubbleme a 'e vvisite",
+       "sitecssprotected": "Nun téne premmesse pe' puté cagnà sta paggena CSS pecché putesse dà prubbleme a 'e vvisite.",
+       "sitejsonprotected": "Nun téne premmesse pe' puté cagnà sta paggena JSON pecché putesse dà prubbleme a 'e vvisite.",
+       "sitejsprotected": "Nun téne premmesse pe' puté cagnà sta paggena JavaScript pecché putesse dà prubbleme a 'e vvisite.",
        "mycustomcssprotected": "Nun v'è permesso 'a cagnà sta paggena CSS.",
        "mycustomjsonprotected": "Nun v'è permesso 'a cagnà sta paggena JSON.",
        "mycustomjsprotected": "Nun v'è licenzia pe cagnà sta paggena JavaScript.",
        "diff-multi-otherusers": "({{PLURAL:$1|Na virzione ntermedia|$1 verziune ntermedie}} 'a {{PLURAL:$2|n'at'utente|$2 n'ati ddoj'utente}} nun è mmustata)",
        "diff-multi-manyusers": "({{PLURAL:$1|Na virzione ntermedia|$1 verziune ntermedie}} 'a cchiù 'e $2 {{PLURAL:$2|utente|utente}} nun è mmustata)",
        "diff-paragraph-moved-tonew": "'O paragrafo è stato spustat. Facite clic pe' puté cagnà dint'a nova posiziona.",
+       "diff-paragraph-moved-toold": "'O paragrafo è stato spustat. Facite clic pe' puté cagnà dint' 'o posto viecchio.",
        "difference-missing-revision": "{{PLURAL:$2|Na virziona|$2 verziune}} 'e sta differenza ($1) {{PLURAL:$2|nun è stata truvata|nun so' state truvate}}.\n\nChest'è succiesso quanno s'è secutato nu diff obsoleto a na paggena scancellata.\n'E dettaglie se ponno truvà dint'a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 'o riggistro 'e scancellamiente].",
        "searchresults": "Risultato d''a recerca",
+       "search-filter-title-prefix": "Ascià surtanto dint' 'e paggene c' 'o titolo c'accumencia pe' \"$1\"",
+       "search-filter-title-prefix-reset": "Ascìa tutt' 'e paggene",
        "searchresults-title": "Ascià risultate ppe \"$1\"",
        "titlematches": "Currispunnenze d' 'o titolo d' 'e paggene",
        "textmatches": "Currispunnenze d' 'o testo d' 'e paggene",
        "prefs-editwatchlist-clear": "Sbacanta l'elenco 'e paggene cuntrullate",
        "prefs-watchlist-days": "Nummero 'e juorne 'a mmustà dint'a l'elenco 'e cuntrollo:",
        "prefs-watchlist-days-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
-       "prefs-watchlist-edits": "Numero massimo 'e cagnamiente 'a mmustà ch' 'e funziune avanzate:",
+       "prefs-watchlist-edits": "Numero massimo 'e cagnamiente 'a mmustà dint' a l'elenco 'e paggene cuntrullate:",
        "prefs-watchlist-edits-max": "Nummero massimo: 1000",
        "prefs-watchlist-token": "Token 'e l'elenco 'e cuntrollo:",
+       "prefs-watchlist-managetokens": "Gestisce 'e tokén",
        "prefs-misc": "Varje",
        "prefs-resetpass": "Cagna 'a password",
        "prefs-changeemail": "Cagna o lèva l'indirizzo e-mail",
        "stub-threshold-disabled": "Stutato",
        "recentchangesdays": "Nummero 'e juorne a mmustà dint'a l'urdeme cagnamiente:",
        "recentchangesdays-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
-       "recentchangescount": "Nummero predefinito 'e cagnamiente 'a mmustà:",
-       "prefs-help-recentchangescount": "Chesto ntenne ll'urdeme cagnamiente, 'e cronologgie 'e paggena, e riggistre.",
-       "prefs-help-watchlist-token2": "Chest'è 'a chiave segreta pe se ffà 'o feed web 'e l'elenco 'e cuntrolo d' 'o vuosto.\nSi coccheruno 'a cunoscesse, allora putesse vedé l'elenco 'e cuntrollo, picciò nun 'a spartite. [[Special:ResetTokens|Cliccate ccà se tenite necessità d' 'a rimpizzà]].",
+       "recentchangescount": "Nummero predefinito 'e cagnamiente 'a mmustà dint' 'e paggene 'e cagnamiente 'e mo, cronologgie e riggistre:",
+       "prefs-help-recentchangescount": "Nummero massimo: 1000",
+       "prefs-help-watchlist-token2": "Chest'è 'a chiave segreta pe se ffà 'o feed web 'e l'elenco 'e cuntrolo d' 'o vuosto.\nSi coccheruno 'a cunoscesse, allora putesse vedé l'elenco vuost' 'e cuntrollo, picciò nun 'a spartite.\nSi ve serve, [[Special:ResetTokens|facite clic ccà p' 'a rimpizzà]].",
+       "prefs-help-tokenmanagement": "Putite vedé e mpustà n'ata vota 'a chiave segreta pe' l'utenza d' 'a vosta pe' ve puté fà trasì dint' 'o feed web 'e paggene cuntrullate 'a vuje. Chi canuscesse sta chiave putesse leggere 'e paggene cuntrullate vuoste, picciò, tenit' 'a mente e nun 'a spartí.",
        "savedprefs": "'E preferenze songo state sarvate.",
        "savedrights": "'E dritte 'e gruppe 'utente {{GENDER:$1|$1}} sto state sarvate.",
        "timezonelegend": "Fuso orario:",
        "timezoneregion-indian": "Oceano Indiano",
        "timezoneregion-pacific": "Oceano Pacifeco",
        "allowemail": "Abbìa 'a ricezione 'e mmasciate mannate 'a l'ati utente",
+       "email-allow-new-users-label": "Abbìa 'a ricezione 'e mmasciate 'a l'ati utente nuove nuove",
+       "email-blacklist-label": "Nun permettere chist' utente 'e me mannà masciate:",
        "prefs-searchoptions": "Ascìa",
        "prefs-namespaces": "Namespace",
        "default": "predefinito",
        "prefs-files": "File",
        "prefs-custom-css": "CSS personalizzato",
+       "prefs-custom-json": "JSON personalizzato",
        "prefs-custom-js": "JavaScript personalizzato",
-       "prefs-common-config": "CSS/JavaScript spartuto pe' tutt' 'e skin:",
+       "prefs-common-config": "CSS/JSON/JavaScript spartuto pe' tutt' 'e skin:",
        "prefs-reset-intro": "Putisse ausà sta paggena pe' rimpizzà 'e preferenze proprie comme chille predefinite d' 'o sito.\nL'operazione nun se può annullà.",
        "prefs-emailconfirm-label": "Cunferma 'e ll'e-mail:",
        "youremail": "E-mail:",
        "prefs-dateformat": "Furmato data",
        "prefs-timeoffset": "Ore 'e differenza",
        "prefs-advancedediting": "Opziune generale",
+       "prefs-developertools": "Strumiente p' 'e sviluppature",
        "prefs-editor": "Editore",
        "prefs-preview": "Anteprimma",
        "prefs-advancedrc": "Opziune avanzate",
+       "prefs-opt-out": "Stuta miglioramente",
        "prefs-advancedrendering": "Opziune avanzate",
        "prefs-advancedsearchoptions": "Opziune avanzate",
        "prefs-advancedwatchlist": "Opziune avanzate",
        "group-autoconfirmed": "Utente autocunfermate",
        "group-bot": "Bot",
        "group-sysop": "Ammenistrature",
+       "group-interface-admin": "Ammenistrature 'e ll'interfaccia",
        "group-bureaucrat": "Burocrate",
        "group-suppress": "Soppressure",
        "group-all": "(tutte)",
        "group-autoconfirmed-member": "{{GENDER:$1|utente autocunfermato|utente autocunfermata|utente autocunfermato/a}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|ammenistratore|ammenistratrice|ammenistratore/trice}}",
+       "group-interface-admin-member": "{{GENDER:$1|ammenistratore|ammenistratrice|ammenistratore/trice}} 'e ll'interfaccia",
        "group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
        "group-suppress-member": "{{GENDER:$1|suppressure|supprimitrice}}",
        "grouppage-user": "{{ns:project}}:Utente",
        "grouppage-autoconfirmed": "{{ns:project}}:Utente autocunfermate",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Ammenistrature",
+       "grouppage-interface-admin": "{{ns:project}}:Ammenistrature 'e ll'interfaccia",
        "grouppage-bureaucrat": "{{ns:project}}:Burocrate",
        "grouppage-suppress": "{{ns:project}}:Suppressure",
        "right-read": "Liegge paggene",
        "right-editcontentmodel": "Cagna 'o modello 'e cuntenute 'e na paggena",
        "right-editinterface": "Modifeca 'a nterfaccia utente",
        "right-editusercss": "Cagna 'e file CSS 'e l'at'utente",
+       "right-edituserjson": "Cagna 'e file JSON 'e l'at'utente",
        "right-edituserjs": "Cagna 'e file JS e l'at'utente",
+       "right-editsitecss": "Cagna 'e CSS p' 'o sito sano",
+       "right-editsitejson": "Cagna 'e JSON p' 'o sito sano",
+       "right-editsitejs": "Cagna 'e JavaScript p' 'o sito sano",
        "right-editmyusercss": "Cagna 'e proprie file CSS",
+       "right-editmyuserjson": "Cagna 'e proprie file JSON",
        "right-editmyuserjs": "Cagna 'e proprie file JavaScript",
        "right-viewmywatchlist": "Vide l'elenco 'e cuntrollo proprio",
        "right-editmywatchlist": "Cagna l'elenco 'e cuntrollo proprio. Vedete ca cocch'azione putesse jògnere ancora paggene senza stu deritto.",
        "grant-createaccount": "Crìa cunte",
        "grant-createeditmovepage": "Créa, cagna e móve paggene",
        "grant-delete": "Scancella paggene, verziune, trasute 'e riggistro",
-       "grant-editinterface": "Cagna 'o namespace MediaWiki e CSS/JavaScript 'e ll'utente",
-       "grant-editmycssjs": "Cagna 'e CSS/JavaScript 'e ll'utenza d' 'a vosta",
+       "grant-editinterface": "Cagna 'o namespace MediaWiki 'e ll'utente/JSON p' 'o sito sano",
+       "grant-editmycssjs": "Cagna 'e CSS/JSON/JavaScript 'e ll'utenza d' 'a vosta",
        "grant-editmyoptions": "Cagna 'e preferenze utente proprie",
        "grant-editmywatchlist": "Cagna l'elenco 'e cuntrolo 'o tuojo",
+       "grant-editsiteconfig": "Cagna 'e CSS/JS p' 'o sito sano",
        "grant-editpage": "Cagna 'e paggene esistente",
        "grant-editprotected": "Cagna 'e paggine prutette",
        "grant-highvolume": "Cagnamiente massive",
        "action-writeapi": "usa l'API 'n scrittura",
        "action-delete": "scancèlla chesta paggena",
        "action-deleterevision": "scancellà 'e verziune",
+       "action-deletelogentry": "scancellà riggistro",
        "action-deletedhistory": "vide 'a cronologgia scancellata 'e sta paggena",
+       "action-deletedtext": "vide 'a verziona d' 'o testo scancellato",
        "action-browsearchive": "ascìa dint' 'e paggene scancellate",
        "action-undelete": "arripiglia chesta paggena",
        "action-suppressrevision": "rivedé e arripiglià 'e cagnamiente annascunnute",
        "action-userrights-interwiki": "cagna 'e deritte 'e ll'utente int'a l'ati wiki",
        "action-siteadmin": "blocca o sblocca 'o database",
        "action-sendemail": "manna e-mail",
+       "action-editmyoptions": "cagna 'e preferenze proprie",
        "action-editmywatchlist": "cagna l'elenco 'e cuntrolo 'o tuojo",
        "action-viewmywatchlist": "vide l'elenco 'e cuntrollo proprio",
        "action-viewmyprivateinfo": "vide 'e date perzunale",
        "recentchanges-legend": "Opzione urdeme cagnamiénte",
        "recentchanges-summary": "Ncopp'a chesta paggena song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
        "recentchanges-noresult": "Nisciuno cagnamiento dint'o periodo dato ca soddisfà sti criterie.",
+       "recentchanges-timeout": "Sta ricerca è ammaturata mo. Si tu vulisse, putisse tentà n'ati parametre 'e cerca.",
+       "recentchanges-network": "Pe' bbìa 'e n'errore tecnico, nun se pò carecà nisciuno risultato. Facite agghiurnamento d' 'a paggena.",
+       "recentchanges-notargetpage": "Azzeccate ncoppa 'o nomme 'e na paggena pe' puté vedé 'e cagnamiente 'e chesta paggena.",
        "recentchanges-feed-description": "Ncoppa chistu feed song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
        "recentchanges-label-newpage": "Chisto cagno ha criato na paggena nova",
        "recentchanges-label-minor": "Chisto è nu cagnamiénto piccerillo",
        "recentchanges-legend-heading": "<strong>Liggenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide [[Special:NewPages|'e paggene nove]])",
        "recentchanges-submit": "Faje vedé",
+       "rcfilters-tag-remove": "Léva '$1'",
+       "rcfilters-legend-heading": "<strong>Elenco abbreviaziune:</strong>",
+       "rcfilters-other-review-tools": "Ate strumiente 'e cuntrollo",
+       "rcfilters-group-results-by-page": "Arricetta risultate pe' paggena",
+       "rcfilters-activefilters": "Filtre appicciate",
+       "rcfilters-activefilters-hide": "Annascunne",
+       "rcfilters-activefilters-show": "Faje vedé",
+       "rcfilters-activefilters-hide-tooltip": "Annascunne l'area 'e filtre appicciate",
+       "rcfilters-activefilters-show-tooltip": "Fà vedé l'area 'e filtre appicciate",
+       "rcfilters-advancedfilters": "Filtre avanzate",
+       "rcfilters-limit-title": "Risultate 'a fà vedé",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}, $2",
+       "rcfilters-date-popup-title": "Periodo 'e tiempo a cercà",
+       "rcfilters-days-title": "Ùrdeme juorne",
+       "rcfilters-hours-title": "Ùrdeme ore",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|juorno|juorne}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|ora|ore}}",
+       "rcfilters-highlighted-filters-list": "Evidenziato: $1",
+       "rcfilters-quickfilters": "Filtre riggistrate",
+       "rcfilters-quickfilters-placeholder-title": "Nisciuno filtro riggistrato",
+       "rcfilters-savedqueries-defaultlabel": "Filtre riggistrate",
+       "rcfilters-savedqueries-rename": "Renommena",
+       "rcfilters-savedqueries-setdefault": "Mpustà comme predefinito",
+       "rcfilters-savedqueries-unsetdefault": "Léva cumme predefinito",
+       "rcfilters-savedqueries-remove": "Scancèlla",
+       "rcfilters-savedqueries-new-name-label": "Nomme",
+       "rcfilters-savedqueries-apply-label": "Crea filtro",
+       "rcfilters-savedqueries-cancel-label": "Scancella",
+       "rcfilters-clear-all-filters": "Pulezza tutt' 'e filtre",
+       "rcfilters-show-new-changes": "Vide 'e cagnamiente cchiù nnove",
+       "rcfilters-invalid-filter": "Filtro invalido",
+       "rcfilters-filterlist-title": "Filtre",
+       "rcfilters-filterlist-whatsthis": "Cumme funzionano?",
+       "rcfilters-highlightbutton-title": "Evidenzia risultate",
+       "rcfilters-filterlist-noresults": "Nisciuno filtro truvato",
+       "rcfilters-filtergroup-authorship": "Autore d' 'o cuntribbuto",
+       "rcfilters-filtergroup-lastRevision": "Ùrdeme verziune",
+       "rcfilters-filter-lastrevision-label": "Verzione 'e mmo",
        "rcnotefrom": "Ccà abbascio {{PLURAL:$5|è alencato 'o cagnamiento appurtato|song' alincate 'e cagnamiente appurtate}} 'a <strong>$3, $4</strong> (mmustate nfin'a <strong>$1</strong>).",
        "rclistfrom": "Faje vedé 'e cagnamiénte fatte a partì 'a $3 $2",
        "rcshowhideminor": "$1 'e cagnamiénte piccerille",
index 359d8b7..05206d8 100644 (file)
        "redirect-file": "Filnavn",
        "redirect-logid": "Logg-ID",
        "redirect-not-exists": "Verdi er ikke funnet",
+       "redirect-not-numeric": "Verdien er ikke numerisk",
        "fileduplicatesearch": "Søk etter duplikatfiler",
        "fileduplicatesearch-summary": "Søk etter duplikatfiler basert på dets hash-verdi.",
        "fileduplicatesearch-filename": "Filnavn:",
index 3fe7135..a02bd93 100644 (file)
        "redirect-file": "Nome do ficheiro",
        "redirect-logid": "Identificador da entrada do registo",
        "redirect-not-exists": "Valor não encontrado",
+       "redirect-not-numeric": "Valor não numérico",
        "fileduplicatesearch": "Pesquisa de ficheiros duplicados",
        "fileduplicatesearch-summary": "Pesquisa de ficheiros duplicados baseada no resumo criptográfico.",
        "fileduplicatesearch-filename": "Nome do ficheiro:",
index 7fdfdbb..cf05767 100644 (file)
        "customcssprotected": "Non ge tine 'u permesse pe cangià sta pàgene de CSS, purcè tène otre configurazione personale.",
        "customjsonprotected": "Non ge tine 'u permesse pe cangià sta pàgene de JSON, purcè tène otre configurazione personale.",
        "customjsprotected": "Non ge tine 'u permesse pe cangià sta pàgene de Javascript, purcè tène otre configurazione personale.",
+       "sitecssprotected": "Non ge tìne le permesse pe cangià sta pàgene CSS purcé pò avè effette sus a tutte le visitature.",
+       "sitejsonprotected": "Non ge tìne le permesse pe cangià sta pàgene JSON purcé pò avè effette sus a tutte le visitature.",
+       "sitejsprotected": "Non ge tìne le permesse pe cangià sta pàgene JavaScript purcé pò avè effette sus a tutte le visitature.",
        "mycustomcssprotected": "Non ge tìne le permesse pe cangià sta pàgene CSS",
+       "mycustomjsonprotected": "Non ge tìne le permesse pe cangià sta pàgene JSON.",
        "mycustomjsprotected": "Non ge tìne le permesse pe cangià sta pàgene JavaScript",
        "myprivateinfoprotected": "Non ge tìne le permesse pe cangià le 'mbormaziune private tune.",
        "mypreferencesprotected": "Non ge tìne le permesse pe cangià le preferenze tune.",
index 7e6d940..aec7c7b 100644 (file)
        "sort-descending": "Упорядочить по убыванию",
        "sort-ascending": "Упорядочить по возрастанию",
        "nstab-main": "Статья",
-       "nstab-user": "Участник",
+       "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Участник|Участница}}",
        "nstab-media": "Мультимедиа",
        "nstab-special": "Служебная страница",
        "nstab-project": "О проекте",
index 99a5b0b..9dd9197 100644 (file)
        "right-reupload": "перезаписування існуючих файлів",
        "right-reupload-own": "перезаписування існуючих файлів, завантажених тим самим користувачем",
        "right-reupload-shared": "підміна файлів зі спільного сховища локальними",
-       "right-upload_by_url": "Ð\97авантаження файлів за URL-адресами",
+       "right-upload_by_url": "завантаження файлів за URL-адресами",
        "right-purge": "очищення кешу сторінки без необхідності підтвердження",
        "right-autoconfirmed": "без обмежень швидкості за IP",
        "right-bot": "автоматична обробка",
        "right-mergehistory": "об'єднання історій редагувань сторінок",
        "right-userrights": "зміна всіх прав користувачів",
        "right-userrights-interwiki": "зміна прав користувачів у інших вікі",
-       "right-siteadmin": "Ð\91локування і розблокування бази даних",
+       "right-siteadmin": "блокування і розблокування бази даних",
        "right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5",
        "right-sendemail": "надсилання електронної пошти іншим користувачам",
        "right-managechangetags": "створення та (де)активування [[Special:Tags|міток]]",
index ce13ba8..a47816c 100644 (file)
        "redirect-file": "文件名",
        "redirect-logid": "日志ID",
        "redirect-not-exists": "没找到相应值",
+       "redirect-not-numeric": "输入的数值并不是数字",
        "fileduplicatesearch": "搜索重复文件",
        "fileduplicatesearch-summary": "根据哈希(hash)值搜索重复文件。",
        "fileduplicatesearch-filename": "文件名:",
index 60ed252..a279cda 100644 (file)
@@ -34,12 +34,14 @@ class EditCLI extends Maintenance {
                $this->addDescription( 'Edit an article from the command line, text is from stdin' );
                $this->addOption( 'user', 'Username', false, true, 'u' );
                $this->addOption( 'summary', 'Edit summary', false, true, 's' );
+               $this->addOption( 'remove', 'Remove a slot (requires --slot).', false, false );
                $this->addOption( 'minor', 'Minor edit', false, false, 'm' );
                $this->addOption( 'bot', 'Bot edit', false, false, 'b' );
                $this->addOption( 'autosummary', 'Enable autosummary', false, false, 'a' );
                $this->addOption( 'no-rc', 'Do not show the change in recent changes', false, false, 'r' );
                $this->addOption( 'nocreate', 'Don\'t create new pages', false, false );
                $this->addOption( 'createonly', 'Only create new pages', false, false );
+               $this->addOption( 'slot', 'Slot role name', false, true );
                $this->addArg( 'title', 'Title of article to edit' );
        }
 
@@ -48,10 +50,12 @@ class EditCLI extends Maintenance {
 
                $userName = $this->getOption( 'user', false );
                $summary = $this->getOption( 'summary', '' );
+               $remove = $this->hasOption( 'remove' );
                $minor = $this->hasOption( 'minor' );
                $bot = $this->hasOption( 'bot' );
                $autoSummary = $this->hasOption( 'autosummary' );
                $noRC = $this->hasOption( 'no-rc' );
+               $slot = $this->getOption( 'slot', 'main' );
 
                if ( $userName === false ) {
                        $wgUser = User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
@@ -78,17 +82,36 @@ class EditCLI extends Maintenance {
 
                $page = WikiPage::factory( $title );
 
-               # Read the text
-               $text = $this->getStdin( Maintenance::STDIN_ALL );
-               $content = ContentHandler::makeContent( $text, $title );
+               if ( $remove ) {
+                       if ( $slot === 'main' ) {
+                               $this->fatalError( "Cannot remove main slot! Use --slot to specify." );
+                       }
+
+                       $content = false;
+               } else {
+                       # Read the text
+                       $text = $this->getStdin( Maintenance::STDIN_ALL );
+                       $content = ContentHandler::makeContent( $text, $title );
+               }
 
                # Do the edit
                $this->output( "Saving... " );
-               $status = $page->doEditContent( $content, $summary,
-                       ( $minor ? EDIT_MINOR : 0 ) |
+               $updater = $page->newPageUpdater( $wgUser );
+
+               $flags = ( $minor ? EDIT_MINOR : 0 ) |
                        ( $bot ? EDIT_FORCE_BOT : 0 ) |
                        ( $autoSummary ? EDIT_AUTOSUMMARY : 0 ) |
-                       ( $noRC ? EDIT_SUPPRESS_RC : 0 ) );
+                       ( $noRC ? EDIT_SUPPRESS_RC : 0 );
+
+               if ( $content === false ) {
+                       $updater->removeSlot( $slot );
+               } else {
+                       $updater->setContent( $slot, $content );
+               }
+
+               $updater->saveRevision( CommentStoreComment::newUnsavedComment( $summary ), $flags );
+               $status = $updater->getStatus();
+
                if ( $status->isOK() ) {
                        $this->output( "done\n" );
                        $exit = 0;
index 33e5fbf..0bcb2b6 100644 (file)
                return null;
        };
 
+       /**
+        * Check if a given namespace is a talk namespace
+        * @param {number} namespaceId Namespace ID
+        * @return {boolean} Namespace is a talk namespace
+        */
+       Title.isTalkNamespace = function ( namespaceId ) {
+               return !!( namespaceId > NS_MAIN && namespaceId % 2 );
+       };
+
        /**
         * Whether this title exists on the wiki.
         *
         * @static
         * @param {string|mw.Title} title prefixed db-key name (string) or instance of Title
         * @return {boolean|null} Boolean if the information is available, otherwise null
+        * @throws {Error} If title is not a string or mw.Title
         */
        Title.exists = function ( title ) {
                var match,
                        }
                },
 
+               /**
+                * Check if the title is in a talk namespace
+                *
+                * @return {boolean} The title is in a talk namespace
+                */
+               isTalkPage: function () {
+                       return Title.isTalkNamespace( this.getNamespaceId() );
+               },
+
+               /**
+                * Get the title for the associated talk page
+                *
+                * @return {mw.Title|null} The title for the associated talk page, null if not available
+                */
+               getTalkPage: function () {
+                       if ( !this.canHaveTalkPage() ) {
+                               return null;
+                       }
+                       return this.isTalkPage() ?
+                               this :
+                               Title.makeTitle( this.getNamespaceId() + 1, this.getMainText() );
+               },
+
+               /**
+                * Get the title for the subject page of a talk page
+                *
+                * @return {mw.Title|null} The title for the subject page of a talk page, null if not available
+                */
+               getSubjectPage: function () {
+                       return this.isTalkPage() ?
+                               Title.makeTitle( this.getNamespaceId() - 1, this.getMainText() ) :
+                               this;
+               },
+
+               /**
+                * Check the the title can have an associated talk page
+                *
+                * @return {boolean} The title can have an associated talk page
+                */
+               canHaveTalkPage: function () {
+                       return this.getNamespaceId() >= NS_MAIN;
+               },
+
                /**
                 * Whether this title exists on the wiki.
                 *
index 3e042f9..910cdc4 100644 (file)
@@ -17,6 +17,7 @@ use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
 use MediaWiki\Storage\SlotRecord;
 use MediaWiki\Storage\SqlBlobStore;
+use MediaWiki\User\UserIdentityValue;
 use MediaWikiTestCase;
 use PHPUnit_Framework_MockObject_MockObject;
 use Revision;
@@ -1050,6 +1051,81 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
 
        /**
         * @covers \MediaWiki\Storage\RevisionStore::newRevisionFromArchiveRow
+        */
+       public function testNewRevisionFromArchiveRow_no_user() {
+               $store = MediaWikiServices::getInstance()->getRevisionStore();
+
+               $row = (object)[
+                       'ar_id' => '1',
+                       'ar_page_id' => '2',
+                       'ar_namespace' => '0',
+                       'ar_title' => 'Something',
+                       'ar_rev_id' => '2',
+                       'ar_text_id' => '47',
+                       'ar_timestamp' => '20180528192356',
+                       'ar_minor_edit' => '0',
+                       'ar_deleted' => '0',
+                       'ar_len' => '78',
+                       'ar_parent_id' => '0',
+                       'ar_sha1' => 'deadbeef',
+                       'ar_comment_text' => 'whatever',
+                       'ar_comment_data' => null,
+                       'ar_comment_cid' => null,
+                       'ar_user' => '0',
+                       'ar_user_text' => '', // this is the important bit
+                       'ar_actor' => null,
+                       'ar_content_format' => null,
+                       'ar_content_model' => null,
+               ];
+
+               \Wikimedia\suppressWarnings();
+               $record = $store->newRevisionFromArchiveRow( $row );
+               \Wikimedia\suppressWarnings( true );
+
+               $this->assertInstanceOf( RevisionRecord::class, $record );
+               $this->assertInstanceOf( UserIdentityValue::class, $record->getUser() );
+               $this->assertSame( 'Unknown user', $record->getUser()->getName() );
+       }
+
+       /**
+        * @covers \MediaWiki\Storage\RevisionStore::newRevisionFromRow
+        */
+       public function testNewRevisionFromRow_no_user() {
+               $store = MediaWikiServices::getInstance()->getRevisionStore();
+               $title = Title::newFromText( __METHOD__ );
+
+               $row = (object)[
+                       'rev_id' => '2',
+                       'rev_page' => '2',
+                       'page_namespace' => '0',
+                       'page_title' => $title->getText(),
+                       'rev_text_id' => '47',
+                       'rev_timestamp' => '20180528192356',
+                       'rev_minor_edit' => '0',
+                       'rev_deleted' => '0',
+                       'rev_len' => '78',
+                       'rev_parent_id' => '0',
+                       'rev_sha1' => 'deadbeef',
+                       'rev_comment_text' => 'whatever',
+                       'rev_comment_data' => null,
+                       'rev_comment_cid' => null,
+                       'rev_user' => '0',
+                       'rev_user_text' => '', // this is the important bit
+                       'rev_actor' => null,
+                       'rev_content_format' => null,
+                       'rev_content_model' => null,
+               ];
+
+               \Wikimedia\suppressWarnings();
+               $record = $store->newRevisionFromRow( $row, 0, $title );
+               \Wikimedia\suppressWarnings( true );
+
+               $this->assertNotNull( $record );
+               $this->assertNotNull( $record->getUser() );
+               $this->assertNotEmpty( $record->getUser()->getName() );
+       }
+
+       /**
         * @covers \MediaWiki\Storage\RevisionStore::insertRevisionOn
         */
        public function testInsertRevisionOn_archive() {
index 44c1f4b..acdf2f1 100644 (file)
                assert.strictEqual( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
        } );
 
+       QUnit.test( 'isTalkPage/getTalkPage/getSubjectPage', function ( assert ) {
+               var title;
+
+               title = new mw.Title( 'User:Foo' );
+               assert.strictEqual( title.isTalkPage(), false, 'Non-talk page detected as such' );
+               assert.strictEqual( title.getSubjectPage().getPrefixedText(), 'User:Foo', 'getSubjectPage on a subject page is a no-op' );
+
+               title = title.getTalkPage();
+               assert.strictEqual( title.getPrefixedText(), 'User talk:Foo', 'getTalkPage creates correct title' );
+               assert.strictEqual( title.getTalkPage().getPrefixedText(), 'User talk:Foo', 'getTalkPage on a talk page is a no-op' );
+               assert.strictEqual( title.isTalkPage(), true, 'Talk page is detected as such' );
+
+               title = title.getSubjectPage();
+               assert.strictEqual( title.getPrefixedText(), 'User:Foo', 'getSubjectPage creates correct title' );
+
+               title = new mw.Title( 'Special:AllPages' );
+               assert.strictEqual( title.isTalkPage(), false, 'Special page is not a talk page' );
+               assert.strictEqual( title.getTalkPage(), null, 'getTalkPage not valid for this namespace' );
+               assert.strictEqual( title.getSubjectPage().getPrefixedText(), 'Special:AllPages', 'getSubjectPage is self for special pages' );
+
+               title = new mw.Title( 'Category:Project:Maintenance' );
+               assert.strictEqual( title.getTalkPage().getPrefixedText(), 'Category talk:Project:Maintenance', 'getTalkPage is not confused by colon in main text' );
+               title = new mw.Title( 'Category talk:Project:Maintenance' );
+               assert.strictEqual( title.getSubjectPage().getPrefixedText(), 'Category:Project:Maintenance', 'getSubjectPage is not confused by colon in main text' );
+
+               title = new mw.Title( 'Foo#Caption' );
+               assert.strictEqual( title.getFragment(), 'Caption', 'Subject page has a fragment' );
+               title = title.getTalkPage();
+               assert.strictEqual( title.getPrefixedText(), 'Talk:Foo', 'getTalkPage creates correct title' );
+               assert.strictEqual( title.getFragment(), null, 'getTalkPage does not copy the fragment' );
+       } );
+
        QUnit.test( 'Throw error on invalid title', function ( assert ) {
                assert.throws( function () {
                        return new mw.Title( '' );