Merge "Remove $wgExperimentalHtmlIds and related code, deprecated in 1.30"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 2 May 2018 20:55:40 +0000 (20:55 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 2 May 2018 20:55:40 +0000 (20:55 +0000)
21 files changed:
RELEASE-NOTES-1.32
includes/Revision.php
includes/api/i18n/es.json
includes/installer/i18n/eu.json
includes/installer/i18n/ml.json
includes/logging/LogFormatter.php
includes/parser/BlockLevelPass.php
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fi.json
languages/i18n/he.json
languages/i18n/li.json
languages/i18n/min.json
languages/i18n/nah.json
languages/i18n/ps.json
languages/i18n/sd.json
resources/lib/qunitjs/qunit.css
resources/lib/qunitjs/qunit.js
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/logging/LogFormatterTest.php
tests/selenium/wdio.conf.js

index 3df5e0b..c7bec8d 100644 (file)
@@ -24,7 +24,7 @@ production.
 * …
 
 ==== Upgraded external libraries ====
-* 
+* Updated QUnit from 2.4.0 to 2.6.0.
 
 ==== New external libraries ====
 * …
@@ -63,6 +63,11 @@ changes to languages because of Phabricator reports.
 * EditPage::isOouiEnabled() was removed (deprecated in 1.30).
 * mw.util.wikiGetlink() was removed (deprecated in 1.23).
   Use mw.util.getUrl() instead.
+* (T61113) The following methods and constants from the Revision class were deprecated in
+  1.25 and have now been removed.
+  * Revision::getRawUser()
+  * Revision::getRawUserText()
+  * Revision::getRawComment()
 
 === Deprecations in 1.32 ===
 * Use of a StartProfiler.php file is deprecated in favour of placing
index 652ce4d..548ef8d 100644 (file)
@@ -786,17 +786,6 @@ class Revision implements IDBAccessObject {
                return $user ? $user->getId() : 0;
        }
 
-       /**
-        * Fetch revision's user id without regard for the current user's permissions
-        *
-        * @return int
-        * @deprecated since 1.25, use getUser( Revision::RAW )
-        */
-       public function getRawUser() {
-               wfDeprecated( __METHOD__, '1.25' );
-               return $this->getUser( self::RAW );
-       }
-
        /**
         * Fetch revision's username if it's available to the specified audience.
         * If the specified audience does not have access to the username, an
@@ -820,18 +809,6 @@ class Revision implements IDBAccessObject {
                $user = $this->mRecord->getUser( $audience, $user );
                return $user ? $user->getName() : '';
        }
-
-       /**
-        * Fetch revision's username without regard for view restrictions
-        *
-        * @return string
-        * @deprecated since 1.25, use getUserText( Revision::RAW )
-        */
-       public function getRawUserText() {
-               wfDeprecated( __METHOD__, '1.25' );
-               return $this->getUserText( self::RAW );
-       }
-
        /**
         * Fetch revision comment if it's available to the specified audience.
         * If the specified audience does not have access to the comment, an
@@ -856,17 +833,6 @@ class Revision implements IDBAccessObject {
                return $comment === null ? null : $comment->text;
        }
 
-       /**
-        * Fetch revision comment without regard for the current user's permissions
-        *
-        * @return string
-        * @deprecated since 1.25, use getComment( Revision::RAW )
-        */
-       public function getRawComment() {
-               wfDeprecated( __METHOD__, '1.25' );
-               return $this->getComment( self::RAW );
-       }
-
        /**
         * @return bool
         */
index 0816ed7..5be4703 100644 (file)
        "apihelp-edit-param-tags": "Cambia las etiquetas para aplicarlas a la revisión.",
        "apihelp-edit-param-minor": "Edición menor.",
        "apihelp-edit-param-notminor": "Edición no menor.",
-       "apihelp-edit-param-bot": "Marcar esta edición como edición de bot.",
+       "apihelp-edit-param-bot": "Marcar esta como una edición de robot.",
        "apihelp-edit-param-basetimestamp": "Marca de tiempo de la revisión base, usada para detectar conflictos de edición. Se puede obtener mediante [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]",
        "apihelp-edit-param-starttimestamp": "Marca de tiempo de cuando empezó el proceso de edición, usada para detectar conflictos de edición. Se puede obtener un valor apropiado usando <var>[[Special:ApiHelp/main|curtimestamp]]</var> cuando comiences el proceso de edición (por ejemplo, al cargar el contenido de la página por editar).",
        "apihelp-edit-param-recreate": "Reemplazar los errores acerca de la página de haber sido eliminados en el ínterin.",
index e94c71b..18c917e 100644 (file)
@@ -64,7 +64,7 @@
        "config-apc": "[http://www.php.net/apc APC] instalatuta dago",
        "config-apcu": "[http://www.php.net/apcu APCu] instalatuta dago",
        "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] instalatuta dago",
-       "config-no-cache-apcu": "<strong>Warning:</strong> Ezin izan da [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] edo [http://www.iis.net/download/WinCacheForPhp WinCache] aurkitu.\nObjektu katxea ez dago aktibatuta.",
+       "config-no-cache-apcu": "<strong>Warning:</strong> Ezin izan da [http://www.php.net/apcu APCu] edo [http://www.iis.net/download/WinCacheForPhp WinCache] aurkitu.\nObjektu katxea ez dago aktibatuta.",
        "config-mod-security": "<strong>Warning:</strong> Zure web zerbitzariak [https://modsecurity.org/mod_security] / mod_security2 aktibatu du. Honen konfigurazio komun asko sortu ahal dituzte arazoak MediaWikin  eta beste software batzuetan, hautazko edukia argitaratzeko aukera ematen dutenei erabiltzaileei.\nAhal izanez gero, desgaitu egin beharko litzateke. Bestela, kontsultatu [https://modsecurity.org/documentation/ mod_security documentation] edo jarri harremanetan zure ostalariarekin ausazko akatsak aurkitzen badituzu.",
        "config-diff3-bad": "GNU diff3 ez da aurkitu.",
        "config-git": "Git bertsio-kontrol software aurkitu da: <code>$1</code>",
        "config-cache-options": "Objektu cachearen ezarpenak:",
        "config-cache-help": "Objektuen katxea erabiltzen da MediaWikiko abiadura hobetzeko, sarritan erabiltzen diren datuak gordetzen.\nOso gomendagarria da, webgune handientzako eta ertainentzako, webgune txikiek ere ikusiko dituzte onurak.",
        "config-cache-none": "Desaktibatu Katxina (ez dira funtzionaltasunak ezabatu, baina wiki orrialde handietan abiaduran eragina izan ahal du)",
-       "config-cache-accel": "PHP objetuen katxea (APC, APCu, XCache edo WinCache)",
+       "config-cache-accel": "PHP objetuen katxea (APC, APCu, edo WinCache)",
        "config-cache-memcached": "Memcached erabili (konfigurazio eta instalazio gehiago behar du)",
        "config-memcached-servers": "Memcached serbidoreak:",
        "config-memcached-help": "Memcached-ekin erabiltzeko IP helbideen lista.\nLerro bakoitzen bat bakarrik jarri behar da eta zehaztu ze ataka erabiliko den. Adibidez:\n127.0.0.1:11211\n192.168.1.25:1234",
        "config-nofile": "Ezin da \"$1\" fitxategia aurkitu. Ezabatua izan da?",
        "config-extension-link": "Ba al zenekien wikiak [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] onartzen dituela?\n\nArakatu [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] edo [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] ikusi ahal izateko luzapenen zerrenda.",
        "config-skins-screenshots": "$1 (Pantaila-irudia: $2)",
+       "config-extensions-requires": "$1 ($2 behar du)",
        "config-screenshot": "Pantaila-irudia",
        "mainpagetext": "<strong>MediaWiki instalatu da.</strong>",
        "mainpagedocfooter": "Ikusi [https://meta.wikimedia.org/wiki/Help:Contents Erabiltzailearen Gida] wiki softwarea erabiltzen hasteko informazio gehiagorako.\n\n== Nola hasi ==\n\n*\n [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigurazio balioen zerrenda]\n*\n [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ (MediaWikin Maiz egindako galderak)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Aurkitu MediaWiki zure hizkuntzan]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Zure wikian spam-a nola borrokatzen ikasi]"
index 55ce440..4f158f9 100644 (file)
@@ -56,6 +56,7 @@
        "config-connection-error": "$1.\n\nതാഴെ നൽകിയിരിക്കുന്ന ഹോസ്റ്റ്, ഉപയോക്തൃനാമം, രഹസ്യവാക്ക് എന്നിവ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.",
        "config-regenerate": "LocalSettings.php പുനഃസൃഷ്ടിക്കുക →",
        "config-mysql-engine": "സ്റ്റോറേജ് എൻജിൻ:",
+       "config-mysql-utf8": "യു.ടി.എഫ്.-8",
        "config-site-name": "വിക്കിയുടെ പേര്:",
        "config-site-name-help": "ഇത് ബ്രൗസറിന്റെ ടൈറ്റിൽ ബാറിലും മറ്റനേകം ഇടങ്ങളിലും പ്രദർശിപ്പിക്കപ്പെടും.",
        "config-site-name-blank": "സൈറ്റിന്റെ പേര് നൽകുക.",
index bc0491f..0ffe691 100644 (file)
@@ -108,6 +108,12 @@ class LogFormatter {
         */
        private $linkRenderer;
 
+       /**
+        * @see LogFormatter::getMessageParameters
+        * @var array
+        */
+       protected $parsedParameters;
+
        protected function __construct( LogEntry $entry ) {
                $this->entry = $entry;
                $this->context = RequestContext::getMain();
index 1173dd2..c366903 100644 (file)
@@ -291,19 +291,34 @@ class BlockLevelPass {
                        if ( 0 == $prefixLength ) {
                                # No prefix (not in list)--go to paragraph mode
                                # @todo consider using a stack for nestable elements like span, table and div
+
+                               // P-wrapping and indent-pre are suppressed inside, not outside
+                               $blockElems = 'table|h1|h2|h3|h4|h5|h6|pre|p|ul|ol|dl|li';
+                               // P-wrapping and indent-pre are suppressed outside, not inside
+                               $antiBlockElems = 'td|th';
+
                                $openMatch = preg_match(
-                                       '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|'
-                                               . '<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)\\b/iS',
+                                       '/<('
+                                               . "({$blockElems})|\\/({$antiBlockElems})|"
+                                               // Always suppresses
+                                               . '\\/?(tr)'
+                                               . ')\\b/iS',
                                        $t
                                );
                                $closeMatch = preg_match(
-                                       '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'
-                                               . '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|'
-                                               . Parser::MARKER_PREFIX
-                                               . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)\\b/iS',
+                                       '/<('
+                                               . "\\/({$blockElems})|({$antiBlockElems})|"
+                                               // Never suppresses
+                                               . '\\/?(center|blockquote|div|hr|mw:)'
+                                               . ')\\b/iS',
                                        $t
                                );
 
+                               // Any match closes the paragraph, but only when `!$closeMatch`
+                               // do we enter block mode.  The oddities with table rows and
+                               // cells are to avoid paragraph wrapping in interstitial spaces
+                               // leading to fostered content.
+
                                if ( $openMatch || $closeMatch ) {
                                        $pendingPTag = false;
                                        // Only close the paragraph if we're not inside a <pre> tag, or if
index eb55654..18fd37e 100644 (file)
        "changepassword-throttled": "Has intentado acceder demasiadas veces recientemente.\nEspera $1 antes de intentarlo de nuevo.",
        "botpasswords": "Contraseñas de bots",
        "botpasswords-summary": "Las <em>contraseñas de bots</em> permiten el acceso a una cuenta de usuario mediante la API sin usar las credenciales principales de la cuenta. Los derechos de un usuario mientras haya iniciado sesión con una contraseña de bot pueden estar restringidos.\n\nSi no sabes por qué querrías hacer esto, probablemente no deberías hacerlo. Nadie debería pedirte que generes una de estas claves y que se la entregues.",
-       "botpasswords-disabled": "Las contraseñas de bot están desactivadas.",
+       "botpasswords-disabled": "Las contraseñas de robot están desactivadas.",
        "botpasswords-no-central-id": "Para usar una contraseña de bot, debes estar conectado a una cuenta centralizada.",
        "botpasswords-existing": "Contraseñas de bots existentes",
-       "botpasswords-createnew": "Crear una nueva contraseña de bot",
-       "botpasswords-editexisting": "Editar una contraseña de bot existente",
-       "botpasswords-label-appid": "Nombre del bot:",
+       "botpasswords-createnew": "Crear una contraseña de robot nueva",
+       "botpasswords-editexisting": "Editar una contraseña de robot existente",
+       "botpasswords-label-appid": "Nombre del robot:",
        "botpasswords-label-create": "Crear",
        "botpasswords-label-update": "Actualizar",
        "botpasswords-label-cancel": "Cancelar",
        "botpasswords-label-grants": "Permisos aplicables:",
        "botpasswords-help-grants": "Cada concesión le da acceso a los permisos listados que el usuario ya posea. Habilitar una concesión aquí no proporciona acceso a ningún permiso que tu cuenta de usuario no tendría de otra manera. Véase la [[Special:ListGrants|lista de concesiones]] para más información.",
        "botpasswords-label-grants-column": "Concedido",
-       "botpasswords-bad-appid": "El nombre del bot \"$1\" no es válido.",
+       "botpasswords-bad-appid": "El nombre del robot «$1» no es válido.",
        "botpasswords-insert-failed": "No se pudo agregar el nombre del bot \"$1\". ¿Ya ha sido añadido?",
        "botpasswords-update-failed": "No se pudo actualizar el nombre del bot \"$1\". ¿Ha sido borrado?",
-       "botpasswords-created-title": "Se creó la contraseña de bot",
+       "botpasswords-created-title": "Se creó la contraseña de robot",
        "botpasswords-created-body": "Se creó la contraseña del robot «$1» perteneciente {{GENDER:$2|al usuario|a la usuaria}} «$2».",
-       "botpasswords-updated-title": "Se actualizó la contraseña de bot",
+       "botpasswords-updated-title": "Se actualizó la contraseña de robot",
        "botpasswords-updated-body": "Se actualizó la contraseña del robot «$1» perteneciente {{GENDER:$2|al usuario|a la usuaria}} «$2».",
-       "botpasswords-deleted-title": "Se eliminó la contraseña de bot",
+       "botpasswords-deleted-title": "Se eliminó la contraseña de robot",
        "botpasswords-deleted-body": "Se eliminó la contraseña del robot «$1» perteneciente {{GENDER:$2|al usuario|a la usuaria}} «$2».",
        "botpasswords-newpassword": "La contraseña nueva para acceder con <strong>$1</strong> es <strong>$2</strong>. <em>Guarda esta información para su consulta futura.</em> <br> (En caso de robots antiguos que requieren que el nombre de acceso coincida con el de usuario, también puedes utilizar <strong>$3</strong> como nombre de usuario y <strong>$4</strong> como contraseña.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider no está disponible.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "group-autoconfirmed": "Autoconfirmados",
-       "group-bot": "Bots",
+       "group-bot": "Robots",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burócratas",
        "group-suppress": "Supresores de Flow",
        "group-all": "(todos)",
        "group-user-member": "{{GENDER:$1|usuario|usuaria}}",
        "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmado|autoconfirmada}}",
-       "group-bot-member": "{{GENDER:$1|bot}}",
+       "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|administrador|administradora}}",
        "group-bureaucrat-member": "{{GENDER:$1|burócrata}}",
        "group-suppress-member": "{{GENDER:$1|supresor|supresora}} de Flow",
        "grouppage-user": "{{ns:project}}:Usuarios",
        "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmados",
-       "grouppage-bot": "{{ns:project}}:Bots",
+       "grouppage-bot": "{{ns:project}}:Robots",
        "grouppage-sysop": "{{ns:project}}:Administradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burócratas",
        "grouppage-suppress": "{{ns:project}}:Supresores de Flow",
        "right-editmyprivateinfo": "Editar su propia información privada (ej.: correo electrónico, nombre real)",
        "right-editmyoptions": "Editar tus preferencias",
        "right-rollback": "Revertir rápidamente las ediciones del último usuario que modificó una página en particular",
-       "right-markbotedits": "Marcar ediciones revertidas como ediciones de bot",
+       "right-markbotedits": "Marcar las reversiones como ediciones de robot",
        "right-noratelimit": "No resultar afectado por los límites de frecuencia de edición",
        "right-import": "Importar páginas desde otras wikis",
        "right-importupload": "Importar páginas desde un archivo",
        "rcfilters-filter-user-experience-level-experienced-label": "Usuarios experimentados",
        "rcfilters-filter-user-experience-level-experienced-description": "Editores registrados con más de 500 ediciones y 30 días de actividad.",
        "rcfilters-filtergroup-automated": "Contribuciones automatizadas",
-       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-label": "Robot",
        "rcfilters-filter-bots-description": "Ediciones realizadas por herramientas automatizadas.",
-       "rcfilters-filter-humans-label": "Ser humano (no bot)",
+       "rcfilters-filter-humans-label": "Ser humano (no robot)",
        "rcfilters-filter-humans-description": "Ediciones realizadas por editores humanos.",
        "rcfilters-filtergroup-reviewstatus": "Estado de revisión",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "No patrulladas",
        "rcfilters-filter-reviewstatus-manual-label": "Verificado manualmente",
-       "rcfilters-filter-reviewstatus-auto-description": "Ediciones por usuarios avanzadus cuyo trabajo es marcado automáticamente como verificado.",
+       "rcfilters-filter-reviewstatus-auto-description": "Ediciones por usuarios avanzados cuyo trabajo se marca automáticamente como verificado.",
        "rcfilters-filter-reviewstatus-auto-label": "Autoverificado",
        "rcfilters-filtergroup-significance": "Significación",
        "rcfilters-filter-minor-label": "Ediciones menores",
        "import-upload-username-prefix": "Prefijo de interwiki:",
        "import-assign-known-users": "Asignar ediciones a usuarios locales cuando el usuario correspondiente exista localmente",
        "import-comment": "Comentario:",
-       "importtext": "Por favor, exporta el archivo desde el wiki de origen usando la [[Special:Export|herramienta de exportación]], guárdalo en tu disco y súbelo aquí.",
+       "importtext": "Exporta el archivo desde el wiki de origen mediante la [[Special:Export|herramienta de exportación]], guárdalo en tu disco y cárgalo aquí.",
        "importstart": "Importando páginas...",
        "import-revision-count": "$1 {{PLURAL:$1|revisión|revisiones}}",
        "importnopages": "No hay páginas que importar.",
        "noscript.css": "/* Los estilos CSS colocados aquí se aplicarán a los usuarios que hayan desactivado el JavaScript en su navegador */",
        "group-autoconfirmed.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Usuarios autoconfirmados */",
        "group-user.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios registrados */",
-       "group-bot.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Bots */",
+       "group-bot.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Robots */",
        "group-sysop.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Administradores */",
        "group-bureaucrat.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Burócratas */",
        "common.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */",
        "group-autoconfirmed.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Usuarios autoconfirmados */",
        "group-user.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios registrados */",
-       "group-bot.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Bots */",
+       "group-bot.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Robots */",
        "group-sysop.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Administradores */",
        "group-bureaucrat.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Burócratas */",
        "anonymous": "{{PLURAL:$1|Usuario anónimo|Usuarios anónimos}} de {{SITENAME}}",
index 5c39a17..c792ba4 100644 (file)
        "savechanges": "Aldaketak gorde",
        "publishpage": "Orrialdea argitaratu",
        "publishchanges": "Aldaketak argitaratu",
+       "savechanges-start": "Aldaketak gorde...",
+       "publishpage-start": "Orrialdea argitaratu...",
+       "publishchanges-start": "Aldaketak argitaratu...",
        "preview": "Aurrebista erakutsi",
        "showpreview": "Aurrebista erakutsi",
        "showdiff": "Aldaketak erakutsi",
        "prefs-dateformat": "Data-formatua",
        "prefs-timeoffset": "Denbora ezberdintasuna",
        "prefs-advancedediting": "Genero aukerak",
+       "prefs-developertools": "Garatzaile tresnak",
        "prefs-editor": "Editorea",
        "prefs-preview": "Aurreikusi",
        "prefs-advancedrc": "Aukera aurreratuak",
        "rcfilters-filter-humans-description": "Gizaki editoreek egindako aldaketak.",
        "rcfilters-filtergroup-reviewstatus": "Berrikuspenaren egoera",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Patruilagabea",
+       "rcfilters-filter-reviewstatus-manual-label": "Eskuz patruilatuak",
        "rcfilters-filtergroup-significance": "Munta",
        "rcfilters-filter-minor-label": "Aldaketa txikiak",
        "rcfilters-filter-minor-description": "Egileak sailkatutako aldaketa txikiak.",
        "deadendpages": "Orrialde itsuak",
        "deadendpagestext": "Jarraian zerrendatutako orrialdeek ez daukate wikiko beste edozein orrialdetarako loturarik.",
        "protectedpages": "Babestutako orrialdeak",
+       "protectedpages-filters": "Iragazkiak:",
        "protectedpages-indef": "Babes mugagabeak bakarrik",
        "protectedpages-summary": "Orrialde honetan unean babestutako orriak zerrendatzen dira. Sorkuntza babesten duten izenen zerrenda lortzeko, ikusi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Kaskada moduko babesak bakarrik",
        "apisandbox-dynamic-error-exists": "$1 parametro izena dagoeneko existitzen da",
        "apisandbox-deprecated-parameters": "Aurretiaz zehaztutako parametroak",
        "apisandbox-fetch-token": "Token-a automatikoki bete",
+       "apisandbox-add-multi": "Gehitu",
        "apisandbox-submit-invalid-fields-title": "Zelai batzuk ez dute balio.",
        "apisandbox-submit-invalid-fields-message": "Mesedez, zuzendu markatutako zelaiak eta saiatu berrio.",
        "apisandbox-results": "Emaitzak",
        "version-specialpages": "Aparteko orrialdeak",
        "version-parserhooks": "Parser estentsioak",
        "version-variables": "Aldagaiak",
+       "version-editors": "Editoreak",
        "version-antispam": "Spam ekiditea",
        "version-other": "Bestelakoak",
        "version-mediahandlers": "Media gordailuak",
index 4d3f927..1db40fd 100644 (file)
        "rcfilters-filter-humans-label": "Ihminen (ei botti)",
        "rcfilters-filter-humans-description": "Ihmisten tekemät muokkaukset.",
        "rcfilters-filtergroup-reviewstatus": "Sivun partioinnin status",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Muutoksia ei ole merkitty manuaalisesti tai automaattisesti partioiduksi.",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Ei ole partioitu",
+       "rcfilters-filter-reviewstatus-manual-description": "Muutokset merkitty partioiduksi manuaalisesti.",
+       "rcfilters-filter-reviewstatus-manual-label": "Manuaalisesti partioitu",
+       "rcfilters-filter-reviewstatus-auto-description": "Muutokset edistyneiltä käyttäjiltä joiden työ on automaattisesti merkitty partioiduksi.",
+       "rcfilters-filter-reviewstatus-auto-label": "Automaattisesti partioitu",
        "rcfilters-filtergroup-significance": "Merkitys",
        "rcfilters-filter-minor-label": "Pienet muutokset",
        "rcfilters-filter-minor-description": "Muokkaukset, jotka on merkitty pieniksi.",
        "rcfilters-filter-watchlistactivity-seen-label": "Nähdyt muutokset",
        "rcfilters-filter-watchlistactivity-seen-description": "Muutokset sivuihin, joilla olet käynyt muutosten jälkeen.",
        "rcfilters-filtergroup-changetype": "Muutoksen tyyppi",
-       "rcfilters-filter-pageedits-label": "Sivun muokkaukset",
+       "rcfilters-filter-pageedits-label": "Sivun muutokset",
        "rcfilters-filter-pageedits-description": "Muokkaukset wikin sisältöön, keskusteluihin, luokkakuvauksiin…",
        "rcfilters-filter-newpages-label": "Sivujen luonnit",
        "rcfilters-filter-newpages-description": "Muokkaukset, joilla on luotu uusia sivuja.",
index 0fb50d1..8366db6 100644 (file)
        "uploaddisabled": "העלאת קבצים מבוטלת.",
        "copyuploaddisabled": "העלאת קבצים מכתובת URL מבוטלת.",
        "uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת.",
-       "php-uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת ברמת PHP. אנא בדקו את ההגדרה file_uploads.",
+       "php-uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת ברמת PHP.\nנא לבדוק את ההגדרה file_uploads.",
        "uploadscripted": "הקובץ כולל קוד סקריפט או HTML שעשוי להתפרש או להתבצע בטעות על־ידי הדפדפן.",
        "upload-scripted-pi-callback": "לא ניתן להעלות קובץ שמכיל את הוראת העיבוד XML-stylesheet.",
-       "upload-scripted-dtd": "לא ניתן להעלות קבצי SVG שכוללים הכרזת DTD לא־סטנדרטית.",
+       "upload-scripted-dtd": "×\9c×\90 × ×\99ת×\9f ×\9c×\94×¢×\9c×\95ת ×§×\95×\91צ×\99 SVG ×©×\9b×\95×\9c×\9c×\99×\9d ×\94×\9bר×\96ת DTD ×\9c×\90־ס×\98× ×\93ר×\98×\99ת.",
        "uploaded-script-svg": "נמצא אלמנט שאפשר לכתוב בו תסריט \"$1\" בקובץ ה־SVG שהועלה.",
        "uploaded-hostile-svg": "נמצא CSS בלתי־מאובטח באלמנט style בקובץ ה־SVG שהועלה.",
        "uploaded-event-handler-on-svg": "אסור להגדיר מאפייני טיפול באירועים <code dir=\"ltr\">$1=\"$2\"</code> בקובצי SVG.",
index ac1eb75..5ef25bf 100644 (file)
        "listduplicatedfiles": "Lies mit bestenj mit duplikaote",
        "listduplicatedfiles-summary": "Dit is 'n lies mit bestenj wovan de litste versie e duplikaot is van de recènste versie van 'n anger bestandj. Allein weurt gerapporteerd euver lokaal bestenj.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] haet [[$3|{{PLURAL:$2|ei duplikaot|$2 duplikaote}}]].",
-       "unusedtemplates": "Óngerbroekde sjablone",
+       "unusedtemplates": "Óngebroekde sjablone",
        "unusedtemplatestext": "Deze pagina guf alle pagina's weer in de {{nas:template}}naamruumde die op gein inkele pagina gebroek waere. Vergaet neet de \"Links nao deze pagina\" te controlere veures dit sjabloon te wösse.",
        "unusedtemplateswlh": "anger links",
        "randompage": "Willekäörige pagina",
        "confirm-purge-title": "Vernuuj dees pagina",
        "confirm_purge_button": "ok",
        "confirm-purge-top": "Wils te de buffer vaan dees paas wisse?",
-       "confirm-purge-bottom": "t Opsjone van de cache zorg drveur det de lèste versie van n pagina wörd weergegaeve.",
+       "confirm-purge-bottom": "'t Opsjeune van de cache zorg d'rveur det de lèste versie van 'n pagina weurt getuind.",
        "confirm-watch-button": "Ok",
        "confirm-watch-top": "Dees pagina bie dien volglies zètte?",
        "confirm-unwatch-button": "Ok",
index 12f0158..62ccc4f 100644 (file)
@@ -10,7 +10,8 @@
                        "VoteITP",
                        "아라",
                        "Macofe",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Baloch Khan"
                ]
        },
        "tog-underline": "Garih bawahi tautan:",
        "october-date": "$1 Oktober",
        "november-date": "$1 Nopember",
        "december-date": "$1 Desember",
+       "period-am": "سهار",
+       "period-pm": "ماښام",
        "pagecategories": "{{PLURAL:$1|Kategori}}",
        "category_header": "Laman pado kategori \"$1\"",
        "subcategories": "Subkategori",
        "nospecialpagetext": "<strong>Sanak mamintak laman istimewa nan indak sah.</strong>\n\nDaftar laman istimewa nan sah dapek dicaliak di [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kasalahan",
        "databaseerror": "Kasalahan basis data",
+       "databaseerror-error": "تېروتنه: $1",
        "laggedslavemode": "Paringatan: Laman mungkin indak barisi parubahan tabaru.",
        "readonly": "Basis data dikunci",
        "enterlockreason": "Masuakkan alasan panguncian, tamasuak pakiraan bilo kunci akan dibuka",
        "createacct-reason": "Alasan",
        "createacct-reason-ph": "Manga Sanak mambuek akun lain",
        "createacct-submit": "Buek akun Sanak",
+       "createacct-another-submit": "ګڼون جوړول",
        "createacct-benefit-heading": "{{SITENAME}} dibuek dek urang-urang saroman Sanak.",
        "createacct-benefit-body1": "{{PLURAL:$1|suntiangan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|laman}}",
index 9f2e935..e7f8ba7 100644 (file)
@@ -78,7 +78,7 @@
        "november": "11 Metz",
        "december": "12 Metz",
        "january-gen": "Ic cē mētztli",
-       "february-gen": "Īcōmemētztli",
+       "february-gen": "Icomemetztli",
        "march-gen": "Īcyēyimētztli",
        "april-gen": "Ic nauhtetl metztli",
        "may-gen": "Īcmācuīllimētztli",
        "categorypage": "Tiquittaz neneuhcayotl itlahcuilolamauh",
        "viewtalkpage": "Xiquitta tēixnāmiquiliztli zāzanilli",
        "otherlanguages": "Occequintin tlahtlahtolcopa",
-       "redirectedfrom": "(Ōmotlacuep īhuīcpa $1)",
+       "redirectedfrom": "(Omocuep ihuicpa $1)",
        "redirectpagesub": "Ōmotlacuep zāzanilli",
        "lastmodifiedat": "Inin tlahcuilolli omopatlac immanin $1, ipan $2.",
        "viewcount": "Inīn zāzanilli quintlapōhua {{PLURAL:$1|cē tlahpololiztli|$1 tlahpololiztli}}.",
        "mainpage": "Yacatlahcuilolli",
        "mainpage-description": "Yacatlahcuilolli",
        "policy-url": "Project:Nahuatīltōn",
-       "portal": "Yacatlahcuilolli tocalpol",
-       "portal-url": "Project:Yacatlahcuilolli tocalpol",
+       "portal": "Necentlaliloyan",
+       "portal-url": "Project:Necentlaliloyan",
        "privacy": "Tlahcuilolli piyaliznahuatilli",
        "privacypage": "Project:Tlahcuilōlpiyaliztechcopa nahuatīltōn",
        "badaccess": "Tlahuelītiliztechcopa ahcuallōtl",
        "resetpass-submit-loggedin": "Ticpatlāz motlahtōlichtacāyo",
        "resetpass-submit-cancel": "Xiccahua",
        "passwordreset-username": "Tequihuihcātōcāitl:",
-       "bold_sample": "Tliltic tlahcuilolpiyaliz",
-       "bold_tip": "Tlīltic tlahcuilōlli",
+       "bold_sample": "Tliltic tlahcuiloliztli",
+       "bold_tip": "Tliltic tlahcuiloliztli",
        "italic_sample": "Nacacic tlahcuiloliztli",
        "italic_tip": "Nacacic tlahcuiloliztli",
        "link_sample": "Tzonhuiliztli ītōcā",
        "templatesused": "{{PLURAL:$1|Nemachiotl tlen motequiuhtia|Nemachiomeh tlen moquintequiuhtiah}} ipan inin tlahcuilolamatl:",
        "templatesusedpreview": "{{PLURAL:$1|Nemachiotl tlen motequiuhtia|Nemachiomeh tlen moquintequiuhtiah}} ipan inin achtochihualiztli:",
        "templatesusedsection": "{{PLURAL:$1|Nemachiotl tlen motequiuhtia|Nemachiomeh tlen moquintequiuhtiah}} ipan inin tlaxeloliztli:",
-       "template-protected": "(ōmoquīxti)",
+       "template-protected": "(ahmo moquixtia)",
        "hiddencategories": "Inin tlahcuilolli pohui {{PLURAL:$1|1 tlatlalilli neneuhcayotl|$1 tlatlaliltin neneuhcayomeh}}:",
        "nocreatetext": "Inin huiqui oquitzacuili ic mochihua yancuic tlahcuilolamatl. Quil ticcuepaznequi auh ticpatlaz occe tlahcuilolamatl, [[Special:UserLogin|xicalaqui nozo xicchihua ce cuentah]].",
        "nocreate-loggedin": "Ahmo hueli ticchihua yancuic tlahcuilolamatl.",
        "searchprofile-advanced": "Huehca ōmpa",
        "searchprofile-articles-tooltip": "Tictēmōz īpan $1",
        "searchprofile-images-tooltip": "motemoz tlapiyaliztecpaliztli",
-       "searchprofile-everything-tooltip": "Tictēmōz mochi tlapiyalizpan (mopiyah tēixnāmiquiliztli zāzanilli)",
-       "search-result-size": "$1 ({{PLURAL:$2|1 tlahtōl|$2 tlahtōltin}})",
+       "searchprofile-everything-tooltip": "Tictemoz ipan mochi tlapiyaliztli (noihuan tlahcuilolamatl iteixnamiquiliz)",
+       "search-result-size": "$1 ({{PLURAL:$2|1 tlahtol|$2 tlahtoltin}})",
        "search-redirect": "(ixquichca ompa mitzhuica $1)",
        "search-section": "(tlahtōltzintli $1)",
        "search-category": "(neneuhcayotl $1)",
        "recentchanges": "Yancuic tlapatlaliztli",
        "recentchanges-legend": "Yancuīc tlapatlaliztechcopa tlanequiliztli",
        "recentchanges-summary": "Tictoquiliz itlapatlaliz oc yancuic inahuac huiqui inin tlahcuilolpan.",
-       "recentchanges-label-newpage": "Inīn tlapatlaliztli ōquiyōcox cē yancuīc āmatl",
+       "recentchanges-label-newpage": "Inin tlapatlaliztli oquiyocox ce yancuic tlahcuilolamatl",
        "recentchanges-label-minor": " Inin tepiton tlapatlaliztli",
        "recentchanges-label-bot": "Inin tlapaltlaliztli oquichiuh ce robot",
        "rclistfrom": "Xiquittaz yancuic tlapatlaliztli ixquichca $3 ihuicpa $2",
        "listfiles-latestversion-yes": "Quēmah",
        "listfiles-latestversion-no": "Ahmō",
        "file-anchor-link": "Tlapiyaliztecpanaliztli",
-       "filehist": "Ihcuilōlli ītlahtōllo",
+       "filehist": "Tlahcuilolli itlahtollo",
        "filehist-deleteall": "tiquimpolōz mochīntīn",
        "filehist-deleteone": "xicpolo",
        "filehist-revert": "tlacuepāz",
        "filedelete-edit-reasonlist": "Xiquihto ipampa ticpohpoloznequi in",
        "mimesearch": "MIME tlatemoliztli",
        "mimetype": "MIME iuhcāyōtl:",
-       "download": "tictemōz",
+       "download": "tictemoz",
        "unwatchedpages": "Zāzaniltin ahmo motlachiya",
        "listredirects": "Tlacuepaliztli",
        "unusedtemplates": "Nemachiyōtīlli ahmotequitiltiah",
        "allmessages-filter-all": "Mochi",
        "allmessages-language": "Tlahtolli:",
        "allmessages-filter-submit": "Tiyaz",
-       "thumbnail-more": "Tiquihuēyiyāz",
+       "thumbnail-more": "Tichueyiyaz",
        "thumbnail_error": "Aiuhcāyōtl ihcuāc mochīhuaya tepitōntli: $1",
        "import": "Tiquincōhuāz zāzaniltin",
        "import-interwiki-sourcewiki": "Mēyalhuiqui:",
        "tooltip-ca-edit": "Ticpatlaz inin tlahcuilolli",
        "tooltip-ca-addsection": "Ticpehualiz ce yancuic xeliuhcayotl.",
        "tooltip-ca-viewsource": "Inīn zāzanilli ōmoquīxti. Tihuelīti tiquitta ītlahtōlcaquiliztilōni.",
-       "tooltip-ca-history": "Achtopa āxcān zāzanilli īhuān in tlatequitiltilīlli ōquinchīuhqueh",
+       "tooltip-ca-history": "In tlein ye oquichiuhqueh ipan inin tlahcuilolamatl",
        "tooltip-ca-protect": "Ticquīxtiāz inīn zāzanilli",
        "tooltip-ca-delete": "Ticpolōz inīn zāzanilli",
        "tooltip-ca-undelete": "Ahticpolōz inīn zāzanilli",
        "tooltip-p-logo": "Tiquittaz in yacatlahcuilolli",
        "tooltip-n-mainpage": "Tiquittaz in yacatlahcuilolli",
        "tooltip-n-mainpage-description": "Tiquittaz in yacatlahcuilolli",
-       "tooltip-n-portal": "Tlachīhualiztechcopa, inōn tihuelīti titlachīhua, tlatēmoyān",
+       "tooltip-n-portal": "Itech totequitiliz, in canin titlachihua, in canin titlatemoa",
        "tooltip-n-recentchanges": "Iyancuictlapatlalizhuan ipan huiqui",
        "tooltip-n-randompage": "Tiquittaz cecen tlahcuilolli",
-       "tooltip-n-help": "In tēmachtīlōyān",
+       "tooltip-n-help": "In canin ticmachtiz",
        "tooltip-t-whatlinkshere": "Mochintin tlahcuiloltin huiquipan quitzonhuiliah nican",
        "tooltip-t-recentchangeslinked": "Yancuic tlapatlaliztli ipan tlahcuiloltin tlein quitzonhuilia nican",
        "tooltip-feed-rss": "RSS tlachicahualiztli inin tlahcuilolamatl",
        "tooltip-t-print": "Tepoztlahcuilolli",
        "tooltip-ca-nstab-main": "Tiquittaz tlein quipiya in tlahcuilolli",
        "tooltip-ca-nstab-user": "Xiquitta tequitiuhqui itlahcuilolamauh",
-       "tooltip-ca-nstab-special": "Inīn nōncuahquīzqui āmatl, auh ahmohuelitizpatla",
+       "tooltip-ca-nstab-special": "Inin noncuahquizqui amatl, auh ahmohueli in ticpatlaz",
        "tooltip-ca-nstab-project": "Xiquitta in tlayecantequitl itlahcuilolamauh",
-       "tooltip-ca-nstab-image": "Xiquittāz īxipzāzanilli",
+       "tooltip-ca-nstab-image": "Xiquittaz tlahcuilolpiyalli",
        "tooltip-ca-nstab-mediawiki": "Xiquitta in tlahcuilōltzin",
        "tooltip-ca-nstab-template": "Xiquitta in nemachiyōtīlli",
        "tooltip-ca-nstab-help": "Xiquitta in tēpalēhuiliztli zāzanilli",
index 1f4f82c..d856230 100644 (file)
        "deleting-backlinks-warning": "گواښنه:''' دا مخ چې تاسې يې ړنگوی د [[Special:WhatLinksHere/{{FULLPAGENAME}}|نورو مخونو]] سره تړلی او يا هم په نورو مخونو کې نغاړل شوی دی.",
        "rollbacklink": "په شابېول",
        "rollbacklinkcount": "$1 {{PLURAL:$1|سمون|سمونونه}} پرشابېول",
+       "rollbacklinkcount-morethan": "تر $1 زيات {{PLURAL:$1|بدلون|بدلونونه}} پرشا بوځي",
        "editcomment": "د سمون لنډيز دا وو: \"''$1''\".",
        "changecontentmodel-title-label": "مخ سرليک",
        "changecontentmodel-model-label": "د نوي مېنځپانگې موډل",
        "limitreport-expansiondepth-value": "$1/$2",
        "limitreport-expensivefunctioncount": "د قیمتي پارسير فعالیت شمیرې",
        "limitreport-expensivefunctioncount-value": "$1/$2",
+       "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|ټکۍ|ټکي}}",
        "expandtemplates": "کينډۍ غځول",
        "expand_templates_intro": "په دا ځانګړي مخ کي متن پاڼه ترلاسه کیږي کوم چي په ټول ډوله مخونو کي کارول کیږي دلته دا مخ بيا بیا وده کوي. د تحلیل دندو لکه <code><nowiki>{{</nowiki>#language:…}}</code> او متغیرونه لکه <code><nowiki>{{</nowiki>CURRENTDAY}}</code> هم سره نښلوي — په واقعیت کې، د ډلو دننه هر څه. دا خپله د ميډياويکي په اړونده مرحله کولو سره ترسره کيږي.",
        "expand_templates_title": "د موزوع سرليک، د {{FULLPAGENAME}} لپاره او نور:",
        "restrictionsfield-badip": "ناباوره آي پي  آدرس او حدود د : $1",
        "restrictionsfield-label": "اجازه ورکړل شوي آي پي حدودونه:",
        "restrictionsfield-help": "په هر کرښه کې د اي پي پته یا د سینیر رینټ داخل کړئ. د هر شی فعالولو لپاره دا ارزښت وکاروئ: <code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "edit-error-short": "تيروتنه: $1",
+       "edit-error-long": "تيروتنې:$1",
        "revid": "بیاکتنه $1",
        "pageid": "د مخ پېژند$1",
        "rawhtml-notallowed": "لیبلونه &lt;html&gt; د منظمو ليکنو څخه بهر نشي کارول کیدی.",
index 5b8dc62..0a17742 100644 (file)
        "copyrightwarning": "ياد رکندا ته {{SITENAME}} لاءِ سموريون ڀاڱيداريون $2 تحت پڌريون ڪجن ٿيون (تفصيلن لاءِ $1 ڏسندا). اوهان جي تحرير کي {{SITENAME}} جي قائدن تحت ترميمي سگهجي ٿو. جيڪڏهن اوهان نه ٿا چاهيو ته اوهان جي لکڻين کي بي رحميءَ سان ترميميو وڃي يا ورهائي عام ڪيو وڃي ته پوءِ پنهنجي لکڻي هتي جمع نه ڪرايو. پنهنجو مواد هتي جمع ڪرڻ جو مطلب هوندو ته توهان کي جمع ڪرايل مواد جي مفت فراهمي ۽ کُليل تبديليءَ تي ڪو به اعتراز ناهي.<br />\nتوهان اهڙي پڪ ڏيڻ جا پابند پڻ آهيو ته توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن مفت وسيلي تان ڪاپي ڪيو آهي.\n'''تحفظيل حق ۽ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ کان سواءِ هتي جمع نه ڪريو.'''",
        "copyrightwarning2": "ياد رکندا تہ {{SITENAME}} لاءِ سموريون ڀاڱيدارين کي ٻيا ڀاڱيدار سنواري، بدلائي، يا ڊاهي سگھن ٿا. جيڪڏهن اوهان نہ ٿا چاهيو تہ اوهان جي لکڻين کي بي رحميءَ سان ترميميو وڃي يا ورهائي عام ڪيو وڃي تہ پوءِ پنهنجي لکڻي هتي جمع نہ ڪرايو.</br>\nتوهان اهڙي پڪ ڏيڻ جا پابند پڻ آهيو تہ توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن اهڙي ئي مفت عوامي وسيلي تان ڪاپي ڪيو آهي. (تفصيلن لاءِ $1 ڏسندا).\n\n<strong>تحفظيل حق ۽ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ بنان هتي جمع نہ ڪريو.</strong>",
        "protectedpagewarning": "<strong>چتاءُ: هيءَ صفحو اهڙيءَ ريت تحفظيو ويو آهي جو فقط منتظمين ئي ان کي سنواري سگھن ٿا. </strong>\nتازه ترين لاگ حوالي طور پيش ڪجي ٿو:",
-       "semiprotectedpagewarning": "<strong>نوٽ:</strong> هيءَ صفحو اهڙيءَ ريت تحفظيو ويو آهي جو فقط کاتيدار واپرائيندڙ ئي ان کي سنواري سگھن ٿا.\nتازه ترين لاگ حوالي طور پيش ڪجي ٿو:",
+       "semiprotectedpagewarning": "<strong>نوٽ:</strong> هيءَ صفحو اهڙيءَ ريت تحفظيو ويو آهي جو فقط خودڪار نموني پڪ ڪيل واپرائيندڙ ئي ان کي سنواري سگھن ٿا.\nتازه ترين لاگ حوالي طور پيش ڪجي ٿو:",
        "templatesused": "هن صفحي تي استعمال ٿيندڙ {{PLURAL:$1|سانچو|سانچا}}:",
        "templatesusedpreview": "هن پيش نگاھ ۾ استعمال ٿيل {{PLURAL:$1|سانچو|سانچا}}:",
        "templatesusedsection": "هن سيڪشن ۾ استعمال ٿيل {{PLURAL:$1|سانچو|سانچا}}:",
        "recentchangesdays": "تازين تبديلين ۾ ڏيکارڻ جي لاءِ ڏينهن:",
        "recentchangesdays-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
        "recentchangescount": "عدم پيروي جي صورت ۾ ڏيکارڻ جي لاءِ ترميمون:",
-       "prefs-help-recentchangescount": "ان ۾ تازيون تبديليون، صفحن جي سوانح، ۽ لاگ شامل آهن.",
+       "prefs-help-recentchangescount": "وڌ ۾ وڌ انگ: 1000",
        "savedprefs": "توھان جون ترجيحون سانڍجي چڪيون آھن.",
        "savedrights": "{{GENDER:$1|$1}} جا واپرائيندڙ گروھ سانڍجي چڪا آھن.",
        "timezonelegend": "اوقاتي زون:",
index 4749222..859544e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * QUnit 2.4.0
+ * QUnit 2.6.0
  * https://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2017-07-08T15:20Z
+ * Date: 2018-03-27T02:18Z
  */
 
 /** Font Family and Sizes */
index bb8f31d..d7b22dd 100644 (file)
@@ -1,17 +1,17 @@
 /*!
- * QUnit 2.4.0
+ * QUnit 2.6.0
  * https://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2017-07-08T15:20Z
+ * Date: 2018-03-27T02:18Z
  */
 (function (global$1) {
   'use strict';
 
-  global$1 = global$1 && 'default' in global$1 ? global$1['default'] : global$1;
+  global$1 = global$1 && global$1.hasOwnProperty('default') ? global$1['default'] : global$1;
 
   var window = global$1.window;
   var self$1 = global$1.self;
   var priorityCount = 0;
   var unitSampler = void 0;
 
+  // This is a queue of functions that are tasks within a single test.
+  // After tests are dequeued from config.queue they are expanded into
+  // a set of tasks in this queue.
+  var taskQueue = [];
+
   /**
-   * Advances the ProcessingQueue to the next item if it is ready.
-   * @param {Boolean} last
+   * Advances the taskQueue to the next task. If the taskQueue is empty,
+   * process the testQueue
    */
   function advance() {
+       advanceTaskQueue();
+
+       if (!taskQueue.length) {
+               advanceTestQueue();
+       }
+  }
+
+  /**
+   * Advances the taskQueue to the next task if it is ready and not empty.
+   */
+  function advanceTaskQueue() {
        var start = now();
        config.depth = (config.depth || 0) + 1;
 
-       while (config.queue.length && !config.blocking) {
+       while (taskQueue.length && !config.blocking) {
                var elapsedTime = now() - start;
 
                if (!defined.setTimeout || config.updateRate <= 0 || elapsedTime < config.updateRate) {
-                       if (priorityCount > 0) {
-                               priorityCount--;
-                       }
-
-                       config.queue.shift()();
+                       var task = taskQueue.shift();
+                       task();
                } else {
-                       setTimeout(advance, 13);
+                       setTimeout(advance);
                        break;
                }
        }
 
        config.depth--;
+  }
 
+  /**
+   * Advance the testQueue to the next test to process. Call done() if testQueue completes.
+   */
+  function advanceTestQueue() {
        if (!config.blocking && !config.queue.length && config.depth === 0) {
                done();
+               return;
        }
-  }
 
-  function addToQueueImmediate(callback) {
-       if (objectType(callback) === "array") {
-               while (callback.length) {
-                       addToQueueImmediate(callback.pop());
-               }
+       var testTasks = config.queue.shift();
+       addToTaskQueue(testTasks());
 
-               return;
+       if (priorityCount > 0) {
+               priorityCount--;
        }
 
-       config.queue.unshift(callback);
-       priorityCount++;
+       advance();
+  }
+
+  /**
+   * Enqueue the tasks for a test into the task queue.
+   * @param {Array} tasksArray
+   */
+  function addToTaskQueue(tasksArray) {
+       taskQueue.push.apply(taskQueue, toConsumableArray(tasksArray));
   }
 
   /**
-   * Adds a function to the ProcessingQueue for execution.
-   * @param {Function|Array} callback
-   * @param {Boolean} priority
+   * Return the number of tasks remaining in the task queue to be processed.
+   * @return {Number}
+   */
+  function taskQueueLength() {
+       return taskQueue.length;
+  }
+
+  /**
+   * Adds a test to the TestQueue for execution.
+   * @param {Function} testTasksFunc
+   * @param {Boolean} prioritize
    * @param {String} seed
    */
-  function addToQueue(callback, prioritize, seed) {
+  function addToTestQueue(testTasksFunc, prioritize, seed) {
        if (prioritize) {
-               config.queue.splice(priorityCount++, 0, callback);
+               config.queue.splice(priorityCount++, 0, testTasksFunc);
        } else if (seed) {
                if (!unitSampler) {
                        unitSampler = unitSamplerGenerator(seed);
 
                // Insert into a random position after all prioritized items
                var index = Math.floor(unitSampler() * (config.queue.length - priorityCount + 1));
-               config.queue.splice(priorityCount + index, 0, callback);
+               config.queue.splice(priorityCount + index, 0, testTasksFunc);
        } else {
-               config.queue.push(callback);
+               config.queue.push(testTasksFunc);
        }
   }
 
        var runtime = now() - config.started;
        var passed = config.stats.all - config.stats.bad;
 
+       if (config.stats.all === 0) {
+
+               if (config.filter && config.filter.length) {
+                       throw new Error("No tests matched the filter \"" + config.filter + "\".");
+               }
+
+               if (config.module && config.module.length) {
+                       throw new Error("No tests matched the module \"" + config.module + "\".");
+               }
+
+               if (config.moduleId && config.moduleId.length) {
+                       throw new Error("No tests matched the moduleId \"" + config.moduleId + "\".");
+               }
+
+               if (config.testId && config.testId.length) {
+                       throw new Error("No tests matched the testId \"" + config.testId + "\".");
+               }
+
+               throw new Error("No tests were run.");
+       }
+
        emit("runEnd", globalSuite.end(true));
        runLoggingCallbacks("done", {
                passed: passed,
 
   var ProcessingQueue = {
        finished: false,
-       add: addToQueue,
-       addImmediate: addToQueueImmediate,
-       advance: advance
+       add: addToTestQueue,
+       advance: advance,
+       taskCount: taskQueueLength
   };
 
   var TestReport = function () {
                this.async = false;
                this.expected = 0;
        } else {
+               if (typeof this.callback !== "function") {
+                       var method = this.todo ? "todo" : "test";
+
+                       // eslint-disable-next-line max-len
+                       throw new TypeError("You must provide a function as a test callback to QUnit." + method + "(\"" + settings.testName + "\")");
+               }
+
                this.assert = new Assert(this);
        }
   }
                                _this.preserveEnvironment = true;
                        }
 
-                       if (hookName === "after" && hookOwner.unskippedTestsRun !== numberOfUnskippedTests(hookOwner) - 1 && config.queue.length > 2) {
+                       // The 'after' hook should only execute when there are not tests left and
+                       // when the 'after' and 'finish' tasks are the only tasks left to process
+                       if (hookName === "after" && hookOwner.unskippedTestsRun !== numberOfUnskippedTests(hookOwner) - 1 && (config.queue.length > 0 || ProcessingQueue.taskCount() > 2)) {
                                return;
                        }
 
 
        finish: function finish() {
                config.current = this;
+
+               if (this.steps.length) {
+                       var stepsList = this.steps.join(", ");
+                       this.pushFailure("Expected assert.verifySteps() to be called before end of test " + ("after using assert.step(). Unverified steps: " + stepsList), this.stack);
+               }
+
                if (config.requireExpects && this.expected === null) {
                        this.pushFailure("Expected number of assertions to be defined, but expect() was " + "not called.", this.stack);
                } else if (this.expected !== null && this.expected !== this.assertions.length) {
                }
 
                function runTest() {
-
-                       // Each of these can by async
-                       ProcessingQueue.addImmediate([function () {
+                       return [function () {
                                test.before();
-                       }, test.hooks("before"), function () {
+                       }].concat(toConsumableArray(test.hooks("before")), [function () {
                                test.preserveTestEnvironment();
-                       }, test.hooks("beforeEach"), function () {
+                       }], toConsumableArray(test.hooks("beforeEach")), [function () {
                                test.run();
-                       }, test.hooks("afterEach").reverse(), test.hooks("after").reverse(), function () {
+                       }], toConsumableArray(test.hooks("afterEach").reverse()), toConsumableArray(test.hooks("after").reverse()), [function () {
                                test.after();
                        }, function () {
                                test.finish();
 
        pushResult: function pushResult(resultInfo) {
                if (this !== config.current) {
-                       throw new Error("Assertion occured after test had finished.");
+                       throw new Error("Assertion occurred after test had finished.");
                }
 
                // Destructure of resultInfo = { result, actual, expected, message, negative }
                        result: resultInfo.result,
                        message: resultInfo.message,
                        actual: resultInfo.actual,
-                       expected: resultInfo.expected,
                        testId: this.testId,
                        negative: resultInfo.negative || false,
                        runtime: now() - this.started,
                        todo: !!this.todo
                };
 
+               if (hasOwn.call(resultInfo, "expected")) {
+                       details.expected = resultInfo.expected;
+               }
+
                if (!resultInfo.result) {
                        source = resultInfo.source || sourceFromStacktrace();
 
                        result: false,
                        message: message || "error",
                        actual: actual || null,
-                       expected: null,
                        source: source
                });
        },
                        then = promise.then;
                        if (objectType(then) === "function") {
                                resume = internalStop(test);
-                               then.call(promise, function () {
-                                       resume();
-                               }, function (error) {
-                                       message = "Promise rejected " + (!phase ? "during" : phase.replace(/Each$/, "")) + " \"" + test.testName + "\": " + (error && error.message || error);
-                                       test.pushFailure(message, extractStacktrace(error, 0));
-
-                                       // Else next test will carry the responsibility
-                                       saveGlobal();
-
-                                       // Unblock
-                                       resume();
-                               });
+                               if (config.notrycatch) {
+                                       then.call(promise, function () {
+                                               resume();
+                                       });
+                               } else {
+                                       then.call(promise, function () {
+                                               resume();
+                                       }, function (error) {
+                                               message = "Promise rejected " + (!phase ? "during" : phase.replace(/Each$/, "")) + " \"" + test.testName + "\": " + (error && error.message || error);
+                                               test.pushFailure(message, extractStacktrace(error, 0));
+
+                                               // Else next test will carry the responsibility
+                                               saveGlobal();
+
+                                               // Unblock
+                                               internalRecover(test);
+                                       });
+                               }
                        }
                }
        },
                        }
 
                        begin();
-               }, 13);
+               });
        } else {
                begin();
        }
        }, {
                key: "step",
                value: function step(message) {
+                       var assertionMessage = message;
                        var result = !!message;
 
                        this.test.steps.push(message);
 
+                       if (objectType(message) === "undefined" || message === "") {
+                               assertionMessage = "You must provide a message to assert.step";
+                       } else if (objectType(message) !== "string") {
+                               assertionMessage = "You must provide a string value to assert.step";
+                               result = false;
+                       }
+
                        return this.pushResult({
                                result: result,
-                               message: message || "You must provide a message to assert.step"
+                               message: assertionMessage
                        });
                }
 
        }, {
                key: "verifySteps",
                value: function verifySteps(steps, message) {
-                       this.deepEqual(this.test.steps, steps, message);
+
+                       // Since the steps array is just string values, we can clone with slice
+                       var actualStepsClone = this.test.steps.slice();
+                       this.deepEqual(actualStepsClone, steps, message);
+                       this.test.steps.length = 0;
                }
 
                // Specify the number of expected assertions to guarantee that failed test
                                message: message
                        });
                }
+       }, {
+               key: "rejects",
+               value: function rejects(promise, expected, message) {
+                       var result = false;
+
+                       var currentTest = this instanceof Assert && this.test || config.current;
+
+                       // 'expected' is optional unless doing string comparison
+                       if (objectType(expected) === "string") {
+                               if (message === undefined) {
+                                       message = expected;
+                                       expected = undefined;
+                               } else {
+                                       message = "assert.rejects does not accept a string value for the expected " + "argument.\nUse a non-string object value (e.g. validator function) instead " + "if necessary.";
+
+                                       currentTest.assert.pushResult({
+                                               result: false,
+                                               message: message
+                                       });
+
+                                       return;
+                               }
+                       }
+
+                       var then = promise && promise.then;
+                       if (objectType(then) !== "function") {
+                               var _message = "The value provided to `assert.rejects` in " + "\"" + currentTest.testName + "\" was not a promise.";
+
+                               currentTest.assert.pushResult({
+                                       result: false,
+                                       message: _message,
+                                       actual: promise
+                               });
+
+                               return;
+                       }
+
+                       var done = this.async();
+
+                       return then.call(promise, function handleFulfillment() {
+                               var message = "The promise returned by the `assert.rejects` callback in " + "\"" + currentTest.testName + "\" did not reject.";
+
+                               currentTest.assert.pushResult({
+                                       result: false,
+                                       message: message,
+                                       actual: promise
+                               });
+
+                               done();
+                       }, function handleRejection(actual) {
+                               var expectedType = objectType(expected);
+
+                               // We don't want to validate
+                               if (expected === undefined) {
+                                       result = true;
+                                       expected = actual;
+
+                                       // Expected is a regexp
+                               } else if (expectedType === "regexp") {
+                                       result = expected.test(errorString(actual));
+
+                                       // Expected is a constructor, maybe an Error constructor
+                               } else if (expectedType === "function" && actual instanceof expected) {
+                                       result = true;
+
+                                       // Expected is an Error object
+                               } else if (expectedType === "object") {
+                                       result = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;
+
+                                       // Expected is a validation function which returns true if validation passed
+                               } else {
+                                       if (expectedType === "function") {
+                                               result = expected.call({}, actual) === true;
+                                               expected = null;
+
+                                               // Expected is some other invalid type
+                                       } else {
+                                               result = false;
+                                               message = "invalid expected value provided to `assert.rejects` " + "callback in \"" + currentTest.testName + "\": " + expectedType + ".";
+                                       }
+                               }
+
+                               currentTest.assert.pushResult({
+                                       result: result,
+                                       actual: actual,
+                                       expected: expected,
+                                       message: message
+                               });
+
+                               done();
+                       });
+               }
        }]);
        return Assert;
   }();
        return false;
   }
 
+  // Handle an unhandled rejection
+  function onUnhandledRejection(reason) {
+       var resultInfo = {
+               result: false,
+               message: reason.message || "error",
+               actual: reason,
+               source: reason.stack || sourceFromStacktrace(3)
+       };
+
+       var currentTest = config.current;
+       if (currentTest) {
+               currentTest.assert.pushResult(resultInfo);
+       } else {
+               test("global failure", extend(function (assert) {
+                       assert.pushResult(resultInfo);
+               }, { validTest: true }));
+       }
+  }
+
   var focused = false;
   var QUnit = {};
   var globalSuite = new SuiteReport();
   QUnit.isLocal = !(defined.document && window.location.protocol !== "file:");
 
   // Expose the current QUnit version
-  QUnit.version = "2.4.0";
+  QUnit.version = "2.6.0";
 
   function createModule(name, testEnvironment, modifiers) {
        var parentModule = moduleStack.length ? moduleStack.slice(-1)[0] : null;
                return sourceFromStacktrace(offset);
        },
 
-       onError: onError
+       onError: onError,
+
+       onUnhandledRejection: onUnhandledRejection
   });
 
   QUnit.pushFailure = pushFailure;
        if (defined.setTimeout) {
                setTimeout(function () {
                        begin();
-               }, 13);
+               });
        } else {
                begin();
        }
 
                var fixture = document.getElementById("qunit-fixture");
                if (fixture) {
-                       config.fixture = fixture.innerHTML;
+                       config.fixture = fixture.cloneNode(true);
                }
        }
 
                }
 
                var fixture = document.getElementById("qunit-fixture");
-               if (fixture) {
-                       fixture.innerHTML = config.fixture;
+               var resetFixtureType = _typeof(config.fixture);
+               if (resetFixtureType === "string") {
+
+                       // support user defined values for `config.fixture`
+                       var newFixture = document.createElement("div");
+                       newFixture.setAttribute("id", "qunit-fixture");
+                       newFixture.innerHTML = config.fixture;
+                       fixture.parentNode.replaceChild(newFixture, fixture);
+               } else {
+                       var clonedFixture = config.fixture.cloneNode(true);
+                       fixture.parentNode.replaceChild(clonedFixture, fixture);
                }
        }
 
                        // Skip inherited or undefined properties
                        if (hasOwn.call(params, key) && params[key] !== undefined) {
 
-                               // Output a parameter for each value of this key (but usually just one)
+                               // Output a parameter for each value of this key
+                               // (but usually just one)
                                arrValue = [].concat(params[key]);
                                for (i = 0; i < arrValue.length; i++) {
                                        querystring += encodeURIComponent(key);
                if (config.altertitle && document$$1.title) {
 
                        // Show ✖ for good, ✔ for bad suite result in title
-                       // use escape sequences in case file gets loaded with non-utf-8-charset
+                       // use escape sequences in case file gets loaded with non-utf-8
+                       // charset
                        document$$1.title = [stats.failedTests ? "\u2716" : "\u2714", document$$1.title.replace(/^[\u2714\u2716] /i, "")].join(" ");
                }
 
                if (running) {
                        bad = QUnit.config.reorder && details.previousFailure;
 
-                       running.innerHTML = (bad ? "Rerunning previously failed test: <br />" : "Running: <br />") + getNameHtml(details.name, details.module);
+                       running.innerHTML = [bad ? "Rerunning previously failed test: <br />" : "Running: <br />", getNameHtml(details.name, details.module)].join("");
                }
        });
 
 
                return ret;
        };
+
+       // Listen for unhandled rejections, and call QUnit.onUnhandledRejection
+       window.addEventListener("unhandledrejection", function (event) {
+               QUnit.onUnhandledRejection(event.reason);
+       });
   })();
 
   /*
                                line = text.substring(lineStart, lineEnd + 1);
                                lineStart = lineEnd + 1;
 
-                               if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined) {
+                               var lineHashExists = lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined;
+
+                               if (lineHashExists) {
                                        chars += String.fromCharCode(lineHash[line]);
                                } else {
                                        chars += String.fromCharCode(lineArrayLength);
index 46bf2c6..dabf66b 100644 (file)
@@ -316,6 +316,10 @@ class CSSMinTest extends MediaWikiTestCase {
                                [ 'background-image: url("");', false, '/example', false ],
                                'background-image: url("");',
                        ],
+                       'Single quote with outer spacing' => [
+                               [ "background-image: url( '' );", false, '/example', false ],
+                               "background-image: url( '' );",
+                       ],
                ];
        }
 
@@ -390,6 +394,11 @@ class CSSMinTest extends MediaWikiTestCase {
                                'foo { background: url(/static/foo.png?query=yes); }',
                                'foo { background: url(https://expand.example/static/foo.png?query=yes); }',
                        ],
+                       [
+                               'Path-relative URL with query',
+                               "foo { background: url(?query=yes); }",
+                               'foo { background: url(http://localhost/w/?query=yes); }',
+                       ],
                        [
                                'Remote URL (unnecessary quotes not preserved)',
                                'foo { background: url("http://example.org/w/unnecessary-quotes.png"); }',
@@ -534,6 +543,11 @@ class CSSMinTest extends MediaWikiTestCase {
                                'foo { background: url( "http://localhost/styles.css?quoted=double" ) }',
                                'foo { background: url(http://localhost/styles.css?quoted=double) }',
                        ],
+                       [
+                               'Background URL (single quoted, containing spaces, with outer spacing)',
+                               "foo { background: url( ' red.gif ' ); }",
+                               'foo { background: url("http://localhost/w/ red.gif "); }',
+                       ],
                        [
                                'Simple case with comments before url',
                                'foo { prop: /* some {funny;} comment */ url(bar.png); }',
index e523a31..91ce9ea 100644 (file)
@@ -91,10 +91,11 @@ class LogFormatterTest extends MediaWikiLangTestCase {
 
                $formatter->setShowUserToolLinks( false );
                $paramsWithoutTools = $formatter->getMessageParametersForTesting();
-               unset( $formatter->parsedParameters );
 
-               $formatter->setShowUserToolLinks( true );
-               $paramsWithTools = $formatter->getMessageParametersForTesting();
+               $formatter2 = LogFormatter::newFromEntry( $entry );
+               $formatter2->setContext( $this->context );
+               $formatter2->setShowUserToolLinks( true );
+               $paramsWithTools = $formatter2->getMessageParametersForTesting();
 
                $userLink = Linker::userLink(
                        $this->user->getId(),
index 024801a..ca9f846 100644 (file)
@@ -41,7 +41,7 @@ exports.config = {
        ],
        // Patterns to exclude.
        exclude: [
-               './extensions/CirrusSearch/tests/selenium/specs/**/*.js'
+               relPath( './extensions/CirrusSearch/tests/selenium/specs/**/*.js' )
        ],
 
        // ============
@@ -175,7 +175,7 @@ exports.config = {
        // See the full list at http://mochajs.org/
        mochaOpts: {
                ui: 'bdd',
-               timeout: 20000
+               timeout: 60000
        },
 
        // =====