Merge "resourceloader: Embed 'mediawiki' directly in startup response"
authorKrinkle <krinklemail@gmail.com>
Thu, 28 Jun 2018 01:43:55 +0000 (01:43 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 28 Jun 2018 01:43:55 +0000 (01:43 +0000)
32 files changed:
autoload.php
docs/extension.schema.v1.json
docs/extension.schema.v2.json
includes/api/i18n/ru.json
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/installer/i18n/bn.json
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/specials/SpecialImport.php
includes/templates/EnhancedChangesListGroup.mustache
languages/i18n/be-tarask.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/de.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fi.json
languages/i18n/gcr.json
languages/i18n/he.json
languages/i18n/inh.json
languages/i18n/lez.json
languages/i18n/pt-br.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sr-ec.json
languages/i18n/zh-hant.json
maintenance/populateContentTables.php [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js

index d3f7e98..c535560 100644 (file)
@@ -1105,6 +1105,7 @@ $wgAutoloadLocalClasses = [
        'PopulateCategory' => __DIR__ . '/maintenance/populateCategory.php',
        'PopulateChangeTagDef' => __DIR__ . '/maintenance/populateChangeTagDef.php',
        'PopulateContentModel' => __DIR__ . '/maintenance/populateContentModel.php',
+       'PopulateContentTables' => __DIR__ . '/maintenance/populateContentTables.php',
        'PopulateExternallinksIndex60' => __DIR__ . '/maintenance/populateExternallinksIndex60.php',
        'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php',
        'PopulateImageSha1' => __DIR__ . '/maintenance/populateImageSha1.php',
index bcfd2aa..e7e0975 100644 (file)
                                                                "class": {
                                                                        "enum": ["ResourceLoaderImageModule"]
                                                                },
+                                                               "defaultColor": {
+                                                                       "type": "string"
+                                                               },
                                                                "data": {
                                                                        "type": "string"
                                                                },
index 31edbd0..24bfb63 100644 (file)
                                                                "class": {
                                                                        "enum": ["ResourceLoaderImageModule"]
                                                                },
+                                                               "defaultColor": {
+                                                                       "type": "string"
+                                                               },
                                                                "data": {
                                                                        "type": "string"
                                                                },
index e04f090..414a252 100644 (file)
@@ -32,7 +32,8 @@
                        "Happy13241",
                        "Ole Yves",
                        "AttemptToCallNil",
-                       "Movses"
+                       "Movses",
+                       "Stjn"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Документация]]\n* [[mw:Special:MyLanguage/API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> MediaWiki API — зрелый и стабильный интерфейс, активно поддерживаемый и улучшаемый. Мы стараемся избегать ломающих изменений, однако изредка они могут быть необходимы. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\n<p class=\"mw-apisandbox-link\"><strong>Тестирование:</strong> для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].</p>",
index 0bf3eb4..57c4026 100644 (file)
@@ -208,8 +208,6 @@ class ChangesList extends ContextSource {
                        $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns' .
                                $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
                }
-               $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns-' .
-                       $rc->mAttribs['rc_namespace'] );
 
                // Indicate watched status on the line to allow for more
                // comprehensive styling.
@@ -223,7 +221,8 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * Get an array of CSS classes attributed to filters for this row
+        * Get an array of CSS classes attributed to filters for this row. Used for highlighting
+        * in the front-end.
         *
         * @param RecentChange $rc
         * @return array Array of CSS classes
@@ -231,6 +230,9 @@ class ChangesList extends ContextSource {
        protected function getHTMLClassesForFilters( $rc ) {
                $classes = [];
 
+               $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns-' .
+                       $rc->mAttribs['rc_namespace'] );
+
                if ( $this->filterGroups !== null ) {
                        foreach ( $this->filterGroups as $filterGroup ) {
                                foreach ( $filterGroup->getFilters() as $filter ) {
index 0c56fdd..ada02ce 100644 (file)
@@ -266,6 +266,7 @@ class EnhancedChangesList extends ChangesList {
 
                # Sub-entries
                $lines = [];
+               $filterClasses = [];
                foreach ( $block as $i => $rcObj ) {
                        $line = $this->getLineData( $block, $rcObj, $queryParams );
                        if ( !$line ) {
@@ -293,12 +294,19 @@ class EnhancedChangesList extends ChangesList {
                                }
                        }
 
+                       // Roll up filter-based CSS classes
+                       $filterClasses = array_merge( $filterClasses, $this->getHTMLClassesForFilters( $rcObj ) );
+                       // Add classes for change tags separately, getHTMLClassesForFilters() doesn't add them
+                       $this->getTags( $rcObj, $filterClasses );
+                       $filterClasses = array_unique( $filterClasses );
+
                        $lines[] = $line;
                }
 
                // Further down are some assumptions that $block is a 0-indexed array
                // with (count-1) as last key. Let's make sure it is.
                $block = array_values( $block );
+               $filterClasses = array_values( $filterClasses );
 
                if ( empty( $block ) || !$lines ) {
                        // if we can't show anything, don't display this block altogether
@@ -339,6 +347,7 @@ class EnhancedChangesList extends ChangesList {
                        'articleLink' => $articleLink,
                        'charDifference' => $charDifference,
                        'collectedRcFlags' => $this->recentChangesFlags( $collectedRcFlags ),
+                       'filterClasses' => $filterClasses,
                        'languageDirMark' => $this->getLanguage()->getDirMark(),
                        'lines' => $lines,
                        'logText' => $logText,
index 546b78a..370ebb4 100644 (file)
@@ -2068,9 +2068,8 @@ abstract class File implements IDBAccessObject {
                        $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                        $key = $this->repo->getLocalCacheKey(
                                'RemoteFileDescription',
-                               'url',
                                $lang->getCode(),
-                               $this->getName()
+                               md5( $this->getName() )
                        );
 
                        return $cache->getWithSetCallback(
index 05df45b..7a982bd 100644 (file)
@@ -155,10 +155,9 @@ class ForeignDBFile extends LocalFile {
 
                return $cache->getWithSetCallback(
                        $this->repo->getLocalCacheKey(
-                               'RemoteFileDescription',
-                               'url',
+                               'ForeignFileDescription',
                                $lang->getCode(),
-                               $this->getName(),
+                               md5( $this->getName() ),
                                $touched
                        ),
                        $this->repo->descriptionCacheExpiry ?: $cache::TTL_UNCACHEABLE,
index ad74add..a2448c4 100644 (file)
@@ -8,7 +8,8 @@
                        "Aftabuzzaman",
                        "Hasive",
                        "আজিজ",
-                       "Elias Ahmmad"
+                       "Elias Ahmmad",
+                       "আফতাবুজ্জামান"
                ]
        },
        "config-desc": "মিডিয়াউইকির জন্য ইন্সটলার",
index d38a175..0adbd0c 100644 (file)
@@ -44,14 +44,18 @@ class ResourceLoaderImage {
         * @param string|array $descriptor Path to image file, or array structure containing paths
         * @param string $basePath Directory to which paths in descriptor refer
         * @param array $variants
+        * @param string|null $defaultColor of the base variant
         * @throws InvalidArgumentException
         */
-       public function __construct( $name, $module, $descriptor, $basePath, $variants ) {
+       public function __construct( $name, $module, $descriptor, $basePath, $variants,
+               $defaultColor = null
+       ) {
                $this->name = $name;
                $this->module = $module;
                $this->descriptor = $descriptor;
                $this->basePath = $basePath;
                $this->variants = $variants;
+               $this->defaultColor = $defaultColor;
 
                // Expand shorthands:
                // [ "en,de,fr" => "foo.svg" ]
@@ -250,7 +254,10 @@ class ResourceLoaderImage {
                if ( $variant && isset( $this->variants[$variant] ) ) {
                        $data = $this->variantize( $this->variants[$variant], $context );
                } else {
-                       $data = file_get_contents( $path );
+                       $defaultColor = $this->defaultColor;
+                       $data = $defaultColor ?
+                               $this->variantize( [ 'color' => $defaultColor ], $context ) :
+                               file_get_contents( $path );
                }
 
                if ( $format === 'rasterized' ) {
index 26d5e98..c779240 100644 (file)
@@ -39,6 +39,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
        protected $origin = self::ORIGIN_CORE_SITEWIDE;
 
        protected $images = [];
+       protected $defaultColor = null;
        protected $variants = [];
        protected $prefix = null;
        protected $selectorWithoutVariant = '.{prefix}-{name}';
@@ -182,6 +183,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                                        $this->{$member} = $option;
                                        break;
 
+                               case 'defaultColor':
                                case 'prefix':
                                case 'selectorWithoutVariant':
                                case 'selectorWithVariant':
@@ -264,7 +266,8 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                                        $this->getName(),
                                        $fileDescriptor,
                                        $this->localBasePath,
-                                       $variantConfig
+                                       $variantConfig,
+                                       $this->defaultColor
                                );
                                $this->imageObjects[$skin][$image->getName()] = $image;
                        }
index ab5d4d7..5a6bbc4 100644 (file)
@@ -526,7 +526,7 @@ class SpecialImport extends SpecialPage {
                                        Xml::checkLabel(
                                                $this->msg( 'import-assign-known-users' )->text(),
                                                'assignKnownUsers',
-                                               'assignKnownUsers',
+                                               'interwikiAssignKnownUsers',
                                                $this->assignKnownUsers
                                        ) .
                                        "</td>
index 24f0613..e41a98b 100644 (file)
@@ -1,5 +1,5 @@
 <table class="{{# tableClasses }}{{ . }} {{/ tableClasses }}" data-mw-ts="{{{ fullTimestamp }}}">
-       <tr class="mw-rcfilters-ui-highlights-enhanced-toplevel">
+       <tr class="mw-rcfilters-ui-highlights-enhanced-toplevel {{# filterClasses }}{{ . }} {{/ filterClasses }}">
                <td>
                        <div class="mw-rcfilters-ui-highlights">
                                <div class="mw-rcfilters-ui-highlights-color-none" data-color="none"></div>
index 65c0f7b..15e292d 100644 (file)
        "emptyfile": "Загружаны файл, здаецца, пусты. Магчыма гэта адбылося з-за памылкі ў назьве файлу. Калі ласка, удакладніце, ці вы сапраўды жадаеце загрузіць гэты файл.",
        "windows-nonascii-filename": "Гэтая вікі не падтрымлівае назвы файлаў з спэцыяльнымі сымбалямі.",
        "fileexists": "Файл з такой назвай ужо існуе. Калі ласка, праверце <strong>[[:$1]]</strong>, калі {{GENDER:|вы}} ня ўпэўненыя, што жадаеце яго замяніць.\n[[$1|thumb]]",
-       "filepageexists": "Старонка апісаньня для гэтага файла ўжо існуе як <strong>[[:$1]]</strong>, але файла з такой назвай няма.\nАпісаньне якое Вы дадалі ня зьявіцца на старонцы апісаньня.\nКаб яно там зьявілася, Вам трэба рэдагаваць яе самастойна.\n[[$1|thumb]]",
+       "filepageexists": "Старонка апісаньня для гэтага файлу ўжо існуе як <strong>[[:$1]]</strong>, але файлу з такой назвай няма.\nАпісаньне якое вы дадалі ня зьявіцца на старонцы апісаньня.\nКаб яно там зьявілася, вам трэба рэдагаваць яе самастойна.\n[[$1|thumb]]",
        "fileexists-extension": "Файл з падобнай назвай ужо існуе: [[$2|thumb]]\n* Назва загружанага файла: <strong>[[:$1]]</strong>\n* Назва існуючага файла: <strong>[[:$2]]</strong>\nМагчыма, вы жадаеце выкарыстаць адрозную назву?",
        "fileexists-thumbnail-yes": "Верагодна файл зьяўляецца паменшанай копіяй ''(мініятурай)''. [[$1|thumb]]\nКалі ласка, праверце файл <strong>[[:$1]]</strong>.\nКалі правераны файл зьяўляецца той жа выявай, то загрузка мініятуры ня мае сэнсу.",
        "file-thumbnail-no": "Назва файла пачынаецца з <strong>$1</strong>.\nВерагодна гэта паменшаная копія выявы ''(мініятура)''.\nКалі Вы маеце гэтую выяву ў поўным памеры, загрузіце яе, альбо зьмяніце назву файла.",
index 1a1084c..4cbc07b 100644 (file)
@@ -37,7 +37,8 @@
                        "Mohammed Galib Hasan",
                        "এম আবু সাঈদ",
                        "Shahadat1971",
-                       "Rasal Lia"
+                       "Rasal Lia",
+                       "আফতাবুজ্জামান"
                ]
        },
        "tog-underline": "সংযোগের নিচে দাগ দেখানো হোক:",
index 5556e7e..a5250de 100644 (file)
        "prefs-misc": "Razno",
        "prefs-resetpass": "Promijeni lozinku",
        "prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
-       "prefs-setemail": "Postavite e-mail adresu",
+       "prefs-setemail": "Postavi adresu e-pošte",
        "prefs-email": "Opcije e-pošte",
        "prefs-rendering": "Izgled",
        "saveprefs": "Sačuvaj",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Kad Vas spominje, softver će pokušati izbjegavati rod kad god je to moguće",
+       "gender-unknown": "Kad Vas spominje, softver će koristiti rodno neutralne riječi kad god je to moguće",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
        "prefs-help-gender": "Ova postavka nije obavezna.\nSoftver koristi datu vrijednost da bi Vam se obratio i spomenuo Vas drugima koristeći odgovarajući gramatički rod.\nPodatak će biti javan.",
        "tooltip-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "tooltip-search-go": "Idi na stranicu s tačno ovim imenom ako postoji",
        "tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
-       "tooltip-p-logo": "Posjetite početnu stranicu",
-       "tooltip-n-mainpage": "Posjetite početnu stranicu",
-       "tooltip-n-mainpage-description": "Posjetite početnu stranicu",
+       "tooltip-p-logo": "Posjeti početnu stranicu",
+       "tooltip-n-mainpage": "Posjeti početnu stranicu",
+       "tooltip-n-mainpage-description": "Posjeti početnu stranicu",
        "tooltip-n-portal": "O projektu, šta možete da uradite, gdje se šta nalazi",
        "tooltip-n-currentevents": "Podaci o onome na čemu se trenutno radi",
        "tooltip-n-recentchanges": "Spisak nedavnih izmjena na wiki.",
index 8fc95fb..7637779 100644 (file)
@@ -92,7 +92,8 @@
                        "Osnard",
                        "Suriyaa Kudo",
                        "KPFC",
-                       "ToBeFree"
+                       "ToBeFree",
+                       "PerfektesChaos"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "whatlinkshere-title": "Seiten, die auf „$1“ verlinken",
        "whatlinkshere-page": "Seite:",
        "linkshere": "Die folgenden Seiten verlinken auf <strong>$2</strong>:",
-       "nolinkshere": "Keine Seiten verlinken auf <strong>$2</strong>.",
-       "nolinkshere-ns": "Keine Seiten verlinken auf <strong>$2</strong> in dem ausgewählten Namensraum.",
+       "nolinkshere": "Keine Seite verlinkt auf <strong>$2</strong>.",
+       "nolinkshere-ns": "Keine Seite in dem ausgewählten Namensraum verlinkt auf <strong>$2</strong>.",
        "isredirect": "Weiterleitungsseite",
        "istemplate": "Vorlageneinbindung",
        "isimage": "Dateilink",
index f261f35..74a7ce4 100644 (file)
        "converter-manual-rule-error": "Se ha detectado un error en una regla manual de conversión de idioma",
        "undo-success": "Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así efectuar la reversión.",
        "undo-failure": "No se ha podido deshacer la edición ya que otro usuario ha realizado una edición intermedia.",
-       "undo-main-slot-only": "Aldaketa ezin da desegin, slot nagusitik kanpoko edukia daukalako.",
+       "undo-main-slot-only": "No se ha podido desacer el cámbio porque contiene contenido fuera del slot principal.",
        "undo-norev": "No se ha podido deshacer la edición porque no existe o ha sido borrada.",
        "undo-nochange": "Parece que ya se había deshecho la edición.",
        "undo-summary": "Se ha deshecho la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]])",
index d51ca07..c93d35d 100644 (file)
@@ -70,7 +70,7 @@
        "tog-watchlisthideminor": "Segimendu zerrendan, aldaketa txikiak ezkutatu",
        "tog-watchlisthideliu": "Ezkutatu izena emana duten lankideen aldaketak, jarraitze-zerrendan",
        "tog-watchlistreloadautomatically": "Berkargatu automatikoki jarraipen zerrenda iragazkiren bat aldatzerakoan (JavaScript beharrezkoa)",
-       "tog-watchlistunwatchlinks": "Gehitu zuzeneko ezikusi/ikusi loturak ikus-zerrendako sarreretan (JavaScript beharrezkoa funtzionaltasuna aldatzeko)",
+       "tog-watchlistunwatchlinks": "Gehitu zuzeneko ezikusi/ikusi markatzaileak ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) aldatuak izan diren ikusitako orrietan (JavaScript beharrezkoa funtzionaltasuna erabiltzeko)",
        "tog-watchlisthideanons": "Ezkutatu lankide anonimoen aldaketak, jarraitze-zerrendan",
        "tog-watchlisthidepatrolled": "Ezkutatu patruilatutako aldaketak jarraitze-zerrendan",
        "tog-watchlisthidecategorization": "Orrialdeen kategorizazioa ezkutatu",
        "converter-manual-rule-error": "Akatsa aurkitu da hizkuntzen eskuszko konbertsio arauan",
        "undo-success": "Aldaketa desegin daiteke.\nMesedez beheko alderaketa egiaztatu, egin nahi duzuna hori dela frogatzeko, eta ondoren azpiko aldaketak gorde, aldaketa desegiten amaitzeko.",
        "undo-failure": "Ezin izan da aldaketa desegin tarteko aldaketekin gatazkak direla-eta.",
+       "undo-main-slot-only": "Aldaketa ezin da desegin, slot nagusitik kanpoko edukia daukalako.",
        "undo-norev": "Aldaketa ezin da desegin ez delako existitzen edo ezabatu zutelako.",
        "undo-nochange": "Aldaketa hau honezkero desegin da.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|eztabaida]]) wikilariaren $1 berrikuspena desegin da",
index 24064d6..f36aa8c 100644 (file)
        "blankpage": "Tyhjä sivu",
        "intentionallyblankpage": "Tämä sivu on tarkoituksellisesti tyhjä.",
        "external_image_whitelist": " #Älä muuta tätä riviä lainkaan.<pre>\n#Laita säännöllisten lausekkeiden palaset (vain osa, joka menee //-merkkien väliin) alle\n#Niitä verrataan ulkoisten (suoralinkitettyjen) kuvien URLeihin\n#Ne jotka sopivat, näytetään kuvina, muutoin kuviin näytetään vain linkit\n#Rivit, jotka alkavat #-merkillä ovat kommentteja\n#Tämä on riippumaton kirjainkoosta\n\n#Laita kaikki säännöllisten lausekkeiden palaset tämän rivit yläpuolelle. Älä muuta tätä riviä lainkaan</pre>",
-       "tags": "Voimassa olevat muutosmerkinnät",
+       "tags": "Voimassa olevat muutosten merkkaukset",
        "tag-filter": "[[Special:Tags|Merkkausten]] suodatin:",
        "tag-filter-submit": "Suodata",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merkkaus|Merkkaukset}}]]: $2)",
index cb5ecd6..28978ae 100644 (file)
@@ -24,9 +24,9 @@
        "tog-minordefault": "Marké tout mo modifikasyon kou minò pa défo",
        "tog-previewontop": "Afiché prévizwalizasyon-an laro di zonn di modifikasyon",
        "tog-previewonfirst": "Afiché prévizwalizasyon-an lò di pronmyé modifikasyon",
-       "tog-enotifwatchlistpages": "Avèrti mo pa kouryé lò roun paj ou roun fiché di mo lis di swivi sa modifyé",
+       "tog-enotifwatchlistpages": "Avèrti mo pa kouryé lòské roun paj oben roun fiché di mo lis di swivi sa modifyé",
        "tog-enotifusertalkpages": "Avèrti mo pa kouryé lò mo paj di diskisyon sa modifyé",
-       "tog-enotifminoredits": "Avèrti mo pa kouryé égalman lò dé modifikasyon minò dé paj ou dé fiché",
+       "tog-enotifminoredits": "Avèrti mo pa kouryé égalman lò dé modifikasyon minò dé paj oben dé fiché",
        "tog-enotifrevealaddr": "Afiché mo adrès élèktronik andan kouryé di notifikasyon",
        "tog-shownumberswatching": "Afiché nonm-an di itilizatò an kour",
        "tog-oldsig": "Zòt signatir atchwèl :",
        "confirmable-confirm": "Ès zòt sir{{GENDER:$1||}} ?",
        "confirmable-yes": "Wi",
        "confirmable-no": "Awa",
-       "thisisdeleted": "Ès zòt ka déziré afiché ou rèstoré $1 ?",
+       "thisisdeleted": "Ès zòt ka déziré afiché oben rèstoré $1 ?",
        "viewdeleted": "Wè $1 ?",
        "restorelink": "Wè {{PLURAL:$1|roun modifikasyon éfasé|$1 modifikasyon éfasé}}",
        "feedlinks": "Flux :",
        "noarticletext": "I pa gen atchwèlman pyès tèks asou sa paj.\nZòt pouvé [[Special:Search/{{PAGENAME}}|lansé oun sasé asou sa tit]] annan ròt paj-ya,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sasé annan opérasyon ki lyannen]\noben [{{fullurl:{{FULLPAGENAME}}|action=edit}} kréyé sa paj]</span>.",
        "noarticletext-nopermission": "I pa gen atchwèlman pyès tèks asou sa paj.\nZòt pouvé [[Special:Search/{{PAGENAME}}|fè roun sasé asou sa tit]] andan ròt paj-ya,\noben <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|paj={{FULLPAGENAMEE}}}} sasé annan journal asosyé]</span>, mè zòt pa gen pèrmisyon di kréyé sa paj.",
        "userpage-userdoesnotexist-view": "Kont itilizatò-a « $1 » pa anréjistré.",
-       "clearyourcache": "<strong>Nòt :</strong> aprè zòt anréjistré zòt modifikasyon, zòt divèt forsé roucharjman konplè di kach di zòt navigatò pou wè chanjman-yan.\n* <strong>Firefox / Safari :</strong> mentné touch-a <em>Maj</em> (<em>Shift</em>) an klikan asou bouton-an <em>Atchwalizé</em> ou présé <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> asou roun Mac) \n* <strong>Google Chrome :</strong> apwiyé asou <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> asou roun Mac) \n* <strong>Internet Explorer :</strong> mentné touch-a <em>Ctrl</em> an klikan asou bouton-an <em>Atchwalizé</em> ou présé <em>Ctrl-F5</em> \n* <strong>Opera :</strong> alé annan <em>Menu → Settings</em> (<em>Opera → Préférences</em> asou roun Mac) é answit à <em>Konfidansyalité & sékrité → Éfasé doné d'èksplorasyon-yan → Imaj ké fiché an kach</em>.",
+       "clearyourcache": "<strong>Nòt :</strong> aprè zòt anréjistré zòt modifikasyon, zòt divèt fòrsé roucharjman konplè di kach di zòt navigatò pou wè chanjman-yan.\n* <strong>Firefox / Safari :</strong> mentné touch-a <em>Maj</em> (<em>Shift</em>) an klikan asou bouton-an <em>Atchwalizé</em> oben présé <em>Ctrl-F5</em> oben <em>Ctrl-R</em> (<em>⌘-R</em> asou roun Mac) \n* <strong>Google Chrome :</strong> apiyé asou <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> asou roun Mac) \n* <strong>Internet Explorer :</strong> mentni touch-a <em>Ctrl</em> an klikan asou bouton-an <em>Atchwalizé</em> oben présé <em>Ctrl-F5</em> \n* <strong>Opera :</strong> alé annan <em>Menu → Settings</em> (<em>Opera → Préférences</em> asou roun Mac) é answit à <em>Konfidansyalité & sékrité → Éfasé doné d'èsplorasyon-yan → Imaj ké fiché an kach</em>.",
        "previewnote": "<strong>Raplé-zòt ki a jis roun prévizwalizasyon.</strong>\nZòt modifikasyon pa òkò anréjistré !",
        "continue-editing": "Alé kot zonn di modifikasyon",
        "editing": "Modifikasyon di $1",
        "invert": "Envèrsé sélèksyon-an",
        "tooltip-invert": "Koché sa kaz pou kaché modifikasyon-yan dé paj annan lèspas di non sélèksyoné (ké lèspas di non asosyé si koché)",
        "namespace_association": "Lèspas di non asosyé",
-       "tooltip-namespace_association": "Koché sa kaz pou enklir égalman lèspas di non di diskisyon ou di sijè, asosyé à lèspas di non sélèksyoné",
+       "tooltip-namespace_association": "Koché sa kaz pou enkli égalman lèspas di non di diskisyon oben di sijè, ki asosyé à lèspas di non ki sélèksyoné",
        "blanknamespace": "(Prensipal)",
        "contributions": "Kontribisyon di {{GENDER:$1|itilizatò|itilizatris}}",
        "contributions-title": "Lis di kontribisyon-yan di itiliza{{GENDER:$1|ò|ris}}-a $1",
        "tooltip-diff": "Afiché modifikasyon-yan ki zòt apòrté andan tèks-a.",
        "tooltip-compareselectedversions": "Afiché diférans-ya ant dé vèrsyon-yan sélèksyoné di sa paj",
        "tooltip-watch": "Ajouté sa paj annan zòt lis di swivi",
-       "tooltip-rollback": "« Révoké » ka anilé an roun klik modifikasyon(-an ou yan) di sa paj réyalizé pa so dannyé kontribitò",
+       "tooltip-rollback": "« Révoké » ka anilé an roun klik modifikasyon(-an oben yan) di sa paj ki réyalizé pa so dannyé kontribitò",
        "tooltip-undo": "« Anilé » ka rétabli modifikasyon présédant é ka ouvri lafinèt di modifikasyon an mòd prévizwalizasyon. I posib di ajouté roun rézon annan rézimé-a.",
        "tooltip-summary": "Antré roun brèf rézimé",
        "simpleantispam-label": "Vérifikasyon anti-pouryèl.\nPa <strong>enskri</strong> anyen isi !",
        "watchlisttools-edit": "Wè é modifyé lis di swivi",
        "watchlisttools-raw": "Modifyé lis di swivi an mòd brout",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskisyon]])",
-       "redirect": "Roudirijé pa ID di fiché, itilizatò, paj, révizyon ou journal",
+       "redirect": "Roudirijé pa ID di fiché, itilizatò, paj, révizyon oben journal",
        "redirect-summary": "Sa paj èspésyal ka roudirijé bò'd roun fiché (non di fiché fourni), oun paj (ID di révizyon oben di paj fourni), oun paj di itilizatò (idantifyan nimérik di itilizatò fourni), oben roun antré di journal (ID di journal fourni). Itilizasyon : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], oben [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Validé",
        "redirect-lookup": "Sasé :",
index 4d11489..8e925ca 100644 (file)
        "monthsall": "הכול",
        "confirmemail": "אימות כתובת דוא\"ל",
        "confirmemail_noemail": "אין לך כתובת דוא\"ל תקפה המוגדרת ב[[Special:Preferences|העדפות המשתמש]] שלך.",
-       "confirmemail_text": "×\99ש ×\9c×\90×\9eת ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×\9b×\93×\99 ×©× ×\99ת×\9f ×\99×\94×\99×\94 להשתמש בשירותי הדוא\"ל של {{SITENAME}}.\nכדי לשלוח קוד אימות לכתובת הדוא\"ל שהזנת, יש ללחוץ על הכפתור שלמטה.\nהודעת הדוא\"ל שתישלח תכלול קישור שמכיל קוד;\nיש לפתוח את הקישור בדפדפן כדי לאשר שכתובת הדוא\"ל תקפה.",
+       "confirmemail_text": "×\97×\95×\91×\94 ×\9c×\90×\9eת ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×\9b×\93×\99 להשתמש בשירותי הדוא\"ל של {{SITENAME}}.\nכדי לשלוח קוד אימות לכתובת הדוא\"ל שהזנת, יש ללחוץ על הכפתור שלמטה.\nהודעת הדוא\"ל שתישלח תכלול קישור שמכיל קוד;\nיש לפתוח את הקישור בדפדפן כדי לאשר שכתובת הדוא\"ל תקפה.",
        "confirmemail_pending": "קוד האימות כבר נשלח לדואר האלקטרוני שלך;\nאם יצרת את החשבון לאחרונה, כדאי להמתין מספר דקות עד שהדוא\"ל יגיע לפני בקשת קוד חדש.",
        "confirmemail_send": "שליחת קוד אימות",
        "confirmemail_sent": "הדוא\"ל עם קוד האימות נשלח.",
        "size-exapixel": "{{PLURAL:$1|אקסה־פיקסל אחד|$1 אקסה־פיקסלים}}",
        "size-zetapixel": "{{PLURAL:$1|זטה־פיקסל אחד|$1 זטה־פיקסלים}}",
        "size-yottapixel": "{{PLURAL:$1|יוטה־פיקסל אחד|$1 יוטה־פיקסלים}}",
+       "bitrate-bits": "{{PLURAL:$1|ביט אחד|$1 ביטים}} בשנייה",
+       "bitrate-kilobits": "{{PLURAL:$1|קילו־ביט אחד|$1 קילו־ביטים}} בשנייה",
+       "bitrate-megabits": "{{PLURAL:$1|מגה־ביט אחד|$1 מגה־ביטים}} בשנייה",
+       "bitrate-gigabits": "{{PLURAL:$1|ג'יגה־ביט אחד|$1 ג'יגה־ביטים}} בשנייה",
+       "bitrate-terabits": "{{PLURAL:$1|טרה־ביט אחד|$1 טרה־ביטים}} בשנייה",
+       "bitrate-petabits": "{{PLURAL:$1|פטה־ביט אחד|$1 פטה־ביטים}} בשנייה",
+       "bitrate-exabits": "{{PLURAL:$1|אקסה־ביט אחד|$1 אקסה־ביטים}} בשנייה",
+       "bitrate-zetabits": "{{PLURAL:$1|זטה־ביט אחד|$1 זטה־ביטים}} בשנייה",
+       "bitrate-yottabits": "{{PLURAL:$1|יוטה־ביט אחד|$1 יוטה־ביטים}} בשנייה",
        "lag-warn-normal": "שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
        "lag-warn-high": "בגלל עיכוב בעדכון בסיס הנתונים, שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
        "watchlistedit-normal-title": "עריכת רשימת המעקב",
        "watchlistedit-normal-done": "{{PLURAL:$1|כותרת אחת הוסרה|$1 כותרות הוסרו}} מרשימת המעקב:",
        "watchlistedit-raw-title": "עריכת הרשימה הגולמית",
        "watchlistedit-raw-legend": "עריכת הרשימה הגולמית",
-       "watchlistedit-raw-explain": "×\94×\93פ×\99×\9d ×\91רש×\99×\9eת ×\94×\9eעק×\91 ×\9e×\95צ×\92×\99×\9d ×\9c×\94×\9c×\9f, ×\95× ×\99ת×\9f ×\9cער×\95×\9a ×\90×\95ת×\9d ×\91×\90×\9eצע×\95ת ×\94×\95ספ×\94 ×\95×\94סר×\94 ×©×\9c×\94×\9d ×\9e×\94רש×\99×\9e×\94;\n×\9b×\9c ×\9b×\95תרת ×\9e×\95פ×\99×¢×\94 ×\91ש×\95ר×\94 × ×¤×¨×\93ת.\n×\9c×\90×\97ר ×¡×\99×\95×\9d ×\94ער×\99×\9b×\94, ×\99ש ×\9c×\9c×\97×\95×¥ ×¢×\9c \"{{int:Watchlistedit-raw-submit}}\".\n×\91×\90פשר×\95ת×\9b×\9d גם [[Special:EditWatchlist|להשתמש בעורך הרגיל]].",
+       "watchlistedit-raw-explain": "×\94×\93פ×\99×\9d ×\91רש×\99×\9eת ×\94×\9eעק×\91 ×\9e×\95צ×\92×\99×\9d ×\9c×\94×\9c×\9f, ×\95× ×\99ת×\9f ×\9cער×\95×\9a ×\90×\95ת×\9d ×\91×\90×\9eצע×\95ת ×\94×\95ספ×\94 ×©×\9c×\94×\9d ×\9cרש×\99×\9e×\94 ×\95×\94סרת×\9d ×\9e×\9e× ×\94;\n×\9b×\9c ×\9b×\95תרת ×\9e×\95פ×\99×¢×\94 ×\91ש×\95ר×\94 × ×¤×¨×\93ת.\n×\9c×\90×\97ר ×¡×\99×\95×\9d ×\94ער×\99×\9b×\94, ×\99ש ×\9c×\9c×\97×\95×¥ ×¢×\9c \"{{int:Watchlistedit-raw-submit}}\".\n×\91×\90פשר×\95ת×\9a גם [[Special:EditWatchlist|להשתמש בעורך הרגיל]].",
        "watchlistedit-raw-titles": "דפים:",
        "watchlistedit-raw-submit": "עדכון רשימת המעקב",
        "watchlistedit-raw-done": "רשימת המעקב עודכנה.",
index 99c4a8b..370d9a4 100644 (file)
        "privacypage": "Project:КъайлагIара хIамай политика",
        "badaccess": "ТIакхоачилга гӀалат",
        "badaccess-group0": "Оаш дIадийха хинна ардам кхоачашде йиш яц шун.",
-       "badaccess-groups": "ДIадийха ардам кхоачашде могаш ба алхха доакъашхой {{PLURAL:$2|1=тоабан «$1»|укх тоабаш чура: $1}}",
+       "badaccess-groups": "ДӀадийхар кхоачашде йиш йолаш ба алхха {{PLURAL:$2|1=«$1»|$1}}.",
        "versionrequired": "Эшаш я $1 версех йола MediaWiki",
        "versionrequiredtext": "Укх оагIонца болх бергболаш $1 версех йола MediaWiki эша. Хьажа [[Special:Version|програмни Iалашдарах бола хоамага]].",
        "ok": "Мег",
        "template-protected": "(лорадаь да)",
        "template-semiprotected": "(цхьа долча даькъе гIо оттадаь да)",
        "hiddencategories": "Ер оагIув {{PLURAL:$1|$1 къайла категориех|1=цаI къайла категорех}} я:",
-       "permissionserrors": "ТÓ\80акÑ\85оаÑ\87илга Ð±Ð¾ÐºÑ\8aоний гӀалат",
-       "permissionserrorstext-withaction": "Ер $2 де Хьа бокъо яц {{PLURAL:$1|1=из бахьан долаш|из бахьанаш долаш}}:",
+       "permissionserrors": "ТÓ\80акÑ\85аÑ\87аÑ\80а Ð±Ð¾ÐºÑ\8aонаÑ\88Ñ\86аÑ\80а гӀалат",
+       "permissionserrorstext-withaction": "$2 шун бокъо яц {{PLURAL:$1|1=укх бахьан}}:",
        "recreate-moveddeleted-warn": "'''Теркам бе. Хьо юхакхолла гӀерта хьалха дIаяьккха хинна оагӀув.'''\n\nДIатахка, боккъонца эший хьона из оагIув юхакхолла.\nКӀалхагIа хьекха да укх оагӀон дӀадаккхари цӀи хувцари тептараш.",
        "moveddeleted-notice": "Ер оагӀув дӀаяьккха хиннай.\nШоана новкъостала кӀалха хьахьекха да укх оагIонца дувзаденна тептараш.",
        "log-fulllog": "БIаргтоха таптарага бIарчча",
        "unwatchedpages": "Цхьанне а зем беш йоаца оагIонаш",
        "randompage": "Цаховш нийсъенна статья",
        "statistics": "ГӀулакх-хьал",
+       "statistics-header-pages": "ОагӀонашца дола гӀулакх-хьал",
+       "statistics-header-edits": "Тоадара гӀулакх-хьал",
+       "statistics-header-users": "Доакъашхошца дола гӀулакх-хьал",
+       "statistics-header-hooks": "Кхыдолчунца дола гӀулакх-хьал",
        "statistics-articles": "Статьяш",
        "statistics-pages": "ОагIонаш",
+       "statistics-pages-desc": "Вике чу мел йола оагӀонаш, дувцара оагӀонаши юхаластараши кхыйола оагӀонаши юкъелоацаш.",
+       "statistics-files": "ДIачуяьха файлаш",
+       "statistics-edits": "{{grammar:genitive|{{SITENAME}}}} дӀаоттаяьча денз даь хувцамаш",
+       "statistics-edits-average": "Цхьан оагӀона деш долча тоадара юкъера дукхал",
        "statistics-users": "Ражача дӏаийтта доакъашхой",
        "statistics-users-active": "Хьинаре доакъашхой",
+       "statistics-users-active-desc": "Доакъашхой, {{PLURAL:$1|тӀехьарча $1 дийнахь}} цхьа моллагӀа хувцам баь бола.",
        "double-redirect-fixer": "ДӀа-хьа хьожавара оагIонаш тоаер",
        "brokenredirects-edit": "нийсъе",
        "brokenredirects-delete": "дӀаяккха",
        "exif-iimcategory-wea": "Хаоттам",
        "namespacesall": "деррига",
        "monthsall": "деррига",
+       "confirm-purge-title": "Укх оагIон кэш ӀоцIенъе",
        "confirm_purge_button": "Мега",
+       "confirm-purge-top": "Укх оагӀон кэш ӀоцIенъйой?",
+       "confirm-purge-bottom": "Кэш ӀоцӀенъячул тӀехьагIа оагIон тӀехьара эрш хьахьокхаргья.",
        "imgmultipagenext": "тӀехьайоагӀа оагӀув →",
        "imgmultigo": "Дехьавала!",
        "imgmultigoto": "$1 оагIон тIа дехьавала",
index 657a370..5b501c8 100644 (file)
@@ -15,7 +15,8 @@
                        "Soul Train",
                        "Умар",
                        "아라",
-                       "Amire80"
+                       "Amire80",
+                       "Stjn"
                ]
        },
        "tog-underline": "ЭлячӀунрин кӀаникай цӀар чӀугун",
index d9b41c5..120b542 100644 (file)
        "converter-manual-rule-error": "Erro detectado na regra de conversão de língua manual",
        "undo-success": "A edição pôde ser desfeita. Por gentileza, verifique o comparativo a seguir para se certificar de que é isto que deseja fazer, salvando as alterações após ter terminado de revisá-las.",
        "undo-failure": "A edição não pôde ser desfeita devido a alterações intermediárias conflitantes.",
+       "undo-main-slot-only": "A edição não pode ser desfeita porque envolve conteúdo fora do espaço principal.",
        "undo-norev": "A edição não pôde ser desfeita porque não existe ou foi apagada.",
        "undo-nochange": "Parece que a edição já foi desfeita.",
        "undo-summary": "Desfeita a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])",
index 15ee8d6..f4cfc79 100644 (file)
                        "Patrick Star",
                        "Happy13241",
                        "Vcohen",
-                       "AttemptToCallNil"
+                       "AttemptToCallNil",
+                       "Stjn"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
index def5f17..2214def 100644 (file)
        "listfiles_size": "Кээмэйэ",
        "listfiles_description": "Быһаарыыта",
        "listfiles_count": "Барыллар",
-       "listfiles-show-all": "Ð\91илÑ\8d Ñ\8dÑ\80гÑ\8d Ñ\82оÑ\80Ñ\83мнаÑ\80Ñ\8bн Ñ\8dмиÑ\8d ÐºÐ¸Ð»Ð»Ñ\8dр",
+       "listfiles-show-all": "Ð\91илÑ\8d Ñ\85ойÑ\83ккÑ\83 Ñ\82оÑ\80Ñ\83мнаÑ\80Ñ\8bн Ñ\8dмиÑ\8d ÐºÓ©Ñ\80дөр",
        "listfiles-latestversion": "Билиҥҥи барыла",
        "listfiles-latestversion-yes": "Сөп",
        "listfiles-latestversion-no": "Суох",
index 027ef90..656f82f 100644 (file)
@@ -50,7 +50,7 @@
        "tog-usenewrc": "Групиши измене по страници у скорашњим изменама и списку надгледања",
        "tog-numberheadings": "Аутоматски нумериши поднаслове",
        "tog-showtoolbar": "Прикажи траку с алаткама за уређивање",
-       "tog-editondblclick": "Уређивање страница двоструким кликом",
+       "tog-editondblclick": "Уреди странице двоструким кликом",
        "tog-editsectiononrightclick": "Уређивање одељака десним кликом на њихове наслове",
        "tog-watchcreations": "Додај странице које направим и датотеке које отпремим у мој списак надгледања",
        "tog-watchdefault": "Додај странице и датотеке које изменим у мој списак надгледања",
@@ -66,7 +66,7 @@
        "tog-enotifminoredits": "Пошаљи ми имејл и код мањих измена страница и датотека",
        "tog-enotifrevealaddr": "Откриј моју имејл адресу у порукама обавештења",
        "tog-shownumberswatching": "Прикажи број корисника који надгледају",
-       "tog-oldsig": "Ваш тренутни потпис:",
+       "tog-oldsig": "Ваш постојећи потпис:",
        "tog-fancysig": "Сматрај потпис као викитекст (без самоповезивања)",
        "tog-uselivepreview": "Прикажи претпреглед без поновног учитавања странице",
        "tog-forceeditsummary": "Упозори ме када не унесем опис измене",
        "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу IP адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога}} претходни $2, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове IP адресе тренутно не могу отворити више налога.",
        "emailauthenticated": "Ваша имејл адреса је потврђена на дан $2 у $3.",
        "emailnotauthenticated": "Ваша имејл адреса још увек није потврђена.\nИмејл неће бити послат ни у једном од следећих случајева.",
-       "noemailprefs": "УнеÑ\81иÑ\82е Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 ÐºÐ°ÐºÐ¾ Ð±Ð¸ Ð¾Ð²Ðµ Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ñ\80адиле.",
+       "noemailprefs": "Ð\9dаведиÑ\82е Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\83 Ñ\81воÑ\98им Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aима Ð·Ð° Ñ\80ад Ð¾Ð²Ð¸Ñ\85 Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и.",
        "emailconfirmlink": "Потврдите своју имејл адресу",
        "invalidemailaddress": "Имејл адреса не може бити прихваћена јер је неисправног облика.\nУнесите исправну адресу или оставите празно поље.",
        "cannotchangeemail": "На овом викију не можете променити имејл адресу налога.",
        "prefs-watchlist-days": "Број дана у списку надгледања:",
        "prefs-watchlist-days-max": "Највише $1 {{PLURAL:$1|дан|дана|дана}}",
        "prefs-watchlist-edits": "Највећи број измена приказаних на списку надгледања:",
-       "prefs-watchlist-edits-max": "Ð\9dаÑ\98веÑ\9bа Ð²Ñ\80едноÑ\81Ñ\82 Ñ\98е Ñ\85иÑ\99адÑ\83",
+       "prefs-watchlist-edits-max": "Ð\9dаÑ\98веÑ\9bи Ð±Ñ\80оÑ\98: 1000",
        "prefs-watchlist-token": "Жетон списка надгледања:",
        "prefs-watchlist-managetokens": "Управљај жетонима",
        "prefs-misc": "Друга подешавања",
        "prefs-resetpass": "промени лозинку",
        "prefs-changeemail": "промени или уклони имејл адресу",
-       "prefs-setemail": "Ð\9fостави имејл адресу",
+       "prefs-setemail": "постави имејл адресу",
        "prefs-email": "Подешавања имејла",
        "prefs-rendering": "Изглед",
        "saveprefs": "Сачувај",
-       "restoreprefs": "Ð\92Ñ\80аÑ\82и Ñ\81ве Ð½Ð° Ð¿Ð¾Ð´Ñ\80азÑ\83мевано (у свим одељцима)",
+       "restoreprefs": "Ð\92Ñ\80аÑ\82и Ñ\81ва Ð¿Ð¾Ð´Ñ\80азÑ\83мевана Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aа (у свим одељцима)",
        "prefs-editing": "Уређивање",
        "searchresultshead": "Претрага",
        "stub-threshold": "Праг за обликовање везе као клице ($1):",
        "recentchangesdays": "Број дана у скорашњим изменама:",
        "recentchangesdays-max": "Највише $1 {{PLURAL:$1|дан|дана}}",
        "recentchangescount": "Подразумевани број измена за приказ у скорашњим изменама, историјама страница и дневницима:",
-       "prefs-help-recentchangescount": "Ð\9dаÑ\98веÑ\9bа Ð²Ñ\80едноÑ\81Ñ\82: 1000",
-       "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваш списак надгледања, зато кључ немојте одавати никоме. \nАко је потребно, кључ [[Special:ResetTokens|можете ресетовати]].",
+       "prefs-help-recentchangescount": "Ð\9dаÑ\98веÑ\9bа Ð±Ñ\80оÑ\98: 1000",
+       "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да чита Ваш списак надгледања, зато га немојте делити. \nАко је потребно, [[Special:ResetTokens|можете га обновити]].",
        "savedprefs": "Ваша подешавања су сачувана.",
        "savedrights": "Корисничке групе за {{GENDER:$1|$1}} су сачуване.",
        "timezonelegend": "Временска зона:",
        "timezoneregion-europe": "Европа",
        "timezoneregion-indian": "Индијски океан",
        "timezoneregion-pacific": "Тихи океан",
-       "allowemail": "Ð\9eмогÑ\83Ñ\9bи примање имејлова од других корисника",
-       "email-allow-new-users-label": "Ð\9eмогÑ\83Ñ\9bи примање имејлова од новајлија",
-       "email-blacklist-label": "Забрани следећим корисницима да ми шаљу имејлове:",
+       "allowemail": "Ð\94озволи примање имејлова од других корисника",
+       "email-allow-new-users-label": "Ð\94озволи примање имејлова од новајлија",
+       "email-blacklist-label": "Забрани примање имејлова од следећих корисника:",
        "prefs-searchoptions": "Претрага",
        "prefs-namespaces": "Именски простори",
        "default": "подразумевана",
        "prefs-emailconfirm-label": "Потврда имејла:",
        "youremail": "Имејл:",
        "username": "{{GENDER:$1|Корисничко име}}:",
-       "prefs-memberingroups": "{{PLURAL:$1|Група|Групе}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Члан|Чланица}} {{PLURAL:$1|групе|групâ}}:",
        "prefs-memberingroups-type": "$1",
        "group-membership-link-with-expiry": "$1 (до $2)",
        "prefs-registration": "Време регистрације:",
        "yourvariant": "Варијанта језика:",
        "prefs-help-variant": "Жељена варијанта или правопис за приказ страница са садржајем овог викија.",
        "yournick": "Нови потпис:",
-       "prefs-help-signature": "Коментари на страницама за разговор би требали бити потписани с „<nowiki>~~~~</nowiki>“ што ће бити претворено у Ваш потпис и време.",
+       "prefs-help-signature": "Коментари на страницама за разговор требају бити потписани са „<nowiki>~~~~</nowiki>“ које ће бити претворено у Ваш потпис и време.",
        "badsig": "Потпис је неисправан.\nПроверите ознаке HTML.",
        "badsiglength": "Ваш потпис је предугачак.\nНе сме бити дужи од $1 {{PLURAL:$1|знака|знака|знакова}}.",
        "yourgender": "Како желите да се представите?",
-       "gender-unknown": "Ð\9dе Ð¶ÐµÐ»Ð¸Ð¼ Ð´Ð° Ñ\81е Ð¿Ñ\80едÑ\81Ñ\82авим",
+       "gender-unknown": "Ð\9aад Ð\92аÑ\81 Ñ\81помиÑ\9aе, Ñ\81оÑ\84Ñ\82веÑ\80 Ñ\9bе ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ñ\80одно Ð½ÐµÑ\83Ñ\82Ñ\80алне Ñ\80еÑ\87и ÐºÐ°Ð´ Ð³Ð¾Ð´ Ñ\98е Ñ\82о Ð¼Ð¾Ð³Ñ\83Ñ\9bе",
        "gender-male": "Он уређује вики странице",
        "gender-female": "Она уређује вики странице",
-       "prefs-help-gender": "Ð\9dеобавезно: ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ñ\81е Ð·Ð° Ð¸Ñ\81пÑ\80авно Ð¾Ð±Ñ\80аÑ\9bаÑ\9aе Ñ\81оÑ\84Ñ\82веÑ\80а ÐºÐ¾Ñ\80иÑ\81ниÑ\86има, Ð·Ð°Ð²Ð¸Ñ\81но Ð¾Ð´ Ñ\9aиÑ\85овог Ð¿Ð¾Ð»Ð°.\nÐ\9eваÑ\98 Ð¿Ð¾Ð´Ð°Ñ\82ак Ñ\9bе Ð±Ð¸Ñ\82и Ñ\98аван.",
+       "prefs-help-gender": "Ð\9fоÑ\81Ñ\82авÑ\99аÑ\9aе Ð¾Ð²Ð¾Ð³ Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aа Ñ\98е Ð½ÐµÐ¾Ð±Ð°Ð²ÐµÐ·Ð½Ð¾.\nСоÑ\84Ñ\82веÑ\80 ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ð´Ð°Ñ\82Ñ\83 Ð²Ñ\80едноÑ\81Ñ\82 Ð´Ð° Ð±Ð¸ Ð\92ам Ñ\81е Ð¾Ð±Ñ\80аÑ\82ио Ð¸ Ñ\81поменÑ\83о Ð\92аÑ\81 Ð´Ñ\80Ñ\83гима ÐºÐ¾Ñ\80иÑ\81Ñ\82еÑ\9bи Ð¾Ð´Ð³Ð¾Ð²Ð°Ñ\80аÑ\98Ñ\83Ñ\9bи Ð³Ñ\80амаÑ\82иÑ\87ки Ñ\80од.\nÐ\9eва Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98а Ñ\9bе Ð±Ð¸Ñ\82и Ñ\98авна.",
        "email": "Имејл",
        "prefs-help-realname": "Право име није обавезно.\nАко изаберете да га унесете, оно ће бити коришћено за приписивање вашег рада.",
-       "prefs-help-email": "Имејл адреса није обавезна, али је потребна у случају да заборавите лозинку.",
+       "prefs-help-email": "Имејл адреса није обавезна, али је потребна за обнављање лозинке, ако је заборавите.",
        "prefs-help-email-others": "Можете је користити и да омогућите другима да вас контактирају преко корисничке странице или странице за разговор, без откривања свог идентитета.",
        "prefs-help-email-required": "Потребна је имејл адреса.",
-       "prefs-info": "Ð\9eÑ\81новни Ð¿Ð¾Ð´Ð°Ñ\86и",
+       "prefs-info": "Ð\9eÑ\81новне Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98е",
        "prefs-i18n": "Интернационализација",
        "prefs-signature": "Потпис",
        "prefs-dateformat": "Формат датума",
        "prefs-developertools": "Програмерске алатке",
        "prefs-editor": "Уређивач",
        "prefs-preview": "Претпреглед",
-       "prefs-advancedrc": "Ð\9dапÑ\80една Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aа",
+       "prefs-advancedrc": "Ð\9dапÑ\80едне Ð¾Ð¿Ñ\86иÑ\98е",
        "prefs-opt-out": "Онемогућавање побољшања",
-       "prefs-advancedrendering": "Ð\9dапÑ\80една Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aа",
+       "prefs-advancedrendering": "Ð\9dапÑ\80едне Ð¾Ð¿Ñ\86иÑ\98е",
        "prefs-advancedsearchoptions": "Напредне опције",
-       "prefs-advancedwatchlist": "Ð\9dапÑ\80една Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aа",
+       "prefs-advancedwatchlist": "Ð\9dапÑ\80едне Ð¾Ð¿Ñ\86иÑ\98е",
        "prefs-displayrc": "Подешавања приказа",
        "prefs-displaywatchlist": "Подешавања приказа",
        "prefs-tokenwatchlist": "Жетон",
        "tooltip-pt-logout": "Одјавите се",
        "tooltip-pt-createaccount": "Препоручијемо Вам да отворите налог и пријавите се, иако то није обавезно",
        "tooltip-ca-talk": "Разговор о страници са садржајем",
-       "tooltip-ca-edit": "Уреди ову страницу",
-       "tooltip-ca-addsection": "Започни нови одељак",
+       "tooltip-ca-edit": "Уредите ову страницу",
+       "tooltip-ca-addsection": "Започните нови одељак",
        "tooltip-ca-viewsource": "Ова страница је закључана. \nМожете да погледате њен изворни кôд",
        "tooltip-ca-history": "Претходне измене ове странице",
        "tooltip-ca-protect": "Заштитите ову страницу",
        "tooltip-ca-nstab-template": "Погледајте шаблон",
        "tooltip-ca-nstab-help": "Погледајте страницу за помоћ",
        "tooltip-ca-nstab-category": "Погледајте страницу категорија",
-       "tooltip-minoredit": "Означи као мању измену",
+       "tooltip-minoredit": "Означите као мању измену",
        "tooltip-save": "Сачувајте своје измене",
-       "tooltip-publish": "Објави своје измене",
+       "tooltip-publish": "Објавите своје измене",
        "tooltip-preview": "Прегледајте своје измене. Користите ово дугме пре чувања.",
        "tooltip-diff": "Погледајте које измене сте направили на тексту",
        "tooltip-compareselectedversions": "Погледаjте разлике између две изабране измене ове странице.",
-       "tooltip-watch": "Додај ову страницу на свој списак надгледања",
+       "tooltip-watch": "Додајте ову страницу на свој списак надгледања",
        "tooltip-watchlistedit-normal-submit": "Уклони наслове",
        "tooltip-watchlistedit-raw-submit": "Ажурирај списак",
        "tooltip-recreate": "Поново направите страницу иако је обрисана",
        "mw-widgets-dateinput-no-date": "Датум није изабран",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
-       "mw-widgets-mediasearch-input-placeholder": "Ð\9fÑ\80еÑ\82Ñ\80ажи Ð´Ð°Ñ\82оÑ\82еке",
+       "mw-widgets-mediasearch-input-placeholder": "Ð\9fÑ\80еÑ\82Ñ\80ага Ð´Ð°Ñ\82оÑ\82ека",
        "mw-widgets-mediasearch-noresults": "Нема резултата.",
        "mw-widgets-titleinput-description-new-page": "страница још увек не постоји",
        "mw-widgets-titleinput-description-redirect": "преусмерава на $1",
index a6c497a..54296b1 100644 (file)
        "thu": "四",
        "fri": "五",
        "sat": "六",
-       "january": "月",
-       "february": "月",
-       "march": "月",
-       "april": "月",
-       "may_long": "月",
-       "june": "月",
-       "july": "月",
-       "august": "月",
-       "september": "月",
-       "october": "月",
-       "november": "十一月",
-       "december": "十二月",
+       "january": "1月",
+       "february": "2月",
+       "march": "3月",
+       "april": "4月",
+       "may_long": "5月",
+       "june": "6月",
+       "july": "7月",
+       "august": "8月",
+       "september": "9月",
+       "october": "10月",
+       "november": "11月",
+       "december": "12月",
        "january-gen": "一月",
        "february-gen": "二月",
        "march-gen": "三月",
diff --git a/maintenance/populateContentTables.php b/maintenance/populateContentTables.php
new file mode 100644 (file)
index 0000000..eee534f
--- /dev/null
@@ -0,0 +1,330 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\NameTableStore;
+use MediaWiki\Storage\SqlBlobStore;
+use Wikimedia\Assert\Assert;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\ResultWrapper;
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Populate the content and slot tables.
+ * @since 1.32
+ */
+class PopulateContentTables extends Maintenance {
+
+       /** @var IDatabase */
+       private $dbw;
+
+       /** @var NameTableStore */
+       private $contentModelStore;
+
+       /** @var int */
+       private $mainRoleId;
+
+       /** @var array|null Map "{$modelId}:{$address}" to content_id */
+       private $contentRowMap = null;
+
+       private $count = 0, $totalCount = 0;
+
+       public function __construct() {
+               parent::__construct();
+
+               $this->addDescription( 'Populate content and slot tables' );
+               $this->addOption( 'table', 'revision or archive table, or `all` to populate both', false,
+                       true );
+               $this->addOption( 'reuse-content',
+                       'Reuse content table rows when the address and model are the same. '
+                       . 'This will increase the script\'s time and memory usage, perhaps significantly.',
+                       false, false );
+               $this->setBatchSize( 500 );
+       }
+
+       private function initServices() {
+               $this->dbw = $this->getDB( DB_MASTER );
+               $this->contentModelStore = MediaWikiServices::getInstance()->getContentModelStore();
+               $this->mainRoleId = MediaWikiServices::getInstance()->getSlotRoleStore()->acquireId( 'main' );
+       }
+
+       public function execute() {
+               global $wgMultiContentRevisionSchemaMigrationStage;
+
+               $t0 = microtime( true );
+
+               if ( $wgMultiContentRevisionSchemaMigrationStage < MIGRATION_WRITE_BOTH ) {
+                       $this->writeln(
+                               "...cannot update while \$wgMultiContentRevisionSchemaMigrationStage < MIGRATION_WRITE_BOTH"
+                       );
+                       return false;
+               }
+
+               $this->initServices();
+
+               if ( $this->getOption( 'reuse-content', false ) ) {
+                       $this->loadContentMap();
+               }
+
+               foreach ( $this->getTables() as $table ) {
+                       $this->populateTable( $table );
+               }
+
+               $elapsed = microtime( true ) - $t0;
+               $this->writeln( "Done. Processed $this->totalCount rows in $elapsed seconds" );
+       }
+
+       /**
+        * @return string[]
+        */
+       private function getTables() {
+               $table = $this->getOption( 'table', 'all' );
+               $validTableOptions = [ 'all', 'revision', 'archive' ];
+
+               if ( !in_array( $table, $validTableOptions ) ) {
+                       $this->fatalError( 'Invalid table. Must be either `revision` or `archive` or `all`' );
+               }
+
+               if ( $table === 'all' ) {
+                       $tables = [ 'revision', 'archive' ];
+               } else {
+                       $tables = [ $table ];
+               }
+
+               return $tables;
+       }
+
+       private function loadContentMap() {
+               $t0 = microtime( true );
+               $this->writeln( "Loading existing content table rows..." );
+               $this->contentRowMap = [];
+               $dbr = $this->getDB( DB_REPLICA );
+               $from = false;
+               while ( true ) {
+                       $res = $dbr->select(
+                               'content',
+                               [ 'content_id', 'content_address', 'content_model' ],
+                               $from ? "content_id > $from" : '',
+                               __METHOD__,
+                               [ 'ORDER BY' => 'content_id', 'LIMIT' => $this->getBatchSize() ]
+                       );
+                       if ( !$res || !$res->numRows() ) {
+                               break;
+                       }
+                       foreach ( $res as $row ) {
+                               $from = $row->content_id;
+                               $this->contentRowMap["{$row->content_model}:{$row->content_address}"] = $row->content_id;
+                       }
+               }
+               $elapsed = microtime( true ) - $t0;
+               $this->writeln( "Loaded " . count( $this->contentRowMap ) . " rows in $elapsed seconds" );
+       }
+
+       /**
+        * @param string $table
+        */
+       private function populateTable( $table ) {
+               $t0 = microtime( true );
+               $this->count = 0;
+               $this->writeln( "Populating $table..." );
+
+               if ( $table === 'revision' ) {
+                       $idField = 'rev_id';
+                       $tables = [ 'revision', 'slots', 'page' ];
+                       $fields = [
+                               'rev_id',
+                               'len' => 'rev_len',
+                               'sha1' => 'rev_sha1',
+                               'text_id' => 'rev_text_id',
+                               'content_model' => 'rev_content_model',
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                       ];
+                       $joins = [
+                               'slots' => [ 'LEFT JOIN', 'rev_id=slot_revision_id' ],
+                               'page' => [ 'LEFT JOIN', 'rev_page=page_id' ],
+                       ];
+               } else {
+                       $idField = 'ar_rev_id';
+                       $tables = [ 'archive', 'slots' ];
+                       $fields = [
+                               'rev_id' => 'ar_rev_id',
+                               'len' => 'ar_len',
+                               'sha1' => 'ar_sha1',
+                               'text_id' => 'ar_text_id',
+                               'content_model' => 'ar_content_model',
+                               'namespace' => 'ar_namespace',
+                               'title' => 'ar_title',
+                       ];
+                       $joins = [
+                               'slots' => [ 'LEFT JOIN', 'ar_rev_id=slot_revision_id' ],
+                       ];
+               }
+
+               $minmax = $this->dbw->selectRow(
+                       $table,
+                       [ 'min' => "MIN( $idField )", 'max' => "MAX( $idField )" ],
+                       '',
+                       __METHOD__
+               );
+               $batchSize = $this->getBatchSize();
+
+               for ( $startId = $minmax->min; $startId <= $minmax->max; $startId += $batchSize ) {
+                       $endId = min( $startId + $batchSize - 1, $minmax->max );
+                       $rows = $this->dbw->select(
+                               $tables,
+                               $fields,
+                               [
+                                       "$idField >= $startId",
+                                       "$idField <= $endId",
+                                       'slot_revision_id IS NULL',
+                               ],
+                               __METHOD__,
+                               [ 'ORDER BY' => 'rev_id' ],
+                               $joins
+                       );
+                       if ( $rows->numRows() !== 0 ) {
+                               $this->populateContentTablesForRowBatch( $rows, $startId, $table );
+                       }
+
+                       $elapsed = microtime( true ) - $t0;
+                       $this->writeln(
+                               "... $table processed up to revision id $endId of {$minmax->max}"
+                               . " ($this->count rows in $elapsed seconds)"
+                       );
+               }
+
+               $elapsed = microtime( true ) - $t0;
+               $this->writeln( "Done populating $table table. Processed $this->count rows in $elapsed seconds" );
+       }
+
+       /**
+        * @param ResultWrapper $rows
+        * @param int $startId
+        * @param string $table
+        * @return int|null
+        */
+       private function populateContentTablesForRowBatch( ResultWrapper $rows, $startId, $table ) {
+               $this->beginTransaction( $this->dbw, __METHOD__ );
+
+               if ( $this->contentRowMap === null ) {
+                       $map = [];
+               } else {
+                       $map = &$this->contentRowMap;
+               }
+               $contentKeys = [];
+
+               try {
+                       // Step 1: Figure out content rows needing insertion.
+                       $contentRows = [];
+                       foreach ( $rows as $row ) {
+                               $revisionId = $row->rev_id;
+
+                               Assert::invariant( $revisionId !== null, 'rev_id must not be null' );
+
+                               $modelId = $this->contentModelStore->acquireId( $this->getContentModel( $row ) );
+                               $address = SqlBlobStore::makeAddressFromTextId( $row->text_id );
+
+                               $key = "{$modelId}:{$address}";
+                               $contentKeys[$revisionId] = $key;
+
+                               if ( !isset( $map[$key] ) ) {
+                                       $map[$key] = false;
+                                       $contentRows[] = [
+                                               'content_size' => (int)$row->len,
+                                               'content_sha1' => $row->sha1,
+                                               'content_model' => $modelId,
+                                               'content_address' => $address,
+                                       ];
+                               }
+                       }
+
+                       // Step 2: Insert them, then read them back in for use in the next step.
+                       if ( $contentRows ) {
+                               $id = $this->dbw->selectField( 'content', 'MAX(content_id)', '', __METHOD__ );
+                               $this->dbw->insert( 'content', $contentRows, __METHOD__ );
+                               $res = $this->dbw->select(
+                                       'content',
+                                       [ 'content_id', 'content_model', 'content_address' ],
+                                       'content_id > ' . (int)$id,
+                                       __METHOD__
+                               );
+                               foreach ( $res as $row ) {
+                                       $key = $row->content_model . ':' . $row->content_address;
+                                       $map[$key] = $row->content_id;
+                               }
+                       }
+
+                       // Step 3: Insert the slot rows.
+                       $slotRows = [];
+                       foreach ( $rows as $row ) {
+                               $revisionId = $row->rev_id;
+                               $contentId = $map[$contentKeys[$revisionId]] ?? false;
+                               if ( $contentId === false ) {
+                                       throw new \RuntimeException( "Content row for $revisionId not found after content insert" );
+                               }
+                               $slotRows[] = [
+                                       'slot_revision_id' => $revisionId,
+                                       'slot_role_id' => $this->mainRoleId,
+                                       'slot_content_id' => $contentId,
+                                       // There's no way to really know the previous revision, so assume no inheriting.
+                                       // rev_parent_id can get changed on undeletions, and deletions can screw up
+                                       // rev_timestamp ordering.
+                                       'slot_origin' => $revisionId,
+                               ];
+                       }
+                       $this->dbw->insert( 'slots', $slotRows, __METHOD__ );
+                       $this->count += count( $slotRows );
+                       $this->totalCount += count( $slotRows );
+               } catch ( \Exception $e ) {
+                       $this->rollbackTransaction( $this->dbw, __METHOD__ );
+                       $this->fatalError( "Failed to populate content table $table row batch starting at $startId "
+                               . "due to exception: " . $e->__toString() );
+               }
+
+               $this->commitTransaction( $this->dbw, __METHOD__ );
+       }
+
+       /**
+        * @param \stdClass $row
+        * @return string
+        */
+       private function getContentModel( $row ) {
+               if ( isset( $row->content_model ) ) {
+                       return $row->content_model;
+               }
+
+               $title = Title::makeTitle( $row->namespace, $row->title );
+
+               return ContentHandler::getDefaultModelFor( $title );
+       }
+
+       /**
+        * @param string $msg
+        */
+       private function writeln( $msg ) {
+               $this->output( "$msg\n" );
+       }
+}
+
+$maintClass = 'PopulateContentTables';
+require_once RUN_MAINTENANCE_IF_MAIN;
index 3e900f0..52438ca 100644 (file)
@@ -34,7 +34,7 @@
                this.requestCounter = {};
                this.baseFilterState = {};
                this.uriProcessor = null;
-               this.initializing = false;
+               this.initialized = false;
                this.wereSavedQueriesSaved = false;
 
                this.prevLoggedItems = [];
                        }
                }
 
-               // Check whether we need to load defaults.
-               // We do this by checking whether the current URI query
-               // contains any parameters recognized by the system.
-               // If it does, we load the given state.
-               // If it doesn't, we have no values at all, and we assume
-               // the user loads the base-page and we load defaults.
-               // Defaults should only be applied on load (if necessary)
-               // or on request
-               this.initializing = true;
-
                if ( defaultSavedQueryExists ) {
                        // This came from the server, meaning that we have a default
                        // saved query, but the server could not load it, probably because
                        );
                }
 
-               this.initializing = false;
+               this.initialized = true;
                this.switchView( 'default' );
 
                this.pollingRate = mw.config.get( 'StructuredChangeFiltersLiveUpdatePollingRate' );
                }
        };
 
+       /**
+        * Check if the controller has finished initializing.
+        * @return {boolean} Controller is initialized
+        */
+       mw.rcfilters.Controller.prototype.isInitialized = function () {
+               return this.initialized;
+       };
+
        /**
         * Extracts information from the changes list DOM
         *
index ec3fe31..3a83eec 100644 (file)
                this.changesListViewModel = changesListViewModel;
                this.controller = controller;
                this.highlightClasses = null;
-               this.filtersModelInitialized = false;
 
                // Events
                this.filtersViewModel.connect( this, {
                        itemUpdate: 'onItemUpdate',
-                       highlightChange: 'onHighlightChange',
-                       initialize: 'onFiltersModelInitialize'
+                       highlightChange: 'onHighlightChange'
                } );
                this.changesListViewModel.connect( this, {
                        invalidate: 'onModelInvalidate',
 
        OO.inheritClass( mw.rcfilters.ui.ChangesListWrapperWidget, OO.ui.Widget );
 
-       /**
-        * Respond to filters model initialize event
-        */
-       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onFiltersModelInitialize = function () {
-               this.filtersModelInitialized = true;
-               // Set up highlight containers. We need to wait for the filters model
-               // to be initialized, so we can make sure we have all the css class definitions
-               // we get from the server with our filters
-               this.setupHighlightContainers( this.$element );
-       };
-
        /**
         * Get all available highlight classes
         *
@@ -98,7 +85,9 @@
         * Respond to a filter item model update
         */
        mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onItemUpdate = function () {
-               if ( this.filtersModelInitialized && this.filtersViewModel.isHighlightEnabled() ) {
+               if ( this.controller.isInitialized() && this.filtersViewModel.isHighlightEnabled() ) {
+                       // this.controller.isInitialized() is still false during page load,
+                       // we don't want to clear/apply highlights at this stage.
                        this.clearHighlight();
                        this.applyHighlight();
                }
                                }
                        }
 
-                       // Set up highlight containers
-                       this.setupHighlightContainers( this.$element );
-
                        // Apply highlight
                        this.applyHighlight();
 
                        .fadeIn( 1000 );
        };
 
-       /**
-        * Set up the highlight containers with all color circle indicators.
-        *
-        * @param {jQuery|string} $content The content of the updated changes list
-        */
-       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.setupHighlightContainers = function ( $content ) {
-               var $enhancedTopPageCell,
-                       widget = this;
-
-               if ( this.inEnhancedMode() ) {
-                       $enhancedTopPageCell = $content.find( 'table.mw-enhanced-rc.mw-collapsible' );
-                       // Go over pages that have sub results
-                       // HACK: We really only can collect those by targetting the collapsible class
-                       $enhancedTopPageCell.each( function () {
-                               var collectedClasses,
-                                       $table = $( this );
-
-                               // Go over <tr>s and pick up all recognized classes
-                               collectedClasses = widget.getHighlightClasses().filter( function ( className ) {
-                                       return $table.find( 'tr' ).hasClass( className );
-                               } );
-
-                               $table.find( 'tr:first-child' )
-                                       .addClass( collectedClasses.join( ' ' ) );
-                       } );
-               }
-       };
-
        /**
         * In enhanced mode, we need to check whether the grouped results all have the
         * same active highlights in order to see whether the "parent" of the group should