Merge "RC Filters: Fix tags for integrated filters"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 22 Jun 2017 00:48:38 +0000 (00:48 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 22 Jun 2017 00:48:39 +0000 (00:48 +0000)
16 files changed:
includes/changes/EnhancedChangesList.php
includes/libs/rdbms/database/Database.php
includes/resourceloader/ResourceLoader.php
includes/title/MalformedTitleException.php
languages/i18n/ar.json
languages/i18n/be-tarask.json
languages/i18n/bs.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/eu.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hi.json
resources/Resources.php
tests/phpunit/includes/changes/EnhancedChangesListTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php

index 2d50f76..cbbbfeb 100644 (file)
@@ -685,7 +685,9 @@ class EnhancedChangesList extends ChangesList {
                }
                $attribs = $data['attribs'];
                unset( $data['attribs'] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = wfArrayFilterByKey( $attribs, function( $key ) {
+                       return $key === 'class' || Sanitizer::isReservedDataAttribute( $key );
+               } );
 
                $line = Html::openElement( 'table', $attribs ) . Html::openElement( 'tr' );
                $line .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
index 9e91592..afeffb3 100644 (file)
@@ -1802,8 +1802,31 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                # Split database and table into proper variables.
-               # We reverse the explode so that database.table and table both output
-               # the correct table.
+               list( $database, $schema, $prefix, $table ) = $this->qualifiedTableComponents( $name );
+
+               # Quote $table and apply the prefix if not quoted.
+               # $tableName might be empty if this is called from Database::replaceVars()
+               $tableName = "{$prefix}{$table}";
+               if ( $format === 'quoted'
+                       && !$this->isQuotedIdentifier( $tableName )
+                       && $tableName !== ''
+               ) {
+                       $tableName = $this->addIdentifierQuotes( $tableName );
+               }
+
+               # Quote $schema and $database and merge them with the table name if needed
+               $tableName = $this->prependDatabaseOrSchema( $schema, $tableName, $format );
+               $tableName = $this->prependDatabaseOrSchema( $database, $tableName, $format );
+
+               return $tableName;
+       }
+
+       /**
+        * @param string $name Table name
+        * @return array (DB name, schema name, table prefix, table name)
+        */
+       protected function qualifiedTableComponents( $name ) {
+               # We reverse the explode so that database.table and table both output the correct table.
                $dbDetails = explode( '.', $name, 3 );
                if ( count( $dbDetails ) == 3 ) {
                        list( $database, $schema, $table ) = $dbDetails;
@@ -1833,21 +1856,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        }
                }
 
-               # Quote $table and apply the prefix if not quoted.
-               # $tableName might be empty if this is called from Database::replaceVars()
-               $tableName = "{$prefix}{$table}";
-               if ( $format === 'quoted'
-                       && !$this->isQuotedIdentifier( $tableName )
-                       && $tableName !== ''
-               ) {
-                       $tableName = $this->addIdentifierQuotes( $tableName );
-               }
-
-               # Quote $schema and $database and merge them with the table name if needed
-               $tableName = $this->prependDatabaseOrSchema( $schema, $tableName, $format );
-               $tableName = $this->prependDatabaseOrSchema( $database, $tableName, $format );
-
-               return $tableName;
+               return [ $database, $schema, $prefix, $table ];
        }
 
        /**
index c2faf48..c11fe5b 100644 (file)
@@ -563,7 +563,8 @@ class ResourceLoader implements LoggerAwareInterface {
        }
 
        /**
-        * Return whether the definition of a module corresponds to a simple ResourceLoaderFileModule.
+        * Return whether the definition of a module corresponds to a simple ResourceLoaderFileModule
+        * or one of its subclasses.
         *
         * @param string $name Module name
         * @return bool
@@ -573,11 +574,13 @@ class ResourceLoader implements LoggerAwareInterface {
                        return false;
                }
                $info = $this->moduleInfos[$name];
+               if ( isset( $info['object'] ) ) {
+                       return false;
+               }
                if (
-                       isset( $info['object'] ) ||
-                       // This special case is dumb, but we need $wgResourceModuleSkinStyles
-                       // to work for 'oojs-ui-core.styles'. See T167042.
-                       ( isset( $info['class'] ) && $info['class'] !== 'ResourceLoaderOOUIFileModule' )
+                       isset( $info['class'] ) &&
+                       $info['class'] !== 'ResourceLoaderFileModule' &&
+                       !is_subclass_of( $info['class'], 'ResourceLoaderFileModule' )
                ) {
                        return false;
                }
index 2dddac5..213343f 100644 (file)
@@ -34,7 +34,7 @@ class MalformedTitleException extends Exception implements ILocalizedException {
         * $titleText will be appended if it's not null. (since MW 1.26)
         */
        public function __construct(
-               $errorMessage = null, $titleText = null, $errorMessageParameters = []
+               $errorMessage, $titleText = null, $errorMessageParameters = []
        ) {
                $this->errorMessage = $errorMessage;
                $this->titleText = $titleText;
@@ -59,7 +59,7 @@ class MalformedTitleException extends Exception implements ILocalizedException {
 
        /**
         * @since 1.26
-        * @return string|null
+        * @return string
         */
        public function getErrorMessage() {
                return $this->errorMessage;
index 2a8a97b..3e1003c 100644 (file)
        "rcfilters-filter-lastrevision-description": "أخر تعديل للصفحة.",
        "rcfilters-filter-previousrevision-label": "نسخ سابقة",
        "rcfilters-filter-previousrevision-description": "كل تعديلات الصفحة ما عدا التعديل الأخير.",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:ليس</strong> $1",
+       "rcfilters-view-tags": "الوسوم",
        "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
        "rclistfromreset": "إعادة ضبط خيار التاريخ",
        "rclistfrom": "أظهر التغييرات بدء من $3 $2",
        "newimages-user": "عنوان الأيبي أو اسم المستخدم",
        "newimages-showbots": "أظهر التحميلات بواسطة البوتات",
        "newimages-hidepatrolled": "أخف المرفوعات المنظورة",
+       "newimages-mediatype": "نوع الوسيط:",
        "noimages": "لا شيء للعرض.",
        "gallery-slideshow-toggle": "تغيير الصور المصغرة",
        "ilsubmit": "بحث",
        "tags-create-reason": "السبب:",
        "tags-create-submit": "أنشئ",
        "tags-create-no-name": "عليك أن تحدد اسم الوسم.",
-       "tags-create-invalid-chars": "أسماء الوسوم ينبغي ألا تحتوي على فواصل (<code>,</code>) أو forward slashes (<code>/</code>).",
+       "tags-create-invalid-chars": "ينبغي ألا تحتوي أسماء الوسوم على فواصل (<code>,</code>) أو عارضة عمودية (<code>|</code>) أو خط مائل للأمام (<code>/</code>).",
        "tags-create-invalid-title-chars": "يجب أن لا تحتوي أسماء العلامات الأحرف التي لا يمكن استخدامها في عناوين الصفحات.",
        "tags-create-already-exists": "الوسم \"$1\" موجود بالفعل.",
        "tags-create-warnings-above": "{{PLURAL:$2|التحذير التالي حدث|التحذيرات التالية حدثت}} عند محاولة إنشاء الوسم \"$1\":",
index cc729c1..ec2814b 100644 (file)
        "apisandbox-sending-request": "Адпраўка API-запыту…",
        "apisandbox-loading-results": "Атрымліваем API-вынікі…",
        "apisandbox-results-error": "Адбылася памылка пры загрузцы адказу на API-запыт: $1.",
+       "apisandbox-results-login-suppressed": "Гэты запыт быў апрацаваны, як выкананы ўдзельнікам, які не ўвайшоў у сыстэму, бо ён мог быць выкарыстаны, каб абысьці бясьпеку Same-Origin браўзэру. Заўважце, што аўтаматычная апрацоўка токенаў API-пясочніцы не працуе правільна з такімі запытамі, калі ласка, запаўняйце іх уручную.",
        "apisandbox-request-selectformat-label": "Паказаць зьвесткі запыту як:",
        "apisandbox-request-format-url-label": "Радок запыту URL",
        "apisandbox-request-url-label": "URL-адрас запыту:",
index 4ca7816..95272d5 100644 (file)
        "recentchanges": "Nedavne izmjene",
        "recentchanges-legend": "Postavke nedavnih izmjena",
        "recentchanges-summary": "Na ovoj stranici možete pratiti nedavne izmjene.",
-       "recentchanges-noresult": "U zadanom vremenu nema promjena za zadane kriterije.",
+       "recentchanges-noresult": "Nema izmjena u zadanom vremenu za zadane kriterije.",
        "recentchanges-feed-description": "Na ovoj stranici možete pratiti nedavne izmjene.",
        "recentchanges-label-newpage": "Nova stranica",
        "recentchanges-label-minor": "Manja izmjena",
index abab073..79f9dfe 100644 (file)
        "apisandbox-sending-request": "Odesílá se API požadavek…",
        "apisandbox-loading-results": "Přijímají se API výsledky…",
        "apisandbox-results-error": "Došlo k chybě při načítání odpovědi na API dotaz: $1.",
+       "apisandbox-results-login-suppressed": "Tento požadavek byl zpracován jako od nepřihlášeného uživatele, neboť by jinak mohl sloužit k obcházení bezpečnostních funkcionalit prohlížeče zajišťujících shodný původ. Automatická správa tokenů pro takové požadavky nefunguje, vyplňte je prosím ručně.",
        "apisandbox-request-selectformat-label": "Zobrazit data požadavku jako:",
        "apisandbox-request-format-url-label": "řetězec dotazu do URL",
        "apisandbox-request-url-label": "URL požadavku:",
index 824fa9c..7c821c0 100644 (file)
        "apisandbox-sending-request": "Sende API-Anfrage …",
        "apisandbox-loading-results": "Rufe API-Ergebnisse ab …",
        "apisandbox-results-error": "Beim Laden der API-Anfragenantwort ist ein Fehler aufgetreten: $1.",
+       "apisandbox-results-login-suppressed": "Diese Anfrage wurde als ein abgemeldeter Benutzer verarbeitet, da sie zur Umgehung der Gleicher-Ursprung-Sicherheit des Browsers verwendet werden könnte. Beachte, dass die automatische Tokenbearbeitung der API-Spielwiese mit solchen Anfragen nicht ordnungsgemäß funktioniert. Bitte fülle sie manuell aus.",
        "apisandbox-request-selectformat-label": "Anfragedaten anzeigen als:",
        "apisandbox-request-format-url-label": "URL-Abfrage-Zeichenfolge",
        "apisandbox-request-url-label": "Anforderungs-URL:",
index 5c7e32f..0604eb2 100644 (file)
        "createacct-benefit-body2": "{{PLURAL:$1|Orrialde 1|$1 orrialde}}",
        "createacct-benefit-body3": "azkeneko {{PLURAL:$1|egilea|egileak}}",
        "badretype": "Idatzitako pasahitzak ez dira berdinak.",
+       "usernameinprogress": "Erabiltzaile honetarako kontu eraketa martxan dago jadanik. Mesedez, itxaron.",
        "userexists": "Aukeratutako erabiltzaile izena hartuta dago.\nMesedez beste bat aukeratu.",
        "loginerror": "Errorea saioa hastean",
        "createacct-error": "Kontua sortzerakoan arazoa",
        "botpasswords-created-title": "Botaren pasahitza sortu da",
        "botpasswords-updated-title": "Botaren pasahitza eguneratu da",
        "botpasswords-deleted-title": "Botaren pasahitza ezabatu da",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider ez dago eskuragarri.",
+       "botpasswords-restriction-failed": "Errobot pasahitza murrizketek logina saihesten dute.",
        "resetpass_forbidden": "Ezin dira pasahitzak aldatu",
        "resetpass_forbidden-reason": "Ezin dira pasahitzak aldatu: $1",
        "resetpass-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "userrights-unchangeable-col": "Aldatu ezin ditzakezun taldeak",
        "userrights-expiry-none": "Ez da iraungitzen",
        "userrights-expiry": "Iraungintze data:",
+       "userrights-expiry-othertime": "Beste denbora:",
        "userrights-expiry-options": "Egun 1:Egun 1,Aste 1:Aste 1,Hilabete 1:Hilabete 1,3 hilabete:3 hilabete,6 hilabete:6 hilabete,Urte 1:Urte 1",
        "userrights-conflict": "Gatazka gertatu da erabiltzaile eskubideak aldatzean. Mesedez, berrikusi eta baieztatu zure aldaketak.",
        "group": "Taldea:",
        "right-override-export-depth": "5eko sakonerararteko loturiko orrialdeak barne esportatu",
        "right-sendemail": "Beste erabiltzaileei e-posta bidali",
        "grant-group-page-interaction": "Orriekin elkarreragin",
+       "grant-group-file-interaction": "Mediarekin elkarreragin",
+       "grant-group-watchlist-interaction": "Zure ikus-zerrendarekin elkarreragin",
        "grant-group-email": "E-posta bidali",
+       "grant-group-customization": "Pertsonalizazioa eta lehentasunak",
+       "grant-group-administration": "Akzio administratiboak aurrera eraman",
        "grant-group-private-information": "Zure datu pribatuetara sartu",
+       "grant-group-other": "Denetariko ekintza",
+       "grant-blockusers": "Blokeatu eta desblokeatu erabiltzaileak",
        "grant-createaccount": "Kontuak sortu",
        "grant-createeditmovepage": "Orrialdeak sortu, aldatu eta mugitu",
+       "grant-delete": "Ezabatu orriak, berrikuspenak eta sarrerak",
        "grant-editmycssjs": "Zure CSS/JavaScript aldatu",
        "grant-editmyoptions": "Aldatu zure hobespenak",
        "grant-editmywatchlist": "Zure jarraipen zerrenda aldatu",
        "grant-editprotected": "Babestutako orriak aldatu",
        "grant-highvolume": "Bolumen-handiko edizioa",
        "grant-patrol": "Orrietako aldaketa patruilatu",
+       "grant-privateinfo": "Informazio pribatura sartu",
        "grant-protect": "Orriak babestu eta babesgabetu",
        "grant-sendemail": "Bidali mezu elektronikoa beste erabiltzailei",
        "grant-uploadeditmovefile": "Fitxategiak igo, ordeztu eta mugitu",
        "action-viewmywatchlist": "zure jarraipen zerrenda ikusi",
        "action-viewmyprivateinfo": "zure informazio pribatua ikusi",
        "action-editmyprivateinfo": "zure informazio pribatua aldatu",
+       "action-editcontentmodel": "Aldatu orri bateko eduki eredua",
        "action-managechangetags": "Etiketak sortu eta (des)aktibatu",
+       "action-applychangetags": "Etiketak zure aldaketekin batera aplikatu",
        "action-deletechangetags": "ezabatu etiketak datu-basetik",
        "action-purge": "Orri hau purgatu",
        "nchanges": "{{PLURAL:$1|aldaketa 1|$1 aldaketa}}",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ikus, gainera, [[Special:NewPages|orri berrien zerrenda]])",
        "recentchanges-submit": "Erakutsi",
        "rcfilters-activefilters": "Iragazki aktiboak",
-       "rcfilters-quickfilters": "Lotura azkarrak",
+       "rcfilters-quickfilters": "Gordetako filtro ezarpenak",
+       "rcfilters-quickfilters-placeholder-title": "Ez dira oraindik Link-ak gorde",
        "rcfilters-savedqueries-defaultlabel": "Gordetako iragazkiak",
+       "rcfilters-savedqueries-rename": "Berrizendatu",
        "rcfilters-savedqueries-remove": "Kendu",
        "rcfilters-savedqueries-new-name-label": "Izena",
        "rcfilters-savedqueries-apply-label": "Konfigurazioa gorde",
        "rcfilters-savedqueries-cancel-label": "Utzi",
-       "rcfilters-savedqueries-add-new-title": "Gorde iragazkiak lotura azkarra gisa",
+       "rcfilters-savedqueries-add-new-title": "Gorde oraingo iragazki ezarpenak",
        "rcfilters-restore-default-filters": "Leheneratu iragazki lehenetsiak",
        "rcfilters-clear-all-filters": "Iragazki guztiak garbitu",
        "rcfilters-search-placeholder": "Aldaketa berriak iragazi (nabigatu ala idatzi)",
+       "rcfilters-invalid-filter": "Balio ez duen iragazkia",
        "rcfilters-filterlist-title": "Iragazkiak",
        "rcfilters-filterlist-whatsthis": "Zer da hau?",
        "rcfilters-highlightbutton-title": "Nabarmendu emaitzak",
        "version-libraries-description": "Deskribapena",
        "version-libraries-authors": "Egileak",
        "redirect": "Birzuzendu fitxategi, kide, orri, berrikuspen edo IDaren arabera",
+       "redirect-summary": "Orri berezi honek artxibo batera (izena emanda) bidaliko zaitu, orri batera (egiaztatze ID edo orri ID-a emanez), erabiltzaile orrira (erabiltzaile ID numerikoa emanez) edota hasiera sarrera batera (Sarrera ID-a emanez). Erabilera: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Joan",
        "redirect-lookup": "Ikuskatu:",
        "redirect-value": "Balioa:",
index c5ee148..c6c4dd8 100644 (file)
        "anontalk": "Diskussionssyste vo sellere IP",
        "navigation": "Navigation",
        "and": "&#32;un",
-       "qbfind": "Finde",
-       "qbbrowse": "Blättre",
-       "qbedit": "Ändere",
-       "qbpageoptions": "Sytenoptione",
-       "qbmyoptions": "Ystellige",
        "faq": "Froge, wo vilmol gstellt wäre",
-       "faqpage": "Project:FAQ",
        "actions": "Aktione",
        "namespaces": "Namensryym",
        "variants": "Variante",
        "edit-local": "Lokali Bschrybig bearbeite",
        "create": "Erstelle",
        "create-local": "Lokali Bschrybig zuefiege",
-       "editthispage": "Syte bearbeite",
-       "create-this-page": "Die Syte afange",
        "delete": "Lesche",
-       "deletethispage": "Syte lösche",
-       "undeletethispage": "Die Syte widerhärstelle",
        "undelete_short": "{{PLURAL:$1|1 Version|$1 Versione}} widerherstelle",
        "viewdeleted_short": "{{PLURAL:$1|ei gleschti Änderig|$1 gleschti Ändrige}} aaluege",
        "protect": "Schütze",
        "protect_change": "ändere",
-       "protectthispage": "Artikel schütze",
        "unprotect": "Syteschutz ändere",
-       "unprotectthispage": "Syteschutz ändere",
        "newpage": "Nöji Syte",
-       "talkpage": "Iber die Syte dischputiere",
        "talkpagelinktext": "Diskussion",
        "specialpage": "Spezialsyte",
        "personaltools": "Persönlichi Wärkzüg",
-       "articlepage": "Syte",
        "talk": "Diskussion",
        "views": "Wievylmol agluegt",
        "toolbox": "Wärchzyyg",
        "tool-link-userrights": "{{GENDER:$1|Benutzergruppe}} ändere",
        "tool-link-userrights-readonly": "{{GENDER:$1|Benutzergruppe}} aaluege",
        "tool-link-emailuser": "E-Mail an {{GENDER:$1|dää Benutzer|die Benutzeri}} schicke",
-       "userpage": "Benutzersyte",
-       "projectpage": "Projektsyte azeige",
        "imagepage": "Dateisyte",
        "mediawikipage": "Inhaltssyte aazeige",
        "templatepage": "Vorlagesyte aazeige",
        "logentry-merge-merge": "{{GENDER:$2|Der $1|D $1|$1}} het $3 i $4 zämegfüert (Versione bis $5)",
        "logentry-move-move": "{{GENDER:$2|Dr|D}} $1 het d Seite $3 uf $4 verschobe",
        "logentry-move-move-noredirect": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 nooch $4 verschobe ohni e Wyterleitig aazlege",
-       "logentry-move-move_redir": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe",
-       "logentry-move-move_redir-noredirect": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe, ohni sälber eini aazlege",
+       "logentry-move-move_redir": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 nooch $4 verschobe un het deby e Wyterleitig überschribe",
+       "logentry-move-move_redir-noredirect": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 nooch $4 verschobe un het deby e Wyterleitig überschribe, ohni sälber eini aazlege",
        "logentry-patrol-patrol": "{{GENDER:$2|Der $1|D $1|$1}} het Version $4 vo Syte $3 als kontrolliert markiert",
        "logentry-patrol-patrol-auto": "{{GENDER:$2|Der $1|D $1|$1}} het Version $4 vor Syte $3 automatisch als kontrolliert markiert",
        "logentry-newusers-newusers": "{{GENDER:$2|Benutzerkonto}} $1 isch aagleit wore.",
index 29875b0..27f1531 100644 (file)
        "apisandbox-sending-request": "בקשת ה־API בשליחה...",
        "apisandbox-loading-results": "תוצאות ה־API בתהליך קבלה...",
        "apisandbox-results-error": "אירעה שגיאה בעת טעינת תשובת ה־API לבקשה: $1.",
+       "apisandbox-results-login-suppressed": "בקשה זו טופלה כבקשה של משתמש אנונימי, כי היא עלולה הייתה לשמש לעקיפת מדיניות האבטחה \"מקור־זהה\" (Same-Origin) של הדפדפן. יש לציין שהטיפול האוטומטי באסימונים של ארגז החול של ה־API אינו עובד כראוי עם בקשות מסוג זה, לכן יש למלא אותם ידנית.",
        "apisandbox-request-selectformat-label": "הצגת נתוני הבקשה בתור:",
        "apisandbox-request-format-url-label": "מחרוזת השאילתה (query string) של כתובת ה־URL",
        "apisandbox-request-url-label": "כתובת ה־URL של הבקשה:",
index 2f2d7fd..c2c2ea8 100644 (file)
        "anontalk": "वार्ता",
        "navigation": "भ्रमण",
        "and": "&#32;और",
-       "qbfind": "खोजें",
-       "qbbrowse": "ब्राउज़",
-       "qbedit": "सम्पादन",
-       "qbpageoptions": "यह पृष्ठ",
-       "qbmyoptions": "मेरे पृष्ठ",
        "faq": "बहुधा पूछे जाने वाले प्रश्न",
-       "faqpage": "Project:बहुधा पूछे जाने वाले सवाल",
        "actions": "क्रियाएँ",
        "namespaces": "नामस्थान",
        "variants": "संस्करण",
        "edit-local": "स्थानीय विवरण सम्पादन करें",
        "create": "बनाएँ",
        "create-local": "स्थानीय विवरण जोड़ें",
-       "editthispage": "यह पृष्ठ संपादन करें",
-       "create-this-page": "यह पृष्ठ बनाएँ",
        "delete": "हटाएँ",
-       "deletethispage": "इस पृष्ठ को हटाएँ",
-       "undeletethispage": "इस पृष्ठ को पुनर्स्थापित करें।",
        "undelete_short": "{{PLURAL:$1|एक हटाया गया|$1 हटाए गए}} बदलाव वापस लायें",
        "viewdeleted_short": "देखें {{PLURAL:$1|एक हटाया गया सम्पादन|$1 हटाए गए सम्पादन}}",
        "protect": "सुरक्षित करें",
        "protect_change": "बदलें",
-       "protectthispage": "इस पृष्ठ को सुरक्षित करें",
        "unprotect": "असुरक्षित",
-       "unprotectthispage": "इस पृष्ठ का सुरक्षा स्तर बदलें",
        "newpage": "नया पृष्ठ",
-       "talkpage": "इस पृष्ठ के बारे में चर्चा करें",
        "talkpagelinktext": "चर्चा",
        "specialpage": "विशेष पृष्ठ",
        "personaltools": "व्यक्तिगत उपकरण",
-       "articlepage": "सामग्री पृष्ठ देखें",
        "talk": "चर्चा",
        "views": "दर्शाव",
        "toolbox": "उपकरण",
        "tool-link-userrights": "{{GENDER:$1|सदस्य}} समूह बदलें",
        "tool-link-userrights-readonly": "{{GENDER:$1|सदस्य}} समूह देखें",
        "tool-link-emailuser": "इस {{GENDER:$1|सदस्य}} को ई-मेल करें।",
-       "userpage": "सदस्य पृष्ठ देखें",
-       "projectpage": "परियोजना पृष्ठ देखें",
        "imagepage": "फ़ाइल पृष्ठ देखें",
        "mediawikipage": "सन्देश पृष्ठ देखें",
        "templatepage": "साँचा पृष्ठ देखें",
        "rcfilters-filter-lastrevision-description": "पृष्ठ का सबसे हाल में हुआ बदलाव",
        "rcfilters-filter-previousrevision-label": "पहले के अवतरण",
        "rcfilters-filter-previousrevision-description": "सभी परिवर्तन जो एक पृष्ठ में सबसे हाल के परिवर्तन नहीं हैं।",
+       "rcfilters-filter-excluded": "अपवर्जित",
+       "rcfilters-tag-prefix-namespace-inverted": " $1 <strong>:नहीं</strong>",
+       "rcfilters-view-tags": "चिप्पियाँ",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
        "rclistfromreset": "चुने दिनांक पहले जैसा करें",
        "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
        "newimages-legend": "छननी",
        "newimages-label": "संचिका नाम (या उसका अंश):",
        "newimages-user": "आईपी पता या सदस्यनाम",
+       "newimages-newbies": "केवल नये खातों के योगदान दिखायें",
        "newimages-showbots": "बॉट के अपलोड दिखाइये",
        "newimages-hidepatrolled": "जाँचा हुआ अपलोड छुपाएँ",
+       "newimages-mediatype": "मीडिया प्रकार:",
        "noimages": "देखने के लिए कुछ नहीं है।",
        "gallery-slideshow-toggle": "टॉगल थंबनेल",
        "ilsubmit": "खोजें",
        "tags-create-reason": "कारण:",
        "tags-create-submit": "बनाएँ",
        "tags-create-no-name": "आपको एक चिप्पि का नाम निर्दिष्ट करना चाहिए।",
-       "tags-create-invalid-chars": "à¤\9fà¥\88à¤\97 à¤¨à¤¾à¤®à¥\8bà¤\82 à¤\95à¥\87 à¤¬à¥\80à¤\9a à¤\95à¥\89मा(<code>,</code>) à¤¯à¤¾ à¤\86à¤\97à¥\87 à¤\95à¥\87 à¤¸à¥\8dलà¥\88श à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\8bनà¥\87 à¤\9aाहिà¤\8f। (<code>/</code>).",
+       "tags-create-invalid-chars": "à¤\9aिपà¥\8dपियà¥\8bà¤\82 à¤\95à¥\87 à¤¨à¤¾à¤® à¤®à¥\87à¤\82 à¤\95à¥\8bमा (<code>,</code>) à¤\85थवा à¤\86à¤\97à¥\87 à¤\95à¥\87 à¤¸à¥\8dलà¥\88श (<code>/</code>) à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\8bनà¥\87 à¤\9aाहियà¥\87।",
        "tags-create-invalid-title-chars": "टैग नामों में ऐसे कैरेक्टर नहीं होने चाहिए जो पृष्ठ के शीर्षक में नहीं इस्तेमाल हो सकते हैं।",
        "tags-create-already-exists": "टैग \"$1\" पहले से ही उपस्थित है।",
        "tags-create-warnings-above": "निम्न लिखित {{PLURAL:$2|चेतावनी देखी गई है|चेतावनियाँ देखी गई हैं}}  जब टैग \"$1\" बनाने का प्रयास किया गया था:",
        "gotointerwiki-invalid": "दिया गया शीर्षक अमान्य है।",
        "gotointerwiki-external": "[[$2]] एक बाहरी वेबसाइट है, जिसमें जाने के लिए आप {{SITENAME}} को छोड़ रहे हैं।\n\n[$1 $1 पर जाने के लिए इस पर क्लिक करें]।",
        "undelete-cantedit": "आप इस पन्ने को वापस नहीं ला सकते, क्योंकि आपको इस पन्ने पर सम्पादन की अनुमति नहीं है।",
-       "undelete-cantcreate": "आप इस पन्ने को वापस नहीं ला सकते, क्योंकि यह पन्ना इस नाम से है ही नहीं और आपको इस पन्ने के निर्माण की अनुमति भी नहीं है।"
+       "undelete-cantcreate": "आप इस पन्ने को वापस नहीं ला सकते, क्योंकि यह पन्ना इस नाम से है ही नहीं और आपको इस पन्ने के निर्माण की अनुमति भी नहीं है।",
+       "pagedata-title": "पृष्ठ आँकड़े",
+       "pagedata-not-acceptable": "कोई अनुकूल प्रारूप नहीं मिला। सुमेलित ऍमआइऍमई प्रकार: $1",
+       "pagedata-bad-title": "अमान्य शीर्षक: $1"
 }
index ef33111..eab00cf 100644 (file)
@@ -1422,6 +1422,7 @@ return [
                ],
        ],
        'mediawiki.action.edit.styles' => [
+               'targets' => [ 'desktop', 'mobile' ],
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.styles.css',
        ],
        'mediawiki.action.edit.collapsibleFooter' => [
index 029d1fe..28818d9 100644 (file)
@@ -99,7 +99,7 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                $enhancedChangesList->recentChangesLine( $recentChange, false );
 
                $html = $enhancedChangesList->endRecentChangesList();
-               $this->assertContains( 'data-mw-revid="5"', $html );
+               $this->assertRegExp( '/data-mw-revid="5" class="[^"]*mw-enhanced-rc[^"]*"/', $html );
 
                $recentChange2 = $this->getEditChange( '20131103092253' );
                $enhancedChangesList->recentChangesLine( $recentChange2, false );
index 0833047..79d0784 100644 (file)
@@ -113,6 +113,58 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                );
        }
 
+       public function provideTestIsFileModule() {
+               $fileModuleObj = $this->getMockBuilder( ResourceLoaderFileModule::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               return [
+                       'object' => [ false,
+                               new ResourceLoaderTestModule()
+                       ],
+                       'FileModule object' => [ false,
+                               $fileModuleObj
+                       ],
+                       'simple empty' => [ true,
+                               []
+                       ],
+                       'simple scripts' => [ true,
+                               [ 'scripts' => 'example.js' ]
+                       ],
+                       'simple scripts, raw and targets' => [ true, [
+                               'scripts' => [ 'a.js', 'b.js' ],
+                               'raw' => true,
+                               'targets' => [ 'desktop', 'mobile' ],
+                       ] ],
+                       'FileModule' => [ true,
+                               [ 'class' => ResourceLoaderFileModule::class, 'scripts' => 'example.js' ]
+                       ],
+                       'TestModule' => [ false,
+                               [ 'class' => ResourceLoaderTestModule::class, 'scripts' => 'example.js' ]
+                       ],
+                       'SkinModule (FileModule subclass)' => [ true,
+                               [ 'class' => ResourceLoaderSkinModule::class, 'scripts' => 'example.js' ]
+                       ],
+                       'JqueryMsgModule (FileModule subclass)' => [ true, [
+                               'class' => ResourceLoaderJqueryMsgModule::class,
+                               'scripts' => 'example.js',
+                       ] ],
+                       'WikiModule' => [ false, [
+                               'class' => ResourceLoaderWikiModule::class,
+                               'scripts' => [ 'MediaWiki:Example.js' ],
+                       ] ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideTestIsFileModule
+        * @covers ResourceLoader::isFileModule
+        */
+       public function testIsFileModule( $expected, $module ) {
+               $rl = TestingAccessWrapper::newFromObject( new EmptyResourceLoader() );
+               $rl->register( 'test', $module );
+               $this->assertSame( $expected, $rl->isFileModule( 'test' ) );
+       }
+
        /**
         * @covers ResourceLoader::isModuleRegistered
         */