Merge "Fix SpecialPageFactory list handling"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 1 Oct 2014 21:55:30 +0000 (21:55 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 1 Oct 2014 21:55:30 +0000 (21:55 +0000)
32 files changed:
RELEASE-NOTES-1.24
RELEASE-NOTES-1.25
includes/DefaultSettings.php
includes/OutputPage.php
includes/api/ApiUserrights.php
includes/htmlform/HTMLForm.php
includes/jobqueue/jobs/ThumbnailRenderJob.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialImport.php
includes/specials/SpecialSearch.php
languages/i18n/be-tarask.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/diq.json
languages/i18n/it.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pms.json
languages/i18n/sc.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/uk.json
languages/i18n/zh-hans.json
maintenance/findMissingFiles.php
resources/Resources.php
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/icons.less
resources/src/mediawiki/mediawiki.jqueryMsg.js
tests/phpunit/includes/specials/SpecialBooksourcesTest.php [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js

index 1f4fcfe..2b5136e 100644 (file)
@@ -71,6 +71,8 @@ production.
   will not send a rel=canonical pointing to a variant-neutral page, however
   we will send rel=alternate.
 * $wgResourceLoaderLESSFunctions has been deprecated and will be removed in the future.
+* $wgGoToEdit has been removed. Use the SpecialSearchNogomatch hook for similar
+  functionality.
 
 === New features in 1.24 ===
 * Added new hook WatchlistEditorBeforeFormRender, allowing subscribers to
index e5a6cd1..e322007 100644 (file)
@@ -22,6 +22,8 @@ production.
 === Bug fixes in 1.25 ===
 * (bug 71003) No additional code will be generated to try to load CSS-embedded
   SVG images in Internet Explorer 6 and 7, as they don't support them anyway.
+* (bug 67021) On Special:BookSources, corrected validation of ISBNs (both
+  10- and 13-digit forms) containing "X".
 
 === Action API changes in 1.25 ===
 * (bug 65403) XML tag highlighting is now only performed for formats
index e9b5746..78091df 100644 (file)
@@ -5626,11 +5626,6 @@ $wgPreviewOnOpenNamespaces = array(
        NS_CATEGORY => true
 );
 
-/**
- * Go button goes straight to the edit screen if the article doesn't exist.
- */
-$wgGoToEdit = false;
-
 /**
  * Enable the UniversalEditButton for browsers that support it
  * (currently only Firefox with an extension)
index e1b6e0e..e9fec18 100644 (file)
@@ -179,14 +179,12 @@ class OutputPage extends ContextSource {
 
        protected $mFeedLinksAppendQuery = null;
 
-       /** @var array
-        * What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
+       /**
+        * @var int
+        * The level of 'untrustworthiness' allowed for modules loaded on this page.
         * @see ResourceLoaderModule::$origin
-        * ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
         */
-       protected $mAllowedModules = array(
-               ResourceLoaderModule::TYPE_COMBINED => ResourceLoaderModule::ORIGIN_ALL,
-       );
+       protected $mAllowedModuleOrigin = ResourceLoaderModule::ORIGIN_ALL;
 
        /** @var bool Whether output is disabled.  If this is true, the 'output' method will do nothing. */
        protected $mDoNothing = false;
@@ -1332,48 +1330,65 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Do not allow scripts which can be modified by wiki users to load on this page;
-        * only allow scripts bundled with, or generated by, the software.
+        * Restrict the page to loading modules bundled the software.
+        *
+        * Disallows the queue to contain any modules which can be modified by wiki
+        * users to load on this page.
         */
        public function disallowUserJs() {
-               $this->reduceAllowedModules(
-                       ResourceLoaderModule::TYPE_SCRIPTS,
-                       ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
-               );
+               $this->reduceAllowedModuleOrigin( ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL );
        }
 
        /**
-        * Show what level of JavaScript / CSS untrustworthiness is allowed on this page
+        * Get the level of JavaScript / CSS untrustworthiness allowed on this page.
+        *
         * @see ResourceLoaderModule::$origin
-        * @param string $type ResourceLoaderModule TYPE_ constant
+        * @param string $type Unused: Module origin allowance used to be fragmented by
+        *  ResourceLoaderModule TYPE_ constants.
         * @return int ResourceLoaderModule ORIGIN_ class constant
         */
-       public function getAllowedModules( $type ) {
-               if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
-                       return min( array_values( $this->mAllowedModules ) );
-               } else {
-                       return isset( $this->mAllowedModules[$type] )
-                               ? $this->mAllowedModules[$type]
-                               : ResourceLoaderModule::ORIGIN_ALL;
-               }
+       public function getAllowedModules( $type = null ) {
+               return $this->mAllowedModuleOrigin;
        }
 
        /**
         * Set the highest level of CSS/JS untrustworthiness allowed
+        *
+        * @deprecated since 1.24 Raising level of allowed untrusted content is no longer supported.
+        *  Use reduceAllowedModuleOrigin() instead.
+        *
         * @param string $type ResourceLoaderModule TYPE_ constant
-        * @param int $level ResourceLoaderModule class constant
+        * @param int $level ResourceLoaderModule ORIGIN_ constant
         */
        public function setAllowedModules( $type, $level ) {
-               $this->mAllowedModules[$type] = $level;
+               wfDeprecated( __METHOD__, '1.24' );
+               $this->reduceAllowedModuleOrigin( $level );
        }
 
        /**
-        * As for setAllowedModules(), but don't inadvertently make the page more accessible
-        * @param string $type
-        * @param int $level ResourceLoaderModule class constant
+        * Limit the highest level of CSS/JS untrustworthiness allowed.
+        *
+        * @deprecated since 1.24 Module allowance is no longer fragmented by content type.
+        *  Use reduceAllowedModuleOrigin() instead.
+        *
+        * @param string $type ResourceLoaderModule TYPE_ constant
+        * @param int $level ResourceLoaderModule ORIGIN_ class constant
         */
        public function reduceAllowedModules( $type, $level ) {
-               $this->mAllowedModules[$type] = min( $this->getAllowedModules( $type ), $level );
+               wfDeprecated( __METHOD__, '1.24' );
+               $this->reduceAllowedModuleOrigin( $level );
+       }
+
+       /**
+        * Limit the highest level of CSS/JS untrustworthiness allowed.
+        *
+        * If passed the same or a higher level than the current level of untrustworthiness set, the
+        * level will remain unchanged.
+        *
+        * @param int $level ResourceLoaderModule class constant
+        */
+       public function reduceAllowedModuleOrigin( $level ) {
+               $this->mAllowedModuleOrigin = min( $this->mAllowedModuleOrigin, $level );
        }
 
        /**
index c3ceb34..66af4c5 100644 (file)
@@ -32,12 +32,28 @@ class ApiUserrights extends ApiBase {
 
        private $mUser = null;
 
+       /**
+        * Get a UserrightsPage object, or subclass.
+        * @return UserrightsPage
+        */
+       protected function getUserRightsPage() {
+               return new UserrightsPage;
+       }
+
+       /**
+        * Get all available groups.
+        * @return array
+        */
+       protected function getAllGroups() {
+               return User::getAllGroups();
+       }
+
        public function execute() {
                $params = $this->extractRequestParams();
 
                $user = $this->getUrUser( $params );
 
-               $form = new UserrightsPage;
+               $form = $this->getUserRightsPage();
                $form->setContext( $this->getContext() );
                $r['user'] = $user->getName();
                $r['userid'] = $user->getId();
@@ -65,7 +81,7 @@ class ApiUserrights extends ApiBase {
 
                $user = isset( $params['user'] ) ? $params['user'] : '#' . $params['userid'];
 
-               $form = new UserrightsPage;
+               $form = $this->getUserRightsPage();
                $form->setContext( $this->getContext() );
                $status = $form->fetchUser( $user );
                if ( !$status->isOK() ) {
@@ -94,11 +110,11 @@ class ApiUserrights extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
                        'add' => array(
-                               ApiBase::PARAM_TYPE => User::getAllGroups(),
+                               ApiBase::PARAM_TYPE => $this->getAllGroups(),
                                ApiBase::PARAM_ISMULTI => true
                        ),
                        'remove' => array(
-                               ApiBase::PARAM_TYPE => User::getAllGroups(),
+                               ApiBase::PARAM_TYPE => $this->getAllGroups(),
                                ApiBase::PARAM_ISMULTI => true
                        ),
                        'reason' => array(
index 6589b2a..4511046 100644 (file)
@@ -788,9 +788,14 @@ class HTMLForm extends ContextSource {
                $this->getOutput()->preventClickjacking();
                $this->getOutput()->addModules( 'mediawiki.htmlform' );
                if ( $this->isVForm() ) {
+                       // This is required for VForm HTMLForms that use that style regardless
+                       // of wgUseMediaWikiUIEverywhere (since they pre-date it).
+                       // When wgUseMediaWikiUIEverywhere is removed, this should be consolidated
+                       // with the addModuleStyles in SpecialPage->setHeaders.
                        $this->getOutput()->addModuleStyles( array(
                                'mediawiki.ui',
                                'mediawiki.ui.button',
+                               'mediawiki.ui.input',
                        ) );
                        // @todo Should vertical form set setWrapperLegend( false )
                        // to hide ugly fieldsets?
index ec68d7e..6b1e7e3 100644 (file)
@@ -81,6 +81,10 @@ class ThumbnailRenderJob extends Job {
                $thumbUrl = $file->getThumbUrl( $thumbName );
 
                if ( $wgUploadThumbnailRenderHttpCustomDomain ) {
+                       // Workaround for parse_url not handling scheme-less urls properly in PHP < 5.4.7
+                       if ( substr( $thumbUrl, 0, 2 ) === '//' ) {
+                               $thumbUrl = 'http:' . $thumbUrl;
+                       }
                        $thumbUrl = '//' . $wgUploadThumbnailRenderHttpCustomDomain . parse_url( $thumbUrl, PHP_URL_PATH );
                }
 
index e6750e1..f6b9d33 100644 (file)
@@ -26,7 +26,6 @@
  * The parser creates links to this page when dealing with ISBNs in wikitext
  *
  * @author Rob Church <robchur@gmail.com>
- * @todo Validate ISBNs using the standard check-digit method
  * @ingroup SpecialPage
  */
 class SpecialBookSources extends SpecialPage {
@@ -73,7 +72,9 @@ class SpecialBookSources extends SpecialPage {
                $sum = 0;
                if ( strlen( $isbn ) == 13 ) {
                        for ( $i = 0; $i < 12; $i++ ) {
-                               if ( $i % 2 == 0 ) {
+                               if ( $isbn[$i] === 'X' ) {
+                                       return false;
+                               } elseif ( $i % 2 == 0 ) {
                                        $sum += $isbn[$i];
                                } else {
                                        $sum += 3 * $isbn[$i];
@@ -81,11 +82,14 @@ class SpecialBookSources extends SpecialPage {
                        }
 
                        $check = ( 10 - ( $sum % 10 ) ) % 10;
-                       if ( $check == $isbn[12] ) {
+                       if ( (string)$check === $isbn[12] ) {
                                return true;
                        }
                } elseif ( strlen( $isbn ) == 10 ) {
                        for ( $i = 0; $i < 9; $i++ ) {
+                               if ( $isbn[$i] === 'X' ) {
+                                       return false;
+                               }
                                $sum += $isbn[$i] * ( $i + 1 );
                        }
 
@@ -93,7 +97,7 @@ class SpecialBookSources extends SpecialPage {
                        if ( $check == 10 ) {
                                $check = "X";
                        }
-                       if ( $check == $isbn[9] ) {
+                       if ( (string)$check === $isbn[9] ) {
                                return true;
                        }
                }
index eab4784..3d762aa 100644 (file)
@@ -30,6 +30,7 @@
  * @ingroup SpecialPage
  */
 class SpecialImport extends SpecialPage {
+       private $sourceName = false;
        private $interwiki = false;
        private $subproject;
        private $fullInterwikiPrefix;
@@ -98,7 +99,7 @@ class SpecialImport extends SpecialPage {
                $isUpload = false;
                $request = $this->getRequest();
                $this->namespace = $request->getIntOrNull( 'namespace' );
-               $sourceName = $request->getVal( "source" );
+               $this->sourceName = $request->getVal( "source" );
 
                $this->logcomment = $request->getText( 'log-comment' );
                $this->pageLinkDepth = $this->getConfig()->get( 'ExportMaxLinkDepth' ) == 0
@@ -109,14 +110,14 @@ class SpecialImport extends SpecialPage {
                $user = $this->getUser();
                if ( !$user->matchEditToken( $request->getVal( 'editToken' ) ) ) {
                        $source = Status::newFatal( 'import-token-mismatch' );
-               } elseif ( $sourceName == 'upload' ) {
+               } elseif ( $this->sourceName == 'upload' ) {
                        $isUpload = true;
                        if ( $user->isAllowed( 'importupload' ) ) {
                                $source = ImportStreamSource::newFromUpload( "xmlimport" );
                        } else {
                                throw new PermissionsError( 'importupload' );
                        }
-               } elseif ( $sourceName == "interwiki" ) {
+               } elseif ( $this->sourceName == "interwiki" ) {
                        if ( !$user->isAllowed( 'import' ) ) {
                                throw new PermissionsError( 'import' );
                        }
@@ -250,7 +251,8 @@ class SpecialImport extends SpecialPage {
                                        Xml::label( $this->msg( 'import-comment' )->text(), 'mw-import-comment' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                       Xml::input( 'log-comment', 50, '',
+                                       Xml::input( 'log-comment', 50, 
+                                               ( $this->sourceName == 'upload' ? $this->logcomment : '' ),
                                                array( 'id' => 'mw-import-comment', 'type' => 'text' ) ) . ' ' .
                                        "</td>
                                </tr>
@@ -430,7 +432,8 @@ class SpecialImport extends SpecialPage {
                                        Xml::label( $this->msg( 'import-comment' )->text(), 'mw-interwiki-comment' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                       Xml::input( 'log-comment', 50, '',
+                                       Xml::input( 'log-comment', 50,
+                                               ( $this->sourceName == 'interwiki' ? $this->logcomment : '' ),
                                                array( 'id' => 'mw-interwiki-comment', 'type' => 'text' ) ) . ' ' .
                                        "</td>
                                </tr>
index adc248e..88ab7d8 100644 (file)
@@ -197,14 +197,6 @@ class SpecialSearch extends SpecialPage {
                $title = Title::newFromText( $term );
                if ( !is_null( $title ) ) {
                        wfRunHooks( 'SpecialSearchNogomatch', array( &$title ) );
-                       wfDebugLog( 'nogomatch', $title->getFullText(), 'private' );
-
-                       # If the feature is enabled, go straight to the edit page
-                       if ( $this->getConfig()->get( 'GoToEdit' ) ) {
-                               $this->getOutput()->redirect( $title->getFullURL( array( 'action' => 'edit' ) ) );
-
-                               return;
-                       }
                }
                $this->showResults( $term );
        }
index 84c8d06..baccdbf 100644 (file)
        "mediastatistics-header-archive": "Сьціснутыя фарматы",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|залішняя коска ў канцы была выдаленая|залішнія коскі ў канцы былі выдаленыя|залішніх косак у канцы былі выдаленыя}} з JSON",
        "json-error-unknown": "Узьнікла праблема з JSON. Памылка: $1",
-       "json-error-depth": "Перавышаная максымальная глыбіня стэку"
+       "json-error-depth": "Перавышаная максымальная глыбіня стэку",
+       "json-error-state-mismatch": "Недазволены або няслушна сфармаваны JSON"
 }
index 372e545..32a5fcc 100644 (file)
        "minoredit": "Жим хийцам",
        "watchthis": "Латайе хӀара агӀо тергаме могӀанан юкъахь",
        "savearticle": "Дlайазъé агlо",
-       "preview": "Хьалха муха ю хьажа",
-       "showpreview": "Хьалха муха ю хьажар",
+       "preview": "Хьалха хьажар",
+       "showpreview": "Хьалха хьажар",
        "showdiff": "Хlоттина болу хийцам",
        "blankarticle": "<strong>ДӀахьедар:</strong> Ахьа кхуллуш йолу агӀо еса ю.\nЮху кнопка «{{int:savearticle}}» тӀетаӀаяхь, агӀо цхьа чулацам боцуш кхуллур ю.",
        "anoneditwarning": "'''Тергам бе''': Ахьа хьай цӀарца тадарш деш дац. Хьан IP-адрес дӀаяздина хира ду хӀокху агӀон истори чу.",
        "prefs-edits": "Нисдарийн дукхалла:",
        "prefsnologintext2": "Оьшу $1, гӀирс дӀанисбан.",
        "prefs-skin": "Кечяран тема",
-       "skin-preview": "Хьалха муха ю хьажа",
+       "skin-preview": "Хьалха хьажар",
        "datedefault": "Iад йитарца",
        "prefs-labs": "Муха ю хьажарна таронаш",
        "prefs-user-pages": "Декъашхочун агӀо",
        "prefs-timeoffset": "Хенан  гӀирс",
        "prefs-advancedediting": "Юкъара параметреш",
        "prefs-editor": "Тадар",
-       "prefs-preview": "Хьалха муха ю хьажар",
+       "prefs-preview": "Хьалха хьажар",
        "prefs-advancedrc": "Кхин гӀирс нисбар",
        "prefs-advancedrendering": "Кхин гӀирс нисбар",
        "prefs-advancedsearchoptions": "Кхин гӀирс нисбар",
        "license-header": "Бакъойалар",
        "nolicense": "Яц",
        "licenses-edit": "Лицензин параметраш хийца",
-       "license-nopreview": "(Хьалха муха ю хьажа цало)",
+       "license-nopreview": "(Хьалха хьажа цало)",
        "upload_source_url": "(ахьа хаьржина нийса, массо тӀекхочу интернет-адрес)",
        "upload_source_file": "(файл хьан компьютер чохь ю)",
        "listfiles-delete": "дӀаяккха",
        "tooltip-ca-nstab-category": "Категорешан агӀо",
        "tooltip-minoredit": "Къастам бé хӀокху хийцамна кӀеззиг болуш санна",
        "tooltip-save": "Хьан хийцамаш lалашбой",
-       "tooltip-preview": "Дехар до, агlо lалаш йарал хьалха хьажа муха йу яз!",
+       "tooltip-preview": "Дехар до, агӀо Ӏалаш ярал хьалха хьажа муха ю из!",
        "tooltip-diff": "Гайта долуш долу йозанах бина болу хийцам.",
-       "tooltip-compareselectedversions": "Хlокху шина хаьржина агlона башхо муха ю хьажа.",
+       "tooltip-compareselectedversions": "ХӀокху шина хаьржина агӀона башхо муха ю хьажа.",
        "tooltip-watch": "ТӀетоха хӀара агӀо сан тергаме могӀанан юкъа",
        "tooltip-watchlistedit-normal-submit": "Билгалйина цӀераш дӀаяха",
        "tooltip-watchlistedit-raw-submit": "Тергаме могӀам карлабаккха",
        "expand_templates_remove_nowiki": "ДӀайоху тегаш <nowiki> хилча",
        "expand_templates_generate_xml": "Гойту дитта цу XML",
        "expand_templates_generate_rawhtml": "Гайта HTML",
-       "expand_templates_preview": "Хьалха муха ю хьажа",
+       "expand_templates_preview": "Хьалха хьажар",
        "pagelanguage": "АгӀона мотт харжар",
        "pagelang-name": "АгӀо",
        "pagelang-language": "Мотт",
index 87a924a..70fd3fb 100644 (file)
        "nocookiesnew": "Uživatelský účet byl vytvořen, ale nejste přihlášeni. {{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím, zapněte je a poté se přihlaste svým novým uživatelským jménem a heslem.",
        "nocookieslogin": "{{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapněte je a zkuste znovu.",
        "nocookiesfornew": "Uživatelský účet nebyl založen, neboť jsme nebyli schopni potvrdit jeho původ.\nUjistěte se, že máte povoleny cookies, obnovte tuto stránku a zkuste to znovu.",
-       "noname": "Musíte uvést jméno svého účtu.",
+       "noname": "{{GENDER:|Nezadal|Nezadala|Nezadali}} jste platné uživatelské jméno.",
        "loginsuccesstitle": "Přihlášení bylo úspěšné",
        "loginsuccess": "Nyní jste přihlášen na {{grammar:6sg|{{SITENAME}}}} jako uživatel „$1“.",
        "nosuchuser": "Neexistuje uživatel se jménem „$1“. U uživatelských jmen se rozlišují malá/velká písmena. Zkontrolujte zápis, nebo si [[Special:UserLogin/signup|vytvořte nový účet]].",
index 73059b0..250d9fb 100644 (file)
        "booksources": "Çımeyê kıtaban",
        "booksources-search-legend": "Seba çımeyanê kıtaban cı geyre",
        "booksources-isbn": "ISBN:",
+       "booksources-search": "Cı geyre",
        "booksources-text": "listeya cêrıni, keyepelê kitap rotoxan o.",
        "booksources-invalid-isbn": "ISBN raşt nêasena bıewnê çımeyê orjinali, raşt kopya biya nê nêbiyaya?",
        "specialloguserlabel": "Kerdoğ:",
index 2c3a5fc..95af635 100644 (file)
@@ -74,7 +74,8 @@
                        "아라",
                        "Lucas2",
                        "Taxandru",
-                       "C.R."
+                       "C.R.",
+                       "Elitre"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "youhavenewmessagesmulti": "Hai nuovi messaggi su $1",
        "editsection": "modifica",
        "editold": "modifica",
-       "viewsourceold": "visualizza sorgente",
+       "viewsourceold": "visualizza wikitesto",
        "editlink": "modifica",
-       "viewsourcelink": "visualizza sorgente",
+       "viewsourcelink": "visualizza wikitesto",
        "editsectionhint": "Modifica la sezione $1",
        "toc": "Indice",
        "showtoc": "mostra",
        "perfcached": "I dati che seguono sono estratti da una copia ''cache'' del database, e potrebbero non essere aggiornati. Un massimo di {{PLURAL:$1|un risultato è disponibile|$1 risultati sono disponibili}} in cache.",
        "perfcachedts": "I dati che seguono sono estratti da una copia ''cache'' del database, il cui ultimo aggiornamento risale al $1. Un massimo di {{PLURAL:$4|un risultato è disponibile|$4 risultati è disponibile}} in cache.",
        "querypage-no-updates": "Gli aggiornamenti della pagina sono temporaneamente sospesi. I dati in essa contenuti non verranno aggiornati.",
-       "viewsource": "Visualizza sorgente",
-       "viewsource-title": "Visualizza sorgente di $1",
+       "viewsource": "Visualizza wikitesto",
+       "viewsource-title": "Visualizza wikitesto di $1",
        "actionthrottled": "Azione ritardata",
        "actionthrottledtext": "Come misura di sicurezza contro lo spam, l'esecuzione di alcune azioni è limitata a un numero massimo di volte in un determinato periodo di tempo, limite che in questo caso è stato superato. Si prega di riprovare tra qualche minuto.",
        "protectedpagetext": "Questa pagina è stata protetta per impedirne la modifica o altre operazioni.",
        "undelete-show-file-confirm": "Si desidera visualizzare la versione cancellata del file \"<nowiki>$1</nowiki>\" del $2 alle $3?",
        "undelete-show-file-submit": "Sì",
        "namespace": "Namespace:",
-       "invert": "inverti la selezione",
-       "tooltip-invert": "Seleziona questa casella per nascondere le modifiche alle pagine all'interno del namespace selezionato (ed il relativo namespace, se selezionato)",
+       "invert": "Inverti selezione",
+       "tooltip-invert": "Seleziona questa casella per nascondere le modifiche alle pagine all'interno del namespace selezionato (ed il namespace associato, se selezionato)",
        "namespace_association": "Namespace associato",
        "tooltip-namespace_association": "Seleziona questa casella per includere anche la pagina di discussione o l'oggetto del namespace associato con il namespace selezionato",
        "blanknamespace": "(Principale)",
index 757bafb..194096d 100644 (file)
        "minutes": "{{PLURAL:$1|$1 ମିନିଟ|$1 ମିନିଟ}}",
        "hours": "{{PLURAL:$1|$1 ଘଣ୍ଟା|$1 ଘଣ୍ଟା}}",
        "days": "{{PLURAL:$1|$1 ଦିନ|$1 ଦିନ}}",
+       "weeks": "{{PLURAL:$1|$1 ସପ୍ତାହ|$1 ସପ୍ତାହ}}",
        "months": "{{PLURAL:$1|$1 month|$1 months}}",
        "years": "{{PLURAL:$1|$1 year|$1 years}}",
        "ago": "$1 ଆଗରୁ",
index eead7c7..57e1fd7 100644 (file)
        "edit": "ਸੋਧੋ",
        "edit-local": "ਲੋਕਲ ਵੇਰਵਾ ਸੋਧੋ",
        "create": "ਬਣਾਓ",
+       "create-local": "ਕੋਈ ਸਥਾਨੀ ਵੇਰਵਾ ਜੋੜੋ",
        "editthispage": "ਇਹ ਸਫ਼ਾ ਸੋਧੋ",
        "create-this-page": "ਇਹ ਸਫ਼ਾ ਬਣਾਓ",
        "delete": "ਹਟਾਓ",
        "otherlanguages": "ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿਚ",
        "redirectedfrom": "($1 ਤੋਂ ਰੀਡਿਰੈਕਟ)",
        "redirectpagesub": "ਰੀਡਿਰੈਕਟ ਸਫ਼ਾ",
+       "redirectto": "ਇਸ ਵੱਲ ਮੋੜੋ:",
        "lastmodifiedat": "ਇਸ ਸਫ਼ੇ ਵਿੱਚ ਆਖ਼ਰੀ ਸੋਧ $1 ਨੂੰ $2 ਵਜੇ ਹੋਈ।",
        "viewcount": "ਇਹ ਸਫ਼ਾ {{PLURAL:$1|ਇੱਕ ਵਾਰ|$1 ਵਾਰ}} ਵੇਖਿਆ ਗਿਆ।",
        "protectedpage": "ਸੁਰੱਖਿਅਤ ਸਫ਼ਾ",
        "sort-descending": "ਘਟਦਾ ਕ੍ਰਮ",
        "sort-ascending": "ਵਧਦਾ ਕ੍ਰਮ",
        "nstab-main": "ਸਫ਼ਾ",
-       "nstab-user": "ਯà©\82à¨\9c਼ਰ à¨¸à¨«à¨¼ਾ",
+       "nstab-user": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨µà¨°à¨\95ਾ",
        "nstab-media": "ਮੀਡੀਆ ਸਫ਼ਾ",
        "nstab-special": "ਖ਼ਾਸ ਸਫ਼ਾ",
        "nstab-project": "ਪਰੋਜੈਕਟ ਸਫ਼ਾ",
        "invalidtitle-knownnamespace": "ਥਾਂ-ਨਾਮ \"$2\" ਅਤੇ ਲਿਖਤ \"$3\" ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ",
        "invalidtitle-unknownnamespace": "ਅਣਜਾਣ ਨਾਂ-ਸਥਾਨ ਗਿਣਤੀ $1 ਅਤੇ ਲਿਖਤ $2 ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ",
        "exception-nologin": "ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ",
-       "exception-nologin-text": "à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨\9cਾà¨\82 à¨\95ਾਰਵਾà¨\88 à¨¤à©\81ਹਾਡਾ à¨\87ਸ à¨µà¨¿à¨\95à©\80 â\80\99ਤà©\87 à¨²à¨¾à¨\97à¨\87ਨ à¨\95à©\80ਤਾ à¨¹à©\8bਣਾ à¨²à©\8bà©\9cਦà©\80 à¨¹à©\88।",
+       "exception-nologin-text": "à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨\9cਾà¨\82 à¨\95ਾਰਵਾà¨\88 à¨¤à©\81ੱà¨\95 à¨ªà©\81ੱà¨\9cਣ à¨µà¨¾à¨¸à¨¤à©\87 à¨®à¨¿à¨¹à¨°à¨¬à¨¾à¨¨à©\80 à¨\95ਰà¨\95à©\87 à¨¦à¨¾à¨\96਼ਲ à¨¹à©\8bਵà©\8b।",
        "virus-badscanner": "ਮੰਦਾ ਪ੍ਰਬੰਧ: ਅਣਜਾਣ ਵਾਇਰਸ ਸਕੈਨਰ: ''$1''",
        "virus-scanfailed": "ਸਕੈਨ ਫੇਲ੍ਹ ਹੈ (ਕੋਡ $1)",
        "virus-unknownscanner": "ਅਣਪਛਾਤਾ ਐਂਟੀਵਾਇਰਸ:",
        "welcomeuser": "$1 ਜੀ ਆਇਆਂ ਨੂੰ!",
        "welcomecreation-msg": "ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭੁੱਲੋ।",
        "yourname": "ਵਰਤੋਂਕਾਰ-ਨਾਂ:",
-       "userlogin-yourname": "ਯà©\82à¨\9c਼ਰ-ਨਾਂ",
-       "userlogin-yourname-ph": "à¨\86ਪਣਾ à¨¯à©\82à¨\9c਼ਰ-ਨਾਂ ਭਰੋ",
-       "createacct-another-username-ph": "ਯà©\82à¨\9c਼ਰ à¨¨à¨¾à¨\82 à¨¦à¨¿à¨\93",
+       "userlogin-yourname": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ ਨਾਂ",
+       "userlogin-yourname-ph": "à¨\86ਪਣਾ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ-ਨਾਂ ਭਰੋ",
+       "createacct-another-username-ph": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ-ਨਾà¨\82 à¨­à¨°à©\8b",
        "yourpassword": "ਪਾਸਵਰਡ:",
        "userlogin-yourpassword": "ਪਾਸਵਰਡ",
        "userlogin-yourpassword-ph": "ਆਪਣਾ ਪਾਸਵਰਡ ਦਿਉ",
        "createacct-benefit-body2": "{{PLURAL:$1|ਸਫ਼ਾ|ਸਫ਼ੇ}}",
        "createacct-benefit-body3": "ਹਾਲੀਆ {{PLURAL:$1|ਯੋਗਦਾਨੀ}}",
        "badretype": "ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੇ ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।",
-       "userexists": "ਯà©\82à¨\9c਼ਰ-ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ।",
+       "userexists": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ-ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ।",
        "loginerror": "ਲਾਗਇਨ ਗ਼ਲਤੀ",
        "createacct-error": "ਖਾਤਾ ਬਣਾਉਣ ਵਿਚ ਗਲਤੀ",
        "createaccounterror": "ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: $1",
-       "nocookiesnew": "ਯà©\82à¨\9c਼ਰ à¨\85à¨\95ਾà¨\8aà¨\82à¨\9f à¨¬à¨£à¨¾à¨\87à¨\86 à¨\97ਿà¨\86 à¨¹à©\88, à¨ªà¨° à¨¤à©\81ਸà©\80à¨\82 à¨²à¨¾à¨\97à¨\87ਨ à¨¨à¨¹à©\80à¨\82 à¨\95à©\80ਤਾ à¨¹à©\88।{{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.",
+       "nocookiesnew": "ਵਰਤà©\8bà¨\82Kà¨\86ਰ à¨\96ਾਤਾ à¨¬à¨£à¨¾à¨\87à¨\86 à¨\97ਿà¨\86 à¨¸à©\80 à¨ªà¨° à¨¤à©\81ਸà©\80à¨\82 à¨¦à¨¾à¨\96਼ਲ à¨¨à¨¹à©\80à¨\82 à¨¹à©\8bà¨\8f।{{SITENAME}} à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰਾà¨\82 à¨¨à©\82à©° à¨¦à¨¾à¨\96਼ਲ à¨\95ਰਨ à¨µà¨¾à¨¸à¨¤à©\87 à¨\95à©\81ੱà¨\95à©\80à¨\86à¨\82 à¨µà¨°à¨¤à¨¦à©\80 à¨¹à©\88। à¨¤à©\81ਸà©\80à¨\82 à¨\95à©\81ੱà¨\95à©\80à¨\86à¨\82 à¨¬à©°à¨¦ à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¹à¨¨à¥¤ à¨®à¨¿à¨¹à¨°à¨¬à¨¾à¨¨à©\80 à¨\95ਰà¨\95à©\87 à¨\87ਹਨਾà¨\82 à¨¨à©\82à©° à¨\9aਲਾà¨\89, à¨«à©\87ਰ à¨\86ਪਣà©\87 à¨¨à¨µà©\87à¨\82 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ-ਨਾà¨\82 à¨ªà¨\9bਾਣ-ਸ਼ਬਦ à¨¨à¨¾à¨²à¨¼ à¨¦à¨¾à¨\96਼ਲ à¨¹à©\8bਵà©\8b।",
        "nocookieslogin": "{{SITENAME}} ਯੂਜ਼ਰਾਂ ਨੂੰ ਲਾਗਇਨ ਕਰਨ ਲਈ ਕੂਕੀਜ਼ ਵਰਤਦੀ ਹੈ। ਤੁਹਾਡੇ ਕੂਕੀਜ਼ ਆਯੋਗ ਕੀਤੇ ਹੋਏ ਹਨ। ਉਨ੍ਹਾਂ ਨੂੰ ਯੋਗ ਕਰਕੇ ਮੁੜ ਟਰਾਈ ਕਰੋ।",
        "nocookiesfornew": "ਵਰਤੋਂਕਾਰ ਖਾਤਾ ਨਹੀਂ ਬਣਾਇਆ ਗਿਆ ਕਿਉਂਕਿ ਅਸੀਂ ਇਹਦੇ ਸਰੋਤ ਨੂੰ ਤਸਦੀਕ ਨਹੀਂ ਕਰ ਸਕੇ।\nਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੀਆਂ ਕੁਕੀਆਂ ਕੰਮ ਕਰ ਰਹੀਆਂ ਹਨ, ਸਫ਼ਾ ਫੇਰ ਲੋਡ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
        "noname": "ਤੁਸੀਂ ਇੱਕ ਸਹੀ ਯੂਜ਼ਰ-ਨਾਂ ਨਹੀਂ ਦਿੱਤਾ।",
        "wrongpassword": "ਗ਼ਲਤ ਪਾਸਵਰਡ ਦਿੱਤਾ ਹੈ। ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।",
        "wrongpasswordempty": "ਖ਼ਾਲੀ ਪਾਸਵਰਡ ਦਿੱਤਾ ਹੈ। ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।",
        "passwordtooshort": "ਪਾਸਵਰਡ {{PLURAL:$1|1 ਅੱਖਰ|$1 ਅੱਖਰਾਂ}} ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ।",
-       "password-name-match": "ਤà©\81ਹਾਡਾ à¨ªà¨¾à¨¸à¨µà¨°à¨¡ à¨¤à©\81ਹਾਡà©\87 à¨¯à©\82à¨\9c਼ਰ ਨਾਂ ਤੋਂ ਵੱਖਰਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
+       "password-name-match": "ਤà©\81ਹਾਡਾ à¨ªà¨\9bਾਣ-ਸ਼ਬਦ à¨¤à©\81ਹਾਡà©\87 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਨਾਂ ਤੋਂ ਵੱਖਰਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
        "password-login-forbidden": "ਇਹ ਯੂਜ਼ਰ-ਨਾਂ ਅਤੇ ਪਾਸਵਰਡ ਵਰਤਣ ਦੀ ਮਨਾਹੀ ਹੈ।",
        "mailmypassword": "ਨਵਾਂ ਪਾਸਵਰਡ ਈ-ਮੇਲ ਕਰੋ",
        "passwordremindertitle": "{{SITENAME}} ਲਈ ਪਾਸਵਰਡ ਯਾਦ ਰੱਖੋ",
        "resetpass-wrong-oldpass": "ਗ਼ਲਤ ਆਰਜ਼ੀ ਜਾਂ ਚਾਲੂ ਪਾਸਵਰਡ।\nਸ਼ਾਇਦ ਤੁਸੀਂ ਕਾਮਯਾਬੀ ਨਾਲ਼ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲ ਚੁੱਕੇ ਹੋ ਜਾਂ ਆਰਜ਼ੀ ਪਾਸਵਰਡ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਸੀ।",
        "resetpass-temp-password": "ਆਰਜ਼ੀ ਪਾਸਵਰਡ:",
        "resetpass-abort-generic": "ਇੱਕ ਐਕਸਟੈਂਸ਼ਨ ਵੱਲੋਂ ਪਾਸਵਰਡ ਦੀ ਤਬਦੀਲੀ ਰੱਦ ਕੀਤੀ ਗਈ",
+       "resetpass-expired": "ਤੁਹਾਡੇ ਪਛਾਣ-ਸ਼ਬਦ ਦੀ ਮਿਆਦ ਮੁੱਕ ਗਈ ਹੈ। ਦਾਖ਼ਲ ਹੋਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਨਵਾਂ ਪਛਾਣ-ਸ਼ਬਦ ਬਣਾਉ।",
        "passwordreset": "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ",
        "passwordreset-text-one": "ਪਾਸਵਰਡ ਦੁਬਾਰਾ ਬਣਾਉਣ ਲਈ ਇਹ ਫ਼ਾਰਮ ਭਰੋ।",
        "passwordreset-text-many": "{{PLURAL:$1|ਈ-ਮੇਲ ਜ਼ਰੀਏ ਆਪਣਾ ਆਰਜ਼ੀ ਪਾਸਵਰਡ ਹਾਸਲ ਕਰਨ ਲਈ ਕੋਈ ਇੱਕ ਥਾਂ ਭਰੋ।}}",
        "passwordreset-legend": "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ",
        "passwordreset-disabled": "ਇਸ ਵਿਕੀ ਤੇ ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਬੰਦ ਕੀਤੇ ਗਏ ਹਨ।",
        "passwordreset-emaildisabled": "ਇਹ ਵਿਕਿ ਉੱਤੇ ਈਮੇਲ ਫੀਚਰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।",
-       "passwordreset-username": "ਯà©\82à¨\9c਼ਰ-ਨਾਂ:",
+       "passwordreset-username": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ ਨਾਂ:",
        "passwordreset-domain": "ਡੋਮੇਨ:",
        "passwordreset-capture": "ਨਤੀਜੇ ਵਜੋਂ ਬਣਦੀ ਈਮੇਲ ਵੇਖੋ?",
        "passwordreset-capture-help": "ਜੇਕਰ ਤੁਸੀਂ ਇਹ ਬਕਸਾ ਸਹੀ ਕਰਦੇ ਹੋ ਤਾਂ ਇਹ ਈਮੇਲ (ਅਸਥਾਈ ਪਾਸਵਰਡ ਸਮੇਤ) ਤੁਹਾਨੂੰ ਵਿਖਾਈ ਜਾਵੇਗੀ ਅਤੇ ਵਰਤੋਂਕਾਰ ਨੂੰ ਵੀ ਭੇਜੀ ਜਾਵੇਗੀ।",
        "preview": "ਝਲਕ",
        "showpreview": "ਝਲਕ ਵਿਖਾਓ",
        "showdiff": "ਤਬਦੀਲੀਆਂ ਵਖਾਓ",
-       "anoneditwarning": "'''à¨\96਼ਬਰਦਾਰ:''' à¨¤à©\81ਸà©\80à¨\82 à¨²à¨¾à¨\97à¨\87ਨ à¨¨à¨¹à©\80à¨\82 à¨\95à©\80ਤਾ à¨¹à©\8bà¨\87à¨\86। à¨¤à©\81ਹਾਡਾ IP à¨ªà¨¤à¨¾ à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¦à©\87 à¨\85ਤà©\80ਤ à¨µà¨¿à©±à¨\9a à¨°à¨¿à¨\95ਾਰਡ à¨\95à©\80ਤਾ ਜਾਵੇਗਾ।",
+       "anoneditwarning": "'''à¨\96਼ਬਰਦਾਰ:''' à¨¤à©\81ਸà©\80à¨\82 à¨¦à¨¾à¨\96਼ਲ à¨¨à¨¹à©\80à¨\82 à¨¹à©\8b। à¨\95à©\8bà¨\88 à¨µà©\80 à¨¸à©\8bਧ à¨\95ਰਨ 'ਤà©\87 à¨¤à©\81ਹਾਡਾ à¨\86à¨\88.ਪà©\80. à¨ªà¨¤à¨¾ à¨²à©\8bà¨\95ਾà¨\82 à¨¨à©\82à©° à¨µà¨¿à¨\96ਾà¨\88 à¨¦à©\87ਵà©\87à¨\97ਾ। à¨\9cà©\87à¨\95ਰ à¨¤à©\81ਸà©\80à¨\82 <strong>[$1 à¨¦à¨¾à¨\96਼ਲ à¨¹à©\81ੰਦà©\87 à¨¹à©\8b]</strong> à¨\9cਾà¨\82 <strong>[$2 à¨\96ਾਤਾ à¨¬à¨£à¨¾à¨\89à¨\82ਦà©\87 à¨¹à©\8b]</strong> à¨¤à¨¾à¨\82 à¨¤à©\81ਹਾਡà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨¦à¨¾ à¨¸à¨¿à¨¹à¨°à¨¾, à¨¹à©\8bਰ à¨«à¨¼à¨¾à¨\87ਦਿà¨\86à¨\82 à¨¸à¨®à©\87ਤ, à¨¤à©\81ਹਾਡà©\87 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ-ਨਾà¨\82 à¨¸à¨¿à¨° à¨¦à¨¿à©±ਤਾ ਜਾਵੇਗਾ।",
        "anonpreviewwarning": "''ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ। ਤਬਦੀਲੀ ਸਾਂਭਣ ਨਾਲ਼ ਤੁਹਾਡਾ IP ਪਤਾ ਸਫ਼ੇ ਦੇ ਸੋਧ ਅਤੀਤ ਵਿਚ ਰਿਕਾਰਡ ਹੋ ਜਾਵੇਗਾ।''",
        "missingsummary": "'''ਯਾਦ-ਦਹਾਨੀ:''' ਤੁਸੀਂ ਸੋਧ ਸਾਰ ਮੁਹੱਈਆ ਨਹੀਂ ਕਰਵਾਇਆ। ਜੇ ਤੁਸੀਂ \"{{int:savearticle}}\" ਤੇ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕੀਤਾ ਤਾਂ ਤੁਹਾਡਾ ਸਫ਼ਾ ਇਸਦੇ ਬਿਨਾਂ ਹੀ ਸਾਂਭਿਆ ਜਾਵੇਗਾ।",
        "missingcommenttext": "ਹੇਠਾਂ ਇੱਕ ਟਿੱਪਣੀ ਦਿਓ।",
        "datedefault": "ਕੋਈ ਪਸੰਦ ਨਹੀਂ",
        "prefs-labs": "ਲੈਬ ਫੀਚਰ",
        "prefs-user-pages": "ਵਰਤੋਂਕਾਰ ਸਫ਼ੇ",
-       "prefs-personal": "ਯà©\82à¨\9c਼ਰ à¨ªà¨°à©\8bਫਾà¨\87ਲ",
+       "prefs-personal": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨ªà©\8dਰà©\8bਫ਼ਾà¨\88ਲ",
        "prefs-rc": "ਤਾਜ਼ਾ ਬਦਲਾਅ",
        "prefs-watchlist": "ਨਿਗਰਾਨ-ਸੂਚੀ",
        "prefs-watchlist-days": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਦਿਨ:",
        "userrights-reason": "ਕਾਰਨ:",
        "userrights-no-interwiki": "ਤੁਹਾਨੂੰ ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਹੱਕਾਂ ਵਿਚ ਤਬਦੀਲੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "userrights-nodatabase": "ਡੈਟਾਬੇਸ $1 ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਮਕਾਮੀ ਨਹੀਂ ਹੈ।",
-       "userrights-notallowed": "ਤà©\81ਹਾਨà©\82à©° à¨¨à©\82à©° à¨¯à©\82à¨\9c਼ਰ ਹੱਕ ਦੇਣ ਜਾਂ ਖੋਹਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
+       "userrights-notallowed": "ਤà©\81ਹਾਡà©\87 à¨\95à©\8bਲ਼ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਹੱਕ ਦੇਣ ਜਾਂ ਖੋਹਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "userrights-changeable-col": "ਉਹ ਸਮੂਹ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਬਦਲ ਸਕਦੇ ਹੋ",
        "userrights-unchangeable-col": "ਉਹ ਸਮੂਹ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਬਦਲ ਨਹੀਂ ਸਕਦੇ",
        "group": "ਸਮੂਹ:",
        "protectedpages-expiry": "ਮਿਆਦ",
        "protectedpages-reason": "ਕਾਰਨ",
        "protectedpages-unknown-timestamp": "ਅਣਜਾਣ",
-       "protectedpages-unknown-performer": "à¨\85ਣà¨\9cਾਣ à¨¯à©\82à¨\9c਼ਰ",
+       "protectedpages-unknown-performer": "à¨\85ਣਪà¨\9bਾਤà©\87 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ",
        "protectedtitles": "ਸੁਰੱਖਿਅਤ ਸਿਰਲੇਖ",
-       "listusers": "ਯà©\82à¨\9c਼ਰ à¨²à¨¿à¨¸à¨\9f",
+       "listusers": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¸à©\82à¨\9aà©\80",
        "listusers-editsonly": "ਸਿਰਫ਼ ਸੋਧਾਂ ਵਾਲੇ ਵਰਤੋਂਕਾਰ ਵਿਖਾਓ",
        "listusers-creationsort": "ਬਣਾਉਣ ਦੀ ਮਿਤੀ ਮੁਤਾਬਕ ਤਰਤੀਬ ਵਿਚ ਕਰੋ",
        "usercreated": "$1 ਨੂੰ $2 ’ਤੇ {{GENDER:$3|ਬਣਾਇਆ}}",
        "mailnologintext": "ਦੂਜੇ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ [[Special:UserLogin|ਦਾਖ਼ਲ]] ਹੋਣਾ ਪਵੇਗਾ ਅਤੇ ਆਪਣੀਆਂ [[Special:Preferences|ਪਸੰਦਾਂ]] ਵਿਚ ਇੱਕ ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦੇਣਾ ਪਵੇਗਾ।",
        "emailuser": "ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ",
        "emailuser-title-target": "ਇਹ {{GENDER:$1|ਯੂਜ਼ਰ}} ਨੂੰ ਈਮੇਲ ਭੇਜੋ",
-       "emailuser-title-notarget": "ਯà©\82à¨\9c਼ਰ à¨¨à©\82à©° à¨\88ਮà©\87ਲ",
-       "emailpage": "ਯà©\82à¨\9c਼ਰ ਨੂੰ ਈਮੇਲ ਕਰੋ",
+       "emailuser-title-notarget": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¨à©\82à©° à¨\88ਮà©\87ਲ à¨\95ਰà©\8b",
+       "emailpage": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ ਨੂੰ ਈਮੇਲ ਕਰੋ",
        "defemailsubject": "{{SITENAME}} ਈਮੇਲ",
        "usermaildisabled": "ਵਰਤੋਂਕਾਰ ਦੀ ਈ-ਮੇਲ ਬੰਦ ਹੈ",
        "usermaildisabledtext": "ਇਸ ਵਿਕੀ ’ਤੇ ਤੁਸੀਂ ਦੂਜੇ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਨਹੀਂ ਭੇਜ ਸਕਦੇ",
        "watchlist-options": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਦੀਆਂ ਚੋਣਾਂ",
        "watching": "ਨਿਗ੍ਹਾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...",
        "unwatching": "ਨਿਗ੍ਹਾ ਰੱਖਣੀ (ਵਾਚ) ਬੰਦ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..",
-       "enotif_impersonal_salutation": "{{SITENAME}} à¨¯à©\82à¨\9c਼ਰ",
+       "enotif_impersonal_salutation": "{{SITENAME}} à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ",
        "enotif_lastvisited": "ਤੁਹਾਡੀ ਆਖ਼ਰੀ ਆਮਦ ਤੋਂ ਲੈ ਕੇ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਵੇਖਣ ਲਈ $1 ਵੇਖੋ।",
        "enotif_lastdiff": "ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਵੇਖਣ ਲਈ $1 ਵੇਖੋ।",
        "enotif_anon_editor": "ਗੁਮਨਾਮ ਵਰਤੋਂਕਾਰ $1",
        "ipbreason": "ਕਾਰਨ:",
        "ipbcreateaccount": "ਖਾਤਾ ਬਣਾਉਣ 'ਤੇ ਰੋਕ ਲਾਓ",
        "ipbemailban": "ਵਰਤੋਂਕਾਰ ਉੱਤੇ ਈਮੇਲ ਭੇਜਣ ਦੀ ਰੋਕ ਲਾਓ",
-       "ipbsubmit": "à¨\87ਹ à¨¯à©\82à¨\9c਼ਰ à¨²à¨\88 à¨ªà¨¾à¨¬à©°à¨¦à©\80",
+       "ipbsubmit": "à¨\87ਸ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ 'ਤà©\87 à¨°à©\8bà¨\95 à¨²à¨¾à¨\89",
        "ipbother": "ਹੋਰ ਟਾਈਮ:",
        "ipboptions": "2 ਘੰਟੇ:2 hours, 1 ਦਿਨ:1 day, 3 ਦਿਨ:3 days, 1 ਹਫ਼ਤਾ:1 week, 2 ਹਫ਼ਤੇ:2 weeks, 2 ਮਹੀਨਾ:1 month, 3 ਮਹੀਨੇ:3 months, 6 ਮਹੀਨੇ:6 months, 1 ਸਾਲ:1 year, ਹਮੇਸ਼ਾਂ ਲਈ:infinite",
        "ipbhidename": "ਸੋਧਾਂ ਅਤੇ ਕੜੀਆਂ ਤੋਂ ਵਰਤੋਂਕਾਰ ਦਾ ਨਾਂ ਲੁਕਾਓ",
        "ipb-unblock": "ਇੱਕ ਯੂਜ਼ਰ ਨਾਂ ਜਾਂ IP ਐਡਰੈੱਸ ਅਣ-ਬਲਾਕ ਕਰੋ",
        "ipb-blocklist": "ਮੌਜੂਦਾ ਪਾਬੰਦੀਆਂ ਵੇਖੋ",
        "ipb-blocklist-contribs": "$1 ਦੇ ਯੋਗਦਾਨ",
-       "unblockip": "ਯà©\82à¨\9c਼ਰ à¨\85ਣ-ਬਲਾà¨\95 à¨\95ਰà©\8b",
+       "unblockip": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¤à©\8bà¨\82 à¨°à©\8bà¨\95 à¨¹à¨\9fਾà¨\89",
        "ipusubmit": "ਇਹ ਪਾਬੰਦੀ ਹਟਾਓ",
        "unblocked": "[[User:$1|$1]] ਪਾਬੰਦੀ ਮੁਕਤ ਹੋ ਚੁੱਕਾ ਹੈ",
        "unblocked-range": "$1 ਪਾਬੰਦੀ ਮੁਕਤ ਹੋ ਚੁੱਕੀ ਹੈ",
        "delete_and_move_confirm": "ਹਾਂ, ਸਫ਼ਾ ਮਿਟਾ ਦੇਵੋ",
        "immobile-source-page": "ਇਹ ਸਫ਼ਾ ਭੇਜਣ ਯੋਗ ਨਹੀਂ ਹੈ।",
        "move-leave-redirect": "ਪਿੱਛੇ ਇਕ ਰੀਡਿਰੈਕਟ ਛੱਡੋ",
-       "export": "ਸਫ਼à©\87 à¨¨à¨¿à¨°à¨¯à¨¾à¨¤ à¨\95ਰà©\8b",
-       "exportall": "ਸਾਰà©\87 à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨¦à¨¾ à¨¨à¨¿à¨°à¨¯à¨¾à¨¤ à¨\95ਰà©\8b",
+       "export": "à¨\9cà©\81à¨\97ਤਾà¨\82 à¨¦à©\80 à¨¬à¨°à¨¾à¨®à¨¦",
+       "exportall": "ਸਾਰà©\87 à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨¦à©\80 à¨¬à¨°à¨¾à¨®à¨¦",
        "exportcuronly": "ਸਿਰਫ਼ ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ ਸ਼ਾਮਲ ਕਰੋ, ਸਾਰਾ ਅਤੀਤ ਨਹੀਂ",
        "export-submit": "ਐਕਸਪੋਰਟ",
        "export-addcattext": "ਇਸ ਸ਼੍ਰੇਣੀ ਤੋਂ ਸਫ਼ੇ ਜੋੜੋ",
index bac4102..4936e9c 100644 (file)
        "wlheader-enotif": "La notìfica për pòsta eletrònica a l'é abilità.",
        "wlheader-showupdated": "Le pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
        "wlnote": "Ambelessì sota a-i {{PLURAL:$1|é l'ùltima modìfica|son j'ùltime <strong>$1</strong> modìfiche}} ant {{PLURAL:$2|l'ùltima ora|j'ùltime <strong>$2</strong> ore}}, a parte da $3, $4.",
-       "wlshowlast": "Smon-e j'ùltime $1 ore $2 dì",
+       "wlshowlast": "Smon-e j'ùltime $1 ore $2 di",
        "watchlist-options": "Opsion ëd la lista dla ròba ch'as ten sot-euj",
        "watching": "Sot-euj...",
        "unwatching": "Ën gavand da lòn ch'as ten sot-euj...",
        "import-error-create": "La pàgina «$1» a l'era pa stàita amportà përchè chiel a peul pa creela.",
        "import-error-interwiki": "La pàgina «$1» a l'era pa stàita amportà përchè sò nòm a l'é arzervà për na liura esterna (antërwiki).",
        "import-error-special": "La pàgina «$1» a l'era pa amportà përchè a aparten a në spassi nominal ch'a përmët pa dle pàgine.",
-       "import-error-invalid": "La pàgina «$1» a l'é pa amportà përchè sò nòm a l'é pa bon.",
+       "import-error-invalid": "La pàgina «$1» a l'é pa stàita amportà përchè ël nòm sota 'l qual a sarìa stàita amportà a va nen bin su costa wiki.",
        "import-error-unserialize": "La revision $2 dla pagina «$1» a peul pa esse desserialisà. La revision a l'era arportà përchè a deuvra ël model ëd contnù $3 serialisà com $4.",
        "import-error-bad-location": "La revision $2, ch'a deuvra ël model ëd contnù $3 a peul nen esse guernà su «$1» su costa wiki, dagià che col model a l'é nen mantnù su cola pàgina.",
        "import-options-wrong": "{{PLURAL:$2|Opsion|Opsion}} sbalià: <nowiki>$1</nowiki>",
        "importlogpage": "Registr dj'amportassion",
        "importlogpagetext": "Amportassion aministrative ëd pàgine e ëd soa stòria da dj'àutre wiki.",
        "import-logentry-upload": "a l'ha amportà [[$1]] con un càrich d'archivi",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revision}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision}} amportà",
        "import-logentry-interwiki": "Amportà da n'àutra wiki $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revision}} da $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision}} amportà da $2",
        "javascripttest": "Preuva ëd JavaScript",
        "javascripttest-title": "Fé dle preuve $1",
        "javascripttest-pagetext-noframework": "Costa pàgina a l'é arservà për fé dle preuve JavaScript.",
        "newimages-summary": "Sta pàgina special-sì a la smon j'ùltim archivi carià.",
        "newimages-legend": "Filtror",
        "newimages-label": "Nòm ëd l'archivi (o na soa part):",
+       "newimages-showbots": "Smon-e j'amportassion dij trigomiro",
        "noimages": "Pa gnente da vëdde.",
        "ilsubmit": "Arserché",
        "bydate": "për data",
        "autosumm-replace": "Pàgina cambià con '$1'",
        "autoredircomment": "Ridiression anvers a [[$1]]",
        "autosumm-new": "Creà la pàgina con '$1'",
+       "autosumm-newblank": "Pàgina veuida creà",
        "size-bytes": "$1 Byte",
        "size-kilobytes": "$1 KByte",
        "size-megabytes": "$1 MByte",
        "watchlistedit-raw-done": "La lista ëd lòn ch'as ten sot-euj a l'é stàita agiornà.",
        "watchlistedit-raw-added": "{{PLURAL:$1|A l'é|As son}} giontasse {{PLURAL:$1|1 tìtol|$1 tìtoj}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|A l'é|As son}} gavasse via {{PLURAL:$1|1 tìtol|$1 tìtoj}}:",
+       "watchlistedit-clear-title": "Lista dla ròba ch'as ten sot-euj dësvujdà.",
+       "watchlistedit-clear-legend": "Scancelé la lista dla ròba ch'as ten sot-euj",
+       "watchlistedit-clear-explain": "Tuti ij tìtoj a saran ësganfà da la lista dla ròba che as ten sot-euj",
+       "watchlistedit-clear-titles": "Tìtoj:",
+       "watchlistedit-clear-submit": "Scancelé la lista dla ròba ch'as ten sot-euj (sossì a l'é definitiv!)",
+       "watchlistedit-clear-done": "La lista ëd lòn ch'as ten sot-euj a l'é stàita scancelà.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|A l'é|As son}} gavasse via {{PLURAL:$1|1 tìtol|$1 tìtoj}}:",
+       "watchlistedit-too-many": "A-i é tròpe pàgine da smon-e ambelessì.",
+       "watchlisttools-clear": "Scancelé la lista dla ròba ch'as ten sot-euj",
        "watchlisttools-view": "S-ciairé le modifiché amportante",
        "watchlisttools-edit": "Vardé e modifiché la lista ëd lòn ch'as ten sot-euj",
        "watchlisttools-raw": "Modifiché ampressa la lista ëd lòn ch'as ten sot-euj",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ciaciarade]])",
        "unknown_extension_tag": "Tichëtta d'estension «$1» pa conossùa",
        "duplicate-defaultsort": "'''Atension:''' La ciav d'ordinament ëstàndard «$2» a pija ël pòst ëd cola ëd prima «$1».",
+       "duplicate-displaytitle": "<strong>Warning:</strong> ël tìtol ëd visualisassion «$2» a rampiassa ëd vej tìtol ëd visualisassion «$1».",
        "version": "Version",
        "version-extensions": "Estension anstalà",
-       "version-skins": "Pej",
+       "version-skins": "Pel anstalà",
        "version-specialpages": "Pàgine speciaj",
        "version-parserhooks": "Gancio dël dëscompositor",
        "version-variables": "Variàbij",
index f718430..5cc3468 100644 (file)
        "invalidtitle-unknownnamespace": "Su tìtulu cun nùmene-logu disconnotu de nùmeru $1 e testu \"$2\" no est bàlidu",
        "exception-nologin": "Non ses intrau",
        "exception-nologin-text": "Pro atzèdere a custa pàgina o atzione est netzessàriu a ti identificare.",
+       "exception-nologin-text-manual": "Pro piaghere $1 pro pòder'atzèdere a custa pàgina o atzione.",
+       "virus-badscanner": "Faddina de configuratzione: antivirus disconnotu: <em>$1</em>",
        "virus-scanfailed": "scansione faddida (còdixe $1)",
        "virus-unknownscanner": "antivirus disconnotu:",
        "logouttext": "<strong>As acabadu sa sessione.</strong>\n\nTene contu ca is pàginas ki sunt giai abertas in àteras bentanas podent sighire a pàrrer comente cando fias identificadu, fintzas a cando non ddas renfriscas dae su browser tuo.",
        "blockednoreason": "perunu motivu inditadu",
        "whitelistedittext": "Pro cambiare is pàginas $1.",
        "nosuchsectiontitle": "Impossìbile agatare sa setzione",
+       "nosuchsectiontext": "Ses proande a modificare una setzione chi non esistit.\nDiat poder'èssere istada iscostiada o burrada cando che fias bidende sa pàgina.",
        "loginreqtitle": "Identificatzione rechesta",
        "loginreqlink": "identìfica·ti",
        "loginreqpagetext": "Depes èsser $1 pro bìer àteras pàginas.",
        "accmailtitle": "Password ispedida.",
+       "accmailtext": "Una password ingendrada a manera casuale pro [[User talk:$1|$1]] est istada imbiada a $2. Podet èssere cambiada in sa pàgina de <em>[[Special:ChangePassword|càmbiu password]]</em> a pustis de èssere intradu in su contu tuo.",
        "newarticle": "(Nou)",
        "newarticletext": "Custa pàgina no esistit galu.\nPro creare sa pàgina, iscrie in sa casella a suta (càstia sa [$1 pàgina de agiudu] pro àteras informatziones).\nSi ses intradu inoghe pro isbàlliu, carca su butone <strong>back/indietro</strong> in su navigadore tuo.",
        "anontalkpagetext": "----\n<em>Custa est sa pàgina de cuntierra de unu impitadore anònimu ki no at creadu unu contu galu, o ki non dd'usat.</em>\nPro custu impreamus su nùmeru de indiritzos IP pro ddu identificare. Is indiritzos IP podent perou èsser cundivìdidos dae unos cantos impitadores. Si ses unu impitadore anònimu e ritenes ki custos cummentos non sunt diretos a tue, pro praxere [[Special:UserLogin/signup|crea unu contu]] o [[Special:UserLogin|identifica·ti (log in)]] pro evitare cunfusione cun àteros impitadore anònimos.''",
        "noarticletext-nopermission": "In custu tempu sa pàgina rechesta est bùida.\nPodes [[Special:Search/{{PAGENAME}}|chircare custu tìtulu]] in is àteras pàginas, o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chircare in is regìstros ligados]</span>, ma non tenes su permissu de creare custa pàgina.",
        "userpage-userdoesnotexist": "Su contu de s'impitadore \"<nowiki>$1</nowiki>\" no est stadu registradu.\nPro praxere abbàida si boles a sèriu creare/cambiare custa pàgina.",
        "userpage-userdoesnotexist-view": "Su contu de s'impitadore \"$1\" no est stadu registradu.",
+       "blocked-notice-logextract": "{{GENDER|Custu impitadore|Custa impitadora}} est {{GENDER|arreadu|arreada}}.\nS'ùrtimu elementu de su registru de sos arreamentos est marcadu inoghe in suta pro referèntzia:",
        "usercssyoucanpreview": "<strong>Consìgiu:</strong> Imprea su butone \"{{int:showpreview}}\" pro testare su CSS nou in antis de sarvare.",
        "userjsyoucanpreview": "<strong>Consìgiu:</strong> Imprea su butone \"{{int:showpreview}}\" pro testare su tuo JavaScript nou in antis de sarvare.",
+       "usercsspreview": "<strong>Ammentadi chi ses petzi bidende s'antiprima de su CSS impitadore tuo.\nNo est istadu galu sarbadu!</strong>",
+       "userjspreview": "<strong>Ammentadi chi ses petzi collaudande/bidende s'antiprima de su CSS impitadore tuo.\nNo est istadu galu sarbadu!</strong>",
+       "sitecsspreview": "<strong>Ammentadi chi ses petzi bidende s'antiprima de custu CSS.\nNo est istadu galu sarbadu!</strong>",
+       "sitejspreview": "<strong>Ammentadi chi ses petzi bidende s'antiprima de custu còdighe JavaScript.\nNo est istadu galu sarbadu!</strong>",
        "updated": "(Atualizadu)",
        "note": "'''Nota:'''",
        "previewnote": "<strong>Regorda·ti ca custa est feti una ANTIPRIMA.</strong>\nIs mudàntzias tuas non sunt galu sarbadas!",
        "template-semiprotected": "(mesu-bardadu)",
        "hiddencategories": "Custa pàgina faghet parte de {{PLURAL:$1|1 categoria cuada|$1 categorias cuadas}}:",
        "nocreate-loggedin": "Non tenes su permissu de creare pàginas noas.",
+       "sectioneditnotsupported-title": "Modìfica de sas setziones non suportada",
+       "sectioneditnotsupported-text": "Modìfica de sas setziones non suportada in custa pàgina.",
        "permissionserrors": "Faddina de permissos",
-       "permissionserrorstext-withaction": "Non tenes su permissu de $2, pro {{PLURAL:$1|custu motivu|custus motivus}}:",
+       "permissionserrorstext": "Non tenes su permissu pro lu fàghere, pro {{PLURAL:$1|custa resone|custas resones}}:",
+       "permissionserrorstext-withaction": "Non tenes su permissu de $2, pro {{PLURAL:$1|custu motivu|custos motivos}}:",
        "recreate-moveddeleted-warn": "<strong>Atentzione: Ses torrende a creare una pàgina chi est istada giai burrada.</strong>\n\nSinchera·ti chi siat pretzisu a sighire cambiende custa pàgina.\nSu registru de is burraduras e moviduras pro custa pàgina benit giùghedu inoghe:",
        "moveddeleted-notice": "Custa pàgina est istada burrada.\nSu registru de is burraduras e moviduras de sa pàgina est ammustradu pro informatzione.",
        "log-fulllog": "Abbista su registru intreu",
+       "edit-hook-aborted": "Sa modìfica est istada annuddada dae su hook de s'estensione.\nNo est istadu datu acrarimentu.",
        "edit-gone-missing": "Impossìbile agiornare sa pàgina.\nParet chi siat istada burrada.",
        "edit-conflict": "Cunflitu de editzione.",
        "edit-no-change": "Su càmbiu tuo est istadu innoradu proite non b'est istada modìfica peruna a su testu.",
        "doubleredirects": "Redirects dòpios",
        "doubleredirectstext": "Custa pàgina cuntenet una lista de pàginas ki re-indiritzant a àteras pàginas de re-indiritzamentu.\nOgni lìnia cuntenet ligàmines a su primu e a su de duos re-indiritzamentu, aici comente sa prima lìnia de sa de duos re-indiritzamentos, chi de sòlitu adòbiat s'artìculu \"beru\", a sa cale fintzas su primu re-indiritzamentu dia depet puntare.\nIs re-indiritzamentos <del>cantzellados</del> sunt stados curretos.",
        "brokenredirects": "Redirects isballiaus",
-       "brokenredirectstext": "Custus redirects ligant cun pàginas chi no esistint.",
+       "brokenredirectstext": "Custos redirects ligant cun pàginas chi no esistint.",
        "brokenredirects-edit": "càmbia",
        "brokenredirects-delete": "cantzella",
        "withoutinterwiki-legend": "Prefissu",
index fa28ede..3cd21d8 100644 (file)
        "undeleteinvert": "Обрни избор",
        "undeletecomment": "Разлог:",
        "undeletedrevisions": "{{PLURAL:$1|Измена је враћена|$1 измене су враћене|$1 измена је враћено}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|1 измена|измене|измена}} и $2 {{PLURAL:$2|1 датотека је враћена|датотеке су враћене|датотека је враћено}}",
+       "undeletedrevisions-files": "$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека је враћена|датотеке су враћене|датотека је враћено}}",
        "undeletedfiles": "{{PLURAL:$1|Датотека је враћена|$1 датотеке су враћене|$1 датотека је враћено}}",
        "cannotundelete": "Враћање није успело:\n$1",
        "undeletedpage": "'''Страница $1 је враћена'''\n\nПогледајте [[Special:Log/delete|историју брисања]] за записе о скорашњим брисањима и враћањима.",
index 21375b7..fad5f2b 100644 (file)
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
        "undeletedrevisions": "{{PLURAL:$1|Izmena je vraćena|$1 izmene su vraćene|$1 izmena je vraćeno}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|1 izmena|izmene|izmena}} i $2 {{PLURAL:$2|1 datoteka je vraćena|datoteke su vraćene|datoteka je vraćeno}}",
+       "undeletedrevisions-files": "$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka je vraćena|datoteke su vraćene|datoteka je vraćeno}}",
        "undeletedfiles": "{{PLURAL:$1|Datoteka je vraćena|$1 datoteke su vraćene|$1 datoteka je vraćeno}}",
        "cannotundelete": "Vraćanje nije uspelo:\n$1",
        "undeletedpage": "'''Stranica $1 je vraćena'''\n\nPogledajte [[Special:Log/delete|istoriju brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
index 40868d2..1272c13 100644 (file)
        "copyright": "Eusina ditangtayungan ku $1 iwal lamun disebutkeun béda.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
        "currentevents": "Keur lumangsung",
-       "currentevents-url": "Project:Keur lumangsung",
+       "currentevents-url": "Portal:Keur lumangsung",
        "disclaimers": "Bantahan",
        "disclaimerpage": "Project:Bantahan_umum",
        "edithelp": "Pitulung ngédit",
index 883f47c..a33d17d 100644 (file)
@@ -73,7 +73,7 @@
        "tog-previewontop": "Показувати попередній перегляд перед вікном редагування, а не після",
        "tog-previewonfirst": "Показувати попередній перегляд під час першого редагування",
        "tog-enotifwatchlistpages": "Повідомляти електронною поштою про зміну сторінки або файлу з мого списку спостереження",
-       "tog-enotifusertalkpages": "Ð\9fовÑ\96домлÑ\8fÑ\82и ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\8e Ð¿Ð¾Ñ\88Ñ\82оÑ\8e Ð¿Ñ\80о Ð·Ð¼Ñ\96ни Ð½Ð° Ð¼Ð¾Ñ\97й Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96 обговорення",
+       "tog-enotifusertalkpages": "Ð\9fовÑ\96домлÑ\8fÑ\82и ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\8e Ð¿Ð¾Ñ\88Ñ\82оÑ\8e Ð¿Ñ\80о Ð·Ð¼Ñ\96ни Ð¼Ð¾Ñ\94Ñ\97 Ñ\81Ñ\82оÑ\80Ñ\96нки обговорення",
        "tog-enotifminoredits": "Надсилати мені електронного листа навіть при незначних редагуваннях сторінок та файлів",
        "tog-enotifrevealaddr": "Показувати мою поштову адресу в повідомленнях",
        "tog-shownumberswatching": "Показувати число користувачів, які додали сторінку до свого списку спостереження",
        "mediastatistics-header-text": "Текст",
        "mediastatistics-header-executable": "Виконувані файли",
        "mediastatistics-header-archive": "Стиснуті формати",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|зайву завершальну кому|зайвих завершальних коми|зайвих завершальних ком}} було видалено із JSON",
        "json-error-unknown": "Виникла проблема із JSON. Помилка: $1",
        "json-error-depth": "Перевищено дозволену глибину стека",
        "json-error-state-mismatch": "Недозволений чи невірно сформований JSON",
        "json-error-ctrl-char": "Помилковий контрольний символ, можливо, неправильно кодований",
        "json-error-syntax": "Синтаксична помилка",
-       "json-error-utf8": "Спотворені символи UTF-8, можливо, неправильно закодовано"
+       "json-error-utf8": "Спотворені символи UTF-8, можливо, неправильно закодовано",
+       "json-error-recursion": "Необхідність закодувати одне чи більше рекурсивних посилань",
+       "json-error-inf-or-nan": "Необхідність закодувати одне чи більше значення NAN або INF",
+       "json-error-unsupported-type": "Було вказано значення типу, який не вдається закодувати"
 }
index 75ad88b..d0f71dc 100644 (file)
        "viewyourtext": "您可以查看并复制<strong>您对此页面作出编辑后</strong>的源代码:",
        "protectedinterface": "该页提供此wiki软件的界面文字,它已被保护以防止恶意修改。\n如欲修改所有wiki的翻译,请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。",
        "editinginterface": "'''警告:'''您正在编辑的页面是用于提供软件的界面文字。\n改变此页将影响其他在此wiki上的用户界面外观。\n如欲修改所有wiki的翻译,请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。",
-       "cascadeprotected": "本页面已经受到保护,不能编辑,因为它被嵌入了以下启用“级联”选项的受保护{{PLURAL:$1|页面}}:$2",
+       "cascadeprotected": "本页面已经受到保护,不能编辑,因为它包含于以下被“连锁保护”的{{PLURAL:$1|页面}}:\n$2",
        "namespaceprotected": "您没有权限编辑'''$1'''名字空间内的页面。",
        "customcssprotected": "您没有权限编辑此CSS页面,因为它包含另一位用户的个人设置。",
        "customjsprotected": "您没有权限编辑此JavaScript页面,因为它包含另一位用户的个人设置。",
        "readonlywarning": "警告:数据库被锁定以进行维护,所以您目前将无法保存您的修改。'''您或许希望将本段文字先剪贴并保存到文本文件,并在稍后进行修改。\n\n锁定数据库的管理员有如下解释:$1",
        "protectedpagewarning": "'''警告:本页面已被保护,只有拥有管理员权限的用户可以编辑。'''下面提供最后的日志条目以供参考:",
        "semiprotectedpagewarning": "'''注意:'''本页面已被保护,只有注册用户可以编辑。下面提供最后的日志条目以供参考:",
-       "cascadeprotectedwarning": "<strong>警告:</strong>本页面已经被保护,只有拥有管理员权限的用户可以编辑,因为它被嵌入了以下启用级联保护的{{PLURAL:$1|页面}}:",
+       "cascadeprotectedwarning": "<strong>警告:</strong>本页面已经被保护,只有拥有管理员权限的用户可以编辑,因为它包含于以下启用连锁保护的{{PLURAL:$1|页面}}中:",
        "titleprotectedwarning": "'''警告:本页面已被保护,创建本页面需要[[Special:ListGroupRights|特定权限]]。'''下面提供最后的日志条目以供参考:",
        "templatesused": "该页面使用的{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "本预览使用的{{PLURAL:$1|模板}}:",
        "listusers-blocked": "(已封禁)",
        "activeusers": "活跃用户列表",
        "activeusers-intro": "这是在过去$1{{PLURAL:$1|天}}有过某种活动的用户的列表。",
-       "activeusers-count": "最近$3天内有$1次编辑",
+       "activeusers-count": "过去{{PLURAL:$3|$3天}}有$1个{{PLURAL:$1|操作}}",
        "activeusers-from": "显示用户开始于:",
        "activeusers-hidebots": "隐藏机器人",
        "activeusers-hidesysops": "隐藏管理员",
index 67864c5..add7108 100644 (file)
@@ -59,11 +59,13 @@ class FindMissingFiles extends Maintenance {
                do {
                        $res = $dbr->select(
                                array_merge( array( 'page' ), $joinTables ),
-                               array( 'name' => 'DISTINCT(page_title)' ),
+                               array( 'name' => 'img_name' ),
                                array( 'page_namespace' => NS_FILE,
                                        "page_title >= " . $dbr->addQuotes( $lastName ) ),
                                __METHOD__,
-                               array( 'ORDER BY' => 'page_title', 'LIMIT' => $this->mBatchSize ),
+                               // DISTINCT causes a pointless filesort
+                               array( 'ORDER BY' => 'name', 'GROUP BY' => 'name',
+                                       'LIMIT' => $this->mBatchSize ),
                                $joinConds
                        );
 
index 538995f..e32e4a5 100644 (file)
@@ -1521,8 +1521,10 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.ui.icon' => array(
-               'styles' => array(
-                       'resources/src/mediawiki.ui/components/icons.less',
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.ui/components/icons.less',
+                       ),
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
index d4f3c69..dceae11 100644 (file)
@@ -40,39 +40,18 @@ $.extend( mw.language, {
         *
         * @param {number} count Non-localized quantifier
         * @param {Array} forms List of plural forms
+        * @param {Object} [explicitPluralForms] List of explicit plural forms
         * @return {string} Correct form for quantifier in this language
         */
-       convertPlural: function ( count, forms ) {
+       convertPlural: function ( count, forms, explicitPluralForms ) {
                var pluralRules,
-                       formCount,
-                       form,
-                       index,
-                       equalsPosition,
                        pluralFormIndex = 0;
 
-               if ( !forms || forms.length === 0 ) {
-                       return '';
+               if ( explicitPluralForms && explicitPluralForms[count] ) {
+                       return explicitPluralForms[count];
                }
 
-               // Handle for explicit n= forms
-               for ( index = 0; index < forms.length; index++ ) {
-                       form = forms[index];
-                       if ( /^\d+=/.test( form ) ) {
-                               equalsPosition = form.indexOf( '=' );
-                               formCount = parseInt( form.slice( 0, equalsPosition ), 10 );
-                               if ( formCount === count ) {
-                                       return form.slice( equalsPosition + 1 );
-                               }
-                               forms[index] = undefined;
-                       }
-               }
-
-               // Remove explicit plural forms from the forms.
-               forms = $.map( forms, function ( form ) {
-                       return form;
-               } );
-
-               if ( forms.length === 0 ) {
+               if ( !forms || forms.length === 0 ) {
                        return '';
                }
 
index 1997c1b..826c82f 100644 (file)
@@ -74,7 +74,7 @@
                        }
                }
 
-               @focusBottomBorderSize: 3px;
+               @focusBottomBorderSize: 0.2em;
                &:active,
                &:focus {
                        + label {
@@ -82,7 +82,7 @@
                                        content: '';
                                        position: absolute;
                                        width: @checkboxSize;
-                                       height: @checkboxSize - @focusBottomBorderSize + 1; // offset by bottom border
+                                       height: @checkboxSize - @focusBottomBorderSize + 0.08; // offset by bottom border
                                        // offset from the checkbox by 1px to account for left border
                                        left: 1px;
                                        border-bottom: solid @focusBottomBorderSize lightgrey;
index bf8e41e..d85cc98 100644 (file)
 // To use icons you must be using a browser that supports pseudo elements.
 // This includes support for IE8.
 // http://caniuse.com/#feat=css-gencontent
-// Browsers that do not support either of these selectors will degrade to text only.
+//
+// For elements that are intended to have both an icon and text, browsers that
+// do not support pseudo-selectors will degrade to text-only.
+//
+// However, icon-only elements do not yet degrade to text-only elements in these
+// browsers.
 //
 // Styleguide 4.
 
index ad71b08..3eaa6d2 100644 (file)
                 * @return {string} selected pluralized form according to current language
                 */
                plural: function ( nodes ) {
-                       var forms, formIndex, node, count;
+                       var forms, firstChild, firstChildText,
+                               explicitPluralForms = {}, explicitPluralFormNumber, formIndex, form, count;
+
                        count = parseFloat( this.language.convertNumber( nodes[0], true ) );
                        forms = nodes.slice( 1 );
                        for ( formIndex = 0; formIndex < forms.length; formIndex++ ) {
-                               node = forms[formIndex];
-                               if ( node.jquery && node.hasClass( 'mediaWiki_htmlEmitter' )  ) {
-                                       // This is a nested node, already expanded.
-                                       forms[formIndex] = forms[formIndex].html();
+                               form = forms[formIndex];
+
+                               if ( form.jquery && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                                       // This is a nested node, may be an explicit plural form like 5=[$2 linktext]
+                                       firstChild = form.contents().get( 0 );
+                                       if ( firstChild && firstChild.nodeType === Node.TEXT_NODE ) {
+                                               firstChildText = firstChild.textContent;
+                                               if ( /^\d+=/.test( firstChildText ) ) {
+                                                       explicitPluralFormNumber = parseInt( firstChildText.split( /=/ )[0], 10 );
+                                                       // Use the digit part as key and rest of first text node and
+                                                       // rest of child nodes as value.
+                                                       firstChild.textContent = firstChildText.slice( firstChildText.indexOf( '=' ) + 1 );
+                                                       explicitPluralForms[explicitPluralFormNumber] = form;
+                                                       forms[formIndex] = undefined;
+                                               }
+                                       }
+                               } else if ( /^\d+=/.test( form ) ) {
+                                       // Simple explicit plural forms like 12=a dozen
+                                       explicitPluralFormNumber = parseInt( form.split( /=/ )[0], 10 );
+                                       explicitPluralForms[explicitPluralFormNumber] = form.slice( form.indexOf( '=' ) + 1 );
+                                       forms[formIndex] = undefined;
                                }
                        }
-                       return forms.length ? this.language.convertPlural( count, forms ) : '';
+
+                       // Remove explicit plural forms from the forms. They were set undefined in the above loop.
+                       forms = $.map( forms, function ( form ) {
+                               return form;
+                       } );
+
+                       return this.language.convertPlural( count, forms, explicitPluralForms );
                },
 
                /**
diff --git a/tests/phpunit/includes/specials/SpecialBooksourcesTest.php b/tests/phpunit/includes/specials/SpecialBooksourcesTest.php
new file mode 100644 (file)
index 0000000..d341ccf
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+class SpecialBooksourcesTest extends MediaWikiTestCase {
+       public static function provideISBNs() {
+               return array(
+                       array( '978-0-300-14424-6', true ),
+                       array( '0-14-020652-3', true ),
+                       array( '020652-3', false ),
+                       array( '9781234567897', true ),
+                       array( '1-4133-0454-0', true ),
+                       array( '978-1413304541', true ),
+                       array( '0136091814', true ),
+                       array( '0136091812', false ),
+                       array( '9780136091813', true ),
+                       array( '9780136091817', false ),
+                       array( '123456789X', true ),
+
+                       // Bug 67021
+                       array( '1413304541', false ),
+                       array( '141330454X', false ),
+                       array( '1413304540', true ),
+                       array( '14133X4540', false ),
+                       array( '97814133X4541', false ),
+                       array( '978035642615X', false ),
+                       array( '9781413304541', true ),
+                       array( '9780356426150', true ),
+               );
+       }
+
+       /**
+        * @covers SpecialBooksources::isValidISBN
+        * @dataProvider provideISBNs
+        */
+       public function testIsValidISBN( $isbn, $isValid ) {
+               $this->assertSame( $isValid, SpecialBooksources::isValidISBN( $isbn ) );
+       }
+}
index 906fd27..ece5116 100644 (file)
@@ -54,7 +54,9 @@
 
                        'jquerymsg-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
 
-                       'external-link-replace': 'Foo [$1 bar]'
+                       'external-link-replace': 'Foo [$1 bar]',
+                       'external-link-plural': 'Foo {{PLURAL:$1|is [$2 one]|are [$2 some]|2=[$2 two]|3=three|4=a=b|5=}} things.',
+                       'plural-only-explicit-forms': 'It is a {{PLURAL:$1|1=single|2=double}} room.'
                }
        } ) );
 
@@ -85,7 +87,7 @@
                        } );
        }
 
-       QUnit.test( 'Replace', 9, function ( assert ) {
+       QUnit.test( 'Replace', 16, function ( assert ) {
                mw.messages.set( 'simple', 'Foo $1 baz $2' );
 
                assert.equal( formatParse( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
                        'Foo <a href="http://example.org/?x=y&amp;z">bar</a>',
                        'Href is not double-escaped in wikilink function'
                );
+               assert.equal(
+                       formatParse( 'external-link-plural', 1, 'http://example.org' ),
+                       'Foo is <a href="http://example.org">one</a> things.',
+                       'Link is expanded inside plural and is not escaped html'
+               );
+               assert.equal(
+                       formatParse( 'external-link-plural', 2, 'http://example.org' ),
+                       'Foo <a href=\"http://example.org\">two</a> things.',
+                       'Link is expanded inside an explicit plural form and is not escaped html'
+               );
+               assert.equal(
+                       formatParse( 'external-link-plural', 3 ),
+                       'Foo three things.',
+                       'A simple explicit plural form co-existing with complex explicit plural forms'
+               );
+               assert.equal(
+                       formatParse( 'external-link-plural', 4, 'http://example.org' ),
+                       'Foo a=b things.',
+                       'Only first equal sign is used as delimiter for explicit plural form. Repeated equal signs does not create issue'
+               );
+               assert.equal(
+                       formatParse( 'external-link-plural', 5, 'http://example.org' ),
+                       'Foo are <a href="http://example.org">some</a> things.',
+                       'Invalid explicit plural form. Plural fallback to the "other" plural form'
+               );
+               assert.equal(
+                       formatParse( 'external-link-plural', 6, 'http://example.org' ),
+                       'Foo are <a href="http://example.org">some</a> things.',
+                       'Plural fallback to the "other" plural form'
+               );
+               assert.equal(
+                       formatParse( 'plural-only-explicit-forms', 2 ),
+                       'It is a double room.',
+                       'Plural with explicit forms alone.'
+               );
        } );
 
        QUnit.test( 'Plural', 6, function ( assert ) {