Merge "Use PHP 7 "\u{NNNN}" Unicode codepoint escapes in string literals (part 2)"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 4 Jun 2018 18:42:43 +0000 (18:42 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 4 Jun 2018 18:42:43 +0000 (18:42 +0000)
46 files changed:
RELEASE-NOTES-1.32
includes/DefaultSettings.php
includes/LinkFilter.php
includes/Setup.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/ia.json
includes/page/WikiPage.php
includes/skins/Skin.php
includes/specials/forms/EditWatchlistNormalHTMLForm.php
languages/i18n/an.json
languages/i18n/btm.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/de.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/fr.json
languages/i18n/he.json
languages/i18n/ia.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/mk.json
languages/i18n/nl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/su.json
maintenance/archives/patch-archive-ar_rev_id-unique.sql [new file with mode: 0644]
maintenance/cleanupSpam.php
maintenance/mssql/tables.sql
maintenance/oracle/archives/patch-archive-ar_rev_id-unique.sql [new file with mode: 0644]
maintenance/oracle/tables.sql
maintenance/postgres/tables.sql
maintenance/sqlite/archives/patch-archive-ar_rev_id-unique.sql [new file with mode: 0644]
maintenance/tables.sql
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/page/WikiPageDbTestBase.php

index eaa7e86..11e306a 100644 (file)
@@ -24,10 +24,13 @@ production.
 * New configuration variable has been added: $wgCookieSetOnIpBlock.
   This determines whether to set a cookie when an IP user is blocked. Doing so means
   that a blocked user, even after moving to a new IP address, will still be blocked.
+* The archive table's ar_rev_id field is now unique.
 
 === New features in 1.32 ===
 * (T112474) Generalized the ResourceLoader mechanism for overriding modules
   using a particular page during edit previews.
+* (T12331) You can now log page creation events by setting $wgPageCreationLog
+  to true.
 * Added 'ApiParseMakeOutputPage' hook.
 * (T174313) Added checkbox on Special:ListUsers to display only users in
   temporary user groups.
index 562d887..fa53703 100644 (file)
@@ -7869,10 +7869,16 @@ $wgActionFilteredLogs = [
 ];
 
 /**
- * Maintain a log of newusers at Log/newusers?
+ * Maintain a log of newusers at Special:Log/newusers?
  */
 $wgNewUserLog = true;
 
+/**
+ * Maintain a log of page creations at Special:Log/create?
+ * @since 1.32
+ */
+$wgPageCreationLog = false;
+
 /** @} */ # end logging }
 
 /*************************************************************************//**
index 790e2be..17b4d56 100644 (file)
@@ -38,9 +38,10 @@ class LinkFilter {
         *
         * @param Content $content Content to check
         * @param string $filterEntry Domainparts, see makeRegex() for more details
+        * @param string $protocol 'http://' or 'https://'
         * @return int 0 if no match or 1 if there's at least one match
         */
-       static function matchEntry( Content $content, $filterEntry ) {
+       public static function matchEntry( Content $content, $filterEntry, $protocol = 'http://' ) {
                if ( !( $content instanceof TextContent ) ) {
                        // TODO: handle other types of content too.
                        //      Maybe create ContentHandler::matchFilter( LinkFilter ).
@@ -50,7 +51,7 @@ class LinkFilter {
 
                $text = $content->getNativeData();
 
-               $regex = self::makeRegex( $filterEntry );
+               $regex = self::makeRegex( $filterEntry, $protocol );
                return preg_match( $regex, $text );
        }
 
@@ -59,10 +60,12 @@ class LinkFilter {
         *
         * @param string $filterEntry URL, if it begins with "*.", it'll be
         *        replaced to match any subdomain
+        * @param string $protocol 'http://' or 'https://'
+        *
         * @return string Regex pattern, for preg_match()
         */
-       private static function makeRegex( $filterEntry ) {
-               $regex = '!http://';
+       private static function makeRegex( $filterEntry, $protocol ) {
+               $regex = '!' . preg_quote( $protocol );
                if ( substr( $filterEntry, 0, 2 ) == '*.' ) {
                        $regex .= '(?:[A-Za-z0-9.-]+\.|)';
                        $filterEntry = substr( $filterEntry, 2 );
index 3cc52f8..1d16a7e 100644 (file)
@@ -533,7 +533,7 @@ if ( $wgInvalidateCacheOnLocalSettingsChange ) {
 }
 
 if ( $wgNewUserLog ) {
-       // Add a new log type
+       // Add new user log type
        $wgLogTypes[] = 'newusers';
        $wgLogNames['newusers'] = 'newuserlogpage';
        $wgLogHeaders['newusers'] = 'newuserlogpagetext';
@@ -544,6 +544,12 @@ if ( $wgNewUserLog ) {
        $wgLogActionsHandlers['newusers/autocreate'] = NewUsersLogFormatter::class;
 }
 
+if ( $wgPageCreationLog ) {
+       // Add page creation log type
+       $wgLogTypes[] = 'create';
+       $wgLogActionsHandlers['create/create'] = LogFormatter::class;
+}
+
 if ( $wgPageLanguageUseDB ) {
        $wgLogTypes[] = 'pagelang';
        $wgLogActionsHandlers['pagelang/pagelang'] = PageLangLogFormatter::class;
index 44b4e30..cfa21f4 100644 (file)
@@ -136,6 +136,7 @@ class MssqlUpdater extends DatabaseUpdater {
                                'patch-externallinks-el_index_60-drop-default.sql' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
                        [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
+                       [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
                ];
        }
 
index d70edea..476e729 100644 (file)
@@ -356,6 +356,7 @@ class MysqlUpdater extends DatabaseUpdater {
                                'patch-externallinks-el_index_60-drop-default.sql' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
                        [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
+                       [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
                ];
        }
 
index 965187a..9d2fdc6 100644 (file)
@@ -153,6 +153,7 @@ class OracleUpdater extends DatabaseUpdater {
                        [ 'populateExternallinksIndex60' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
                        [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
+                       [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
 
                        // KEEP THIS AT THE BOTTOM!!
                        [ 'doRebuildDuplicateFunction' ],
index 49419ea..dc1ffdb 100644 (file)
@@ -582,6 +582,8 @@ class PostgresUpdater extends DatabaseUpdater {
                                'change_tag_tag_id_id',
                                '( ct_tag_id, ct_rc_id, ct_rev_id, ct_log_id )'
                        ],
+                       [ 'addPgIndex', 'archive', 'ar_revid_uniq', '(ar_rev_id)', 'unique' ],
+                       [ 'dropPgIndex', 'archive', 'ar_revid' ], // Probably doesn't exist, but do it anyway.
                ];
        }
 
@@ -959,12 +961,13 @@ END;
                }
        }
 
-       public function addPgIndex( $table, $index, $type ) {
+       public function addPgIndex( $table, $index, $type, $unique = false ) {
                if ( $this->db->indexExists( $table, $index ) ) {
                        $this->output( "...index '$index' on table '$table' already exists\n" );
                } else {
                        $this->output( "Creating index '$index' on table '$table' $type\n" );
-                       $this->db->query( "CREATE INDEX $index ON $table $type" );
+                       $unique = $unique ? 'UNIQUE' : '';
+                       $this->db->query( "CREATE $unique INDEX $index ON $table $type" );
                }
        }
 
index 2b27d37..2a67a0a 100644 (file)
@@ -220,6 +220,7 @@ class SqliteUpdater extends DatabaseUpdater {
                                'patch-externallinks-el_index_60-drop-default.sql' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
                        [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
+                       [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
                ];
        }
 
index 7203cae..9ba487c 100644 (file)
        "config-support-info": "MediaWiki supporta le sequente systemas de base de datos:\n\n$1\n\nSi tu non vide hic infra le systema de base de datos que tu tenta usar, alora seque le instructiones ligate hic supra pro activar le supporto.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] es le systema primari pro MediaWiki e le melio supportate. MediaWiki functiona anque con [{{int:version-db-mariadb-url}} MariaDB] e con [{{int:version-db-percona-url}} Percona Server], le quales es compatibile con MySQL. ([https://secure.php.net/manual/en/mysqli.installation.php Como compilar PHP con supporto de MySQL])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] es un systema de base de datos popular e open source, alternativa a MySQL. ([https://secure.php.net/manual/en/pgsql.installation.php Como compilar PHP con supporto de PostgreSQL])",
-       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un systema de base de datos legier que es multo ben supportate. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es un banca de datos commercial pro interprisas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un systema de base de datos legier que es multo ben supportate. ([https://secure.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es un banca de datos commercial pro interprisas. ([https://secure.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es un base de datos de interprisa commercial pro Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Como compilar PHP con supporto de SQLSRV])",
        "config-header-mysql": "Configuration de MySQL",
        "config-header-postgres": "Configuration de PostgreSQL",
        "config-nofile": "Le file \"$1\" non poteva esser trovate. Ha illo essite delite?",
        "config-extension-link": "Sapeva tu que tu wiki supporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nTu pote explorar le [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensiones per category] o le [https://www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
        "config-skins-screenshots": "$1 (capturas de schermo: $2)",
+       "config-extensions-requires": "$1 (require $2)",
        "config-screenshot": "captura de schermo",
        "mainpagetext": "<strong>MediaWiki ha essite installate.</strong>",
        "mainpagedocfooter": "Consulta le [https://meta.wikimedia.org/wiki/Help:Contents Guida del usator] pro information sur le uso del software wiki.\n\n== Pro initiar ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de configurationes]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ a proposito de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducer MediaWiki in tu lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Como combatter le spam in tu wiki]"
index 5c1f92c..e186279 100644 (file)
@@ -1874,7 +1874,7 @@ class WikiPage implements Page, IDBAccessObject {
        private function doCreate(
                Content $content, $flags, User $user, $summary, array $meta
        ) {
-               global $wgUseRCPatrol, $wgUseNPPatrol;
+               global $wgUseRCPatrol, $wgUseNPPatrol, $wgPageCreationLog;
 
                $status = Status::newGood( [ 'new' => true, 'revision' => null ] );
 
@@ -1950,6 +1950,21 @@ class WikiPage implements Page, IDBAccessObject {
 
                $user->incEditCount();
 
+               if ( $wgPageCreationLog ) {
+                       // Log the page creation
+                       // @TODO: Do we want a 'recreate' action?
+                       $logEntry = new ManualLogEntry( 'create', 'create' );
+                       $logEntry->setPerformer( $user );
+                       $logEntry->setTarget( $this->mTitle );
+                       $logEntry->setComment( $summary );
+                       $logEntry->setTimestamp( $now );
+                       $logEntry->setAssociatedRevId( $revisionId );
+                       $logid = $logEntry->insert();
+                       // Note that we don't publish page creation events to recentchanges
+                       // (i.e. $logEntry->publish()) since this would create duplicate entries,
+                       // one for the edit and one for the page creation.
+               }
+
                $dbw->endAtomic( __METHOD__ );
                $this->mTimestamp = $now;
 
index 57ca2f4..55d3462 100644 (file)
@@ -1605,8 +1605,7 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Create a section edit link.  This supersedes editSectionLink() and
-        * editSectionLinkForOther().
+        * Create a section edit link.
         *
         * @param Title $nt The title being linked to (may not be the same as
         *   the current page, if the section is included from a template)
index b60882a..5f07073 100644 (file)
@@ -29,4 +29,10 @@ class EditWatchlistNormalHTMLForm extends OOUIHTMLForm {
                        ? $this->msg( 'blanknamespace' )->escaped()
                        : htmlspecialchars( $this->getContext()->getLanguage()->getFormattedNsText( $namespace ) );
        }
+
+       public function displaySection(
+               $fields, $sectionName = '', $fieldsetIDPrefix = '', &$hasUserVisibleFields = false
+       ) {
+               return parent::displaySection( $fields, $sectionName, 'editwatchlist-', $hasUserVisibleFields );
+       }
 }
index 1ae6538..bef9f04 100644 (file)
        "logempty": "No bi ha garra elemento en o rechistro con ixas carauteristicas.",
        "log-title-wildcard": "Mirar títols que prencipien con iste texto",
        "allpages": "Todas as pachinas",
-       "nextpage": "Siguient pachina ($1)",
+       "nextpage": "Pachina siguient ($1)",
        "prevpage": "Pachina anterior ($1)",
        "allpagesfrom": "Amostrar as pachinas que prencipien por:",
        "allpagesto": "Amostrar as pachinas que rematen en:",
index 180ecd5..a9d34df 100644 (file)
@@ -5,6 +5,57 @@
                        "Apundung"
                ]
        },
+       "tog-underline": "Garis torui pranala:",
+       "tog-hideminor": "Bunion editan namenek i parubaan tarbaru",
+       "tog-hidepatrolled": "Bunion editan tarpatroli parubaan tarbaru",
+       "tog-newpageshidepatrolled": "Bunion alaman tarpatroli tingon daftar alaman baru",
+       "tog-hidecategorization": "Bunion pangkatagorian alaman",
+       "tog-extendwatchlist": "Kombangkon daftar pamataan tuna patidaon sude parubaan, inda umna tarbaru",
+       "tog-usenewrc": "Kalompokkon editan i tampilan parubaan tarbaru dot daftar pamataan mardasorkon alaman",
+       "tog-numberheadings": "Len nomor judul sacara otomatis",
+       "tog-showtoolbar": "Tampilkon bilah alat pangeditan",
+       "tog-editondblclick": "Pature alaman dohot klik ganda",
+       "tog-editsectiononrightclick": "Fungsion pangeditan bagian dohot mangklik siamun i judul bagian",
+       "tog-watchcreations": "Tambaon alaman na ubaen dot berkas na uunggah tu daftar pamataan",
+       "tog-watchdefault": "Tambaon alaman na upature tu daftar pamataan",
+       "tog-watchmoves": "Tambaon alaman na upapindah tu daftar pamataan",
+       "tog-watchdeletion": "Tambaon alaman na uapus tu daftar pantauan",
+       "tog-watchuploads": "Tambaon berkas baru nauunggah tu daftar pamataan",
+       "tog-watchrollback": "Tambaon alaman na unjung ubaen mulak tu bagasan daftar pamataanku",
+       "tog-minordefault": "Partando sude editan manjadi editan namenek sacara baku",
+       "tog-previewontop": "Patidaon pratayang dompakso kotak edit dot inda sidungi",
+       "tog-previewonfirst": "Patidaon pratayang i suntingan parjolo",
+       "tog-enotifwatchlistpages": "Kirimkon tuau surel molo sada alaman sanga berkas na u pamatai maruba",
+       "tog-enotifusertalkpages": "Kirimkon jau surel molo alaman parkobaranku maruba",
+       "tog-enotifminoredits": "Kirimkon jau surel juo i parubaan namenek",
+       "tog-enotifrevealaddr": "Tampilkon alamat surelku i surel notifikasi",
+       "tog-shownumberswatching": "Patidaon bahat ni namamatai",
+       "tog-oldsig": "Tekenanmu namadung adong:",
+       "tog-fancysig": "Baen tekenan manjadi teks wiki (indapake pranala otomatis)",
+       "tog-uselivepreview": "Tampilkon pratayang indapake mamuat mulak alaman",
+       "tog-forceeditsummary": "Paingot au molo kotak ringkasan editan nakosong dope",
+       "tog-watchlisthideown": "Bunion editanku i daftar pamataan",
+       "tog-watchlisthidebots": "Bunion editan bot idaftar pantauan",
+       "tog-watchlisthideminor": "Bunion editan namenek tingon pamataan",
+       "tog-watchlisthideliu": "Bunion suntingan masuk log tingon pamataan",
+       "tog-watchlistreloadautomatically": "Muat mulak daftar pamataan sacara otomatis atia sada tapis maruba (JavaScript iporluon)",
+       "tog-watchlistunwatchlinks": "Tambaon pananda pamatai/apus pamataan tu alaman na imatai na maruba (JavaScript iporluon tu manggonti fungsi on)",
+       "tog-watchlisthideanons": "Bunion editan pamake anonim i daftar pamataan",
+       "tog-watchlisthidepatrolled": "Bunion editan tarpatroli i daftar pantauan",
+       "tog-watchlisthidecategorization": "Bunion pangkatagorian alaman",
+       "tog-ccmeonemails": "Kirimkon jau salinan surel nau kirimkon tu alak nalain",
+       "tog-diffonly": "Ulang patidaon isi alaman i toru parbedaan editan",
+       "tog-showhiddencats": "Patidaon kategori namonjap",
+       "tog-norollbackdiff": "Nangkon patidaon parbedaan sidung mambaen paulakan",
+       "tog-useeditwarning": "Ingotkon au molo maninggalkon alaman pangeditan dompak so manyimpan parubaan",
+       "tog-prefershttps": "Totop pake sambungan aman atia masuk log",
+       "underline-always": "Totop",
+       "underline-never": "Inda unjung",
+       "underline-default": "Ulit sanga pangaraun naiobanna",
+       "editfont-style": "Gaya tulisan komputer i kotak pangeditan:",
+       "editfont-monospace": "Tulisan Monospace",
+       "editfont-sansserif": "Tulisan Sans-serif",
+       "editfont-serif": "Tulisan Serif",
        "sunday": "Akad",
        "monday": "Sinayan",
        "tuesday": "Salasa",
        "oct": "Okt",
        "nov": "Nov",
        "dec": "Des",
+       "january-date": "$1 Januari",
+       "february-date": "$1 Februari",
+       "march-date": "$1 Maret",
+       "april-date": "$1 April",
+       "may-date": "$1 Mei",
+       "june-date": "$1 Juni",
+       "july-date": "$1 Juli",
+       "august-date": "$1 Agustus",
+       "september-date": "$1 September",
+       "october-date": "$1 Oktober",
+       "november-date": "$1 November",
+       "december-date": "$1 Desember",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Category|Kategori}}",
        "category_header": "Alaman i kategori \"$1\"",
        "subcategories": "Subkategori",
        "category-media-header": "Media i kategori \"$1\"",
        "category-empty": "<em>Kategori on sonnari indadong alaman dot media.</em>",
        "hidden-categories": "{{PLURAL:$1|Hidden category|Kategori monjap}}",
+       "hidden-category-category": "Kategori namonjap",
        "category-subcat-count": "{{PLURAL:$2|Kategori on umna puna subkategori ima.|Kategori on puna ima {{PLURAL:$1|subkategori|$1 subkategori}}, tingon bahat $2.}}",
+       "category-subcat-count-limited": "Kategori on puna {{PLURAL:$1|$1 subkategori}} on.",
        "category-article-count": "{{PLURAL:$2|Kategori on umna marisi alaman ima.|Onma{{PLURAL:$1|alaman ima|$1 alaman}} i kategori on, tingon bahat $2.}}",
+       "category-article-count-limited": "Kategori on puna {{PLURAL:$1|$1 alaman}} onma.",
        "category-file-count": "{{PLURAL:$2|Kategori on umna marisi alaman ima.|Onma{{PLURAL:$1|alaman ima|$1 alaman}} i kategori on, tingon bahat $2.}}",
        "listingcontinuesabbrev": "Sat",
+       "index-category": "Alaman na iindeks",
        "noindex-category": "Alaman naso tarindeks",
        "broken-file-category": "Alaman dot link berkas sega",
        "about": "Satontang",
+       "article": "Isi nialaman",
        "newwindow": "(bukak i tingkap nabaru)",
        "cancel": "Antai",
+       "moredotdotdot": "Lainna...",
+       "morenotlisted": "Daftar on mungkin inda singkop",
+       "mypage": "Alaman",
        "mytalk": "Dokon",
+       "anontalk": "Obar",
        "navigation": "Navigasi",
        "and": "&#32;dot",
+       "faq": "FAQ",
        "namespaces": "Ruang gorar",
        "variants": "Mocoman",
        "navigation-heading": "Menu Navigasi",
+       "errorpagetitle": "Sega",
        "returnto": "Keimulak tu $1",
        "tagline": "Tingon {{SITENAME}}",
        "help": "Tolong",
        "search": "Jalaki",
+       "search-ignored-headings": "# <pre>\n# Judul na angkan ipatopi ni panjalakan.\n# Editan on nangkan iterapkon sidung alaman dohot judul on iindeks.\n# Amu bisa mamaksaon pangindekskan mulak alaman on dohot mambaen editan kosong (''null edit'')\n# Sintaksisna ima songon onma:\n#   * Sudena tingon karakter \"#\" tu ujung baris ima sada komentar.\n#   * Satiop baris naso-kosong ima judul pas na angkan ipatopi\nReferensi\nPranala luar\nLigin muse\n #</pre>",
        "searchbutton": "Jalaki",
+       "go": "Kehe",
        "searcharticle": "Kehe",
        "history": "Sejarah alaman",
        "history_short": "Sejarah",
+       "history_small": "sejarah",
+       "updatedmarker": "Iuba sian parabisan uligi",
        "printableversion": "Versi cetak",
        "permalink": "Tautan permanen",
+       "print": "Cetak",
        "view": "Sise",
        "view-foreign": "Sise i $1",
        "edit": "Pature",
+       "edit-local": "Baen deskeipsi lokal",
        "create": "Baen",
        "create-local": "Baen deskripsi lokal",
        "delete": "Apus",
index 6e158c1..dfa2d9c 100644 (file)
        "dellogpage": "Kniha smazaných stránek",
        "dellogpagetext": "Zde je seznam posledních smazaných stránek.",
        "deletionlog": "Kniha smazaných stránek",
+       "log-name-create": "Kniha vytvoření stránek",
+       "log-description-create": "Níže se nachází seznam posledních vyvořených stránek.",
+       "logentry-create-create": "$1 {{GENDER:$2|vytvořil|vytvořila|vytvořil(a)}} stránku $3",
        "reverted": "Obnovení předchozí verze",
        "deletecomment": "Důvod:",
        "deleteotherreason": "Jiný/další důvod:",
        "pagedata-text": "Tato stránka poskytuje datové rozhraní ke stránkám. Uveďte prosím název stránky v URL pomocí syntaxe pro podstránky.\n* Funguje dohadování o obsahu na základě hlavičky Accept vašeho klienta. To znamená, že data stránky budou poskytnuta ve formátu preferovaném vaším klientem.",
        "pagedata-not-acceptable": "Nenalezen odpovídající formát. Podporované MIME typy: $1",
        "pagedata-bad-title": "Neplatný název: $1.",
-       "unregistered-user-config": "Z bezpečnostních důvodů nelze načítat uživatelské podstránky s JavaScriptem, CSS nebo JSONem u neregistrovaných uživatelů."
+       "unregistered-user-config": "Z bezpečnostních důvodů nelze načítat uživatelské podstránky s JavaScriptem, CSS nebo JSONem u neregistrovaných uživatelů.",
+       "passwordpolicies-group": "Skupina",
+       "passwordpolicies-policy-minimalpasswordlength": "Heslo musí být alespoň {{PLURAL:$1|$1 znak|$1 znaky|$1 znaků}} dlouhé",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Pro přihlášení je vyžadováno alespoň {{PLURAL:$1|$1 znak|$1 znaky|$1 znaků}} dlouhé heslo",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Heslo se nemůže shodovat s uživatelským jménem",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Heslo nesmí být v seznamu určitých zakázaných hesel",
+       "passwordpolicies-policy-maximalpasswordlength": "Heslo musí být kratší než {{PLURAL:$1|$1 znak|$1 znaky|$1 znaků}}",
+       "passwordpolicies-policy-passwordcannotbepopular": "Heslo nesmí být {{PLURAL:$1|dané oblíbené heslo|v seznamu $1 oblíbených hesel}}"
 }
index 76f7fdc..e043517 100644 (file)
        "recentchanges-submit": "Кăтарт",
        "rcfilters-legend-heading": "<strong>Кĕскетнисем:</strong>",
        "rcfilters-other-review-tools": "Урăх пăхмаллисем",
+       "rcfilters-show-new-changes": "Çĕнĕ улăшăннисем",
        "rcfilters-filterlist-title": "Фильтрсем",
        "rcfilters-filter-editsbyself-label": "Хăвăр улăштарнисем",
        "rcfilters-filter-editsbyother-label": "Урăххисем улăштарнисем",
index ab7e2ec..fa9859e 100644 (file)
        "dellogpage": "Lösch-Logbuch",
        "dellogpagetext": "Dies ist das Logbuch der gelöschten Seiten und Dateien.",
        "deletionlog": "Lösch-Logbuch",
+       "log-name-create": "Seitenerstellungs-Logbuch",
+       "log-description-create": "Es folgt eine Liste der letzten Seitenerstellungen.",
+       "logentry-create-create": "$1 hat die Seite $3 {{GENDER:$2|erstellt}}",
        "reverted": "Auf eine alte Version zurückgesetzt",
        "deletecomment": "Grund:",
        "deleteotherreason": "Anderer/ergänzender Grund:",
index ce92179..e2a5941 100644 (file)
        "dellogpage": "Αρχείο καταγραφών διαγραφών",
        "dellogpagetext": "Λίστα των πιο πρόσφατων διαγραφών",
        "deletionlog": "Καταγραφές διαγραφών",
+       "log-name-create": "Αρχείο καταγραφών δημιουργίας σελίδων",
+       "log-description-create": "Παρακάτω υπάρχει ένας κατάλογος των πιο πρόσφατων δημιουργιών σελίδας.",
        "reverted": "Επαναφορά σε προηγούμενη αναθεώρηση",
        "deletecomment": "Λόγος:",
        "deleteotherreason": "Άλλος/πρόσθετος λόγος:",
index 37a682d..8add41f 100644 (file)
        "dellogpage": "Deletion log",
        "dellogpagetext": "Below is a list of the most recent deletions.",
        "deletionlog": "deletion log",
+       "log-name-create": "Page creation log",
+       "log-description-create": "Below is a list of the most recent page creations.",
+       "logentry-create-create": "$1 {{GENDER:$2|created}} page $3",
        "reverted": "Reverted to earlier revision",
        "deletecomment": "Reason:",
        "deleteotherreason": "Other/additional reason:",
index 42dc32d..2a6817f 100644 (file)
        "dellogpage": "Journal des suppressions",
        "dellogpagetext": "Voici la liste des suppressions les plus récentes.",
        "deletionlog": "journal des suppressions",
+       "log-name-create": "Journal des créations de pages",
+       "log-description-create": "Ci-dessous, la liste des dernières créations de pages.",
+       "logentry-create-create": "$1 {{GENDER:$2|a créé}} la page $3",
        "reverted": "Version précédente rétablie",
        "deletecomment": "Motif :",
        "deleteotherreason": "Motif autre ou supplémentaire :",
index d419391..8dcf581 100644 (file)
        "dellogpage": "יומן מחיקות",
        "dellogpagetext": "להלן רשימה של המחיקות האחרונות שבוצעו.",
        "deletionlog": "יומן המחיקות",
+       "log-name-create": "יומן יצירות דפים",
+       "log-description-create": "להלן רשימה של הדפים האחרונים שנוצרו.",
+       "logentry-create-create": "$1 {{GENDER:$2|יצר|יצרה}} את הדף $3",
        "reverted": "שוחזר לגרסה קודמת",
        "deletecomment": "סיבה:",
        "deleteotherreason": "סיבה אחרת/נוספת:",
        "blockipsuccesssub": "החסימה הושלמה בהצלחה",
        "blockipsuccesstext": "{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.<br />\nניתן לעיין ב[[Special:BlockList|רשימת החסומים]] כדי לצפות בחסימות.",
        "ipb-blockingself": "החשבון שלך ייחסם! האם ברצונך לעשות זאת?",
-       "ipb-confirmhideuser": "×\94×\97ש×\91×\95×\9f ×\99×\99×\97ס×\9d ×¢×\9d ×\94×\90פשר×\95ת \"×\94סתרת ×\9eשת×\9eש\". ×\96×\94 ×\99עלים את שם המשתמש בכל הרשימות ופעולות היומן. האם ברצונך לעשות זאת?",
+       "ipb-confirmhideuser": "×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש ×\99×\99×\97ס×\9d ×ª×\95×\9a ×\94פע×\9cת ×\94×\90פשר×\95ת \"×\94סתרת ×\9eשת×\9eש\". ×¤×¢×\95×\9c×\94 ×\96×\95 ×ªעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם ברצונך לעשות זאת?",
        "ipb-confirmaction": "אם באמת התכוונת לעשות זאת, יש לסמן את השדה \"{{int:ipb-confirm}}\" שמופיע למטה.",
        "ipb-edit-dropdown": "עריכת סיבות החסימה",
        "ipb-unblock-addr": "שחרור חסימה של $1",
index eb4b171..77d625b 100644 (file)
        "whatlinkshere-title": "Paginas con ligamines verso $1",
        "whatlinkshere-page": "Pagina:",
        "linkshere-2": "Le sequente paginas contine ligamines a <strong>$2</strong>:",
-       "nolinkshere-2": "Nulle pagina contine un ligamine verso <strong>$2</strong>.",
-       "nolinkshere-ns-2": "Nulle pagina liga a <strong>$2</strong>  in le spatio de nomines seligite.",
+       "nolinkshere-2": "Nulle pagina contine un ligamine a <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Nulle pagina liga a <strong>$2</strong> in le spatio de nomines seligite.",
        "isredirect": "pagina de redirection",
        "istemplate": "transclusion",
        "isimage": "ligamine al file",
index 090f8f2..8588186 100644 (file)
        "subject-preview": "Panangipadas ti suheto:",
        "previewerrortext": "Adda napasamak a maysa a biddut bayat a nagpadpadas kadagiti binawbaliwam.",
        "blockedtitle": "Naseraan ti agar-aramat",
-       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti adres ti IP.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga adres ti esurat a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga adres ti IP ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
-       "autoblockedtext": "Ti bukodmo nga adres ti IP ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga adres ti esurat a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panagusar daytoy.\n\nTi agdama a bukodmo nga adres ti IP ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti adres ti IP.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga {{int:emailuser}} malaksid no adda napudno nga adres ti esurat a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga adres ti IP ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "autoblockedtext": "Ti bukodmo nga adres ti IP ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"{{int:emailuser}}\" a langa malaksid no addaanka iti napudno nga adres ti esurat a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud iti panagusar daytoy.\n\nTi agdama a bukodmo nga adres ti IP ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
        "systemblockedtext": "Ti naganmo nga agar-aramat wenno adres ti IP ket automatikon a sinerraan babaen ti MediaWiki.\nTi naited a rason ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a maserraan: $7\nTi agdama nga adresmo nga IP ket $3.\nPangngaasi nga iraman amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
        "blockednoreason": "awan ti naited a rason",
        "whitelistedittext": "Pangngaasi a $1 tapno makaurnos kadagiti panid.",
        "recentchangeslinked-feed": "Mainaig a sinukatan",
        "recentchangeslinked-toolbox": "Mainaig a sinuksukatan",
        "recentchangeslinked-title": "Sinukatan a mainaig iti \"$1\"",
-       "recentchangeslinked-summary": "Mangikabil iti maysa a nagan ti panid tapno makita dagiti panagbaliw kadagiti naisilpo a panid wenno iti dayta a panid. (Tapno makita dagiti kameng iti maysa a kategoria, ikabil ti Kategoria:Nagan ti kategoria). Dagiti panagbaliw kadagiti panid iti [[Special:Watchlist|Listaan ti bambantayam]] ket addada iti <strong>napuskol</strong>.",
+       "recentchangeslinked-summary": "Mangikabil iti maysa a nagan ti panid tapno makita dagiti panagbaliw kadagiti naisilpo a panid wenno iti dayta a panid. (Tapno makita dagiti kameng iti maysa a kategoria, ikabil ti {{ns:category}}:Nagan ti kategoria). Dagiti panagbaliw kadagiti panid iti [[Special:Watchlist|Listaan ti bambantayam]] ket addada iti <strong>napuskol</strong>.",
        "recentchangeslinked-page": "Nagan ti panid:",
        "recentchangeslinked-to": "Ipakita dagiti sinukatan kadagiti panid nga imbes a naisilpo iti naited a panid",
        "recentchanges-page-added-to-category": "nainayon ti [[:$1]] iti kategoria",
        "protectedtitles-submit": "Ipakita dagiti titulo",
        "listusers": "Listaan ti agar-aramat",
        "listusers-editsonly": "Ipakita laeng dagiti agar-aramat nga addaan kadagiti inurnos",
+       "listusers-temporarygroupsonly": "Ipakita laeng dagiti agar-aramat kadagiti temporario a grupo ti agar-aramat.",
        "listusers-creationsort": "Ilasin babaen ti petsa a pannakapartuat",
        "listusers-desc": "Ilasin iti agpababa nga urnos",
        "usereditcount": "$1 {{PLURAL:$1|nga inurnos|kadagiti inurnos}}",
        "dellogpage": "Listaan ti panagikkat",
        "dellogpagetext": "Adda dita baba ti listaan dagiti kaudian a panangikkat.",
        "deletionlog": "listaan ti panagikkat",
+       "log-name-create": "Listaan ti panagpartuat iti panid",
+       "log-description-create": "Dita baba ket listaan dagiti kaudian a panagpartuat iti panid.",
        "reverted": "Naisubli iti nasapsapa a rebision",
        "deletecomment": "Rason:",
        "deleteotherreason": "Sabali/maipatinayon a rason:",
        "gotointerwiki-invalid": "Ti nainaganan a titulo ket imbalido.",
        "pagedata-title": "Datos ti panid",
        "pagedata-not-acceptable": "Awan ti kapada a pormat ti nabirukan. Dagiti masuportaran a kita ti MIME: $1",
-       "pagedata-bad-title": "Imbalido ti titulo: $1."
+       "pagedata-bad-title": "Imbalido ti titulo: $1.",
+       "unregistered-user-config": "Para kadagiti rason ti seguridad dagiti subpanid ti agar-aramat iti JavaScript, CSS ken JSON ket saan a maikarga  para kadagiti di nairehistro nga agar-aramat.",
+       "passwordpolicies": "Dagiti annuroten ti kontrasenias",
+       "passwordpolicies-summary": "Daytoy ti listaan dagiti epektibo nga annuroten ti kontrasenias para kadagiti grupo ti agar-aramat iti daytoy a wiki.",
+       "passwordpolicies-group": "Grupo",
+       "passwordpolicies-policies": "Dagiti annuroten",
+       "passwordpolicies-policy-minimalpasswordlength": "Ti kontrasenias ket nasken a saan a basbassit ngem $1 a {{PLURAL:$1|karakter|karkarakter}} iti kaatiddog",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Ti kontrasenias ket nasken a saan a basbassit ngem $1 a {{PLURAL:$1|karakter|karkarakter}} iti kaatiddog tapno makabaelan ti sumrek",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Ti kontrasenia ket saan a mabalin a kapada a kas ti nagan ti agar-aramat",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Ti kontrasenias ket saan a mabalin a maipada kadagiti naiparit a kontrasenias",
+       "passwordpolicies-policy-maximalpasswordlength": "Ti kontrasenias ket nasken a basbassit ngem $1 a {{PLURAL:$1|karakter|karkarakter}} iti kaatiddog",
+       "passwordpolicies-policy-passwordcannotbepopular": "Ti kontrasenias ket saan a mabalin {{PLURAL:$1|a ti popular a kontrasenias|nga adda iti listaan dagiti $1 a popular a kontrasenias}}"
 }
index d8fb9d1..2c4245f 100644 (file)
        "listgrouprights-namespaceprotection-namespace": "ЦIерий моттиг",
        "listgrants-rights": "Бокъонаш",
        "emailuser": "Доакъашхочоа каьхат",
+       "emailusername": "Доакъашхочун цIи:",
        "usermessage-editor": "Системан дIакхоачадар",
        "watchlist": "Зем",
        "mywatchlist": "Зем",
        "watchlistfor2": "Доакъашхо $1 $2",
+       "addwatch": "Зема хьаязъяьрá юкъеяьккха",
        "addedwatchtext": "Статья «[[:$1]]» а, цун дувца оттадара оагIув а тIатехай хьа [[Special:Watchlist|зем бара хьаязъяьра]].",
        "removedwatchtext": "Статья «[[:$1]]» а, иштта цун дувца оттадара оагIув а дIаяьккхай хьа [[Special:Watchlist|зем бара хьаязъяьр]] чура.",
        "watch": "Зем бе",
        "year": "Укх шер (кхы хьалхагIа):",
        "sp-contributions-newbies": "Хьахьокха алхха керда дагара йоазонашца баь бола къахьегам",
        "sp-contributions-blocklog": "блок тохар",
-       "sp-contributions-deleted": "доакъашхочун дӀадаьха тоадар",
+       "sp-contributions-deleted": "{{GENDER:$1|доакъашхочун}} дӀадаьккха хинна тоадар",
        "sp-contributions-uploads": "чуяьхараш",
        "sp-contributions-logs": "тептараш",
        "sp-contributions-talk": "дувца оттадар",
-       "sp-contributions-userrights": "доакъашхочун бокъонашта урхалдар",
+       "sp-contributions-userrights": "{{GENDER:$1|доакъашхочун}} бокъонашта урхалдар",
        "sp-contributions-search": "Къахьегама лахар",
        "sp-contributions-username": "IP-адрес е доакъашхочун цӀи:",
        "sp-contributions-toponly": "Гойта алхха тIехьара эршаш хинна дола тоадаьраш",
        "whatlinkshere": "Тӏатовжамаш укхаза",
        "whatlinkshere-title": "«$1» яхача оагӏонна тӏатовжаш йола оагӏонаш",
        "whatlinkshere-page": "ОагIув:",
-       "linkshere-2": "«'''$2'''» ← укхунна тӀахьожавеш я тӀехьайоагӀа оагӀонаш:",
-       "nolinkshere-2": "Кхыйолча оагӏонашкара '''$2''' яхача оагӏон тIатовжамаш доацаш да.",
+       "linkshere-2": "<strong>$2</strong> ← укхунна тӀахьожавеш я тӀехьайоагӀа оагӀонаш:",
+       "nolinkshere-2": "Кхыйолча оагӏонашкара <strong>$2</strong> яхача оагӏонна тIатовжамаш доацаш да.",
        "isredirect": "дIа-хьа хьожавара оагIув",
        "istemplate": "юкъейоалаяр",
        "isimage": "Файлови тӏатовжам",
index fe2afdf..e2bd113 100644 (file)
        "redirect-file": "Arkivo-nomo",
        "fileduplicatesearch-submit": "Serchar",
        "specialpages": "Specala pagini",
+       "specialpages-group-maintenance": "Raporti pri manteno",
        "specialpages-group-other": "Altra specala pagini",
        "specialpages-group-login": "Enirar / krear konto",
        "specialpages-group-changes": "Recenta chanji e registri",
index c438f97..b3a81d0 100644 (file)
        "botpasswords-existing": "ពាក្យសម្ងាត់រូបយន្តមានហើយ",
        "botpasswords-createnew": "បង្កើតពាក្យសម្ងាត់រូបយន្តថ្មី",
        "botpasswords-editexisting": "កែប្រែពាក្យសម្ងាត់រូបយន្តមានហើយ",
+       "botpasswords-label-needsreset": "(ពាក្យសម្ងាត់ចាំបាច់ត្រូវកំណត់ឡើងវិញ)",
        "botpasswords-label-appid": "ឈ្មោះរូបយន្ត៖",
        "botpasswords-label-create": "បង្កើត",
        "botpasswords-label-update": "បន្ទាន់សម័យ",
index fe7b8f6..f2edcb7 100644 (file)
        "dellogpage": "삭제 기록",
        "dellogpagetext": "아래의 목록은 최근에 삭제된 문서입니다.",
        "deletionlog": "삭제 기록",
+       "log-name-create": "문서 만들기 기록",
+       "logentry-create-create": "$1님이 $3 문서를 {{GENDER:$2|만들었습니다}}",
        "reverted": "이전 판으로 되돌렸습니다",
        "deletecomment": "이유:",
        "deleteotherreason": "다른 이유/추가적인 이유:",
        "whatlinkshere": "여기를 가리키는 문서",
        "whatlinkshere-title": "\"$1\" 문서를 가리키는 문서 목록",
        "whatlinkshere-page": "문서:",
-       "linkshere-2": "다음 문서가 '''$2''' 문서를 가리키고 있습니다:",
-       "nolinkshere-2": "'''$2''' 문서를 가리키는 문서가 없습니다.",
-       "nolinkshere-ns-2": "선택한 이름공간에는 '''$2''' 문서를 가리키는 문서가 없습니다.",
+       "linkshere-2": "다음 문서가 <strong>$2</strong> 문서를 가리키고 있습니다:",
+       "nolinkshere-2": "<strong>$2</strong> 문서를 가리키는 문서가 없습니다.",
+       "nolinkshere-ns-2": "선택한 이름공간에는 <strong>$2</strong> 문서를 가리키는 문서가 없습니다.",
        "isredirect": "넘겨주기 문서",
        "istemplate": "끼워넣기",
        "isimage": "연결된 파일",
index 9e5010b..dffb09b 100644 (file)
        "dellogpage": "Дневник на бришења",
        "dellogpagetext": "Подолу е наведен список на најновите бришења.",
        "deletionlog": "дневник на бришењата",
+       "log-name-create": "Дневник на создавање страници",
+       "log-description-create": "Подолу е наведен список на најновите создавања.",
+       "logentry-create-create": "$1 {{GENDER:$2|ја создаде}} страница $3",
        "reverted": "Вратено на претходната преработка",
        "deletecomment": "Причина:",
        "deleteotherreason": "Друга/дополнителна причина:",
index 47316b4..2e6e242 100644 (file)
        "dellogpage": "Verwijderingslogboek",
        "dellogpagetext": "Hieronder wordt een lijst met recent verwijderde pagina's en bestanden weergegeven.",
        "deletionlog": "verwijderingslogboek",
+       "log-name-create": "Logboek nieuwe pagina's",
+       "log-description-create": "Hieronder wordt een lijst met recent aangemaakte pagina's weergegeven.",
+       "logentry-create-create": "$1 {{GENDER:$2|heeft}} de pagina $3 aangemaakt",
        "reverted": "Eerdere versie hersteld",
        "deletecomment": "Reden:",
        "deleteotherreason": "Andere reden:",
index 423443f..faa797a 100644 (file)
        "sp-contributions-newbies-title": "Contribuições de contas novas",
        "sp-contributions-blocklog": "registro de bloqueios",
        "sp-contributions-suppresslog": "Contribuições de {{GENDER:$1|usuário}} suprimidas",
-       "sp-contributions-deleted": "contribuições eliminadas do {{GENDER:$1|usuário}}",
+       "sp-contributions-deleted": "contribuições eliminadas",
        "sp-contributions-uploads": "envios",
        "sp-contributions-logs": "registros",
-       "sp-contributions-talk": "disc",
-       "sp-contributions-userrights": "gerenciamento de privilégios de {{GENDER:$1|usuários}}",
+       "sp-contributions-talk": "discussão",
+       "sp-contributions-userrights": "gerenciamento de privilégios",
        "sp-contributions-blocked-notice": "Este usuário atualmente está bloqueado. O registro de bloqueio mais recente é fornecido abaixo para referência:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP encontra-se bloqueado.\nSegue, para referência, a entrada mais recente no registro de bloqueios:",
        "sp-contributions-search": "Navegar pelas contribuições",
index 00983a6..386a396 100644 (file)
        "sp-contributions-newbies-title": "Contribuições de contas novas",
        "sp-contributions-blocklog": "registo de bloqueios",
        "sp-contributions-suppresslog": "contribuições suprimidas {{GENDER:$1|do utilizador|da utilizadora}}",
-       "sp-contributions-deleted": "contribuições eliminadas {{GENDER:$1|do utilizador|da utilizadora}}",
+       "sp-contributions-deleted": "contribuições eliminadas",
        "sp-contributions-uploads": "carregamentos",
        "sp-contributions-logs": "registos",
        "sp-contributions-talk": "discussão",
-       "sp-contributions-userrights": "Gestão de privilégios {{GENDER:$1|do utilizador|da utilizadora}}",
+       "sp-contributions-userrights": "gestão de privilégios",
        "sp-contributions-blocked-notice": "Este utilizador está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-search": "Pesquisar contribuições",
index cf1c817..8f5f01f 100644 (file)
        "dellogpage": "{{doc-logpage}}\n\nThe name of the deletion log. Used as heading on [[Special:Log/delete]] and in the drop down menu for selecting logs on [[Special:Log]].\n{{Identical|Deletion log}}",
        "dellogpagetext": "Text in [[Special:Log/delete]].",
        "deletionlog": "Used as text for the link which points to the deletion log:\n* Used as <code>$1</code> in {{msg-mw|Filewasdeleted}}\n* Used as <code>$2</code> in {{msg-mw|Deletedtext}}\n* Used in log lines on [[Special:DeletedContributions]]\n{{Identical|Deletion log}}",
+       "log-name-create": "{{doc-logpage}}\n\nThe name of the page creation log. Used as heading on [[Special:Log/create]] and in the drop down menu for selecting logs on [[Special:Log]].",
+       "log-description-create": "Text in [[Special:Log/create]].",
+       "logentry-create-create": "{{Logentry|[[Special:Log/create]]}}",
        "reverted": "{{Identical|Revert}}",
        "deletecomment": "{{Identical|Reason}}",
        "deleteotherreason": "{{Identical|Other/additional reason}}",
index f3059ee..0410602 100644 (file)
        "protectedtitles-submit": "Prikaži naslove",
        "listusers": "Seznam uporabnikov",
        "listusers-editsonly": "Pokaži samo uporabnike z urejanji",
+       "listusers-temporarygroupsonly": "Pokaži samo uporabnike v začasnih uporabniških skupinah",
        "listusers-creationsort": "Razvrsti po datumu ustvaritve",
        "listusers-desc": "Razvrsti padajoče",
        "usereditcount": "$1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
        "apisandbox-dynamic-parameters-add-label": "Dodaj parameter:",
        "apisandbox-dynamic-parameters-add-placeholder": "Ime parametra",
        "apisandbox-dynamic-error-exists": "Parameter z imenom »$1« že obstaja.",
+       "apisandbox-templated-parameter-reason": "Ta [[Special:ApiHelp/main#main/templatedparams|parameter s predlogo]] je ponujen na podlagi {{PLURAL:$1|vrednosti}} $2.",
        "apisandbox-deprecated-parameters": "Zastareli parametri",
        "apisandbox-fetch-token": "Samodejno izpolni žeton",
        "apisandbox-add-multi": "Dodaj",
        "whatlinkshere-title": "Strani, ki se povezujejo na $1",
        "whatlinkshere-page": "Stran:",
        "linkshere-2": "Na '''$1''' kažejo naslednje strani:",
-       "nolinkshere-2": "Nobena stran ne kaže na '''$2'''.",
-       "nolinkshere-ns-2": "Nobena stran se ne povezuje na '''$2''' v izbranem imenskem prostoru.",
+       "nolinkshere-2": "Nobena stran ne kaže na <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Nobena stran se ne povezuje na <strong>$2</strong> v izbranem imenskem prostoru.",
        "isredirect": "preusmeritvena stran",
        "istemplate": "vključitev",
        "isimage": "povezava na datoteko",
        "pagedata-text": "Ta stran nudi podatkovni vmesnik do strani. Prosimo, navedite naslov strani v URL-ju z uporabo skladnje podstrani.\n* Pogajanje o vsebini se nanaša na glavo Accept vašega odjemalca. To pomeni, da bomo podatke strani posredovali v obliki, ki vašemu odjemalcu bolj ustreza.",
        "pagedata-not-acceptable": "Nismo našli ujemajoče oblike. Podprte vrste MIME: $1",
        "pagedata-bad-title": "Neveljaven naslov: $1.",
-       "unregistered-user-config": "Iz varnostnih razlogov uporabniških podstrani JavaScript, CSS in JSON ne moremo naložiti neregistriranim uporabnikom."
+       "unregistered-user-config": "Iz varnostnih razlogov uporabniških podstrani JavaScript, CSS in JSON ne moremo naložiti neregistriranim uporabnikom.",
+       "passwordpolicies": "Pravilniki gesel",
+       "passwordpolicies-summary": "To je seznam trenutno veljavnih pravilnikov gesel za uporabniške skupine, opredeljene v tem wikiju.",
+       "passwordpolicies-group": "Skupina",
+       "passwordpolicies-policies": "Pravilniki",
+       "passwordpolicies-policy-minimalpasswordlength": "Geslo mora dolgo biti vsaj $1 {{PLURAL:$1|znak|znaka|znake|znakov}}",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Geslo mora biti dolgo vsaj $1 {{PLURAL:$1|znak|znaka|znake|znakov}}, da je omogočena prijava",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Geslo ne more biti enako kot uporabniško ime",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Geslo se ne sme ujemati s posebej prepovedanimi gesli",
+       "passwordpolicies-policy-maximalpasswordlength": "Geslo ne sme biti daljše od $1 {{PLURAL:$1|znak|znaka|znake|znakov}}",
+       "passwordpolicies-policy-passwordcannotbepopular": "Geslo ne sme biti {{PLURAL:$1|1=popularno geslo|na seznamu $1 popularnih gesel}}"
 }
index 299a137..3074297 100644 (file)
        "longpageerror": "<strong>Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.</strong>\nСтраница не може бити сачувана.",
        "readonlywarning": "<strong>Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.</strong>\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nСистемски администратор је навео следеће објашњење: $1",
        "protectedpagewarning": "<strong>Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.</strong>\nПоследњи запис у дневнику је приказан испод:",
-       "semiprotectedpagewarning": "<strong>Ð\9dапомена:</strong> Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ð·Ð°Ñ\88Ñ\82иÑ\9bена, Ñ\82ако Ð´Ð° Ñ\81амо Ñ\80егиÑ\81Ñ\82Ñ\80овани ÐºÐ¾Ñ\80иÑ\81ниÑ\86и Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\98е Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98Ñ\83.\nÐ\9fоÑ\81ледÑ\9aи Ð·Ð°Ð¿Ð¸Ñ\81 Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83 Ñ\98е Ð¿Ñ\80иказан Ð¸Ñ\81под:",
+       "semiprotectedpagewarning": "<strong>Ð\9dапомена:</strong> Ð¾Ð²Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ð·Ð°Ñ\88Ñ\82иÑ\9bена, Ñ\82ако Ð´Ð° Ñ\81амо Ñ\80егиÑ\81Ñ\82Ñ\80овани ÐºÐ¾Ñ\80иÑ\81ниÑ\86и Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\98е Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98Ñ\83.\nÐ\9fоÑ\81ледÑ\9aи Ð·Ð°Ð¿Ð¸Ñ\81 Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83 Ñ\98е Ð¿Ñ\80иказан Ð¸Ñ\81под ÐºÐ°Ð¾ Ñ\80еÑ\84еÑ\80енÑ\86а:",
        "cascadeprotectedwarning": "<strong>Упозорење:</strong> Ова страница је заштићена тако да је могу уређивати само корисници са [[Special:ListGroupRights|одређеним правима]] (администратори), јер је иста укључена у {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом” заштитом:",
        "titleprotectedwarning": "<strong>Упозорење: ову страницу могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].</strong>\nПоследњи запис у дневнику је приказан испод:",
        "templatesused": "{{PLURAL:$1|Шаблон који се користи|Шаблони који се користе}} на овој страници:",
index bf662d2..04d55e5 100644 (file)
        "subject-preview": "Pramidang subyék:",
        "previewerrortext": "Aya éror nalika nyobaan nyawang robahan anjeun.",
        "blockedtitle": "Pamaké dipeungpeuk",
-       "blockedtext": "'''Ngaran pamaké atawa alamat IP anjeun dipeungpeuk.'''\n\nDipeungpeuk ku $1.\nAlesanana ''$2''.\n\n* Mimiti dipeungpeuk : $8\n* dipeungpeuk kadaluarsa dina: $6\n* Sasaran nudipeungpeuk : $7\n\nAnjeun bisa nepungan $1 atawa salasahiji [[{{MediaWiki:Grouppage-sysop}}|kuncén]] séjén pikeun nyawalakeun hal ieu.\n'''Catet''': yén anjeun teu bisa maké fungsi \"surélékan pamaké ieu\" mun anjeun teu ngadaptarkeun alamat surélék nu sah kana [[Special:Preferences|préferénsi pamaké]] anjeun.\n\nAlamat IP anjeun $3 jeung ID na #$5.\nLampirkeun informasi ieu dina unggal ''query'' anjeun.",
+       "blockedtext": "<strong>Ngaran pamaké atawa alamat IP anjeun dipeungpeuk.</strong>\n\nDipeungpeuk ku $1.\nAlesanana <em>$2</em>.\n\n* Mimiti dipeungpeuk: $8\n* Anggeusan dipeungpeuk: $6\n* Sasaran anu dipeungpeuk: $7\n\nAnjeun bisa ngontak $1 atawa [[{{MediaWiki:Grouppage-sysop}}|kuncén]] lianna pikeun nyawalakeun ieu hal.\nAnjeun teu bisa maké fitur \"{{int:emailuser}}\" mun anjeun teu ngadaptarkeun alamat surélék nu sah dina [[Special:Preferences|préferénsi akun]] anjeun sarta henteu dipeungpeuk tina migunakeun éta fitur.\nAlamat IP anjeun $3, kalayan ID peungpeukna #$5.\nLampirkeun informasi ieu dina unggal kueri anjeun.",
        "autoblockedtext": "Alamat IP anjeun otomatis dipeungpeuk sabab dipaké ku pamaké séjén nu geus dipeungpeuk ku $1, kalawan alesan:\n\n:''$2''\n\n*Mimiti dipeungpeuk: $8\n*Kadaluwarsa peungpeuk: $6\n*Sasaran peungpeuk: $7\n\nAnjeun bisa nepungan $1 atawa [[{{MediaWiki:Grouppage-sysop}}|kuncé]] lianna pikeun ngabadamikeun ieu peungpeukan.\n\nCatet yén anjeun moal bisa migunakeun fitur \"surélékan ieu pamaké\" mun alamat surélék anu didaptarkeun dina [[Special:Preferences|préferénsi pamaké]]na teu sah, sarta teu dipeungpeuk tina migunakeun ieu fitur.\n\nAlamat IP Anjeun ayeuna nyaéta $3, sarta ID peungpeukan anjeun #$5.\nMangga sebatkeun éta ID dina pamundut-pamundut anjeun.",
        "blockednoreason": "taya alesan",
        "whitelistedittext": "Anjeun kudu asup $1 sangkan bisa ngédit.",
        "recentchangeslinked-feed": "Parobahan nu patali",
        "recentchangeslinked-toolbox": "Parobahan nu patali",
        "recentchangeslinked-title": "Parobahan patali ka \"$1\"",
-       "recentchangeslinked-summary": "Ieu kaca husus ngabéréndélkeun parobahan anyar anu numbu ti kaca husus (atawa uesi katagori husus). Kaca anu [[Special:Watchlist|diawaskeun]] némbongan '''kandel'''.",
+       "recentchangeslinked-summary": "Asupkeun ngaran kaca pikeun nempo parobahan anu nutumbu ka atawa ti éta kaca. (Pikeun nempo anggota kategori, asupkeun {{ns:category}}:Ngaran kategori). Parobahan kaca-kaca anu [[Special:Watchlist|diawaskeun]] némbongan <strong>kandel</strong>.",
        "recentchangeslinked-page": "Ngaran kaca:",
        "recentchangeslinked-to": "Témbongkeun parobahan ka kaca-kaca nu ditumbukeun ka kaca nu dimaksud",
        "recentchanges-page-added-to-category": "[[:$1]] ditambahkeun kana kategori",
        "filehist-comment": "Kamandang",
        "imagelinks": "Pamakéan berkas",
        "linkstoimage": "Kaca ieu  {{PLURAL:$1|numbu|$1 numbu}} ka gambar ieu :",
-       "linkstoimage-more": "Leuwih ti $1 {{PLURAL:$1|kaca nutumbu|kaca nutumbu}} ka ieu berkas.\nBéréndélan di handap némbongkeun {{PLURAL:$1|tutumbu kaca kahiji|$1 tutumbu kaca}} ka ieu berkas hungkul.\n[[Special:WhatLinksHere/$2|Béréndélan lengkepna]] aya.",
+       "linkstoimage-more": "Leuwih ti $1 {{PLURAL:$1|kaca nutumbu|kaca nutumbu}} ka ieu berkas.\nBéréndélan di handap némbongkeun {{PLURAL:$1|tutumbu kaca kahiji|$1 tutumbu kaca kahiji}} ka ieu berkas hungkul.\n[[Special:WhatLinksHere/$2|Béréndélan lengkepna]] ogé aya.",
        "nolinkstoimage": "Teu aya kaca anu nutumbu ka ieu berkas.",
        "morelinkstoimage": "Témbong [[Special:WhatLinksHere/$1|tutumbu lianna]] ka ieu berkas.",
        "linkstoimage-redirect": "$1 (pangalihan berkas) $2",
        "unwatchthispage": "Eureun ngawaskeun",
        "notanarticle": "Sanés kaca eusi",
        "notvisiblerev": "Révisi geus dihapus",
-       "watchlist-details": "Aya {{PLURAL:$1|$1 kaca|$1 kaca}} dina daptar awaseun (pleus kaca obrolanna).",
+       "watchlist-details": "Aya {{PLURAL:$1|$1 kaca|$1 kaca}} dina Awaseun anjeun (kaasup kaca obrolan).",
        "wlheader-enotif": "Iber surélék diaktifkeun.",
-       "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
-       "wlnote": "Di handap ieu mangrupa $1 {{PLURAL:$1|robahan|robahan}} ahir salila '''$2''' jam.",
+       "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun <strong>kandel</strong>.",
+       "wlnote": "Di handap ieu mangrupa {{PLURAL:$1|robahan|robahan}} <strong>$1</strong> panungtung salila {{PLURAL:$2|jam|<strong>$2</strong> jam}}, ti $3, $4.",
        "wlshowlast": "Témbongkeun $1 jam $2 poé panungtung",
        "watchlist-hide": "Sumputkeun",
        "watchlist-submit": "Témbongkeun",
        "pageinfo-few-visiting-watchers": "Rék aya atawa henteuna pamariksa kaca nu nyorang éditan kiwari",
        "pageinfo-redirects-name": "Jumlah pindahan ka ieu kaca",
        "pageinfo-subpages-name": "Nomor subkaca ieu kaca",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|pindahan|pindahan}}; $3 {{PLURAL:$3|non-pindahan|non-pindahan}})",
        "pageinfo-firstuser": "Panyieun kaca",
        "pageinfo-firsttime": "Tanggal panyieunan kaca",
        "pageinfo-lastuser": "Pangédit panungtung",
diff --git a/maintenance/archives/patch-archive-ar_rev_id-unique.sql b/maintenance/archives/patch-archive-ar_rev_id-unique.sql
new file mode 100644 (file)
index 0000000..0f07627
--- /dev/null
@@ -0,0 +1,4 @@
+-- T193180: ar_rev_id should be unique
+
+CREATE UNIQUE INDEX /*i*/ar_revid_uniq ON /*_*/archive (ar_rev_id);
+DROP INDEX /*i*/ar_revid ON /*_*/archive;
index 038b28c..24ca86d 100644 (file)
@@ -53,9 +53,14 @@ class CleanupSpam extends Maintenance {
                $wgUser->addGroup( 'bot' );
 
                $spec = $this->getArg();
-               $like = LinkFilter::makeLikeArray( $spec );
-               if ( !$like ) {
-                       $this->fatalError( "Not a valid hostname specification: $spec" );
+
+               $likes = [];
+               foreach ( [ 'http://', 'https://' ] as $prot ) {
+                       $like = LinkFilter::makeLikeArray( $spec, $prot );
+                       if ( !$like ) {
+                               $this->fatalError( "Not a valid hostname specification: $spec" );
+                       }
+                       $likes[$prot] = $like;
                }
 
                if ( $this->hasOption( 'all' ) ) {
@@ -63,15 +68,24 @@ class CleanupSpam extends Maintenance {
                        $this->output( "Finding spam on " . count( $wgLocalDatabases ) . " wikis\n" );
                        $found = false;
                        foreach ( $wgLocalDatabases as $wikiID ) {
+                               /** @var $dbr Database */
                                $dbr = $this->getDB( DB_REPLICA, [], $wikiID );
 
-                               $count = $dbr->selectField( 'externallinks', 'COUNT(*)',
-                                       [ 'el_index' . $dbr->buildLike( $like ) ], __METHOD__ );
-                               if ( $count ) {
-                                       $found = true;
-                                       $cmd = wfShellWikiCmd( "$IP/maintenance/cleanupSpam.php",
-                                               [ '--wiki', $wikiID, $spec ] );
-                                       passthru( "$cmd | sed 's/^/$wikiID:  /'" );
+                               foreach ( $likes as $like ) {
+                                       $count = $dbr->selectField(
+                                               'externallinks',
+                                               'COUNT(*)',
+                                               [ 'el_index' . $dbr->buildLike( $like ) ],
+                                               __METHOD__
+                                       );
+                                       if ( $count ) {
+                                               $found = true;
+                                               $cmd = wfShellWikiCmd(
+                                                       "$IP/maintenance/cleanupSpam.php",
+                                                       [ '--wiki', $wikiID, $spec ]
+                                               );
+                                               passthru( "$cmd | sed 's/^/$wikiID:  /'" );
+                                       }
                                }
                        }
                        if ( $found ) {
@@ -82,13 +96,21 @@ class CleanupSpam extends Maintenance {
                } else {
                        // Clean up spam on this wiki
 
+                       $count = 0;
+                       /** @var $dbr Database */
                        $dbr = $this->getDB( DB_REPLICA );
-                       $res = $dbr->select( 'externallinks', [ 'DISTINCT el_from' ],
-                               [ 'el_index' . $dbr->buildLike( $like ) ], __METHOD__ );
-                       $count = $dbr->numRows( $res );
-                       $this->output( "Found $count articles containing $spec\n" );
-                       foreach ( $res as $row ) {
-                               $this->cleanupArticle( $row->el_from, $spec );
+                       foreach ( $likes as $prot => $like ) {
+                               $res = $dbr->select(
+                                       'externallinks',
+                                       [ 'DISTINCT el_from' ],
+                                       [ 'el_index' . $dbr->buildLike( $like ) ],
+                                       __METHOD__
+                               );
+                               $count = $dbr->numRows( $res );
+                               $this->output( "Found $count articles containing $spec\n" );
+                               foreach ( $res as $row ) {
+                                       $this->cleanupArticle( $row->el_from, $spec, $prot );
+                               }
                        }
                        if ( $count ) {
                                $this->output( "Done\n" );
@@ -96,7 +118,13 @@ class CleanupSpam extends Maintenance {
                }
        }
 
-       private function cleanupArticle( $id, $domain ) {
+       /**
+        * @param int $id
+        * @param string $domain
+        * @param string $protocol
+        * @throws MWException
+        */
+       private function cleanupArticle( $id, $domain, $protocol ) {
                $title = Title::newFromID( $id );
                if ( !$title ) {
                        $this->error( "Internal error: no page for ID $id" );
@@ -109,7 +137,7 @@ class CleanupSpam extends Maintenance {
                $currentRevId = $rev->getId();
 
                while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT )
-                       || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain ) )
+                       || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain, $protocol ) )
                ) {
                        $rev = $rev->getPrevious();
                }
index fbe207d..f7db574 100644 (file)
@@ -290,7 +290,7 @@ CREATE TABLE /*_*/archive (
 CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
 CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
 CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
-CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
+CREATE UNIQUE INDEX /*i*/ar_revid_uniq ON /*_*/archive (ar_rev_id);
 
 
 --
diff --git a/maintenance/oracle/archives/patch-archive-ar_rev_id-unique.sql b/maintenance/oracle/archives/patch-archive-ar_rev_id-unique.sql
new file mode 100644 (file)
index 0000000..c1cccc2
--- /dev/null
@@ -0,0 +1,6 @@
+-- T193180: ar_rev_id should be unique
+
+define mw_prefix='{$wgDBprefix}';
+
+CREATE UNIQUE INDEX &mw_prefix.archive_i04 ON &mw_prefix.archive (ar_rev_id);
+DROP INDEX &mw_prefix.archive_i03;
index 6e36752..612f089 100644 (file)
@@ -271,7 +271,7 @@ ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk2 FOREIGN KEY
 CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp);
 CREATE INDEX &mw_prefix.archive_i02 ON &mw_prefix.archive (ar_user_text,ar_timestamp);
 CREATE INDEX &mw_prefix.ar_actor_timestamp ON &mw_prefix.archive (ar_actor,ar_timestamp);
-CREATE INDEX &mw_prefix.archive_i03 ON &mw_prefix.archive (ar_rev_id);
+CREATE UNIQUE INDEX &mw_prefix.archive_i04 ON &mw_prefix.archive (ar_rev_id);
 /*$mw$*/
 CREATE TRIGGER &mw_prefix.archive_seq_trg BEFORE INSERT ON &mw_prefix.archive
        FOR EACH ROW WHEN (new.ar_id IS NULL)
index cf0eb2f..2f56772 100644 (file)
@@ -263,6 +263,7 @@ ALTER SEQUENCE archive_ar_id_seq OWNED BY archive.ar_id;
 CREATE INDEX archive_name_title_timestamp ON archive (ar_namespace,ar_title,ar_timestamp);
 CREATE INDEX archive_user_text            ON archive (ar_user_text);
 CREATE INDEX archive_actor                ON archive (ar_actor);
+CREATE UNIQUE INDEX ar_revid_uniq ON archive (ar_rev_id);
 
 
 CREATE TABLE slots (
diff --git a/maintenance/sqlite/archives/patch-archive-ar_rev_id-unique.sql b/maintenance/sqlite/archives/patch-archive-ar_rev_id-unique.sql
new file mode 100644 (file)
index 0000000..9677dbb
--- /dev/null
@@ -0,0 +1,4 @@
+-- T193180: ar_rev_id should be unique
+
+CREATE UNIQUE INDEX /*i*/ar_revid_uniq ON /*_*/archive (ar_rev_id);
+DROP INDEX /*i*/ar_revid;
index 53c1529..d8a47cb 100644 (file)
@@ -667,7 +667,7 @@ CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
 
 -- Index for linking archive rows with tables that normally link with revision
 -- rows, such as change_tag.
-CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
+CREATE UNIQUE INDEX /*i*/ar_revid_uniq ON /*_*/archive (ar_rev_id);
 
 --
 -- Slots represent an n:m relation between revisions and content objects.
index da5cfb1..b4707e6 100644 (file)
@@ -1543,7 +1543,7 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                if ( $db ) {
                        $userTables = [ 'user', 'user_groups', 'user_properties', 'actor' ];
                        $pageTables = [ 'page', 'revision', 'ip_changes', 'revision_comment_temp',
-                               'revision_actor_temp', 'comment' ];
+                               'revision_actor_temp', 'comment', 'archive' ];
                        $coreDBDataTables = array_merge( $userTables, $pageTables );
 
                        // If any of the user or page tables were marked as used, we should clear all of them.
index 40c4e1e..68539b5 100644 (file)
@@ -96,6 +96,8 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
         * @covers WikiPage::doEditUpdates
         */
        public function testDoEditContent() {
+               $this->setMwGlobals( 'wgPageCreationLog', true );
+
                $page = $this->newPage( __METHOD__ );
                $title = $page->getTitle();
 
@@ -108,13 +110,21 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
 
                $page->doEditContent( $content, "[[testing]] 1" );
 
+               $id = $page->getId();
+
+               // Test page creation logging
+               $this->assertSelect(
+                       'logging',
+                       [ 'log_type', 'log_action' ],
+                       [ 'log_page' => $id ],
+                       [ [ 'create', 'create' ] ]
+               );
+
                $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
-               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
+               $this->assertTrue( $id > 0, "WikiPage should have new page id" );
                $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
                $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
 
-               $id = $page->getId();
-
                # ------------------------
                $dbr = wfGetDB( DB_REPLICA );
                $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );