Merge "Use strtr() for clarity"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 14 Jun 2017 20:18:58 +0000 (20:18 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 14 Jun 2017 20:18:59 +0000 (20:18 +0000)
84 files changed:
autoload.php
includes/Title.php
includes/actions/Action.php
includes/api/ApiBase.php
includes/api/ApiFormatBase.php
includes/api/ApiParse.php
includes/api/i18n/en.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/nb.json
includes/api/i18n/qqq.json
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/db/DatabaseOracle.php
includes/installer/i18n/ast.json
includes/installer/i18n/bs.json
includes/installer/i18n/mk.json
includes/libs/rdbms/database/DBConnRef.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/loadmonitor/LoadMonitor.php
includes/linkeddata/PageDataRequestHandler.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/resourceloader/ResourceLoaderContext.php
includes/skins/Skin.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/SpecialPage.php
includes/tidy/RaggettWrapper.php
includes/tidy/tidy.conf
languages/MessageLocalizer.php [new file with mode: 0644]
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/de.json
languages/i18n/es.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ko.json
languages/i18n/mk.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sgs.json
languages/i18n/tet.json
languages/i18n/vi.json
languages/i18n/zh-hans.json
languages/messages/MessagesAr.php
languages/messages/MessagesArz.php
resources/Resources.php
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js
tests/parser/parserTests.txt
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/api/ApiBaseTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/linkeddata/PageDataRequestHandlerTest.php
tests/phpunit/includes/parser/ParserOptionsTest.php
tests/phpunit/includes/specials/SpecialPageDataTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js [new file with mode: 0644]

index 6c5aff5..2715655 100644 (file)
@@ -979,6 +979,7 @@ $wgAutoloadLocalClasses = [
        'MessageBlobStore' => __DIR__ . '/includes/cache/MessageBlobStore.php',
        'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php',
        'MessageContent' => __DIR__ . '/includes/content/MessageContent.php',
+       'MessageLocalizer' => __DIR__ . '/languages/MessageLocalizer.php',
        'MessageSpecifier' => __DIR__ . '/includes/libs/MessageSpecifier.php',
        'MigrateFileRepoLayout' => __DIR__ . '/maintenance/migrateFileRepoLayout.php',
        'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php',
index a8cfad8..c9f09f7 100644 (file)
@@ -1419,13 +1419,22 @@ class Title implements LinkTarget {
         * @return string The prefixed text
         */
        private function prefix( $name ) {
+               global $wgContLang;
+
                $p = '';
                if ( $this->isExternal() ) {
                        $p = $this->mInterwiki . ':';
                }
 
                if ( 0 != $this->mNamespace ) {
-                       $p .= $this->getNsText() . ':';
+                       $nsText = $this->getNsText();
+
+                       if ( $nsText === false ) {
+                               // See T165149. Awkward, but better than erroneously linking to the main namespace.
+                               $nsText = $wgContLang->getNsText( NS_SPECIAL ) . ":Badtitle/NS{$this->mNamespace}";
+                       }
+
+                       $p .= $nsText . ':';
                }
                return $p . $name;
        }
index f06f828..844a0d6 100644 (file)
@@ -34,7 +34,7 @@
  * format (protect, delete, move, etc), and the just-do-something format (watch, rollback,
  * patrol, etc). The FormAction and FormlessAction classes represent these two groups.
  */
-abstract class Action {
+abstract class Action implements MessageLocalizer {
 
        /**
         * Page on which we're performing the action
@@ -253,7 +253,7 @@ abstract class Action {
         *
         * @return Message
         */
-       final public function msg() {
+       final public function msg( $key ) {
                $params = func_get_args();
                return call_user_func_array( [ $this->getContext(), 'msg' ], $params );
        }
index a6c4b2a..5332d7e 100644 (file)
@@ -1863,6 +1863,23 @@ abstract class ApiBase extends ContextSource {
                        throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
                }
 
+               // ApiUsageException needs a fatal status, but this method has
+               // historically accepted any non-good status. Convert it if necessary.
+               $status->setOK( false );
+               if ( !$status->getErrorsByType( 'error' ) ) {
+                       $newStatus = Status::newGood();
+                       foreach ( $status->getErrorsByType( 'warning' ) as $err ) {
+                               call_user_func_array(
+                                       [ $newStatus, 'fatal' ],
+                                       array_merge( [ $err['message'] ], $err['params'] )
+                               );
+                       }
+                       if ( !$newStatus->getErrorsByType( 'error' ) ) {
+                               $newStatus->fatal( 'unknownerror-nocode' );
+                       }
+                       $status = $newStatus;
+               }
+
                throw new ApiUsageException( $this, $status );
        }
 
index eb23bd6..36247dd 100644 (file)
@@ -219,7 +219,14 @@ abstract class ApiFormatBase extends ApiBase {
                        if ( !$this->getIsWrappedHtml() ) {
                                // When the format without suffix 'fm' is defined, there is a non-html version
                                if ( $this->getMain()->getModuleManager()->isDefined( $lcformat, 'format' ) ) {
-                                       $msg = $context->msg( 'api-format-prettyprint-header' )->params( $format, $lcformat );
+                                       if ( !$this->getRequest()->wasPosted() ) {
+                                               $nonHtmlUrl = strtok( $this->getRequest()->getFullRequestURL(), '?' )
+                                                       . '?' . $this->getRequest()->appendQueryValue( 'format', $lcformat );
+                                               $msg = $context->msg( 'api-format-prettyprint-header-hyperlinked' )
+                                                       ->params( $format, $lcformat, $nonHtmlUrl );
+                                       } else {
+                                               $msg = $context->msg( 'api-format-prettyprint-header' )->params( $format, $lcformat );
+                                       }
                                } else {
                                        $msg = $context->msg( 'api-format-prettyprint-header-only-html' )->params( $format );
                                }
index 91e49ab..b2e03c8 100644 (file)
@@ -38,6 +38,9 @@ class ApiParse extends ApiBase {
        /** @var Content $pstContent */
        private $pstContent = null;
 
+       /** @var bool */
+       private $contentIsDeleted = false, $contentIsSuppressed = false;
+
        public function execute() {
                // The data is hot but user-dependent, like page views, so we set vary cookies
                $this->getMain()->setCacheMode( 'anon-public-user-private' );
@@ -85,6 +88,9 @@ class ApiParse extends ApiBase {
 
                $redirValues = null;
 
+               $needContent = isset( $prop['wikitext'] ) ||
+                       isset( $prop['parsetree'] ) || $params['generatexml'];
+
                // Return result
                $result = $this->getResult();
 
@@ -110,27 +116,9 @@ class ApiParse extends ApiBase {
                                $wgTitle = $titleObj;
                                $pageObj = WikiPage::factory( $titleObj );
                                list( $popts, $reset, $suppressCache ) = $this->makeParserOptions( $pageObj, $params );
-
-                               // If for some reason the "oldid" is actually the current revision, it may be cached
-                               // Deliberately comparing $pageObj->getLatest() with $rev->getId(), rather than
-                               // checking $rev->isCurrent(), because $pageObj is what actually ends up being used,
-                               // and if its ->getLatest() is outdated, $rev->isCurrent() won't tell us that.
-                               if ( !$suppressCache && $rev->getId() == $pageObj->getLatest() ) {
-                                       // May get from/save to parser cache
-                                       $p_result = $this->getParsedContent( $pageObj, $popts,
-                                               $pageid, isset( $prop['wikitext'] ) );
-                               } else { // This is an old revision, so get the text differently
-                                       $this->content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
-
-                                       if ( $this->section !== false ) {
-                                               $this->content = $this->getSectionContent(
-                                                       $this->content, $this->msg( 'revid', $rev->getId() )
-                                               );
-                                       }
-
-                                       // Should we save old revision parses to the parser cache?
-                                       $p_result = $this->content->getParserOutput( $titleObj, $rev->getId(), $popts );
-                               }
+                               $p_result = $this->getParsedContent(
+                                       $pageObj, $popts, $suppressCache, $pageid, $rev, $needContent
+                               );
                        } else { // Not $oldid, but $pageid or $page
                                if ( $params['redirects'] ) {
                                        $reqParams = [
@@ -172,25 +160,9 @@ class ApiParse extends ApiBase {
                                }
 
                                list( $popts, $reset, $suppressCache ) = $this->makeParserOptions( $pageObj, $params );
-
-                               // Don't pollute the parser cache when setting options that aren't
-                               // in ParserOptions::optionsHash()
-                               /// @todo: This should be handled closer to the actual cache instead of here, see T110269
-                               $suppressCache = $suppressCache ||
-                                       $params['disablepp'] ||
-                                       $params['disablelimitreport'] ||
-                                       $params['preview'] ||
-                                       $params['sectionpreview'] ||
-                                       $params['disabletidy'];
-
-                               if ( $suppressCache ) {
-                                       $this->content = $this->getContent( $pageObj, $pageid );
-                                       $p_result = $this->content->getParserOutput( $titleObj, null, $popts );
-                               } else {
-                                       // Potentially cached
-                                       $p_result = $this->getParsedContent( $pageObj, $popts, $pageid,
-                                               isset( $prop['wikitext'] ) );
-                               }
+                               $p_result = $this->getParsedContent(
+                                       $pageObj, $popts, $suppressCache, $pageid, null, $needContent
+                               );
                        }
                } else { // Not $oldid, $pageid, $page. Hence based on $text
                        $titleObj = Title::newFromText( $title );
@@ -249,6 +221,12 @@ class ApiParse extends ApiBase {
                        if ( $params['onlypst'] ) {
                                // Build a result and bail out
                                $result_array = [];
+                               if ( $this->contentIsDeleted ) {
+                                       $result_array['textdeleted'] = true;
+                               }
+                               if ( $this->contentIsSuppressed ) {
+                                       $result_array['textsuppressed'] = true;
+                               }
                                $result_array['text'] = $this->pstContent->serialize( $format );
                                $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'text';
                                if ( isset( $prop['wikitext'] ) ) {
@@ -279,6 +257,12 @@ class ApiParse extends ApiBase {
 
                $result_array['title'] = $titleObj->getPrefixedText();
                $result_array['pageid'] = $pageid ?: $pageObj->getId();
+               if ( $this->contentIsDeleted ) {
+                       $result_array['textdeleted'] = true;
+               }
+               if ( $this->contentIsSuppressed ) {
+                       $result_array['textsuppressed'] = true;
+               }
 
                if ( $params['disabletoc'] ) {
                        $p_result->setTOCEnabled( false );
@@ -541,64 +525,72 @@ class ApiParse extends ApiBase {
                Hooks::run( 'ApiMakeParserOptions',
                        [ $popts, $pageObj->getTitle(), $params, $this, &$reset, &$suppressCache ] );
 
+               // Force cache suppression when $popts aren't cacheable.
+               $suppressCache = $suppressCache || !$popts->isSafeToCache();
+
                return [ $popts, $reset, $suppressCache ];
        }
 
        /**
         * @param WikiPage $page
         * @param ParserOptions $popts
+        * @param bool $suppressCache
         * @param int $pageId
-        * @param bool $getWikitext
+        * @param Revision|null $rev
+        * @param bool $getContent
         * @return ParserOutput
         */
-       private function getParsedContent( WikiPage $page, $popts, $pageId = null, $getWikitext = false ) {
-               $this->content = $this->getContent( $page, $pageId );
+       private function getParsedContent(
+               WikiPage $page, $popts, $suppressCache, $pageId, $rev, $getContent
+       ) {
+               $revId = $rev ? $rev->getId() : null;
+               $isDeleted = $rev && $rev->isDeleted( Revision::DELETED_TEXT );
+
+               if ( $getContent || $this->section !== false || $isDeleted ) {
+                       if ( $rev ) {
+                               $this->content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                               if ( !$this->content ) {
+                                       $this->dieWithError( [ 'apierror-missingcontent-revid', $revId ] );
+                               }
+                       } else {
+                               $this->content = $page->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                               if ( !$this->content ) {
+                                       $this->dieWithError( [ 'apierror-missingcontent-pageid', $pageId ] );
+                               }
+                       }
+                       $this->contentIsDeleted = $isDeleted;
+                       $this->contentIsSuppressed = $rev &&
+                               $rev->isDeleted( Revision::DELETED_TEXT | Revision::DELETED_RESTRICTED );
+               }
 
-               if ( $this->section !== false && $this->content !== null ) {
-                       // Not cached (save or load)
-                       return $this->content->getParserOutput( $page->getTitle(), null, $popts );
+               if ( $this->section !== false ) {
+                       $this->content = $this->getSectionContent(
+                               $this->content,
+                               $pageId === null ? $page->getTitle()->getPrefixedText() : $this->msg( 'pageid', $pageId )
+                       );
+                       return $this->content->getParserOutput( $page->getTitle(), $revId, $popts );
                }
 
-               // Try the parser cache first
-               // getParserOutput will save to Parser cache if able
-               $pout = $page->getParserOutput( $popts );
-               if ( !$pout ) {
-                       $this->dieWithError( [ 'apierror-nosuchrevid', $page->getLatest() ] );
+               if ( $isDeleted ) {
+                       // getParserOutput can't do revdeled revisions
+                       $pout = $this->content->getParserOutput( $page->getTitle(), $revId, $popts );
+               } else {
+                       // getParserOutput will save to Parser cache if able
+                       $pout = $page->getParserOutput( $popts, $revId, $suppressCache );
                }
-               if ( $getWikitext ) {
-                       $this->content = $page->getContent( Revision::RAW );
+               if ( !$pout ) {
+                       $this->dieWithError( [ 'apierror-nosuchrevid', $revId ?: $page->getLatest() ] );
                }
 
                return $pout;
        }
 
-       /**
-        * Get the content for the given page and the requested section.
-        *
-        * @param WikiPage $page
-        * @param int $pageId
-        * @return Content
-        */
-       private function getContent( WikiPage $page, $pageId = null ) {
-               $content = $page->getContent( Revision::RAW ); // XXX: really raw?
-
-               if ( $this->section !== false && $content !== null ) {
-                       $content = $this->getSectionContent(
-                               $content,
-                               !is_null( $pageId )
-                                       ? $this->msg( 'pageid', $pageId )
-                                       : $page->getTitle()->getPrefixedText()
-                       );
-               }
-               return $content;
-       }
-
        /**
         * Extract the requested section from the given Content
         *
         * @param Content $content
         * @param string|Message $what Identifies the content in error messages, e.g. page title.
-        * @return Content|bool
+        * @return Content
         */
        private function getSectionContent( Content $content, $what ) {
                // Not cached (save or load)
index ed3f25f..5554105 100644 (file)
        "api-format-title": "MediaWiki API result",
        "api-format-prettyprint-header": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the <var>format</var> parameter to change the output format. To see the non-HTML representation of the $1 format, set <kbd>format=$2</kbd>.\n\nSee the [[mw:Special:MyLanguage/API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
        "api-format-prettyprint-header-only-html": "This is an HTML representation intended for debugging, and is unsuitable for application use.\n\nSee the [[mw:Special:MyLanguage/API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
+       "api-format-prettyprint-header-hyperlinked": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the <var>format</var> parameter to change the output format. To see the non-HTML representation of the $1 format, set [$3 <kbd>format=$2</kbd>].\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
        "api-format-prettyprint-status": "This response would be returned with HTTP status $1 $2.",
 
        "api-login-fail-aborted": "Authentication requires user interaction, which is not supported by <kbd>action=login</kbd>. To be able to login with <kbd>action=login</kbd>, see [[Special:BotPasswords]]. To continue using main-account login, see <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
index c7bcf02..e6414b1 100644 (file)
@@ -63,6 +63,7 @@
        "apihelp-compare-param-fromtitle": "Primeiro título para comparar.",
        "apihelp-compare-param-fromid": "Identificador da primeira páxina a comparar.",
        "apihelp-compare-param-fromrev": "Primeira revisión a comparar.",
+       "apihelp-compare-param-fromtext": "Uso este texto en vez do contido da revisión especificada por <var>fromtitle</var>, <var>fromid</var> ou <var>fromrev</var>.",
        "apihelp-compare-param-totitle": "Segundo título para comparar.",
        "apihelp-compare-param-toid": "Identificador da segunda páxina a comparar.",
        "apihelp-compare-param-torev": "Segunda revisión a comparar.",
index 36a19bc..74d83e6 100644 (file)
        "apihelp-compare-paramvalue-prop-diff": "ה־HTML של ההשוואה.",
        "apihelp-compare-paramvalue-prop-diffsize": "גודל ה־HTML של ההשוואה, בבתים.",
        "apihelp-compare-paramvalue-prop-rel": "מזהי הגרסאות של הגרסאות לפני \"from\" ואחרי \"to\", אם יש כאלה.",
+       "apihelp-compare-paramvalue-prop-ids": "מזהי הדף והגרסה של גרסאות ה־\"from\" וה־\"to\".",
+       "apihelp-compare-paramvalue-prop-title": "כותרות הדפים של גרסאות ה־\"from\" וה־\"to\".",
+       "apihelp-compare-paramvalue-prop-user": "השם והמזהה של המשתמש של גרסאות ה־\"from\" וה־\"to\".",
+       "apihelp-compare-paramvalue-prop-comment": "התקציר על גרסאות ה־\"from\" וה־\"to\".",
+       "apihelp-compare-paramvalue-prop-parsedcomment": "התקציר המפוענח על גרסאות ה־\"from\" וה־\"to\".",
+       "apihelp-compare-paramvalue-prop-size": "הגודל של גרסאות ה־\"from\" וה־\"to\".",
        "apihelp-compare-example-1": "יצירת תיעוד שינוי בין גרסה 1 ל־2.",
        "apihelp-createaccount-description": "יצירת חשבון משתמש חדש.",
        "apihelp-createaccount-param-preservestate": "אם <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> החזיר true עבור <samp>hasprimarypreservedstate</samp>, בקשות שמסומנות בתור <samp>primary-required</samp> אמורות להיות מושמטות. אם מוחזר ערך לא ריק ל־<samp>preservedusername</samp>, שם המשתמש הזה ישמש לפרמטר <var>username</var>.",
        "apierror-changeauth-norequest": "יצירת בקשת השינוי נכשלה.",
        "apierror-chunk-too-small": "גודל הפלח המזערי הוא {{PLURAL:$1|בית אחד|$1 בתים}} בשביל פלחים לא סופיים.",
        "apierror-cidrtoobroad": "טווחי CIDR של $1 שרחבים יותר מ־/$2 אינם קבילים.",
+       "apierror-compare-no-title": "לא ניתן לעשות התמרה לפני שמירה ללא כותרת. נא לנסות לציין <var>fromtitle</var> או <var>totitle</var>.",
+       "apierror-compare-relative-to-nothing": "אין גרסת \"from\" עבור <var>torelative</var> שתהיה יחסית.",
        "apierror-contentserializationexception": "הסדרת התוכן נכשלה: $1",
        "apierror-contenttoobig": "התוכן שסיפקת חורג מגודל הערך המרבי של {{PLURAL:$1|קילובייט אחד|$1 קילובייטים}}.",
        "apierror-copyuploadbaddomain": "העלאות לפי URL אינם מורשות מהמתחם הזה.",
        "apierror-maxlag": "ממתין ל־$2: שיהוי של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
        "apierror-mimesearchdisabled": "חיפוש MIME כבוי במצב קמצן.",
        "apierror-missingcontent-pageid": "תוכן חסר עבור מזהה הדף $1.",
+       "apierror-missingcontent-revid": "תוכן חסר עבור מזהה הגרסה $1.",
        "apierror-missingparam-at-least-one-of": "דרוש {{PLURAL:$2|הפרמטר|לפחות אחד מהפרמטרים}} $1.",
        "apierror-missingparam-one-of": "דרוש {{PLURAL:$2|הפרמטר|אחד מהפרמטרים}} $1.",
        "apierror-missingparam": "הפרמטר <var>$1</var> צריך להיות מוגדר.",
        "apierror-missingrev-pageid": "אין גרסה נוכחית של דף עם המזהה $1.",
+       "apierror-missingrev-title": "אין גרסה נוכחית לכותרת $1.",
        "apierror-missingtitle-createonly": "כותרות חסרות יכולות להיות מוגנות עם <kbd>create</kbd>.",
        "apierror-missingtitle": "הדף שנתת אינו קיים.",
        "apierror-missingtitle-byname": "הדף $1 אינו קיים.",
        "apiwarn-badurlparam": "לא היה אפשר לפענח את <var>$1urlparam</var> עבור $2. משתמשים רק ב־width ו־height.",
        "apiwarn-badutf8": "הערך הערך שהועבר ל־<var>$1</var> מכיל נתונים בלתי־תקינים או בלתי־מנורמלים. נתונים טקסט אמורים להיות תקינים, מנורמלי NFC ללא תווי בקרה C0 למעט HT (\\t)‏, LF (\\n), ו־CR (\\r).",
        "apiwarn-checktoken-percentencoding": "נא לבדוק שסימנים כמו \"+\" באסימון מקודדים עם אחוזים בצורה נכונה ב־URL.",
+       "apiwarn-compare-nocontentmodel": "לא היה אפשר לקבוע את מודל התוכן, נניח שזה $1.",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> הוצהר בתור מיושן. נא להשתמש ב־ <kbd>prop=deletedrevisions</kbd> או ב־<kbd>list=alldeletedrevisions</kbd> במקום זה.",
        "apiwarn-deprecation-expandtemplates-prop": "מכיוון שלא ניתנו ערכים לפרמטר <var>prop</var>, תסדיר מיושן ישמש לפלט. התסדיר הזה מיושן, ובעתיד יינתן ערך בררת מחדל לפרמטר <var>prop</var>, כך שתמיד ישמש התסדיר החדש.",
        "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
index f2705ba..72a5fda 100644 (file)
        "apihelp-main-param-origin": "Når man aksesserer API-en som bruker en domene-kryssende AJAX-forespørsel (CORS), sett denne til det opprinnelige domenet. Denne må tas med i alle pre-flight-forespørsler, og derfor være en del av spørre-URI-en (ikke POST-kroppen).\n\nFor autentiserte forespørsler må denne stemme helt med en av de opprinnelige i <code>Origin</code>-headeren, slik at den må settes til noe a la <kbd>https://en.wikipedia.org</kbd> eller <kbd>https://meta.wikimedia.org</kbd>. Hvis denne parameteren ikke stemmer med <code>Origin</code>-headeren, returneres et 403-svar. Hvis denne parameteren stemmer med <code>Origin</code>-headeren og originalen er hvitlistet, vil <code>Access-Control-Allow-Origin</code> og <code>Access-Control-Allow-Credentials</code>-headere bli satt.\n\nFor ikke-autentiserte forepørsler, spesifiser <kbd>*</kbd>. Denne vil gjøre at <code>Access-Control-Allow-Origin</code>-headeren blir satt, men <code>Access-Control-Allow-Credentials</code> blir <code>false</code> og alle bruerspesifikke data blir begrenset.",
        "apihelp-main-param-uselang": "Språk å bruke for meldingsoversettelser. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> med <kbd>siprop=languages</kbd> returnerer en liste over språkkoder, eller spesifiser <kbd>user</kbd> for å bruke den nåværende brukerens språkpreferanser, eller spesifiser <kbd>content</kbd> for å bruke denne wikiens innholdsspråk.",
        "apihelp-main-param-errorformat": "Formater som kan brukes for advarsels- og feiltekster.\n; plaintext: Wikitext der HTML-tagger er fjernet og elementer byttet ut.\n; wikitext: Ubehandlet wikitext.\n; html: HTML.\n; raw: Meldingsnøkler og -parametre.\n; none: Ingen tekst, bare feilkoder.\n; bc: Format brukt før MediaWiki 1.29. <var>errorlang</var> og <var>errorsuselocal</var> ses bort fra.",
+       "apihelp-main-param-errorlang": "Språk som skal brukes for advarsler og feil. <kbd>[[Specia:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> med <kbd>siprop=languages/<kbd> returnerer ei liste over språkkoder, eller angi <kbd>content</kbd> for å bruke wikiens innholdsspråk, eller angi <kbd>uselang</kbd> for å bruke samme verdi som <var>uselang</var>-parameteren.",
        "apihelp-main-param-errorsuselocal": "Hvis gitt, vil feiltekster bruke lokalt tilpassede meldinger fra {{ns:MediaWiki}}-navnerommet.",
        "apihelp-block-description": "Blokker en bruker.",
        "apihelp-block-param-user": "Brukernavn, IP-adresse eller IP-intervall som skal blokkeres. Kan ikke brukes sammen med <var>$1userid</var>",
+       "apihelp-block-param-userid": "Bruker-ID som skal blokkeres. Kan ikke brukes sammen med <var>$1user</var>.",
        "apihelp-block-param-expiry": "Utløpstid. Kan være relativ (f.eks. <kbd>5 months</kbd> eller <kbd>2 weeks</kbd>) eller absolutt (f.eks. <kbd>2014-09-18T12:34:56Z</kbd>). Om den er satt til <kbd>infinite</kbd>, <kbd>indefinite</kbd> eller <kbd>never</kbd> vil blokkeringen ikke ha noen utløpsdato.",
        "apihelp-block-param-reason": "Årsak for blokkering.",
        "apihelp-block-param-anononly": "Blokker bare anonyme brukere (dvs. hindre anonyme redigeringer fra denne IP-adressen).",
@@ -56,6 +58,9 @@
        "apihelp-compare-param-fromtitle": "Første tittel å sammenligne.",
        "apihelp-compare-param-fromid": "Første side-ID å sammenligne.",
        "apihelp-compare-param-fromrev": "Første revisjon å sammenligne.",
+       "apihelp-compare-param-fromtext": "Bruk denne teksten i stedet for innholdet i revisjonen som angis med <var>fromtitle</var>, <var>fromid</var> eller <var>fromrev</var>.",
+       "apihelp-compare-param-fromcontentmodel": "Innholdsmodell for <var>fromtext</var>. Om den ikke angis vil den gjettes basert på de andre parameterne.",
+       "apihelp-compare-param-fromcontentformat": "Innholdsserialiseringsformat for <var>fromtext</var>.",
        "apihelp-compare-param-totitle": "Andre tittel å sammenligne.",
        "apihelp-compare-param-toid": "Andre side-ID å sammenligne.",
        "apihelp-compare-param-torev": "Andre revisjon å sammenligne.",
index e53ece6..c5fb799 100644 (file)
        "apihelp-xml-param-includexmlnamespace": "{{doc-apihelp-param|xml|includexmlnamespace}}",
        "apihelp-xmlfm-description": "{{doc-apihelp-description|xmlfm|seealso=* {{msg-mw|apihelp-xml-description}}}}",
        "api-format-title": "{{technical}}\nPage title when API output is pretty-printed in HTML.",
-       "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name",
+       "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML, but a post request is received.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name",
+       "api-format-prettyprint-header-hyperlinked": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name\n* $3 - URL to Non-pretty-printing module",
        "api-format-prettyprint-header-only-html": "{{technical}} Displayed as a header when API output is pretty-printed in HTML, but there is no non-html module.\n\nParameters:\n* $1 - Format name",
        "api-format-prettyprint-status": "{{technical}} Displayed as a header when API pretty-printed output is used for a response that uses an unusual HTTP status code.\n\nParameters:\n* $1 - HTTP status code (integer)\n* $2 - Standard English text for the status code.",
        "api-login-fail-aborted": "{{technical}} Displayed as an error when API login fails due to AuthManager requiring user interaction.\n\nSee also:\n* {{msg-mw|api-login-fail-aborted-nobotpw}}",
index 2264670..36d6df2 100644 (file)
@@ -181,10 +181,12 @@ abstract class ContextSource implements IContextSource {
         * Parameters are the same as wfMessage()
         *
         * @since 1.18
+        * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
+        *   or a MessageSpecifier.
         * @param mixed ...
         * @return Message
         */
-       public function msg( /* $args */ ) {
+       public function msg( $key /* $args */ ) {
                $args = func_get_args();
 
                return call_user_func_array( [ $this->getContext(), 'msg' ], $args );
index 2939510..9c3c42a 100644 (file)
@@ -324,10 +324,12 @@ class DerivativeContext extends ContextSource implements MutableContext {
         * it would set only the original context, and not take
         * into account any changes.
         *
+        * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
+        *   or a MessageSpecifier.
         * @param mixed $args,... Arguments to wfMessage
         * @return Message
         */
-       public function msg() {
+       public function msg( $key ) {
                $args = func_get_args();
 
                return call_user_func_array( 'wfMessage', $args )->setContext( $this );
index 8e9fc6f..d13e1a5 100644 (file)
@@ -52,7 +52,7 @@ use Liuggio\StatsdClient\Factory\StatsdDataFactory;
  * belong here either. Session state changes should only be propagated on
  * shutdown by separate persistence handler objects, for example.
  */
-interface IContextSource {
+interface IContextSource extends MessageLocalizer {
        /**
         * Get the WebRequest object
         *
@@ -143,14 +143,6 @@ interface IContextSource {
         */
        public function getTiming();
 
-       /**
-        * Get a Message object with context set.  See wfMessage for parameters.
-        *
-        * @param mixed ...
-        * @return Message
-        */
-       public function msg();
-
        /**
         * Export the resolved user IP, HTTP headers, user ID, and session ID.
         * The result will be reasonably sized to allow for serialization.
index 0e1de50..2cabfe1 100644 (file)
@@ -449,10 +449,12 @@ class RequestContext implements IContextSource, MutableContext {
         * Get a Message object with context set
         * Parameters are the same as wfMessage()
         *
+        * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
+        *   or a MessageSpecifier.
         * @param mixed ...
         * @return Message
         */
-       public function msg() {
+       public function msg( $key ) {
                $args = func_get_args();
 
                return call_user_func_array( 'wfMessage', $args )->setContext( $this );
index b728786..556fe75 100644 (file)
@@ -558,19 +558,9 @@ class DatabaseOracle extends Database {
        }
 
        function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = []
+               $insertOptions = [], $selectOptions = [], $selectJoinConds = []
        ) {
                $destTable = $this->tableName( $destTable );
-               if ( !is_array( $selectOptions ) ) {
-                       $selectOptions = [ $selectOptions ];
-               }
-               list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) =
-                       $this->makeSelectOptions( $selectOptions );
-               if ( is_array( $srcTable ) ) {
-                       $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) );
-               } else {
-                       $srcTable = $this->tableName( $srcTable );
-               }
 
                $sequenceData = $this->getSequenceData( $destTable );
                if ( $sequenceData !== false &&
@@ -585,13 +575,16 @@ class DatabaseOracle extends Database {
                        $val = $val . ' field' . ( $i++ );
                }
 
-               $sql = "INSERT INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' .
-                       " SELECT $startOpts " . implode( ',', $varMap ) .
-                       " FROM $srcTable $useIndex $ignoreIndex ";
-               if ( $conds != '*' ) {
-                       $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
-               }
-               $sql .= " $tailOpts";
+               $selectSql = $this->selectSQLText(
+                       $srcTable,
+                       array_values( $varMap ),
+                       $conds,
+                       $fname,
+                       $selectOptions,
+                       $selectJoinConds
+               );
+
+               $sql = "INSERT INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ') ' . $selectSql;
 
                if ( in_array( 'IGNORE', $insertOptions ) ) {
                        $this->ignoreDupValOnIndex = true;
index d47334c..1b2831f 100644 (file)
        "config-db-schema-help": "Esti esquema de vezu va tar bien.\nCamúdalos solo si sabes que lo precises.",
        "config-pg-test-error": "Nun puede coneutase cola base de datos <strong>$1</strong>: $2",
        "config-sqlite-dir": "Direutoriu de datos SQLite:",
+       "config-oracle-def-ts": "Espaciu de tables predetermináu:",
+       "config-oracle-temp-ts": "Espaciu de tables temporal:",
        "config-type-mysql": "MySQL (o compatible)",
        "config-type-mssql": "Microsoft SQL Server",
+       "config-support-info": "MediaWiki ye compatible colos siguientes sistemes de bases de datos:\n\n$1\n\nSi nun atopes na llista el sistema de base de datos que tas intentando utilizar, sigue les instrucciones enllazaes enriba p'activar la compatibilidá.",
+       "config-header-mysql": "Configuración de MySQL",
+       "config-header-postgres": "Configuración de PostgreSQL",
+       "config-header-sqlite": "Configuración de SQLite",
+       "config-header-oracle": "Configuración d'Oracle",
+       "config-header-mssql": "Configuración de Microsoft SQL Server",
        "config-invalid-db-type": "Triba non válida de base de datos.",
        "config-missing-db-name": "Tienes d'introducir un valor pa «{{int:config-db-name}}».",
+       "config-missing-db-host": "Tienes d'escribir un valor pa «{{int:config-db-host}}».",
+       "config-missing-db-server-oracle": "Tienes d'escribir un valor pa «{{int:config-db-host-oracle}}».",
+       "config-invalid-db-server-oracle": "TNS inválidu pa la base de datos «$1».\nUsa una cadena «TNS Name» o «Easy Connect» ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Métodos de nomenclatura d'Oracle]).",
+       "config-invalid-db-name": "Nome inválidu de la base de datos «$1».\nUsa sólo lletres ASCII (a-z, A-Z), númberos (0-9), guiones baxos (_) y guiones (-).",
+       "config-invalid-db-prefix": "Prefixu inválidu pa la base de datos «$1».\nUsa sólo lletres ASCII (a-z, A-Z), númberos (0-9), guiones baxos (_) y guiones (-).",
+       "config-connection-error": "$1.\n\nComprueba'l sirvidor, el nome d'usuariu y la contraseña, y tenta nuevamente.",
+       "config-invalid-schema": "Esquema inválidu «$1» pa MediaWiki.\nUsa sólo lletres ASCII (a-z, A-Z), númberos (0-9) y guiones baxos (_).",
+       "config-db-sys-create-oracle": "L'instalador sólo almite l'emplegu d'una cuenta SYSDBA pa crear una cuenta nueva.",
+       "config-db-sys-user-exists-oracle": "La cuenta d'usuariu «$1» yá esiste. ¡SYSDBA sólo puede utilizase pa crear una nueva cuenta!",
+       "config-postgres-old": "Ríquese PostgreSQL $1 o posterior. Tienes la versión $2.",
+       "config-mssql-old": "Ríquese Microsoft SQL Server $1 o posterior. Tienes la versión $2.",
+       "config-sqlite-name-help": "Escueye'l nome qu'identifica la to wiki.\nNun uses espacios o guiones.\nEsti va usase como nome del ficheru de datos pa SQLite.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-utf8": "UTF-8",
index a8abcec..6613972 100644 (file)
        "config-env-php": "PHP $1 je instaliran.",
        "config-env-hhvm": "HHVM $1 je instaliran.",
        "config-no-db": "Ne mogu pronaći pogodan upravljački program za bazu podataka! Morate ga instalirati za PHP-bazu.\n{{PLURAL:$2|Podržana je sljedeća vrsta|Podržane su sljedeće vrste}} baze podataka: $1.\n\nAko se sami kompajlirali PHP, omogućite klijent baze podataka u postavkama koristeći, naprimjer, <code>./configure --with-mysqli</code>.\nAko ste instalirali PHP iz paketa za Debian ili Ubuntu, onda također morate instalirati, naprimjer, paket <code>php5-mysql</code>.",
+       "config-memory-raised": "<code>memory_limit</code> za PHP iznosi $1, povišen na $2.",
+       "config-memory-bad": "<strong>Upozorenje:</strong> <code>memory_limit</code> za PHP iznosi $1.\nOvo je vjerovatno premalo.\nInstalacija možda neće uspjeti!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] je instaliran",
        "config-apc": "[http://www.php.net/apc APC] je instaliran",
+       "config-apcu": "[http://www.php.net/apcu APCu] je instaliran",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] je instaliran",
        "config-diff3-bad": "GNU diff3 nije pronađen.",
+       "config-git": "Pronađen je Git program za kontrolu verzija: <code>$1</code>.",
+       "config-git-bad": "Nije pronađen Git program za kontrolu verzija.",
+       "config-imagemagick": "Pronađen je ImageMagick: <code>$1</code>.\nAko omogućite postavljanje, bit će omogućena minijaturizacija slika.",
+       "config-gd": "Utvrđeno je da je ugrađena grafička biblioteka GD.\nAko omogućite postavljanje, bit će omogućena minijaturizacija slika.",
+       "config-no-scaling": "Ne mogu pronaći biblioteku GD niti ImageMagick.\nMinijaturizacija slika bit će onemogućena.",
+       "config-no-uri": "<strong>Greška:</strong> Ne mogu utvrditi trenutni URI.\nInstalacija je prekinuta.",
        "config-db-type": "Vrsta baze podataka:",
        "config-db-host": "Domaćin baze podataka:",
        "config-db-wiki-settings": "Identificiraj ovu wiki",
        "config-db-name": "Naziv baze podataka:",
        "config-db-name-oracle": "Šema baze podataka:",
+       "config-db-install-account": "Korisnički račun za instalaciju",
        "config-db-username": "Korisničko ime baze podataka:",
        "config-db-password": "Lozinka baze podataka:",
+       "config-db-wiki-account": "Korisnički račun za redovan rad",
+       "config-db-prefix": "Prefiks tabele u bazi podataka:",
+       "config-mysql-old": "Zahtijeva se MySQL $1 ili noviji. Vi imate $2.",
        "config-db-port": "Port baze podataka:",
        "config-db-schema": "Šema za MediaWiki:",
+       "config-pg-test-error": "Ne mogu se povezati na bazu podataka <strong>$1</strong>: $2",
+       "config-sqlite-dir": "Folder za SQLite-podatke:",
        "config-oracle-def-ts": "Predodređeni tabelarni prostor:",
        "config-oracle-temp-ts": "Privremeni tabelarni prostor:",
+       "config-type-mysql": "MySQL (ili kompaktibilan)",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "Postavke MySQL-a",
        "config-header-postgres": "Postavke PostgreSQL-a",
        "config-header-sqlite": "Postavke SQLite-a",
        "config-missing-db-name": "Morate unijeti vrijednost za \"{{int:config-db-name}}\".",
        "config-missing-db-host": "Morate unijeti vrijednost za \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "Morate unijeti vrijednost za \"{{int:config-db-host-oracle}}\".",
+       "config-db-sys-create-oracle": "Program za instalaciju podržava samo upotrebu SYSDBA-računa za pravljenje novih računa.",
+       "config-postgres-old": "Zahtijeva se PostgreSQL $1 ili noviji. Vi imate $2.",
+       "config-mssql-old": "Zahtijeva se Microsoft SQL Server $1 ili noviji. Vi imate $2.",
+       "config-sqlite-name-help": "Izaberite ime koje će predstavljati Vaš wiki.\nNemojte koristiti razmake i crte.\nOvo će se koristiti za ime datoteke SQLite-podataka.",
        "config-sqlite-readonly": "Datoteka <code>$1</code> nije zapisiva.",
+       "config-sqlite-cant-create-db": "Ne mogu napraviti datoteku <code>$1</code> za bazu podataka.",
        "config-sqlite-fts3-downgrade": "PHP ne podržava FTS3, poništavam nadogradnju tabela.",
        "config-upgrade-done": "Nadogradnja završena.\n\nSada možete [$1 početi koristiti Vaš wiki].\n\nAko želite regenerirati Vašu datoteku <code>LocalSettings.php</code>, kliknite na dugme ispod.\nOvo <strong>nije preporučeno</strong> osim ako nemate problema s Vašim wikijem.",
        "config-upgrade-done-no-regenerate": "Nadogradnja završena.\n\nSad možete [$1 početi da koristite svoj wiki].",
        "config-regenerate": "Regeneriraj LocalSettings.php →",
        "config-unknown-collation": "<strong>Upozorenje:</strong> Baza podataka koristi nepoznatu kolaciju.",
        "config-db-web-account": "Račun baze podataka za mrežni pristup",
+       "config-db-web-account-same": "Koristi isti račun kao i za instalaciju",
        "config-db-web-create": "Napravi račun ako već ne postoji",
        "config-mysql-engine": "Skladišni pogon:",
        "config-mysql-innodb": "InnoDB",
        "config-site-name-blank": "Upišite ime sajta.",
        "config-project-namespace": "Imenski prostor projekta:",
        "config-ns-generic": "Projekt",
+       "config-ns-site-name": "Isti kao ime wikija: $1",
        "config-ns-other": "Drugo (navedite)",
        "config-ns-other-default": "MyWiki",
        "config-admin-box": "Administratorski račun",
        "config-admin-password-mismatch": "Lozinke koje ste upisali se ne poklapaju.",
        "config-admin-email": "Adresa e-pošte:",
        "config-admin-error-bademail": "Upisali ste neispravnu adresu e-pošte.",
+       "config-pingback": "Podijeli podatke o instalaciji s programerima MediaWikija.",
+       "config-optional-continue": "Postavi mi još pitanja.",
        "config-optional-skip": "Već mi je dosadilo, daj samo instaliraj wiki.",
+       "config-profile": "Profil korisničkih prava:",
        "config-profile-wiki": "Otvoren wiki",
+       "config-profile-no-anon": "Potrebno je napraviti račun",
+       "config-profile-fishbowl": "Samo ovlašteni korisnici",
        "config-profile-private": "Privatni wiki",
        "config-license": "Autorska prava i licenca:",
        "config-license-none": "Bez podnožja za licencu",
        "config-license-pd": "Javno vlasništvo",
+       "config-email-settings": "Postavke e-pošte",
+       "config-enable-email": "Omogući odlaznu e-poštu",
+       "config-upload-enable": "Omogući postavljanje datoteka",
+       "config-upload-deleted": "Folder za obrisane datoteke:",
        "config-logo": "URL logotipa:",
+       "config-instantcommons": "Omogući Instant Commons",
        "config-cc-again": "Izaberite ponovo...",
        "config-advanced-settings": "Napredna konfiguracija",
        "config-extensions": "Proširenja",
        "config-skins": "Teme",
+       "config-skins-use-as-default": "Koristi temu kao predodređenu",
+       "config-skins-missing": "Nije pronađena nijedna tema. MediaWiki će koristiti rezervnu temu dok ne instalirate druge.",
+       "config-skins-must-enable-some": "Morate izabrati barem jednu temu.",
+       "config-skins-must-enable-default": "Tema koju ste izabrali za predodređenu mora se omogućiti.",
        "config-install-alreadydone": "<strong>Upozorenje:</strong> Izgleda da već imate instaliran MediaWiki i da ga ponovo pokušavate instalirati.\nIdite na sljedeću stranicu.",
        "config-install-step-done": "završeno",
        "config-install-step-failed": "neuspješno",
        "config-install-extensions": "Uključujem proširenja",
        "config-install-database": "Postavljam bazu podataka",
        "config-install-schema": "Pravim šemu",
+       "config-install-pg-plpgsql": "Provjeravam jezik PL/pgSQL",
+       "config-pg-no-plpgsql": "Morate instalirati jezik PL/pgSQL u bazu podataka $1",
        "config-install-user": "Pravim korisnika baze podataka",
        "config-install-user-alreadyexists": "Korisnik \"$1\" već postoji",
+       "config-install-user-create-failed": "Pravljenje korisnika \"$1\" nije uspjelo: $2",
+       "config-install-user-grant-failed": "Dodjeljivanje dozvola korisniku \"$1\" nije uspjelo: $2",
        "config-install-user-missing": "Navedeni korisnik \"$1\" ne postoji.",
        "config-install-tables": "Pravim tabele",
        "config-install-interwiki": "Popunjavam predodređenu međuprojektnu tabelu",
        "config-install-stats": "Pokrećem statistiku",
        "config-install-keys": "Stvaram tajne ključeve",
+       "config-install-updates": "Spriječi pokretanje nepotrebnih ažuriranja",
        "config-install-sysop": "Pravim administratorski korisnički račun",
+       "config-install-subscribe-fail": "Ne mogu Vas pretplatiti na mediawiki-announce: $1",
+       "config-install-subscribe-notpossible": "cURL nije instaliran, a <code>allow_url_fopen</code> nije dostupno.",
        "config-install-mainpage": "Pravim početnu stranicu sa standardnim sadržajem",
+       "config-install-mainpage-exists": "Početna strana već postoji. Prelazim na sljedeće.",
+       "config-install-mainpage-failed": "Ne mogu umetnuti početnu stranu: $1",
        "config-download-localsettings": "Preuzmi <code>LocalSettings.php</code>",
        "config-help": "pomoć",
        "config-help-tooltip": "kliknite da proširite",
index b8dab21..728a9a8 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Bjankuloski06",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Srdjan m"
                ]
        },
        "config-desc": "Воспоставувачот на МедијаВики",
@@ -58,7 +59,7 @@
        "config-pcre-old": "'''Кобно:''' Се бара PCRE $1 или понова верзија.\nВашиот PHP-бинарен е сврзан со PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Повеќе информации].",
        "config-pcre-no-utf8": "<strong>Кобно</strong>: PCRE-модулот на PHP е срочен без поддршка за PCRE_UTF8.\nМедијаВики бара поддршка за UTF-8 за да може да работи правилно.",
        "config-memory-raised": "<code>memory_limit</code> за PHP изнесува $1, зголемен на $2.",
-       "config-memory-bad": "'''Предупредување:''' <code>memory_limit</code> за PHP изнесува $1.\nОва е веројатно премалку.\nВоспоставката може да не успее!",
+       "config-memory-bad": "<strong>Предупредување:</strong> <code>memory_limit</code> за PHP изнесува $1.\nОва е веројатно премалку.\nВоспоставката може да не успее!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] е воспоставен",
        "config-apc": "[http://www.php.net/apc APC] е воспоставен",
        "config-apcu": "[http://www.php.net/apcu APCu] е воспоставен",
@@ -71,7 +72,7 @@
        "config-imagemagick": "Пронајден е ImageMagick: <code>$1</code>.\nАко овозможите подигање, тогаш ќе биде овозможена минијатуризација на сликите.",
        "config-gd": "Утврдив дека има вградена GD графичка библиотека.\nАко овозможите подигање, тогаш ќе биде овозможена минијатураизација на сликите.",
        "config-no-scaling": "Не можев да пронајдам GD-библиотека или ImageMagick.\nМинијатуризацијата на сликите ќе биде оневозможена.",
-       "config-no-uri": "'''Грешка:''' Не можев да го утврдам тековниот URI.\nВоспоставката е откажана.",
+       "config-no-uri": "<strong>Грешка:</strong> Не можев да го утврдам тековниот URI.\nВоспоставката е откажана.",
        "config-no-cli-uri": "'''Предупредување''': Нема наведено <code>--scriptpath</code>. Ќе се користи основниот: <code>$1</code>.",
        "config-using-server": "Користите опслужувач под името „<nowiki>$1</nowiki>“.",
        "config-using-uri": "Користите опслужувач со URL-адреса „<nowiki>$1$2</nowiki>“.",
        "config-db-port": "Порта на базата:",
        "config-db-schema": "Шема за МедијаВики",
        "config-db-schema-help": "Оваа шема обично по правило ќе работи нормално.\nСменете ја само ако знаете дека треба да се смени.",
-       "config-pg-test-error": "Не можам да се поврзам со базата '''$1''': $2",
+       "config-pg-test-error": "Не можам да се поврзам со базата <strong>$1</strong>: $2",
        "config-sqlite-dir": "Папка на SQLite-податоци:",
        "config-sqlite-dir-help": "SQLite ги складира сите податоци во една податотека.\n\nПапката што ќе ја наведете мора да е запислива од мрежниот опслужувач во текот на воспоставката.\n\nТаа '''не''' смее да биде достапна преку семрежјето, и затоа не ја ставаме кајшто ви се наоѓаат PHP-податотеките.\n\nВоспоставувачот воедно ќе создаде податотека <code>.htaccess</code>, но ако таа не функционира како што треба, тогаш некој ќе може да ви влезе во вашата необработена (сирова) база на податоци.\nТука спаѓаат необработени кориснички податоци (е-поштенски адреси, хеширани лозинки) како и избришани преработки и други податоци за викито до кои се има ограничен пристап.\n\nСе препорачува целата база да ја сместите некаде, како на пр. <code>/var/lib/mediawiki/вашетовики</code>.",
        "config-oracle-def-ts": "Стандарден таблеарен простор:",
index 5b59d2a..fb4122d 100644 (file)
@@ -247,13 +247,13 @@ class DBConnRef implements IDatabase {
        }
 
        public function selectField(
-               $table, $var, $cond = '', $fname = __METHOD__, $options = []
+               $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = []
        ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
        public function selectFieldValues(
-               $table, $var, $cond = '', $fname = __METHOD__, $options = []
+               $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = []
        ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
@@ -411,7 +411,7 @@ class DBConnRef implements IDatabase {
 
        public function insertSelect(
                $destTable, $srcTable, $varMap, $conds,
-               $fname = __METHOD__, $insertOptions = [], $selectOptions = []
+               $fname = __METHOD__, $insertOptions = [], $selectOptions = [], $selectJoinConds = []
        ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
index 8bea8cc..9e91592 100644 (file)
@@ -1150,7 +1150,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        public function selectField(
-               $table, $var, $cond = '', $fname = __METHOD__, $options = []
+               $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = []
        ) {
                if ( $var === '*' ) { // sanity
                        throw new DBUnexpectedError( $this, "Cannot use a * field: got '$var'" );
@@ -1162,7 +1162,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                $options['LIMIT'] = 1;
 
-               $res = $this->select( $table, $var, $cond, $fname, $options );
+               $res = $this->select( $table, $var, $cond, $fname, $options, $join_conds );
                if ( $res === false || !$this->numRows( $res ) ) {
                        return false;
                }
@@ -2356,7 +2356,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        public function insertSelect(
                $destTable, $srcTable, $varMap, $conds,
-               $fname = __METHOD__, $insertOptions = [], $selectOptions = []
+               $fname = __METHOD__, $insertOptions = [], $selectOptions = [], $selectJoinConds = []
        ) {
                if ( $this->cliMode ) {
                        // For massive migrations with downtime, we don't want to select everything
@@ -2368,7 +2368,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                $conds,
                                $fname,
                                $insertOptions,
-                               $selectOptions
+                               $selectOptions,
+                               $selectJoinConds
                        );
                }
 
@@ -2380,7 +2381,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $fields[] = $this->fieldNameWithAlias( $sourceColumnOrSql, $dstColumn );
                }
                $selectOptions[] = 'FOR UPDATE';
-               $res = $this->select( $srcTable, implode( ',', $fields ), $conds, $fname, $selectOptions );
+               $res = $this->select(
+                       $srcTable, implode( ',', $fields ), $conds, $fname, $selectOptions, $selectJoinConds
+               );
                if ( !$res ) {
                        return false;
                }
@@ -2401,7 +2404,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         */
        protected function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds,
                $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = []
+               $insertOptions = [], $selectOptions = [], $selectJoinConds = []
        ) {
                $destTable = $this->tableName( $destTable );
 
@@ -2411,32 +2414,18 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                $insertOptions = $this->makeInsertOptions( $insertOptions );
 
-               if ( !is_array( $selectOptions ) ) {
-                       $selectOptions = [ $selectOptions ];
-               }
-
-               list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) = $this->makeSelectOptions(
-                       $selectOptions );
-
-               if ( is_array( $srcTable ) ) {
-                       $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) );
-               } else {
-                       $srcTable = $this->tableName( $srcTable );
-               }
+               $selectSql = $this->selectSQLText(
+                       $srcTable,
+                       array_values( $varMap ),
+                       $conds,
+                       $fname,
+                       $selectOptions,
+                       $selectJoinConds
+               );
 
                $sql = "INSERT $insertOptions" .
-                       " INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' .
-                       " SELECT $startOpts " . implode( ',', $varMap ) .
-                       " FROM $srcTable $useIndex $ignoreIndex ";
-
-               if ( $conds != '*' ) {
-                       if ( is_array( $conds ) ) {
-                               $conds = $this->makeList( $conds, self::LIST_AND );
-                       }
-                       $sql .= " WHERE $conds";
-               }
-
-               $sql .= " $tailOpts";
+                       " INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ') ' .
+                       $selectSql;
 
                return $this->query( $sql, $fname );
        }
index 782727a..8f3cab8 100644 (file)
@@ -717,11 +717,12 @@ class DatabaseMssql extends Database {
         * @param string $fname
         * @param array $insertOptions
         * @param array $selectOptions
+        * @param array $selectJoinConds
         * @return null|ResultWrapper
         * @throws Exception
         */
        public function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = []
+               $insertOptions = [], $selectOptions = [], $selectJoinConds = []
        ) {
                $this->mScrollableCursor = false;
                try {
@@ -732,7 +733,8 @@ class DatabaseMssql extends Database {
                                $conds,
                                $fname,
                                $insertOptions,
-                               $selectOptions
+                               $selectOptions,
+                               $selectJoinConds
                        );
                } catch ( Exception $e ) {
                        $this->mScrollableCursor = true;
index 2fe275b..57acd01 100644 (file)
@@ -681,14 +681,13 @@ __INDEXATTR__;
         * @param string $fname
         * @param array $insertOptions
         * @param array $selectOptions
+        * @param array $selectJoinConds
         * @return bool
         */
        public function nativeInsertSelect(
                $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = []
+               $insertOptions = [], $selectOptions = [], $selectJoinConds = []
        ) {
-               $destTable = $this->tableName( $destTable );
-
                if ( !is_array( $insertOptions ) ) {
                        $insertOptions = [ $insertOptions ];
                }
@@ -705,28 +704,9 @@ __INDEXATTR__;
                        $savepoint->savepoint();
                }
 
-               if ( !is_array( $selectOptions ) ) {
-                       $selectOptions = [ $selectOptions ];
-               }
-               list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) =
-                       $this->makeSelectOptions( $selectOptions );
-               if ( is_array( $srcTable ) ) {
-                       $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) );
-               } else {
-                       $srcTable = $this->tableName( $srcTable );
-               }
-
-               $sql = "INSERT INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' .
-                       " SELECT $startOpts " . implode( ',', $varMap ) .
-                       " FROM $srcTable $useIndex $ignoreIndex ";
-
-               if ( $conds != '*' ) {
-                       $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
-               }
-
-               $sql .= " $tailOpts";
+               $res = parent::nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname,
+                       $insertOptions, $selectOptions, $selectJoinConds );
 
-               $res = (bool)$this->query( $sql, $fname, $savepoint );
                if ( $savepoint ) {
                        $bar = pg_result_error( $this->mLastResult );
                        if ( $bar != false ) {
@@ -1059,6 +1039,7 @@ __INDEXATTR__;
                if ( $schema === false ) {
                        $schema = $this->getCoreSchema();
                }
+               $table = $this->realTableName( $table, 'raw' );
                $etable = $this->addQuotes( $table );
                $eschema = $this->addQuotes( $schema );
                $sql = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n "
index 617982c..7c6413c 100644 (file)
@@ -568,11 +568,12 @@ interface IDatabase {
         * @param string|array $cond The condition array. See IDatabase::select() for details.
         * @param string $fname The function name of the caller.
         * @param string|array $options The query options. See IDatabase::select() for details.
+        * @param string|array $join_conds The query join conditions. See IDatabase::select() for details.
         *
         * @return bool|mixed The value from the field, or false on failure.
         */
        public function selectField(
-               $table, $var, $cond = '', $fname = __METHOD__, $options = []
+               $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = []
        );
 
        /**
@@ -589,12 +590,13 @@ interface IDatabase {
         * @param string|array $cond The condition array. See IDatabase::select() for details.
         * @param string $fname The function name of the caller.
         * @param string|array $options The query options. See IDatabase::select() for details.
+        * @param string|array $join_conds The query join conditions. See IDatabase::select() for details.
         *
         * @return bool|array The values from the field, or false on failure
         * @since 1.25
         */
        public function selectFieldValues(
-               $table, $var, $cond = '', $fname = __METHOD__, $options = []
+               $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = []
        );
 
        /**
@@ -1247,12 +1249,14 @@ interface IDatabase {
         *    IDatabase::insert() for details.
         * @param array $selectOptions Options for the SELECT part of the query, see
         *    IDatabase::select() for details.
+        * @param array $selectJoinConds Join conditions for the SELECT part of the query, see
+        *    IDatabase::select() for details.
         *
         * @return IResultWrapper
         */
        public function insertSelect( $destTable, $srcTable, $varMap, $conds,
                $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = []
+               $insertOptions = [], $selectOptions = [], $selectJoinConds = []
        );
 
        /**
index d120b6f..4300e9f 100644 (file)
@@ -161,7 +161,10 @@ class LoadMonitor implements ILoadMonitor {
                        if ( !$conn ) {
                                $lagTimes[$i] = false;
                                $host = $this->parent->getServerName( $i );
-                               $this->replLogger->error( __METHOD__ . ": host $host is unreachable" );
+                               $this->replLogger->error(
+                                       __METHOD__ . ": host {db_server} is unreachable",
+                                       [ 'db_server' => $host ]
+                               );
                                continue;
                        }
 
@@ -171,7 +174,10 @@ class LoadMonitor implements ILoadMonitor {
                                $lagTimes[$i] = $conn->getLag();
                                if ( $lagTimes[$i] === false ) {
                                        $host = $this->parent->getServerName( $i );
-                                       $this->replLogger->error( __METHOD__ . ": host $host is not replicating?" );
+                                       $this->replLogger->error(
+                                               __METHOD__ . ": host {db_server} is not replicating?",
+                                               [ 'db_server' => $host ]
+                                       );
                                }
                        }
 
index 9804b2d..d26b304 100644 (file)
@@ -20,26 +20,36 @@ class PageDataRequestHandler {
         * This does not check whether the request is valid and will actually produce a successful
         * response.
         *
-        * @param string|null $title Page title
+        * @param string|null $subPage
         * @param WebRequest $request
         *
         * @return bool
         * @throws HttpError
         */
-       public function canHandleRequest( $title, WebRequest $request ) {
-               if ( $title === '' || $title === null ) {
+       public function canHandleRequest( $subPage, WebRequest $request ) {
+               if ( $subPage === '' || $subPage === null ) {
                        if ( $request->getText( 'target', '' ) === '' ) {
                                return false;
+                       } else {
+                               return true;
                        }
                }
 
-               return true;
+               $parts = explode( '/', $subPage, 2 );
+               if ( $parts !== 2 ) {
+                       $slot = $parts[0];
+                       if ( $slot === 'main' or $slot === '' ) {
+                               return true;
+                       }
+               }
+
+               return false;
        }
 
        /**
         * Main method for handling requests.
         *
-        * @param string $title Page title
+        * @param string $subPage
         * @param WebRequest $request The request parameters. Known parameters are:
         *        - title: the page title
         *        - format: the format
@@ -51,13 +61,23 @@ class PageDataRequestHandler {
         *
         * @throws HttpError
         */
-       public function handleRequest( $title, WebRequest $request, OutputPage $output ) {
+       public function handleRequest( $subPage, WebRequest $request, OutputPage $output ) {
                // No matter what: The response is always public
                $output->getRequest()->response()->header( 'Access-Control-Allow-Origin: *' );
 
+               if ( !$this->canHandleRequest( $subPage, $request ) ) {
+                       throw new HttpError( 400, wfMessage( 'pagedata-bad-title', $subPage ) );
+               }
+
                $revision = 0;
 
-               $title = $request->getText( 'target', $title );
+               $parts = explode( '/', $subPage, 2 );
+               if ( $subPage !== '' ) {
+                       $title = $parts[1];
+               } else {
+                       $title = $request->getText( 'target', '' );
+               }
+
                $revision = $request->getInt( 'oldid', $revision );
                $revision = $request->getInt( 'revision', $revision );
 
index 9c6cf93..1f0e19e 100644 (file)
@@ -327,6 +327,13 @@ class ParserCache {
                        // ...and its pointer
                        $this->mMemc->set( $this->getOptionsKey( $page ), $optionsKey, $expire );
 
+                       // Normally, when there was no key change, the above would have
+                       // overwritten the old entry. Delete that old entry to save disk
+                       // space.
+                       $oldParserOutputKey = $this->getParserOutputKey( $page,
+                               $popts->optionsHashPre30( $optionsKey->mUsedOptions, $page->getTitle() ) );
+                       $this->mMemc->delete( $oldParserOutputKey );
+
                        Hooks::run(
                                'ParserCacheSaveComplete',
                                [ $this, $parserOutput, $page->getTitle(), $popts, $revId ]
index f8ed63f..5be0321 100644 (file)
@@ -60,7 +60,6 @@ class ParserOptions {
         */
        private static $inCacheKey = [
                'dateformat' => true,
-               'editsection' => true,
                'numberheadings' => true,
                'thumbsize' => true,
                'stubthreshold' => true,
@@ -82,6 +81,13 @@ class ParserOptions {
         */
        private $mTimestamp;
 
+       /**
+        * The edit section flag is in ParserOptions for historical reasons, but
+        * doesn't actually affect the parser output since Feb 2015.
+        * @var bool
+        */
+       private $mEditSection = true;
+
        /**
         * Stored user object
         * @var User
@@ -244,23 +250,6 @@ class ParserOptions {
                return $this->setOptionLegacy( 'enableImageWhitelist', $x );
        }
 
-       /**
-        * Create "edit section" links?
-        * @return bool
-        */
-       public function getEditSection() {
-               return $this->getOption( 'editsection' );
-       }
-
-       /**
-        * Create "edit section" links?
-        * @param bool|null $x New value (null is no change)
-        * @return bool Old value
-        */
-       public function setEditSection( $x ) {
-               return $this->setOptionLegacy( 'editsection', $x );
-       }
-
        /**
         * Automatically number headings?
         * @return bool
@@ -878,6 +867,23 @@ class ParserOptions {
                return wfSetVar( $this->mTimestamp, $x );
        }
 
+       /**
+        * Create "edit section" links?
+        * @return bool
+        */
+       public function getEditSection() {
+               return $this->mEditSection;
+       }
+
+       /**
+        * Create "edit section" links?
+        * @param bool|null $x New value (null is no change)
+        * @return bool Old value
+        */
+       public function setEditSection( $x ) {
+               return wfSetVar( $this->mEditSection, $x );
+       }
+
        /**
         * Set the redirect target.
         *
@@ -1041,7 +1047,6 @@ class ParserOptions {
                        // *UPDATE* ParserOptions::matches() if any of this changes as needed
                        self::$defaults = [
                                'dateformat' => null,
-                               'editsection' => true,
                                'tidy' => false,
                                'interfaceMessage' => false,
                                'targetLanguage' => null,
@@ -1256,16 +1261,32 @@ class ParserOptions {
        public function optionsHash( $forOptions, $title = null ) {
                global $wgRenderHashAppend;
 
+               $options = $this->options;
+               $defaults = self::getCanonicalOverrides() + self::getDefaults();
+               $inCacheKey = self::$inCacheKey;
+
+               // Historical hack: 'editsection' hasn't been a true parser option since
+               // Feb 2015 (instead the parser outputs a constant placeholder and post-parse
+               // processing handles the option). But Wikibase forces it in $forOptions
+               // and expects the cache key to still vary on it for T85252.
+               // @todo Deprecate and remove this behavior after optionsHashPre30() is
+               //  removed (Wikibase can use addExtraKey() or something instead).
+               if ( in_array( 'editsection', $forOptions, true ) ) {
+                       $options['editsection'] = $this->mEditSection;
+                       $defaults['editsection'] = true;
+                       $inCacheKey['editsection'] = true;
+                       ksort( $inCacheKey );
+               }
+
                // We only include used options with non-canonical values in the key
                // so adding a new option doesn't invalidate the entire parser cache.
                // The drawback to this is that changing the default value of an option
                // requires manual invalidation of existing cache entries, as mentioned
                // in the docs on the relevant methods and hooks.
-               $defaults = self::getCanonicalOverrides() + self::getDefaults();
                $values = [];
-               foreach ( self::$inCacheKey as $option => $include ) {
+               foreach ( $inCacheKey as $option => $include ) {
                        if ( $include && in_array( $option, $forOptions, true ) ) {
-                               $v = $this->optionToString( $this->options[$option] );
+                               $v = $this->optionToString( $options[$option] );
                                $d = $this->optionToString( $defaults[$option] );
                                if ( $v !== $d ) {
                                        $values[] = "$option=$v";
@@ -1364,7 +1385,7 @@ class ParserOptions {
                // directly. At least Wikibase does at this point in time.
                if ( !in_array( 'editsection', $forOptions ) ) {
                        $confstr .= '!*';
-               } elseif ( !$this->options['editsection'] ) {
+               } elseif ( !$this->mEditSection ) {
                        $confstr .= '!edit=0';
                }
 
index 8955b8c..f99114e 100644 (file)
@@ -29,7 +29,7 @@ use MediaWiki\MediaWikiServices;
  * Object passed around to modules which contains information about the state
  * of a specific loader request.
  */
-class ResourceLoaderContext {
+class ResourceLoaderContext implements MessageLocalizer {
        protected $resourceLoader;
        protected $request;
        protected $logger;
@@ -222,10 +222,12 @@ class ResourceLoaderContext {
         * Get a Message object with context set.  See wfMessage for parameters.
         *
         * @since 1.27
+        * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
+        *   or a MessageSpecifier.
         * @param mixed ...
         * @return Message
         */
-       public function msg() {
+       public function msg( $key ) {
                return call_user_func_array( 'wfMessage', func_get_args() )
                        ->inLanguage( $this->getLanguage() )
                        // Use a dummy title because there is no real title
index ccb202e..e9d2f07 100644 (file)
@@ -1485,7 +1485,7 @@ abstract class Skin extends ContextSource {
         *   should fall back to the next notice in its sequence
         */
        private function getCachedNotice( $name ) {
-               global $wgRenderHashAppend, $parserMemc, $wgContLang;
+               global $wgRenderHashAppend, $wgContLang;
 
                $needParse = false;
 
@@ -1506,9 +1506,10 @@ abstract class Skin extends ContextSource {
                        $notice = $msg->plain();
                }
 
+               $cache = wfGetCache( CACHE_ANYTHING );
                // Use the extra hash appender to let eg SSL variants separately cache.
-               $key = $parserMemc->makeKey( $name . $wgRenderHashAppend );
-               $cachedNotice = $parserMemc->get( $key );
+               $key = $cache->makeKey( $name . $wgRenderHashAppend );
+               $cachedNotice = $cache->get( $key );
                if ( is_array( $cachedNotice ) ) {
                        if ( md5( $notice ) == $cachedNotice['hash'] ) {
                                $notice = $cachedNotice['html'];
@@ -1521,7 +1522,7 @@ abstract class Skin extends ContextSource {
 
                if ( $needParse ) {
                        $parsed = $this->getOutput()->parse( $notice );
-                       $parserMemc->set( $key, [ 'html' => $parsed, 'hash' => md5( $notice ) ], 600 );
+                       $cache->set( $key, [ 'html' => $parsed, 'hash' => md5( $notice ) ], 600 );
                        $notice = $parsed;
                }
 
index 09ed3c4..1b561ef 100644 (file)
@@ -791,16 +791,18 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $config = $this->getConfig();
                $opts = new FormOptions();
                $structuredUI = $this->getUser()->getOption( 'rcenhancedfilters' );
+               // If urlversion=2 is set, ignore the filter defaults and set them all to false/empty
+               $useDefaults = $this->getRequest()->getInt( 'urlversion' ) !== 2;
 
                // Add all filters
                foreach ( $this->filterGroups as $filterGroup ) {
                        // URL parameters can be per-group, like 'userExpLevel',
                        // or per-filter, like 'hideminor'.
                        if ( $filterGroup->isPerGroupRequestParameter() ) {
-                               $opts->add( $filterGroup->getName(), $filterGroup->getDefault() );
+                               $opts->add( $filterGroup->getName(), $useDefaults ? $filterGroup->getDefault() : '' );
                        } else {
                                foreach ( $filterGroup->getFilters() as $filter ) {
-                                       $opts->add( $filter->getName(), $filter->getDefault( $structuredUI ) );
+                                       $opts->add( $filter->getName(), $useDefaults ? $filter->getDefault( $structuredUI ) : false );
                                }
                        }
                }
@@ -808,6 +810,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $opts->add( 'namespace', '', FormOptions::STRING );
                $opts->add( 'invert', false );
                $opts->add( 'associated', false );
+               $opts->add( 'urlversion', 1 );
 
                return $opts;
        }
index ba58e92..9594952 100644 (file)
@@ -33,7 +33,7 @@ use MediaWiki\MediaWikiServices;
  *
  * @ingroup SpecialPage
  */
-class SpecialPage {
+class SpecialPage implements MessageLocalizer {
        // The canonical name of this special page
        // Also used for the default <h1> heading, @see getDescription()
        protected $mName;
@@ -743,7 +743,7 @@ class SpecialPage {
         * @return Message
         * @see wfMessage
         */
-       public function msg( /* $args */ ) {
+       public function msg( $key /* $args */ ) {
                $message = call_user_func_array(
                        [ $this->getContext(), 'msg' ],
                        func_get_args()
@@ -783,6 +783,10 @@ class SpecialPage {
         * @since 1.25
         */
        public function addHelpLink( $to, $overrideBaseUrl = false ) {
+               if ( $this->including() ) {
+                       return;
+               }
+
                global $wgContLang;
                $msg = $this->msg( $wgContLang->lc( $this->getName() ) . '-helppage' );
 
index 9f6feb8..b793a58 100644 (file)
@@ -48,6 +48,12 @@ class RaggettWrapper {
                // Modify inline Microdata <link> and <meta> elements so they say <html-link> and <html-meta> so
                // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
                $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', '<html-$1$2$3', $wrappedtext );
+               // Similar for inline <style> tags, but those aren't empty.
+               $wrappedtext = preg_replace_callback( '!<style([^>]*)>(.*?)</style>!s', function ( $m ) {
+                       return '<html-style' . $m[1] . '>'
+                               . $this->replaceCallback( [ $m[2] ] )
+                               . '</html-style>';
+               }, $wrappedtext );
 
                // Preserve empty li elements (T49673) by abusing Tidy's datafld hack
                // The whitespace class is as in TY_(InitMap)
@@ -78,8 +84,9 @@ class RaggettWrapper {
         * @return string
         */
        public function postprocess( $text ) {
-               // Revert <html-{link,meta}> back to <{link,meta}>
+               // Revert <html-{link,meta,style}> back to <{link,meta,style}>
                $text = preg_replace( '!<html-(link|meta)([^>]*?)(/{0,1}>)!', '<$1$2$3', $text );
+               $text = preg_replace( '!<(/?)html-(style)([^>]*)>!', '<$1$2$3>', $text );
 
                // Remove datafld
                $text = str_replace( '<li datafld=""', '<li', $text );
index d93ce22..d4a3199 100644 (file)
@@ -20,3 +20,5 @@ fix-uri: no
 # html-{meta,link} is a hack we use to prevent Tidy from stripping <meta> and <link> used in the body for Microdata
 new-empty-tags: html-meta, html-link, wbr, source, track
 new-inline-tags: video, audio, bdi, data, time, mark
+# html-style is a hack we use to prevent pre-HTML5 versions of Tidy from stripping <style> used in the body for TemplateStyles
+new-blocklevel-tags: html-style
diff --git a/languages/MessageLocalizer.php b/languages/MessageLocalizer.php
new file mode 100644 (file)
index 0000000..9a1796b
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Language
+ */
+
+/**
+ * Interface for localizing messages in MediaWiki
+ *
+ * @since 1.30
+ * @ingroup Language
+ */
+interface MessageLocalizer {
+
+       /**
+        * This is the method for getting translated interface messages.
+        *
+        * @see https://www.mediawiki.org/wiki/Manual:Messages_API
+        * @see Message::__construct
+        *
+        * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
+        *   or a MessageSpecifier.
+        * @param mixed $params,... Normal message parameters
+        * @return Message
+        */
+       public function msg( $key /*...*/ );
+
+}
index 696be25..ee3f214 100644 (file)
        "searchprofile-everything": "الكل",
        "searchprofile-advanced": "متقدم",
        "searchprofile-articles-tooltip": "ابحث في $1",
-       "searchprofile-images-tooltip": "ابحث عن الصور",
+       "searchprofile-images-tooltip": "ابحث عن الملفات",
        "searchprofile-everything-tooltip": "ابحث في كل المحتوى (شاملا صفحات النقاش)",
        "searchprofile-advanced-tooltip": "ابحث في النطاقات المخصصة",
        "search-result-size": "$1 ({{PLURAL:$2|لا كلمات|كلمة واحدة|كلمتان|$2 كلمات|$2 كلمة}})",
        "listfiles-latestversion-no": "لا",
        "file-anchor-link": "ملف",
        "filehist": "تاريخ الملف",
-       "filehist-help": "اضغط على وقت/زمن لرؤية الملف كما بدا في هذا الزمن.",
+       "filehist-help": "اضغط على زمن/تاريخ لرؤية الملف كما بدا في هذا الزمن.",
        "filehist-deleteall": "احذف الكل",
        "filehist-deleteone": "حذف",
        "filehist-revert": "استرجع",
        "filehist-current": "حالي",
-       "filehist-datetime": "وقت/زمن",
+       "filehist-datetime": "زمن/تاريخ",
        "filehist-thumb": "صورة مصغرة",
        "filehist-thumbtext": "تصغير للنسخة بتاريخ $1",
        "filehist-nothumb": "لا تصغير",
index f46b9d3..77cc528 100644 (file)
        "undelete-cantedit": "Nun puedes desfacer el borráu d'esta páxina porque nun tienes permisu pa editala.",
        "undelete-cantcreate": "Nun puedes desfacer el borráu d'esta páxina porque nun existe nenguna páxina con esti nome y nun tienes permisu pa creala.",
        "pagedata-title": "Datos de la páxina",
+       "pagedata-text": "Esta páxina ufre una interfaz de datos pa les páxines. Escribe'l títulu de la páxina na URL, usando la sintaxis de subpáxina.\n* Aplícase la negociación de conteníu en base a la testera Accept del to cliente. Esto significa que los datos de la páxina van dase nel formatu que prefiera'l to cliente.",
        "pagedata-not-acceptable": "Nun s'alcontró nengún formatu que coincidiera. Tipos MIME soportaos: $1",
        "pagedata-bad-title": "Títulu inválidu: $1."
 }
index a9dcc4f..b1441ff 100644 (file)
        "specialpages-group-maintenance": "ساخلانیش گوزاریشلری",
        "specialpages-group-other": "آیری اؤزل صفحه‌لر",
        "specialpages-group-login": "گیریش / حساب یارات",
-       "specialpages-group-changes": "سون دییشیک‌لیک‌لر و قئیدلر",
+       "specialpages-group-changes": "سون دییشیک‌لیک‌لر و ژورناللار",
        "specialpages-group-media": "مئدیا مروزه‌لری و یوکلمه‌لر",
        "specialpages-group-users": "ایشلدن‌لر و حاقلار",
        "specialpages-group-highuse": "ان چوْخ ایشلدیلمیش صفحه‌لر",
index de0df85..9a3ebe9 100644 (file)
        "recentchanges-legend": "Налады апошніх зьменаў",
        "recentchanges-summary": "Сачыце за апошнімі зьменамі ў {{GRAMMAR:месны|{{SITENAME}}}} на гэтай старонцы.",
        "recentchanges-noresult": "Зьмены, што пасуюць дадзенаму пэрыяду і крытэрам, ня знойдзеныя.",
-       "recentchanges-feed-description": "Сачыце за апошнімі зьменамі ў {{GRAMMAR:месны|{{SITENAME}}}} праз гэтую стужку.",
+       "recentchanges-feed-description": "Сачыце за апошнімі зьменамі ў вікі праз гэтую стужку.",
        "recentchanges-label-newpage": "Гэтым рэдагаваньнем была створаная новая старонка",
        "recentchanges-label-minor": "Гэта дробнае рэдагаваньне",
        "recentchanges-label-bot": "Гэтае рэдагаваньне зробленае робатам",
        "authprovider-resetpass-skip-help": "Прапусьціць скіданьне паролю.",
        "authform-nosession-login": "Аўтэнтыфікацыя была пасьпяховай, але ваш браўзэр ня змог «запомніць» уваход у сыстэму.\n\n$1",
        "authform-nosession-signup": "Рахунак быў створаны, але ваш браўзэр ня змог «запомніць» уваход у сыстэму.\n\n$1",
+       "authform-newtoken": "Адсутнічае токен. $1",
        "changecredentials": "Зьмена ўліковых зьвестак",
        "removecredentials": "Выдаленьне ўліковых зьвестак",
        "removecredentials-submit": "Выдаліць уліковыя зьвесткі",
index 1cee1b9..006c69e 100644 (file)
        "user-mail-no-addy": "Опитвате се да изпратите електронно писмо без да е посочен адрес за електронна поща.",
        "user-mail-no-body": "Опитвате се да изпратите е-писмо с празно или изключително кратко съдържание.",
        "changepassword": "Смяна на парола",
-       "resetpass_announce": "За да завърши процеса на влизане е необходимо да се избере нова парола.",
+       "resetpass_announce": "За да се завърши процеса на влизане е необходимо да се избере нова парола.",
        "resetpass_text": "<!-- Тук добавете текст -->",
        "resetpass_header": "Промяна на парола",
        "oldpassword": "Стара парола:",
        "search-redirect": "(пренасочване от $1)",
        "search-section": "(раздел $1)",
        "search-category": "(категория $1)",
+       "search-file-match": "(съвпада със съдържанието на файла)",
        "search-suggest": "Вероятно имахте предвид: $1",
        "search-rewritten": "Показани са резултати за $1. Вместо това търсете $2.",
        "search-interwiki-caption": "Резултати от сродни проекти",
index bf65acc..3c3f6ed 100644 (file)
@@ -33,7 +33,8 @@
                        "Kayser Ahmad",
                        "NahidSultan",
                        "Elias Ahmmad",
-                       "Catrope"
+                       "Catrope",
+                       "Mohammed Galib Hasan"
                ]
        },
        "tog-underline": "সংযোগের নিচে দাগ দেখানো হোক:",
        "gotointerwiki-invalid": "নিদিষ্টকৃত শিরোনামটি অবৈধ।",
        "gotointerwiki-external": "আপনি [[$2]] পরিদর্শন করতে {{SITENAME}} ছাড়তে চলেছেন যা একটি ভিন্ন ওয়েবসাইট।\n\n'''[$1 $1-এ চলুন]'''",
        "undelete-cantedit": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ আপনার এই পাতাটি সম্পাদনা করার অনুমতি নেই।",
-       "undelete-cantcreate": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ এই নামে কোন পাতা বিদ্যমান নেই ও আপনার এই পাতাটি তৈরি করার অনুমতি নেই।"
+       "undelete-cantcreate": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ এই নামে কোন পাতা বিদ্যমান নেই ও আপনার এই পাতাটি তৈরি করার অনুমতি নেই।",
+       "pagedata-title": "পাতার উপাত্ত",
+       "pagedata-bad-title": "অপ্রযোজ্য শিরোনাম: \"$1\""
 }
index 945dd7f..67075fd 100644 (file)
        "usernameinprogress": "Račun za ovo korisničko ime već se pravi. Molimo sačekajte.",
        "userexists": "Korisničko ime je već u upotrebi.\nIzaberite drugo.",
        "loginerror": "Greška pri prijavljivanju",
-       "createacct-error": "Došlo je do greške pri otvaranju naloga",
+       "createacct-error": "Greška u pravljenju računa",
        "createaccounterror": "Ne mogu napraviti račun: $1",
        "nocookiesnew": "Korisnički račun je napravljen, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće (cookies) za prijavu korisnika.\nVama su kolačići onemogućeni.\nOmogućite ih pa se onda prijavite s novim korisničkim imenom i lozinkom.",
        "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') za prijavu korisnika.\nVama su kolačići onemogućeni.\nOmogućite ih i pokušajte ponovo.",
        "next-page": "sljedeća stranica",
        "prevn-title": "{{PLURAL:$1|Prethodni $1 rezultat|Prethodna $1 rezultata|Prethodnih $1 rezultata}}",
        "nextn-title": "{{PLURAL:$1|Sljedeći $1 rezultat|Sljedeća $1 rezultata|Sljedećih $1 rezultata}}",
-       "shown-title": "Pokaži $1 {{PLURAL:$1|rezultat|rezultata}} po stranici",
+       "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata}} po stranici",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Postoji stranica pod nazivom \"[[:$1]]\" na ovoj wiki'''",
        "searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također stranicu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
        "rc_categories_any": "Bilo koju odabranu",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije izmjene",
        "newsectionsummary": "/* $1 */ novi odlomak",
-       "rc-enhanced-expand": "Pokaži detalje",
+       "rc-enhanced-expand": "Prikaži detalje",
        "rc-enhanced-hide": "Sakrij detalje",
        "rc-old-title": "prvobitno kreirano kao \"$1\"",
        "recentchangeslinked": "Srodne izmjene",
        "recentchangeslinked-title": "Srodne promjene sa \"$1\"",
        "recentchangeslinked-summary": "Ova posebna stranica prikazuje promjene na povezanim stranicama.\nStranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
        "recentchangeslinked-page": "Naslov stranice:",
-       "recentchangeslinked-to": "Pokaži promjene stranica koji su povezane sa datom stranicom",
+       "recentchangeslinked-to": "Prikaži izmjene stranica koji su povezane s datom stranicom",
        "recentchanges-page-added-to-category": "Stranica [[:$1]] dodana je u kategoriju",
        "recentchanges-page-added-to-category-bundled": "Stranica [[:$1]] dodana je u kategoriju, [[Special:WhatLinksHere/$1|ovu stranicu sadrže druge stranice]]",
        "recentchanges-page-removed-from-category": "Stranica [[:$1]] uklonjena je iz kategorije",
        "protectedtitlesempty": "Nijedan naslov članka trenutno nije zaštićen ovim parametrima.",
        "protectedtitles-submit": "Prikaži naslove",
        "listusers": "Spisak korisnika",
-       "listusers-editsonly": "Pokaži samo korisnike koji su uređivali",
+       "listusers-editsonly": "Prikaži samo korisnike koji su uređivali",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
        "listusers-desc": "Sortiraj u opadajućem redoslijedu",
        "usereditcount": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "apisandbox-request-selectformat-label": "Prikaži zahtijevane podatke kao:",
        "apisandbox-request-url-label": "URL zahtjeva:",
        "apisandbox-results-fixtoken": "Ispravi žeton i pošalji ponovo",
+       "apisandbox-results-fixtoken-fail": "Nisam uspio dobiti žeton \"$1\".",
        "apisandbox-continue": "Nastavi",
        "apisandbox-continue-clear": "Očisti",
        "apisandbox-multivalue-all-namespaces": "$1 (svi imenski prostori)",
        "expand_templates_remove_comments": "Ukloni komentare",
        "expand_templates_remove_nowiki": "Onemogući oznake <nowiki> u rezultatima",
        "expand_templates_generate_xml": "Prikaži XML stablo parsera",
-       "expand_templates_generate_rawhtml": "Pokaži izvorni HTML",
+       "expand_templates_generate_rawhtml": "Prikaži izvorni HTML",
        "expand_templates_preview": "Pregled",
        "expand_templates_preview_fail_html": "<em>Budući da {{SITENAME}} ima uključen sirov HTML, te je bilo gubitka u podacima sesije, pregled je sakriven kao mjera predostrožnosti protiv napada preko JavaScripta.</em>\n\n<strong>Ako je ovo ispravan pokušaj pretpregleda, pokušajte ponovo.</strong>\nAko i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]], pa ponovo prijaviti i provjerite dozvoljava li Vaš preglednik kolačiće s ovog sajta.",
        "expand_templates_preview_fail_html_anon": "<em>Pošto stranica {{SITENAME}} ima uključen sirov HTML prikaz, a vi se niste prijavili, pregled je sakriven kao mjera predostrožnosti protiv JavaScript napada.</em>\n\n<strong>Ako je ovo ispravan pokušaj pretpregleda, molim da se [[Special:UserLogin|prijavite]] i pokušate ponovo.</strong>",
index 9d1ad3a..8ae9a42 100644 (file)
        "userinvalidcssjstitle": "'''Atenció:''' No existeix l'aparença «$1». Recordeu que les subpàgines personalitzades amb extensions .css i .js utilitzen el títol en minúscules, per exemple, {{ns:user}}:NOM/vector.css no és el mateix que {{ns:user}}:NOM/Vector.css.",
        "updated": "(Actualitzat)",
        "note": "'''Nota:'''",
-       "previewnote": "<strong>Recorda que això és només una previsualització.</strong>\nEls vostres canvis encara no s’han desat!",
+       "previewnote": "<strong>Recordeu que això és només una previsualització.</strong>\nEls vostres canvis encara no s’han desat!",
        "continue-editing": "Aneu a l’àrea d’edició",
        "previewconflict": "Aquesta previsualització reflecteix, a l'àrea\nd'edició superior, el text tal com apareixerà si trieu desar-lo.",
        "session_fail_preview": "Disculpes! No s'ha pogut processar la vostra modificació a causa d'una pèrdua de dades de la sessió.\n\nPot ser que s'hagi tancat la sessió. <strong>Comproveu si teniu la sessió iniciada i proveu-ho una altra vegada</strong>.\nSi continués sense funcionar, proveu de [[Special:UserLogout|finalitzar la sessió]] i torneu a iniciar-ne una. Comproveu que el vostre navegador permeti les galetes d'aquest lloc.",
        "defaultmessagetext": "Missatge per defecte",
        "content-failed-to-parse": "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
        "invalid-content-data": "Dades de contingut no vàlides",
-       "content-not-allowed-here": "No és permès el contingut \"$1\" a la pàgina [[$2]]",
+       "content-not-allowed-here": "No és permès el contingut «$1» a la pàgina [[$2]]",
        "editwarning-warning": "Si sortiu d'aquesta pàgina, perdreu tots els canvis que hàgiu fet.\nSi teniu un compte d'usuari, podeu eliminar aquest avís en la secció «{{int:prefs-editing}}» de les vostres preferències.",
        "editpage-invalidcontentmodel-title": "Model de contingut no permès",
        "editpage-invalidcontentmodel-text": "El model de contingut «$1» no és permès.",
index c53cb0e..fa5ed6b 100644 (file)
        "anontalk": "Diskussionsseite",
        "navigation": "Navigation",
        "and": "&#32;und",
-       "qbfind": "Finden",
-       "qbbrowse": "Durchsuchen",
-       "qbedit": "Bearbeiten",
-       "qbpageoptions": "Seitenoptionen",
-       "qbmyoptions": "Meine Seiten",
        "faq": "Häufig gestellte Fragen",
-       "faqpage": "Project:FAQ",
        "actions": "Aktionen",
        "namespaces": "Namensräume",
        "variants": "Varianten",
        "edit-local": "Lokale Beschreibung bearbeiten",
        "create": "Erstellen",
        "create-local": "Lokale Beschreibung hinzufügen",
-       "editthispage": "Seite bearbeiten",
-       "create-this-page": "Seite erstellen",
        "delete": "Löschen",
-       "deletethispage": "Diese Seite löschen",
-       "undeletethispage": "Diese Seite wiederherstellen",
        "undelete_short": "{{PLURAL:$1|1 Version|$1 Versionen}} wiederherstellen",
        "viewdeleted_short": "{{PLURAL:$1|Eine gelöschte Version|$1 gelöschte Versionen}} ansehen",
        "protect": "Schützen",
        "protect_change": "ändern",
-       "protectthispage": "Seite schützen",
        "unprotect": "Seitenschutz ändern",
-       "unprotectthispage": "Seitenschutz ändern",
        "newpage": "Neue Seite",
-       "talkpage": "Diese Seite diskutieren",
        "talkpagelinktext": "Diskussion",
        "specialpage": "Spezialseite",
        "personaltools": "Meine Werkzeuge",
-       "articlepage": "Inhaltsseite anzeigen",
        "talk": "Diskussion",
        "views": "Ansichten",
        "toolbox": "Werkzeuge",
        "tool-link-userrights": "{{GENDER:$1|Benutzergruppen}} ändern",
        "tool-link-userrights-readonly": "{{GENDER:$1|Benutzergruppen}} ansehen",
        "tool-link-emailuser": "E-Mail an {{GENDER:$1|diesen Benutzer|diese Benutzerin}} senden",
-       "userpage": "Benutzerseite anzeigen",
-       "projectpage": "Projektseite anzeigen",
        "imagepage": "Dateiseite anzeigen",
        "mediawikipage": "Meldungsseite anzeigen",
        "templatepage": "Vorlagenseite anzeigen",
        "gotointerwiki-invalid": "Der angegebene Titel ist ungültig.",
        "gotointerwiki-external": "Du bist dabei, {{SITENAME}} zu verlassen, um [[$2]] zu besuchen, was eine externe Website ist.\n\n'''[$1 Auf $1 fortfahren]'''",
        "undelete-cantedit": "Du kannst diese Seite nicht wiederherstellen, da du nicht berechtigt bist, diese Seite zu bearbeiten.",
-       "undelete-cantcreate": "Du kannst diese Seite nicht wiederherstellen, da es keine vorhandene Seite mit diesem Namen gibt und du nicht berechtigt bist, diese Seite zu erstellen."
+       "undelete-cantcreate": "Du kannst diese Seite nicht wiederherstellen, da es keine vorhandene Seite mit diesem Namen gibt und du nicht berechtigt bist, diese Seite zu erstellen.",
+       "pagedata-title": "Seitendaten",
+       "pagedata-text": "Diese Seite stellt eine Datenschnittstelle für Seiten zur Verfügung. Bitte gib mithilfe der Unterseitensyntax den Seitentitel in der URL an.\n* Übertragungen von Inhalten werden basierend auf dem Accept-Header deines Clients ausgeführt. Das bedeutet, dass die Seitendaten in dem Format zur Verfügung gestellt werden, das von deinem Client bevorzugt wird.",
+       "pagedata-not-acceptable": "Kein passendes Format gefunden. Unterstützte MIME-Typen: $1",
+       "pagedata-bad-title": "Ungültiger Titel: $1."
 }
index be8e3c6..3b50dc3 100644 (file)
        "saveusergroups": "Guardar grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "userrights-groupsmember": "Miembro de:",
        "userrights-groupsmember-auto": "Miembro implícito de:",
-       "userrights-groups-help": "Puedes cambiar los grupos en que está este usuario:\n* Una casilla marcada significa que el usuario está en ese grupo.\n* Una casilla sin marcar significa que el usuario no está en ese grupo.\n* Un * indica que no se puede eliminar el grupo una vez que se ha añadido o viceversa.\n* Un # indica que sólo se puede volver a poner la fecha de caducidad de membresía de este grupo; no se pueden llevar adelante.",
+       "userrights-groups-help": "Puedes modificar los grupos a los que pertenece {{GENDER:$1|este usuario|esta usuaria}}:\n* Una casilla marcada significa que {{GENDER:$1|el usuario|la usuaria}} está en ese grupo.\n* Una casilla sin marcar significa que {{GENDER:$1|el usuario|la usuaria}} no está en ese grupo.\n* Un * indica que no podrás eliminar el grupo una vez que lo añadas, o viceversa.\n* Un # indica que puedes únicamente postergar, y no adelantar, la fecha de caducidad de la membresía a este grupo.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "No tienes permiso para editar permisos de usuario en otros wikis.",
        "userrights-nodatabase": "La base de datos $1 no existe o no es local.",
        "authmanager-authplugin-setpass-failed-message": "El complemento de autenticación denegó el cambio de contraseña.",
        "authmanager-authplugin-create-fail": "El complemento de autenticación denegó la creación de la cuenta.",
        "authmanager-authplugin-setpass-denied": "El complemento de autenticación no permite el cambio de contraseñas.",
-       "authmanager-authplugin-setpass-bad-domain": "Dominio inválido.",
+       "authmanager-authplugin-setpass-bad-domain": "El dominio no es válido.",
        "authmanager-autocreate-noperm": "La creación automática de cuentas no está permitida.",
        "authmanager-autocreate-exception": "La creación automática de cuentas ha sido temporalmente desactivada debido a errores previos.",
        "authmanager-userdoesnotexist": "El usuario «$1» no está registrado.",
        "gotointerwiki-invalid": "El título especificado no es válido.",
        "gotointerwiki-external": "Estás a punto de abandonar {{SITENAME}} para visitar [[$2]], un sitio web diferente.\n\n'''[$1 Continuar a $1]'''",
        "undelete-cantedit": "No puedes deshacer el borrado de esta página porque no tienes permisos para editarla.",
-       "undelete-cantcreate": "No puedes deshacer el borrado de esta página porque no existe ninguna página con este nombre y no tienes permisos para crearla."
+       "undelete-cantcreate": "No puedes deshacer el borrado de esta página porque no existe ninguna página con este nombre y no tienes permisos para crearla.",
+       "pagedata-title": "Datos de la página",
+       "pagedata-bad-title": "El título «$1» no es válido."
 }
index 2c31ef5..81a323c 100644 (file)
        "gotointerwiki-invalid": "Le titre spécifié n’est pas valide.",
        "gotointerwiki-external": "Vous allez quitter {{SITENAME}} pour visiter [[$2]], qui est un site web distinct.\n\n<strong>[$1 Continuer vers $1]</strong>",
        "undelete-cantedit": "Vous ne pouvez pas annuler la suppression de cette page car vous n’êtes pas autorisé à la modifier.",
-       "undelete-cantcreate": "Vous ne pouvez pas annuler la suppression de cette page car il n’existe pas de page avec ce nom, et vous n’êtes pas autorisé à la créer."
+       "undelete-cantcreate": "Vous ne pouvez pas annuler la suppression de cette page car il n’existe pas de page avec ce nom, et vous n’êtes pas autorisé à la créer.",
+       "pagedata-title": "Données de page",
+       "pagedata-text": "Cette page fournit une interface de données aux pages. Veuillez fournir le titre de la page dans l’URL en utilisant la syntaxe de sous-page.\n* La négociation de contenu s’applique d’après l’entête Accept de votre client. Cela veut dire que les données de la page seront fournies dans le format préféré par votre client.",
+       "pagedata-not-acceptable": "Aucun format correspondant trouvé. Types MIME supportés : $1",
+       "pagedata-bad-title": "Titre non valide : $1."
 }
index 664b6f5..2843c87 100644 (file)
        "gotointerwiki-invalid": "O título especificado non é válido.",
        "gotointerwiki-external": "Vai sair de {{SITENAME}} para visitar [[$2]], que é un sitio web externo.\n\n'''[$1 Continuar en $1]'''",
        "undelete-cantedit": "Non pode anular o borrado desta páxina porque non ten permisos para editar esta páxina.",
-       "undelete-cantcreate": "Non pode anular o borrado desta páxina xa que non hai ningunha páxina con ese nome e non ten permisos para creala."
+       "undelete-cantcreate": "Non pode anular o borrado desta páxina xa que non hai ningunha páxina con ese nome e non ten permisos para creala.",
+       "pagedata-title": "Datos da páxina",
+       "pagedata-text": "Esta páxina porporciona unha interface de datos para páxinas. Por favor, proporcione o título da páxina na URL, usando a sintaxe de subpáxinas.\n* A negociación de contido aplícase baseándose na cabeceira Accept do seu cliente. Isto significa que os datos da páxina serán proporcionados no formato preferido polo seu cliente.",
+       "pagedata-not-acceptable": "Non se atopou ningún formato correspondente. Tipos MIME soportadosː $1",
+       "pagedata-bad-title": "Título non válido: $1."
 }
index 15c7bf2..4936047 100644 (file)
@@ -55,7 +55,7 @@
        "tog-enotifminoredits": "પાનાં અને ફાઇલ્સમાં નાનાં ફેરફાર થાય તો પણ મને ઇમેલ મોકલો",
        "tog-enotifrevealaddr": "નોટીફીકેશનના ઇમેલમાં મારૂ ઇમેલ સરનામું બતાવો",
        "tog-shownumberswatching": "ધ્યાન રાખતા સભ્યોની સંખ્યા બતાવો",
-       "tog-oldsig": "હાલના હસ્તાક્ષર:",
+       "tog-oldsig": "તમારા àª¹àª¾àª²àª¨àª¾ àª¹àª¸à«\8dતાàª\95à«\8dષર:",
        "tog-fancysig": "હસ્તાક્ષરનો વિકિલખાણ તરીકે ઉપયોગ કરો (સ્વચાલિત કડી વગર)",
        "tog-uselivepreview": "જીવંત પૂર્વદર્શન વાપરો",
        "tog-forceeditsummary": "કોરો 'ફેરફાર સારાંશ' ઉમેરતા પહેલા મને ચેતવો",
@@ -68,9 +68,9 @@
        "tog-ccmeonemails": "મે અન્યોને મોકલેલા ઇમેલની નકલ મને મોકલો",
        "tog-diffonly": "તફાવતની નીચે લેખ ન બતાવશો",
        "tog-showhiddencats": "છુપી શ્રેણીઓ દર્શાવો",
-       "tog-norollbackdiff": "રà«\8bલબà«\87àª\95 àª\95રà«\8dયા àªªàª\9bà«\80ના àª¤àª«àª¾àªµàª¤à«\8b àª\9bà«\81પાવà«\8b",
+       "tog-norollbackdiff": "રà«\8bલબà«\87àª\95 àª\95રà«\8dયા àªªàª\9bà«\80ના àª¤àª«àª¾àªµàª¤à«\8b àª¦àª°à«\8dશાવà«\8b àª¨àª¹à«\80àª\82",
        "tog-useeditwarning": "સાચવ્યા વગર જો હું પૃષ્ઠ છોડું તો મને ચેતવણી આપો",
-       "tog-prefershttps": "સભ્યનામથી પ્રવેશ કર્યો હોય ત્યારે સુરક્ષિત જોડાણ (https) જ વાપરો",
+       "tog-prefershttps": "àª\9cà«\8dયારà«\87 àª¸àª­à«\8dયનામથà«\80 àªªà«\8dરવà«\87શ àª\95રà«\8dયà«\8b àª¹à«\8bય àª¤à«\8dયારà«\87 àª¸à«\81રàª\95à«\8dષિત àª\9cà«\8bડાણ (https) àª\9c àªµàª¾àªªàª°à«\8b",
        "underline-always": "હંમેશાં",
        "underline-never": "કદી નહિ",
        "underline-default": "પૂર્વ નિર્ધારિત સ્કિન કે બ્રાઉઝર",
        "category-file-count-limited": "નીચે દર્શાવેલ {{PLURAL:$1|દસ્તાવેજ|દસ્તાવેજો}} પ્રસ્તુત શ્રેણીમાં છે.",
        "listingcontinuesabbrev": "ચાલુ..",
        "index-category": "અનુક્રમણિકા બનાવેલા પાનાં",
-       "noindex-category": "અનુક્રમણિકા નહી બનાવેલા પાનાં",
+       "noindex-category": "અનુક્રમણિકા નહી બનાવેલા પાનાં",
        "broken-file-category": "ફાઇલોની ત્રૂટક કડીઓવાળાં પાનાં",
        "about": "વિષે",
        "article": "લેખનું પાનું",
        "newwindow": "(નવા પાનામાં ખુલશે)",
        "cancel": "રદ કરો",
        "moredotdotdot": "વધારે...",
-       "morenotlisted": "આ યાદી પૂર્ણ નથી.",
+       "morenotlisted": "àª\95દાàª\9a àª\86 àª¯àª¾àª¦à«\80 àªªà«\82રà«\8dણ àª¨àª¥à«\80.",
        "mypage": "પાનું",
        "mytalk": "ચર્ચા",
        "anontalk": "ચર્ચા",
        "edit-local": "સ્થાનિક વર્ણનમાં ફેરફાર કરો",
        "create": "બનાવો",
        "create-local": "સ્થાનિક વર્ણન ઉમેરો",
-       "delete": "રદ કરો",
+       "delete": "દà«\82ર કરો",
        "undelete_short": "હટાવેલ {{PLURAL:$1|એક ફેરફાર|$1 ફેરફારો}} પરત લાવો.",
        "viewdeleted_short": "{{PLURAL:$1|ભૂંસી નાખેલો એક|ભૂંસી નાખેલા $1}} ફેરફાર જુઓ",
        "protect": "સુરક્ષિત કરો",
        "ok": "મંજૂર",
        "retrievedfrom": "\"$1\" થી મેળવેલ",
        "youhavenewmessages": "{{PLURAL:$3|તમારી પાસે}} $1 ($2).",
-       "youhavenewmessagesfromusers": "આપને માટે {{PLURAL:$3|અન્ય સભ્ય|$3 અન્ય સભ્યો}} તરફથી $1 છે. ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|આપ}}ને માટે {{PLURAL:$3|અન્ય સભ્ય|$3 અન્ય સભ્યો}} તરફથી $1 છે. ($2).",
        "youhavenewmessagesmanyusers": "આપને માટે ઘણાં સભ્યો તરફથી $1 છે ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|નવો સંદેશો|૯૯૯=નવા સંદેશા}}",
        "newmessagesdifflinkplural": "છેલ્લા {{PLURAL:$1|ફેરફાર|૯૯૯=ફેરફારો}}",
        "youhavenewmessagesmulti": "તમારા માટે $1 ઉપર નવા સંદેશાઓ છે",
        "editsection": "ફેરફાર કરો",
        "editold": "ફેરફાર કરો",
-       "viewsourceold": "સà«\8dરà«\8bત જુઓ",
+       "viewsourceold": "મà«\82ળ જુઓ",
        "editlink": "ફેરફાર",
-       "viewsourcelink": "સà«\8dરà«\8bત જુઓ",
+       "viewsourcelink": "મà«\82ળ જુઓ",
        "editsectionhint": "પરિચ્છેદમાં ફેરફાર કરો: $1",
        "toc": "અનુક્રમણિકા",
        "showtoc": "બતાવો",
        "actionthrottled": "અકાળે અટાકાવી દીધેલી ક્રિયા",
        "actionthrottledtext": "સ્પામ નિયંત્રણ તકેદારી રૂપે આ ક્રિયા અમુક મર્યાદામાં જ કરી શકો છો, અને તમે તે મર્યાદા વટાવી દીધી છે. કૃપા કરી થોડાક સમય પછી ફરી પ્રયત્ન કરો.",
        "protectedpagetext": "ફેરફારો કે એવું કંઈ પણ થતું રોકવા માટે આ પાનું સુરક્ષિત કરવામાં આવ્યું છે.",
-       "viewsourcetext": "આપ આ પાનાનો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:",
-       "viewyourtext": "આપ આ પાનાનાં '''આપનાં સંપાદનો'''નો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:",
+       "viewsourcetext": "આપ આ પાનાનો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો.",
+       "viewyourtext": "આપ આ પાનાનાં <strong>આપનાં સંપાદનો</strong>નો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:<strong>",
        "protectedinterface": "આ પાનું સોફ્ટવેર માટે ઇન્ટરફેઇસ ટેક્સટ આપે છે, અને તેને દુરુપયોગ રોકવા માટે સ્થગિત કર્યું છે.\nબધાંજ વિકિ માટે ભાષાંતર ઉમેરવા કે બદલવા માટે, કૃપા કરી [https://translatewiki.net/ translatewiki.net], મિડિયાવિકિ સ્થાનિયકરણ પ્રકલ્પ, વાપરો.",
        "editinginterface": "<strong>ચેતવણી:</strong> તમે જે પાનામાં ફેરફાર કરી રહ્યા છો તે પાનું સોફ્ટવેર માટે ઇન્ટરફેસ ટેક્સટ પૂરી પાડે છે.\nઅહીંનો બદલાવ આ વિકિ પર ઉપસ્થિત અન્ય સભ્યોના ઇન્ટરફેસનાં દેખાવ ઉપર અસરકર્તા બનશે.",
        "cascadeprotected": "આ પાના પર ફેરફાર પ્રતિબંધિત છે, કારણ કે આ પાનું {{PLURAL:$1|એવા પાનાં}}નું સભ્ય છે કે જેમાં અનુવર્તી(પગથિયામય) સંરક્ષણ લાગુ કરવામાં આવ્યું છે :\n$2",
        "nocookieslogin": "{{SITENAME}} કુકીઝ સિવાય પ્રવેશ કરવા નહીં દે.\nતમે કુકીઝ બંધ કરી છે.\nકૃપા કરી કુકીઝ ચાલુ કરીને તમારા સભ્યનામ સાથે પ્રવેશ કરો.",
        "nocookiesfornew": "સભ્ય ખાતાની પુષ્ટિ નથી થઇ, અમે તેના સ્ત્રોતની પુષ્ટિ ન કરી શક્યા.\nખાત્રી કરો કે તમે કુકીઝ સક્રીય કરી છે, અને પાનું ફરીથી ચડાવો",
        "noname": "તમે પ્રમાણભૂત સભ્યનામ જણાવેલ નથી.",
-       "loginsuccesstitle": "પ્રવેશ સફળ",
+       "loginsuccesstitle": "પ્રવેશીત",
        "loginsuccess": "'''તમે હવે {{SITENAME}}માં \"$1\" તરીકે પ્રવેશી ચુક્યા છો.'''",
        "nosuchuser": "\"$1\" નામ ધરાવતો કોઇ સભ્ય અસ્તિત્વમાં નથી.\n\nસભ્યનામો અક્ષરસંવેદી (કેસ સેન્સિટીવ) હોય છે.\n\nકૃપા કરી સ્પેલીંગ/જોડણી ચકાસો અથવા [[Special:CreateAccount|નવું ખાતુ ખોલો]].",
        "nosuchusershort": "\"$1\" નામનો કોઇ સભ્ય નથી, તમારી જોડણી તપાસો.",
        "noemail": "સભ્ય \"$1\"નું કોઇ ઇ-મેલ સરનામું નોંધાયેલું નથી.",
        "noemailcreate": "તમારે વૈધ ઇમેલ આપવાની જરૂર છે.",
        "passwordsent": "\"$1\" ની નવી ગુપ્તસંજ્ઞા (પાસવર્ડ) આપના ઇમેઇલ પર મોકલવામાં આવ્યો છે.\nકૃપા કરી તે મળ્યા બાદ ફરી લોગ ઇન કરો.",
-       "blocked-mailpassword": "ફેરફાર કરવા માટે તમારું IP એડ્રેસ સ્થગિત કરી દેવાયું છે, તેથી દૂરુપયોગ ટાળવા માટે તમને ગુપ્તસંજ્ઞા ફરી મેળવવાની છૂટ નથી.",
+       "blocked-mailpassword": "ફà«\87રફાર àª\95રવા àª®àª¾àª\9fà«\87 àª¤àª®àª¾àª°à«\81àª\82 IP àª\8fડà«\8dરà«\87સ àª¸à«\8dથàª\97િત àª\95રà«\80 àª¦à«\87વાયà«\81àª\82 àª\9bà«\87, àª¤à«\87થà«\80 àª¦à«\82રà«\81પયà«\8bàª\97 àª\9fાળવા àª®àª¾àª\9fà«\87 àª¤àª®àª¨à«\87 àª\86 IP àª\8fડà«\8dરà«\87સ àªªàª°àª¥à«\80 àª\97à«\81પà«\8dતસàª\82àª\9cà«\8dàª\9eા àª«àª°à«\80 àª®à«\87ળવવાનà«\80 àª\9bà«\82àª\9f àª¨àª¥à«\80.",
        "eauthentsent": "પુષ્ટિ કરવા માટે નિશ્ચિત થયેલા સરનામાં પર ઇમેલ મોકલવામાં આવ્યો છે.\nએ જ સરનામે બીજો ઇમેલ થતાં પહેલાં તમારે ઇમેલમાં લખેલી સૂચનાઓ પ્રમાણે કરવું પડશે જેથી એ પુષ્ટિ થઇ શકે કે આપેલું સરનામું તમારું છે.",
        "throttled-mailpassword": "ગુપ્ત સંજ્ઞા યાદ અપાવતી ઇમેઇલ છેલ્લા {{PLURAL:$1|કલાકમાં|$1 કલાકોમાં}} મોકલેલી છે.\nદૂરુપયોગ રોકવા માટે, {{PLURAL:$1|કલાકમાં|$1 કલાકોમાં}} ફક્ત એક જ આવી મેઇલ કરવામાં આવે છે.",
        "mailerror": "મેઇલ મોકલવામાં ત્રુટિ: $1",
-       "acct_creation_throttle_hit": "àª\86 àªµàª¿àª\95િના àª®à«\81લાàª\95ાતà«\80àª\93àª\8f àª¤àª®àª¾àª°à«\81àª\82 IP àªµàª¾àªªàª°à«\80નà«\87 àª\97àª\88 àª\95ાલà«\87 {{PLURAL:$1|1 àª\96ાતà«\81àª\82 |$1 àª\96ાતા}} àª\96à«\8bલà«\8dયાàª\82 àª\9bà«\87,àª\9cà«\87 àªªà«\8dરવાનગીની મહત્તમ સંખ્યા છે. આને પરિણામે મુલાકાતી આ ક્ષણેવધુ ખાતા નહીં ખોલી શકે.",
+       "acct_creation_throttle_hit": "àª\86 àªµàª¿àª\95િના àª®à«\81લાàª\95ાતà«\80àª\93àª\8f àª¤àª®àª¾àª°à«\81àª\82 IP àªµàª¾àªªàª°à«\80નà«\87 àªªàª¾àª\9bલા $2માàª\82 {{PLURAL:$1|1 àª\96ાતà«\81àª\82 |$1 àª\96ાતા}} àª\96à«\8bલà«\8dયાàª\82 àª\9bà«\87, àª\9cà«\87 àªªરવાનગીની મહત્તમ સંખ્યા છે. આને પરિણામે મુલાકાતી આ ક્ષણેવધુ ખાતા નહીં ખોલી શકે.",
        "emailauthenticated": "તમારૂં ઇ-મેઇલ સરનામું $2 ના $3 સમયે પ્રમાણિત કરેલું છે.",
        "emailnotauthenticated": "તમારૂં ઇ-મેઇલ સરનામું હજુ સુધી પ્રમાણિત થયેલું નથી.\n\nનિમ્નલિખિત વિશેષતાઓમાંથી કોઇ માટે ઇ-મેઇલ મોકલવામાં આવશે નહીં.",
        "noemailprefs": "આ વિશેષતાઓ કાર્ય કરી શકે તે માટે 'તમારી પસંદ'માં ઇ-મેઇલ સરનામું દર્શાવો.",
        "createaccount-title": "{{SITENAME}} માટે ખાતુ બનાવ્યું",
        "createaccount-text": "કોઇકે {{SITENAME}} ($4) પર, નામ \"$2\", ગુપ્તસંજ્ઞા \"$3\", શાથે તમારા ઇ-મેઇલ એડ્રેસ માટે ખાતુ બનાવેલ છે.\n\nતમે હવે પ્રવેશ કરી અને ગુપ્તસંજ્ઞા બદલી શકો છો.\n\nજો આ ખાતુ ભુલથી બનેલું હોય તો,આ સંદેશને અવગણી શકો છો.",
        "login-throttled": "તમે હાલમાં ઘણાં જ પ્રવેશ પ્રયત્નો કર્યા છે.\nકૃપા કરી ફરી પ્રયત્ન કરતાં પહેલાં $1 રાહ જુઓ.",
-       "login-abort-generic": "તમારà«\81àª\82 àªªà«\8dરવà«\87શ àª¨àª¿àª·à«\8dફળ àª¥àª¯à«\81àª\82 - àª\9bà«\8bડà«\80 àª¦à«\87વાયà«\81àª\82",
+       "login-abort-generic": "તમારà«\80 àªªà«\8dરવà«\87શવિધિ àª¨àª¿àª·à«\8dફળ àª¥àª\88 - àª°àª¦àª¬àª¾àª¤àª²",
        "loginlanguagelabel": "ભાષા: $1",
        "suspicious-userlogout": "લોગ આઉટ કરવાની તમારી વિનંતિ પૂરી ન કરી શકાઇ. એમ લાગે છે કે તેને તૃટિ પામેલ બ્રાઉઝર કે પ્રોક્સી દ્વારા મોકલાઈ હતી.",
        "createacct-another-realname-tip": "સાચું નામ મરજીયાત છે.\nજો તમે તે આપવાનું પસંદ કરશો, તો તેનો ઉપયોગ તમે કરેલ યોગદાનનું શ્રેય આપવા માટે થશે.",
        "newpassword": "નવી ગુપ્તસંજ્ઞા:",
        "retypenew": "નવી ગુપ્ત સંજ્ઞા (પાસવર્ડ) ફરી લખો:",
        "resetpass_submit": "ગુપ્તસંજ્ઞા બદલીને પ્રવેશ કરો.",
-       "changepassword-success": "તમારà«\80 àª\97à«\81પà«\8dતસàª\82àª\9cà«\8dàª\9eા àª¸àª«àª³àª¤àª¾àªªà«\82રà«\8dવàª\95 àª¬àª¦àª²àª¾àª\87 àª\97àª\87 છે!",
+       "changepassword-success": "તમારà«\80 àª\97à«\81પà«\8dતસàª\82àª\9cà«\8dàª\9eા àª¬àª¦àª²à«\80 àª\85પાàª\88 છે!",
        "resetpass_forbidden": "ગુપ્તસંજ્ઞા બદલી શકાશે નહીં",
        "resetpass-no-info": "બારોબાર આ પાનું જોવા માટે પ્રવેશ કરવો આવશ્યક છે.",
        "resetpass-submit-loggedin": "ગુપ્તસંજ્ઞા બદલો",
        "hr_tip": "આડી લીટી (શક્ય તેટલો ઓછો ઉપયોગ કરો)",
        "summary": "સારાંશ:",
        "subject": "વિષય:",
-       "minoredit": "àª\86 àª\8fàª\95 àª¨àª¾àª¨à«\8b àª¸à«\81ધારà«\8b છે",
+       "minoredit": "àª\86 àª\8fàª\95 àª¨àª¾àª¨à«\8b àª«à«\87રફાર છે",
        "watchthis": "આ પાનાને ધ્યાનમાં રાખો",
        "savearticle": "પાનું સાચવો",
        "savechanges": "પરિવર્તન સાચવો",
        "summary-preview": "સારાંશ પૂર્વાવલોકન:",
        "subject-preview": "વિષય/શીર્ષક પૂર્વાવલોકન:",
        "blockedtitle": "સભ્ય પ્રતિબંધિત છે",
-       "blockedtext": "'''આપનાં સભ્ય નામ અથવા આઇ.પી. એડ્રેસ પર પ્રતિબંધ મુકવામાં આવ્યો છે.'''\n\nઆ પ્રતિબંધ  $1એ મુક્યો છે.\nજેને માટે કારણ આપવામાં આવ્યું છે કે, ''$2''.\n\n* પ્રતિબંધ મુક્યા તારીખ: $8\n* પ્રતિબંધ ઉઠાવવાની તારીખ: $6\n* જેના ઉપર પ્રતિબંધ મુક્યો છે તે: $7\n\nઆપનાં પર મુકવામાં આવેલાં પ્રતિબંધ વિષે ચર્ચા કરવા માટે આપ $1નો કે અન્ય [[{{MediaWiki:Grouppage-sysop}}|પ્રબંધક]]નો સંપર્ક કરી શકો છો.\nઆપ 'સભ્યને ઇ-મેલ કરો' ની કડી વાપરી નહી શકો, પરંતુ જો આપનાં [[Special:Preferences|મારી પસંદ]]માં યોગ્ય ઇ-મેલ સરનામું વાપર્યું હશે અને તમારા તે ખાતું વાપરવા ઉપર પ્રતિબંધ નહી મુક્યો હોય તો તમે તે કડીનો ઉપયોગ કરી શકશો.\nતમારૂં હાલનું આઇ.પી સરનામું છે $3, અને જેના પર પ્રતિબંધ મુકવામાં આવ્યો છે તે છે  #$5.\nમહેરબાની કરીને કોઇ પણ પત્ર વ્યવહારમાં ઉપરની બધીજ માહિતીનો ઉલ્લેખ કરશો.",
+       "blockedtext": "<strong>આપનાં સભ્ય નામ અથવા આઇ.પી. એડ્રેસ પર પ્રતિબંધ મુકવામાં આવ્યો છે.</strong>\n\nઆ પ્રતિબંધ $1એ મુક્યો છે.\nજેને માટે કારણ આપવામાં આવ્યું છે, <em>$2</em>.\n\n* પ્રતિબંધ મુક્યા તારીખ: $8\n* પ્રતિબંધ ઉઠાવવાની તારીખ: $6\n* જેના ઉપર પ્રતિબંધ મુક્યો છે તે: $7\n\nઆપનાં પર મુકવામાં આવેલાં પ્રતિબંધ વિષે ચર્ચા કરવા માટે આપ $1નો કે અન્ય [[{{MediaWiki:Grouppage-sysop}}|પ્રબંધક]]નો સંપર્ક કરી શકો છો.\nઆપ 'સભ્યને ઇ-મેલ કરો' ની કડી વાપરી નહી શકો, પરંતુ જો આપનાં [[Special:Preferences|મારી પસંદ]]માં યોગ્ય ઇ-મેલ સરનામું વાપર્યું હશે અને તમારા તે ખાતું વાપરવા ઉપર પ્રતિબંધ નહી મુક્યો હોય તો તમે તે કડીનો ઉપયોગ કરી શકશો.\nતમારૂં હાલનું આઇ.પી સરનામું છે $3, અને જેના પર પ્રતિબંધ મુકવામાં આવ્યો છે તે છે  #$5.\nમહેરબાની કરીને કોઇ પણ પત્ર વ્યવહારમાં ઉપરની બધીજ માહિતીનો ઉલ્લેખ કરશો.",
        "autoblockedtext": "તમારાં IP સરનામા પર સ્વયંચાલિત રીતે રોક લગાવી દેવાઈ છે કેમકે તે અન્ય સભ્ય દ્વારા વાપરવામાં આવ્યું હતું જેના પર $1 દ્વારા પહેલેથી પ્રતિબંધ મૂકવામાં આવ્યો છે.\n:''$2''\n\n* રોકની શરુઆત : $8\n* રોકની સમાપ્તિ : $6\n* પ્રસ્તાવિત રોક સહન કરનાર : $7\n\nતમે $1 અથવા કોઇ અન્ય [[{{MediaWiki:Grouppage-sysop}}|પ્રબંધક]]નો સંપર્ક કરી રોકની ચર્ચા કરી શકો.\n\nનોંધો કે તેમે \"આ સભ્યને ઈ-મેલ કરો\" વિકલ્પ નહિ વાપરી શકો, સિવાયકે તમરી પાસે તમારા [[Special:Preferences|user preferences]]માં વૈધ ઈ-મેલ સરનામું હોય અને તે વાપરવા પર પ્રતિબંધ ન મૂકવામાં આવ્યો હોય.\n\nતમારું હાલનું IP સરનામું $3 છે, અને રોકની ID છે #$5.\nઆ માહિતી તમારી પૂછપરછમાં જરૂર ઉમેરશો.",
        "blockednoreason": "કોઇ કારણ દર્શાવવામાં આવ્યું નથી",
        "whitelistedittext": "ફેરફાર કરવા માટે તમારે $1 કરવાનું છે.",
        "noarticletext": "આ પાનામાં હાલમાં કોઇ લખાણ નથી.\nતમે બીજાં પાનાંમાં [[Special:Search/{{PAGENAME}}|આ પાનાંના શીર્ષક માટે શોધી શકો છો]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો],\nઅથવા [{{fullurl:{{FULLPAGENAME}}|action=edit}} આ પાનું બનાવી શકો છો]</span>.",
        "noarticletext-nopermission": "આ પાનામાં હાલમાં કોઇ માહિતિ નથી.\nતમે  [[Special:Search/{{PAGENAME}}|આ શબ્દ]] ધરાવતાં અન્ય લેખો શોધી શકો છો, અથવા <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો], પરંતુ તમને આ પાનું બનાવવાની મંજૂરી નથી.",
        "userpage-userdoesnotexist": "સભ્ય ખાતું \"<nowiki>$1</nowiki>\"ની નોંધણીનથી થઈ.\nશું તમે ખરેખર આ પાનાની રચના કે ફેરફાર કરવા માંગો છો",
-       "userpage-userdoesnotexist-view": "સભ્યના ખાતા $1 ની નોંધણી નથી થઈ",
+       "userpage-userdoesnotexist-view": "સભ્ય ખાતા \"$1\" ની નોંધણી થયેલ નથી.",
        "blocked-notice-logextract": "આ સભ્ય હાલમાં પ્રતિબંધિત છે.\nતમારા નીરીક્ષણ માટે તાજેતરમાં પ્રતિબંધિત થયેલા સભ્યોની યાદિ આપી છે.",
-       "clearyourcache": "<strong>નà«\8bàª\82ધ:</strong> àªªàª¾àª¨à«\81àª\82 àª¸àª¾àª\9aવà«\8dયા àªªàª\9bà«\80, àª¤àª®àª¾àª°à«\87 àª¤àª®àª¾àª°àª¾ àª¬à«\8dરાàª\89àª\9dરનà«\80 àª\95à«\85શ àª¬àª¾àª¯àªªàª¾àª¸ àª\95રવાનà«\80 àª\86વશà«\8dયàª\95તા àªªàª¡à«\80 àª¶àª\95à«\87 àª\9bà«\87.\n*<strong>ફાયરફà«\8bàª\95à«\8dસ / àª¸àª«àª¾àª°à«\80:</strong> </em>શà«\80ફà«\8dàª\9f<em> àª¦àª¬àª¾àªµà«\87લà«\80 àª°àª¾àª\96à«\80નà«\87 ''રિલà«\8bડ'' àªªàª° àª\95à«\8dલિàª\95 àª\95રà«\8b, àª\85થવા àª¤à«\8b <em>Ctrl-F5</em> àª\95à«\87 <em>Ctrl-R<em> àª¦àª¬àª¾àªµà«\8b (મà«\87àª\95 àªªàª° <em>â\8c\98-R</em>)\n*<strong>àª\97à«\81àª\97લ àª\95à«\8dરà«\8bમ:</strong> <em>Ctrl-Shift-R</em> àª¦àª¬àª¾àªµà«\8b (મà«\87àª\95 àªªàª° <em>â\8c\98-Shift-R</em>)\n*<strong>àª\88નà«\8dàª\9fરનà«\87àª\9f àª\8fàª\95à«\8dસપà«\8dલà«\8bરર:</strong> <em>Ctrl</em> àª¦àª¬àª¾àªµà«\87લà«\80 àª°àª¾àª\96à«\80નà«\87 <em>રિફà«\8dરà«\87શ</em> àªªàª° àª\95à«\8dલિàª\95 àª\95રà«\8b, àª\85થવા <em>Ctrl-F5</em> àª¦àª¬àª¾àªµà«\8b\n*<strong>àª\93પà«\87રા:</strong> <em>સાધનà«\8b â\86\92 àªªàª¸àª\82દàª\97à«\80àª\93</em>માàª\82 àª\9càª\88નà«\87 àª\95à«\85શ àª¸àª¾àª« àª\95રà«\8b",
+       "clearyourcache": "<strong>નà«\8bàª\82ધ:</strong> àªªàª¾àª¨à«\81àª\82 àª¸àª¾àª\9aવà«\8dયા àªªàª\9bà«\80, àª¤àª®àª¾àª°à«\87 àª¤àª®àª¾àª°àª¾ àª¬à«\8dરાàª\89àª\9dરનà«\80 àª\95à«\85શ àª¬àª¾àª¯àªªàª¾àª¸ àª\95રવાનà«\80 àª\86વશà«\8dયàª\95તા àªªàª¡à«\80 àª¶àª\95à«\87 àª\9bà«\87.\n*<strong>ફાયરફà«\8bàª\95à«\8dસ / àª¸àª«àª¾àª°à«\80:</strong> </em>શà«\80ફà«\8dàª\9f<em> àª¦àª¬àª¾àªµà«\87લà«\80 àª°àª¾àª\96à«\80નà«\87 ''રિલà«\8bડ'' àªªàª° àª\95à«\8dલિàª\95 àª\95રà«\8b, àª\85થવા àª¤à«\8b <em>Ctrl-F5</em> àª\95à«\87 <em>Ctrl-R<em> àª¦àª¬àª¾àªµà«\8b (મà«\87àª\95 àªªàª° <em>â\8c\98-R</em>)\n*<strong>àª\97à«\81àª\97લ àª\95à«\8dરà«\8bમ:</strong> <em>Ctrl-Shift-R</em> àª¦àª¬àª¾àªµà«\8b (મà«\87àª\95 àªªàª° <em>â\8c\98-Shift-R</em>)\n*<strong>àª\88નà«\8dàª\9fરનà«\87àª\9f àª\8fàª\95à«\8dસપà«\8dલà«\8bરર:</strong> <em>Ctrl</em> àª¦àª¬àª¾àªµà«\87લà«\80 àª°àª¾àª\96à«\80નà«\87 <em>રિફà«\8dરà«\87શ</em> àªªàª° àª\95à«\8dલિàª\95 àª\95રà«\8b, àª\85થવા <em>Ctrl-F5</em> àª¦àª¬àª¾àªµà«\8b\n*<strong>àª\93પà«\87રા:</strong> <em>મà«\87નà«\81 â\86\92 àª¸à«\87àª\9fિàª\82àª\97à«\8dસ</em> (<em>àª\93પà«\87રા â\86\92 àªªà«\8dરà«\87ફરà«\87નà«\8dસિàª\9d</em> àª®à«\87àª\95 àªªàª°) àª®àª¾àª\82 àª\9cાàª\93 àª\85નà«\87 àªªàª\9bà«\80 <em>પà«\8dરાયવસà«\80 àª\85નà«\87 àª¸àª¿àª\95à«\8dયà«\81રિàª\9fà«\80 â\86\92 àª¬à«\8dરાàª\89àª\9dà«\80àª\82àª\97 àª¡à«\87àª\9fા àª¸àª¾àª« àª\95રà«\8b â\86\92 àª\95à«\85શ àª¥àª¯à«\87લા àª\9aિતà«\8dરà«\8b àª\85નà«\87 àª«àª¾àª\88લà«\8b</em> àªªàª° àª\9cાàª\93.",
        "usercssyoucanpreview": "'''ટીપ:''' તમારા નવા CSSને સાચવતા પહેલા  \"{{int:showpreview}}\" બટન વાપરી ચકાસણી કરો.",
        "userjsyoucanpreview": "'''ટીપ:''' Use the તમારી નવી JavaScript ને સાચવતા પહેલા   \"{{int:showpreview}}\" બટન વાપરી ચકાસો.",
        "usercsspreview": "'''યાદ રહે કે તમે તમારા સભ્ય CSS નું અવલોકન કરો છે.'''\n'''હજી સીધું તે સચવાયું નથી!'''",
        "userinvalidcssjstitle": "'''ચેતવણી:''' કોઇ પણ \"$1\" પટલ નથી.\nસભ્ય રચિત .css અને  .js પાના બીજી અંગ્રેજી બારખડી શીર્ષક વાપરે છે, દા. ત. {{ns:user}}:Foo/vector.css નહીં કે {{ns:user}}:Foo/Vector.css.",
        "updated": "(સંવર્ધીત)",
        "note": "'''નોંધ:'''",
-       "previewnote": "'''આ ફક્ત પૂર્વાવલોકન છે;'''\nતમારા ફેરફારો હજુ સાચવવામાં નથી આવ્યા!",
+       "previewnote": "<strong>ધ્યાનમાં રાખો કે આ ફક્ત પૂર્વાવલોકન છે.</strong>\nતમારા ફેરફારો હજુ સાચવવામાં આવ્યા નથી!",
        "continue-editing": "ફેરફાર કરવાનું ચાલુ રાખો",
        "previewconflict": "જો તમે આ પાનું સાચવશો તો આ પ્રિવ્યુમાં દેખાય છે તેવું સચવાશે.",
        "session_fail_preview": "'''અફસોસ છે! સત્ર માહિતી ખોઇ દેવાને કારણે અમે તમારું કાર્ય સાચવી ન શક્યાં.'''\nકૃપયા ફરી પ્રયત્ન કરો.\nતેમ છતાં પણ સાચવી ન શકો તો [[Special:UserLogout|logging out]] કરી ફરી પ્રવેશ કરો.",
        "currentrev-asof": "$1એ જોઈ શકાતી હાલની આવૃત્તિ",
        "revisionasof": "$1 સુધીનાં પુનરાવર્તન",
        "revision-info": "{{GENDER:$6|$2}}$7 દ્વારા $1 સુધીમાં કરવામાં આવેલાં ફેરફારો",
-       "previousrevision": "â\86\90 àª\9cà«\81ના àª«à«\87રફારà«\8b",
-       "nextrevision": "àª\86 àªªàª\9bà«\80નà«\81àª\82 àªªà«\81નરાવરà«\8dતન→",
+       "previousrevision": "â\86\90 àª\9cà«\81નà«\80 àª\86વà«\83તà«\8dતિ",
+       "nextrevision": "àª\86 àªªàª\9bà«\80નà«\80 àª\86વà«\83તà«\8dતિ →",
        "currentrevisionlink": "વર્તમાન આવૃત્તિ",
        "cur": "વર્તમાન",
        "next": "આગળ",
        "page_first": "પહેલું",
        "page_last": "છેલ્લું",
        "histlegend": "વિવિધ પસંદગી:સરખામણી માટે સુધારેલી આવૃતિઓના રેડિયો ખાનાઓ પસંદ કરો અને એન્ટર દબાવો અથવા નીચે આપેલું બટન દબાવો.<br />\nસમજૂતી:'''({{int:cur}})''' = વર્તમાન અને સુધારેલી આવૃતિનો તફાવત, '''({{int:last}})''' = પૂર્વવર્તી ફેરફારનો તફાવત, '''{{int:minoreditletter}}''' = નાનો ફેરફાર.",
-       "history-fieldset-title": "àª\87તિહાસ àª\89àª\96à«\87ળો",
+       "history-fieldset-title": "àª\86વà«\83તà«\8dતિàª\93 àª®àª¾àª\9fà«\87 àª¶à«\8bધો",
        "history-show-deleted": "માત્ર હટાવાયેલા",
        "histfirst": "જુનામાં જુનું",
        "histlast": "નવામાં નવું",
        "compareselectedversions": "પસંદ કરેલા સરખાવો",
        "showhideselectedversions": "પસંદ કરેલા બતાવો / સંતાડો",
        "editundo": "રદ કરો",
-       "diff-empty": "(àª\95à«\8bàª\87 àª­à«\87દ àª¨àª¹ી)",
+       "diff-empty": "(àª\95à«\8bàª\87 àª­à«\87દ àª¨àª¥ી)",
        "diff-multi-sameuser": "(સમાન સભ્ય દ્વારા {{PLURAL:$1|કરાયેલ એક પુનરાવર્તન| કરાયેલા $1 પુનરાવર્તનો}} દર્શાવેલ નથી)",
+       "diff-multi-otherusers": "({{PLURAL:$2|એક અન્ય સભ્ય|$2 સભ્યો}} વડેની {{PLURAL:$1|વચ્ચેની એક આવૃત્તિ|વચ્ચેની $1 આવૃત્તિઓ}} દર્શાવેલ નથી)",
        "diff-multi-manyusers": "{{PLURAL:$2|એક સભ્યએ કરેલું|$2 સભ્યોએ કરેલા}} ({{PLURAL:$1|વચગાળાનું એક પુનરાવર્તન દર્શાવ્યં|વચગાળાનાં $1 પુનરાવર્તનો દર્શાવ્યાં}} નથી.)",
        "searchresults": "પરિણામોમાં શોધો",
        "searchresults-title": "\"$1\" માટેના પરિણામો",
        "search-redirect": "($1થી વાળેલું)",
        "search-section": "(વિભાગ $1)",
        "search-category": "(શ્રેણી $1)",
+       "search-file-match": "(ફાઇલ વિગતને અનુરૂપ છે)",
        "search-suggest": "શું તમે $1 કહેવા માંગો છો?",
        "search-interwiki-caption": "બંધુ પ્રકલ્પ",
        "search-interwiki-default": "$1 માંથી પરીણામો:",
        "recentchanges": "તાજા ફેરફારો",
        "recentchanges-legend": "હાલમાં થયેલા ફેરફારોના વિકલ્પ",
        "recentchanges-summary": "વિકિમાં તાજેતરમાં થયેલા ફેરફારો પર અહીંથી નજર રાખો.",
+       "recentchanges-noresult": "આપેલા સમયગાળા દરમિયાન આ માપદંડો માટે કોઇ ફેરફારો મળ્યા નહી.",
        "recentchanges-feed-description": "આ ફીડ દ્વારા વિકિમાં થયેલા તાજા ફેરફારો પર ધ્યાન રાખો.",
        "recentchanges-label-newpage": "આ ફેરફાર દ્વારા નવું પાનું નિર્મિત થયું",
-       "recentchanges-label-minor": "àª\86 àª\8fàª\95 àª¨àª¾àª¨à«\8b àª¸à«\81ધારà«\8b àª\9bà«\87.",
-       "recentchanges-label-bot": "àª\86 àª«à«\87રફાર àª¬à«\8bàª\9f àª¦à«\8dવારા àª\95રાયà«\8b àª\9bà«\87",
+       "recentchanges-label-minor": "àª\86 àª\8fàª\95 àª¨àª¾àª¨à«\8b àª«à«\87રફાર àª\9bà«\87",
+       "recentchanges-label-bot": "àª\86 àª«à«\87રફાર àª¬à«\8bàª\9f àª¦à«\8dવારા àª\95રાયà«\8b àª¹àª¤à«\8b",
        "recentchanges-label-unpatrolled": "આ ફેરફાર હજી ચકાસાયો નથી",
        "recentchanges-label-plusminus": "પાનાનું કદ આપેલા અંકો જેટલાં બાઈટ્સ જેટલું બદલ્યુ છે.",
        "recentchanges-legend-heading": "<strong>કળ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)",
-       "rcnotefrom": "નીચે <strong>$2</strong> થી ફેરફારો દર્શાવેલ છે (<strong>$1</strong> સુધી દર્શાવલે છે).",
+       "rcnotefrom": "નીચે <strong>$3, $4</strong> થી {{PLURAL:$5|ફેરફાર|ફેરફારો}} દર્શાવેલ છે (<strong>$1</strong> સુધી દર્શાવેલ છે).",
        "rclistfrom": "$3 $2 બાદ થયેલા નવા ફેરફારો બતાવો",
        "rcshowhideminor": "નાના ફેરફારો $1",
        "rcshowhideminor-show": "બતાવો",
        "notargettext": "આ ક્રિયા જેના પર કરવાની છે તે સભ્ય કે પાનાની માહિતી તમે પૂરી પાડી નથી",
        "nopagetitle": "આવું કોઇ લક્ષ્ય પાનું નથી",
        "nopagetext": "તમે લખેલ પાનું અસ્તિત્વમાં નથી",
-       "pager-newer-n": "{{PLURAL:$1|નવું 1|નવા $1}}",
+       "pager-newer-n": "{{PLURAL:$1|નવું |નવા $1}}",
        "pager-older-n": "{{PLURAL:$1|જૂનું ૧|જૂનાં $1}}",
        "suppress": "નાબૂદ",
        "querypage-disabled": "કાર્યક્ષમતાના કારણે આ ખાસ પાનું નિષ્ક્રિ કરાયું છે.",
        "booksources-text": "નીચે દર્શાવેલ યાદી એ કડીઓ બતાવે છે જેઓ નવા અને જૂના પુસ્તકો  વેચે છે , અને તમે માંગેલ વસ્તુ સંબંધિ વધુ મહિતી પણ ધરાવી શકે છે.",
        "booksources-invalid-isbn": "આપેલ ISBN વૈધ નથી લાગતો; મૂળ સ્રોતને ચકાસી, ભૂલ શોધી, ખરી માહિતી આપો.",
        "specialloguserlabel": "કર્તા:",
-       "speciallogtitlelabel": "લક્ષ્યાંક (શીર્ષક અથવા વપરાશકર્તા)",
+       "speciallogtitlelabel": "લક્ષ્યાંક (શીર્ષક અથવા {{ns:user}}:સભ્યનું સભ્યનામ):",
        "log": "લૉગ",
        "all-logs-page": "બધાં જાહેર માહિતીપત્રકો",
        "alllogstext": "{{SITENAME}} ના લોગનો સંયુક્ત વર્ણન.\nતમે લોગનો પ્રકાર,સભ્ય નામ અથવા અસરગ્રસ્ત પાના આદિ પસંદ કરી તમારી યાદિ ટૂંકાવી શકો.",
        "logempty": "લોગમાં આને મળતી કોઇ વસ્તુ નથી",
        "log-title-wildcard": "આ શબ્દો દ્વારા શરૂ થનાર શીર્ષકો શોધો",
        "showhideselectedlogentries": "પસંદગીની લોગ નોંધણીઓ બતાવો/છુપાવો",
-       "allpages": "બધા પાના",
+       "allpages": "બધા પાનાંઓ",
        "nextpage": "આગળનું પાનું ($1)",
        "prevpage": "પાછળનું પાનું ($1)",
        "allpagesfrom": "આનાથી શરૂ થતા પાના દર્શાવો:",
        "allpagesprefix": "ઉપસર્ગ ધરાવતા પાનાં શોધો",
        "allpagesbadtitle": "આપનું ઈચ્છિત શીર્ષક અમાન્ય છે, ખાલી છે, અથવાતો અયોગ્ય રીતે આંતર-ભાષિય કે આંતર-વિકિ સાથે જોડાયેલું શીર્ષક છે.\nશક્ય છે કે તેમાં એક કે વધુ એવા અક્ષર કે ચિહ્નો છે કે જે પાનાનાં શીર્ષક માટે અવૈધ છે.",
        "allpages-bad-ns": "{{SITENAME}} ને નામસ્થળ  \"$1\" નથી.",
-       "allpages-hide-redirects": "àª\85નà«\8dયતà«\8dર àªµàª¾àª³à«\87લાàª\82 પાનાંઓ છૂપાવો",
+       "allpages-hide-redirects": "દિશાનિરà«\8dદà«\87શિત પાનાંઓ છૂપાવો",
        "cachedspecial-refresh-now": "આધૂનિક બતાવો.",
        "categories": "શ્રેણીઓ",
        "categoriespagetext": "નીચેની {{PLURAL:$1|શ્રેણી|શ્રેણીઓ}}માં પાના કે અન્ય સભ્યો છે.\n[[Special:UnusedCategories|વણ વપરાયેલી શ્રેણીઓ]] અત્રે દર્શાવવામાં આવી નથી.\n[[Special:WantedCategories|ઈચ્છિત શ્રેણીઓ]] પણ જોઈ જુઓ.",
        "trackingcategories-disabled": "વર્ગ અસક્રિય છે.",
        "mailnologin": "મેળવનારનું સરનામું નથી",
        "mailnologintext": "અન્ય સભ્યને ઇ-મેલ મોકલવા માટે તમે [[Special:UserLogin|logged in]] પ્રવેશ કરેલ હોવો જોઈએ અને તમારા[[Special:Preferences|preferences]] વિકલ્પોમાં તમારા ઈ-મેલ સરનામાની પુષ્ટિ થયેલી હોવી જોઈએ",
-       "emailuser": "સભà«\8dયનà«\87 àª\87-મેલ કરો",
+       "emailuser": "àª\86 àª¸àª­à«\8dયનà«\87 àª\87મેલ કરો",
        "emailuser-title-target": "આ {{GENDER:$1|સભ્ય}}ને ઇમેલ કરો",
        "emailuser-title-notarget": "ઇ-મેલ વપરાશકર્તા",
        "emailpagetext": "તમે નીચે દર્શાવેલ ફોર્મ વાપરી આ {{GENDER:$1|સભ્ય}}ને ઇ-મેલ મોકલી શકો છો.\nતમે [[Special:Preferences|તમારી પસંદમાં]] જે ઇ-મેલ સરનામું લખ્યું હશે તે \"દ્વારા\"ના નામ હેઠળ દેખાશે, જેથી ઇ-મેલ મેળવનાર તમને સંદેશાનો જવાબ આપી શકશે.",
        "unwatchthispage": "નીરીક્ષણ બંધ કરો",
        "notanarticle": "માહિતી વિનાનું પાનું",
        "notvisiblerev": "અન્ય સભ્ય દ્વારા થયેલું સંપાદન ભૂંસી નખાયું છે.",
-       "watchlist-details": "ચર્ચાનાં પાનાં ન ગણતા {{PLURAL:$1|$1 પાનું|$1 પાનાં}} ધ્યાનસૂચીમાં છે.",
+       "watchlist-details": "àª\9aરà«\8dàª\9aાનાàª\82 àªªàª¾àª¨àª¾àª\82 àª\85લàª\97થà«\80 àª¨ àª\97ણતા {{PLURAL:$1|$1 àªªàª¾àª¨à«\81àª\82|$1 àªªàª¾àª¨àª¾àª\82}} àª§à«\8dયાનસà«\82àª\9aà«\80માàª\82 àª\9bà«\87.",
        "wlheader-enotif": "ઈમેલ સૂચના પદ્ધતિ સક્રીય કરાઈ.",
        "wlheader-showupdated": "તમારી છેલ્લી મુલાકાત પછી બદલાયેલાં પાના  '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે.",
-       "wlnote": "નીચે $3, $4 વાગ્યા સુધીના છેલ્લા {{PLURAL:$2|એક કલાક|'''$2''' કલાક}}માં થયેલા {{PLURAL:$1|ફેરફાર|'''$1''' ફેરફારો }} દર્શાવ્યા છે.",
+       "wlnote": "નીચે $3, $4 વાગ્યા સુધીના છેલ્લા {{PLURAL:$2|એક કલાક|<strong>$2</strong> કલાક}}માં થયેલા {{PLURAL:$1|ફેરફાર|<strong>$1</strong> ફેરફારો }} દર્શાવ્યા છે.",
        "wlshowlast": "છેલ્લા $1 કલાકો $2 દિવસો બતાવો",
        "watchlist-options": "ધ્યાનસૂચિના વિકલ્પો",
        "watching": "નજર રાખી રહ્યાં છો...",
        "minimum-size": "લઘુત્તમ કદ",
        "maximum-size": "મહત્તમ કદ",
        "pagesize": "(બાઇટ્સ)",
-       "restriction-edit": "બદલો",
+       "restriction-edit": "ફà«\87રફાર àª\95રો",
        "restriction-move": "ખસેડો",
        "restriction-create": "બનાવો",
        "restriction-upload": "ફાઇલ ચઢાવો",
        "tooltip-namespace_association": "પસંદ કરેલા નામસ્થળ સાથેસંલગ્ન નામ સ્થ્ળની માહિતી શામિલ કરવા આ ખાનું પણ અંકિત કરો",
        "blanknamespace": "(મુખ્ય)",
        "contributions": "{{GENDER:$1|સભ્ય}}ના યોગદાનો",
-       "contributions-title": "સભ્ય $1નું યોગદાન",
-       "mycontris": "યોગદાન",
+       "contributions-title": "$1 માટે સભ્યના યોગદાનો",
+       "mycontris": "યોગદાન",
        "anoncontribs": "યોગદાનો",
        "contribsub2": "($2) માટે {{GENDER:$3|$1}}",
        "nocontribs": "આ પરિમાણને મળતી પરિણામ નથી મળ્યાં",
        "sp-contributions-search": "યોગદાન શોધો",
        "sp-contributions-username": "IP સરનામું અથવા સભ્યનામ:",
        "sp-contributions-toponly": "માત્ર છેલ્લી આવૃત્તિના ફેરફારો જ દર્શાવો",
+       "sp-contributions-newonly": "માત્ર નવા પાનાં બનાવ્યા હોય તેવા ફેરફાર દર્શાવો",
        "sp-contributions-submit": "શોધો",
        "whatlinkshere": "અહી શું જોડાય છે",
        "whatlinkshere-title": "\"$1\" ને જોડતા પાનાં",
        "tooltip-save": "તમે કરેલાં ફેરફારો સુરક્ષિત કરો",
        "tooltip-preview": "તમે કરેલાં ફેરફારોનું પૂર્વદર્શન કરો. કૃપા કરી કાર્ય સુરક્ષિત કરતાં પહેલા આ જોઇ લો.",
        "tooltip-diff": "તમે માહિતીમાં કયા ફેરફારો કર્યા છે તે જોવા મળશે",
-       "tooltip-compareselectedversions": "અ પાનાનાં પસંદ કરેલા બે વૃત્તાંત વચ્ચેનાં ભેદ જુઓ.",
+       "tooltip-compareselectedversions": "અા પાનાની પસંદ કરેલી બે આવૃત્તિઓ વચ્ચેનો ભેદ જુઓ",
        "tooltip-watch": "આ પાનાને તમારી ધ્યાનસૂચિમાં ઉમેરો",
        "tooltip-watchlistedit-normal-submit": "શીર્ષકો હટાવો",
        "tooltip-watchlistedit-raw-submit": "ધ્યાનસૂચિ અધ્યતન બનાવો",
        "pageinfo-length": "પાનાંની લંબાઇ (બાઇટમાં)",
        "pageinfo-article-id": "પાનાં ઓળખ",
        "pageinfo-language": "પાનાંની વિગતની ભાષા",
+       "pageinfo-content-model": "પાનાનું લખાણ બંધારણ",
        "pageinfo-robot-policy": "રોબોટ્સ દ્વારા અનુક્રમિત",
        "pageinfo-robot-index": "માન્ય",
        "pageinfo-robot-noindex": "અમાન્ય",
        "pageinfo-watchers": "પાના નીરીક્ષકોની સંખ્યા",
+       "pageinfo-few-watchers": "$1 કરતા ઓછા {{PLURAL:$1|ચાતક|ચાતકો}}",
        "pageinfo-redirects-name": "આ પાનાં પર દિશાનિર્દેશનોની સંખ્યા",
-       "pageinfo-subpages-name": "આ પાનાંનું ઉપપાનું",
+       "pageinfo-subpages-name": "આ પાનાના ઉપપાનાઓ",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|દિશાનિર્દેશન|દિશાનિર્દેશનો}}; $3 {{PLURAL:$3|દિશાનિર્દેશન નહી|દિશાનિર્દેશનો નહી}})",
        "pageinfo-firstuser": "પૃષ્ઠ સર્જક",
        "pageinfo-firsttime": "પાનાં બનાવવાની તારીખ",
        "pageinfo-lastuser": "છેલ્લો ફેરફાર કરનાર",
        "pageinfo-toolboxlink": "પાનાંની માહિતી",
        "pageinfo-redirectsto": "તરફ દિશાનિર્દેશન",
        "pageinfo-redirectsto-info": "માહિતી",
+       "pageinfo-contentpage": "લખાણ પાના તરીકે ગણાયેલ",
        "pageinfo-contentpage-yes": "હા",
        "pageinfo-protect-cascading-yes": "હા",
        "pageinfo-category-info": "શ્રેણી માહિતી",
        "version-entrypoints-header-url": "URL",
        "version-libraries-library": "લાઇબ્રેરી",
        "version-libraries-version": "આવૃત્તિ",
+       "redirect": "ફાઇલ, સભ્ય, પાનું, આવૃત્તિ, અથવા લૉગ ઓળખ વડે દિશાનિર્દેશન",
        "redirect-submit": "જાઓ",
        "redirect-lookup": "જુઓ:",
        "redirect-value": "કિંમત:",
        "htmlform-cloner-create": "વધુ ઉમેરો",
        "htmlform-cloner-delete": "હટાવો",
        "logentry-delete-delete": "$1 દ્વારા પાનું $3 {{GENDER:$2|દૂર કરવામાં આવ્યું}}",
-       "logentry-delete-restore": "$1 {{GENDER:$2|પુનઃસંગ્રહ}} પાનું $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|પુનઃસંગ્રહ}} પાનું $3 ($4)",
        "logentry-delete-event": "$1 એ {{PLURAL:$5|લૉગ ઘટના|$5 લૉગ ઘટનાઓ}} ની દ્રશ્યતા $3 પર {{GENDER:$2|બદલેલ}} છે: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|એ}} પૃષ્ઠ $3 પરના {{PLURAL:$5|એક પુનરાવર્તન|$5 પુનરાવર્તનો}}ની દૃષ્યતા બદલી: $4",
        "logentry-delete-event-legacy": "$1એ $3 પર લોગ ઘટનાઓની દૃશ્યતા {{GENDER:$2|બદલી}}",
        "logentry-newusers-create2": "સભ્ય ખાતું $3 $1 વડે {{GENDER:$2|બનાવવામાં આવ્યું હતું}}",
        "logentry-newusers-autocreate": "વપરાશકર્તા ખાતું $1 આપમેળે {{GENDER:$2|બનાવવામાં આવ્યું હતું}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|દ્વારા ચડાવેલ}} $3",
+       "logentry-upload-overwrite": "$1 એ $3 ની નવી આવૃત્તિ {{GENDER:$2|ચડાવી}}",
        "rightsnone": "(કંઈ નહી)",
        "feedback-adding": "પ્રતિભાવ આ પાના પર ઉમેરાઈ રહ્યો છે.",
        "feedback-bugcheck": "સરસ! જરા જોઈ લેશો કે આ  પહેલેથી જ હાજર [$1 known bugs] નથીને?",
        "special-characters-group-thai": "થાઈ",
        "special-characters-group-lao": "લાઓ",
        "special-characters-group-khmer": "ખ્મેર",
-       "mw-widgets-titleinput-description-new-page": "પાનું અસ્તિત્વ ધરાવતું નથી."
+       "mw-widgets-titleinput-description-new-page": "પાનું અસ્તિત્વ ધરાવતું નથી.",
+       "randomrootpage": "યાદચ્છિક મૂળ પાનું"
 }
index 5887fe7..44692df 100644 (file)
        "anontalk": "שיחה",
        "navigation": "ניווט",
        "and": "&#32;וגם",
-       "qbfind": "חיפוש",
-       "qbbrowse": "ניווט",
-       "qbedit": "עריכה",
-       "qbpageoptions": "הדף הזה",
-       "qbmyoptions": "הדפים שלי",
        "faq": "שאלות ותשובות",
-       "faqpage": "Project:שאלות ותשובות",
        "actions": "פעולות",
        "namespaces": "מרחבי שם",
        "variants": "גרסאות שפה",
        "edit-local": "עריכת התיאור המקומי",
        "create": "יצירה",
        "create-local": "הוספת תיאור מקומי",
-       "editthispage": "עריכת דף זה",
-       "create-this-page": "יצירת דף זה",
        "delete": "מחיקה",
-       "deletethispage": "מחיקת דף זה",
-       "undeletethispage": "שחזור דף זה",
        "undelete_short": "שחזור {{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "viewdeleted_short": "הצגת {{PLURAL:$1|עריכה מחוקה אחת|$1 עריכות מחוקות}}",
        "protect": "הגנה",
        "protect_change": "שינוי",
-       "protectthispage": "הפעלת הגנה על דף זה",
        "unprotect": "שינוי הגנה",
-       "unprotectthispage": "שינוי ההגנה על דף זה",
        "newpage": "דף חדש",
-       "talkpage": "שיחה על דף זה",
        "talkpagelinktext": "שיחה",
        "specialpage": "דף מיוחד",
        "personaltools": "כלים אישיים",
-       "articlepage": "צפייה בדף התוכן",
        "talk": "שיחה",
        "views": "צפיות",
        "toolbox": "כלים",
        "tool-link-userrights": "שינוי הרשאות ה{{GENDER:$1|משתמש|משתמשת}}",
        "tool-link-userrights-readonly": "צפייה בהרשאות ה{{GENDER:$1|משתמש|משתמשת}}",
        "tool-link-emailuser": "שליחת דוא\"ל ל{{GENDER:$1|משתמש|משתמשת}}",
-       "userpage": "צפייה בדף המשתמש",
-       "projectpage": "צפייה בדף המיזם",
        "imagepage": "צפייה בדף הקובץ",
        "mediawikipage": "צפייה בדף ההודעה",
        "templatepage": "צפייה בדף התבנית",
        "gotointerwiki-invalid": "הכותרת שצוינה אינה תקינה.",
        "gotointerwiki-external": "{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} לעזוב את {{SITENAME}} כדי לבקר באתר הנפרד \"[[$2]]\".\n\n'''[$1 להמשך לכתובת $1]'''",
        "undelete-cantedit": "אין באפשרותך לשחזר דף זה, כי אין באפשרותך לערוך אותו.",
-       "undelete-cantcreate": "אין באפשרותך לשחזר דף זה, כי אין דף קיים בשם זה ואין באפשרותך ליצור אותו."
+       "undelete-cantcreate": "אין באפשרותך לשחזר דף זה, כי אין דף קיים בשם זה ואין באפשרותך ליצור אותו.",
+       "pagedata-title": "מידע על הדף",
+       "pagedata-text": "דף זה מהווה ממשק מידע לדפים. כדי להשתמש בו, כותרת הדף צריכה להופיע בכתובת ה־URL, בעזרת התחביר המתאים לדפי־משנה.\n* דף זה משתמש בשיטת \"ניתוב התוכן\" (Content negotiation) בהתבסס על כותרת ה־Accept ששולח צד הלקוח. פירוש הדבר הוא שהמידע על הדף יישלח בפורמט שצד הלקוח (כגון דפדפן) מעדיף.",
+       "pagedata-not-acceptable": "לא נמצא פורמט נתמך. סוגי MIME נתמכים: $1",
+       "pagedata-bad-title": "כותרת בלתי־תקינה: $1."
 }
index a1b852c..5ebc0c4 100644 (file)
        "anontalk": "Discussion",
        "navigation": "Navigation",
        "and": "&#32;e",
-       "qbfind": "Cercar",
-       "qbbrowse": "Foliar",
-       "qbedit": "Modificar",
-       "qbpageoptions": "Iste pagina",
-       "qbmyoptions": "Mi paginas",
        "faq": "FAQ",
-       "faqpage": "Project:FAQ",
        "actions": "Actiones",
        "namespaces": "Spatios de nomines",
        "variants": "Variantes",
        "edit-local": "Modificar description local",
        "create": "Crear",
        "create-local": "Adder description local",
-       "editthispage": "Modificar iste pagina",
-       "create-this-page": "Crear iste pagina",
        "delete": "Deler",
-       "deletethispage": "Deler iste pagina",
-       "undeletethispage": "Restaurar iste pagina",
        "undelete_short": "Restaurar {{PLURAL:$1|un modification|$1 modificationes}}",
        "viewdeleted_short": "Vider {{PLURAL:$1|un modification|$1 modificationes}} delite",
        "protect": "Proteger",
        "protect_change": "cambiar",
-       "protectthispage": "Proteger iste pagina",
        "unprotect": "Cambiar protection",
-       "unprotectthispage": "Cambiar le protection de iste pagina",
        "newpage": "Nove pagina",
-       "talkpage": "Discuter iste pagina",
        "talkpagelinktext": "Discussion",
        "specialpage": "Pagina special",
        "personaltools": "Instrumentos personal",
-       "articlepage": "Vider pagina de contento",
        "talk": "Discussion",
        "views": "Representationes",
        "toolbox": "Instrumentos",
        "tool-link-userrights": "Modificar le gruppos del {{GENDER:$1|usator|usatrice}}",
        "tool-link-userrights-readonly": "Vider gruppos de {{GENDER:$1|usator}}",
        "tool-link-emailuser": "Inviar e-mail a iste {{GENDER:$1|usator|usatrice}}",
-       "userpage": "Vider pagina del usator",
-       "projectpage": "Vider pagina de projecto",
        "imagepage": "Vider le pagina del file",
        "mediawikipage": "Vider pagina de message",
        "templatepage": "Vider pagina de patrono",
        "gotointerwiki-invalid": "Le titulo specificate non es valide.",
        "gotointerwiki-external": "Tu es sur le puncto de quitar {{SITENAME}} pro visitar [[$2]], un sito web separate.\n\n'''[$1 Continuar a $1]'''",
        "undelete-cantedit": "Tu non pote restaurar iste pagina perque tu non ha le permission de modificar iste pagina.",
-       "undelete-cantcreate": "Tu non pote restaurar iste pagina perque il non ha pagina existente con iste nomine e tu non ha le permission de crear lo."
+       "undelete-cantcreate": "Tu non pote restaurar iste pagina perque il non ha pagina existente con iste nomine e tu non ha le permission de crear lo.",
+       "pagedata-title": "Datos de pagina"
 }
index 0d90853..7f39185 100644 (file)
        "anontalk": "Pembicaraan",
        "navigation": "Navigasi",
        "and": "&#32;dan",
-       "qbfind": "Pencarian",
-       "qbbrowse": "Navigasi",
-       "qbedit": "Sunting",
-       "qbpageoptions": "Halaman ini",
-       "qbmyoptions": "Halaman saya",
        "faq": "FAQ",
-       "faqpage": "Project:FAQ",
        "actions": "Tindakan",
        "namespaces": "Ruang nama",
        "variants": "Varian",
        "edit-local": "Sunting deskripsi lokal",
        "create": "Buat",
        "create-local": "Tambah deskripsi lokal",
-       "editthispage": "Sunting halaman ini",
-       "create-this-page": "Buat halaman ini",
        "delete": "Hapus",
-       "deletethispage": "Hapus halaman ini",
-       "undeletethispage": "Batalkan penghapusan",
        "undelete_short": "Batal hapus {{PLURAL:$1|$1 suntingan}}",
        "viewdeleted_short": "Lihat {{PLURAL:$1|$1 suntingan}} yang dihapus",
        "protect": "Lindungi",
        "protect_change": "ubah",
-       "protectthispage": "Lindungi halaman ini",
        "unprotect": "Ubah perlindungan",
-       "unprotectthispage": "Ubah perlindungan halaman ini",
        "newpage": "Halaman baru",
-       "talkpage": "Bicarakan halaman ini",
        "talkpagelinktext": "bicara",
        "specialpage": "Halaman istimewa",
        "personaltools": "Perkakas pribadi",
-       "articlepage": "Lihat halaman isi",
        "talk": "Pembicaraan",
        "views": "Tampilan",
        "toolbox": "Perkakas",
        "tool-link-userrights": "Simpan kelompok {{GENDER:$1|pengguna}}",
        "tool-link-userrights-readonly": "Lihat kelompok {{GENDER:$1|pengguna}}",
        "tool-link-emailuser": "Kirim surel ke {{GENDER:$1|pengguna}} ini",
-       "userpage": "Lihat halaman pengguna",
-       "projectpage": "Lihat halaman proyek",
        "imagepage": "Lihat halaman berkas",
        "mediawikipage": "Lihat halaman pesan sistem",
        "templatepage": "Lihat halaman templat",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat pula [[Special:NewPages|daftar halaman baru]])",
        "recentchanges-submit": "Tampilkan",
        "rcfilters-activefilters": "Filter aktif",
-       "rcfilters-quickfilters": "Pranala cepat (pintas)",
+       "rcfilters-quickfilters": "Pengaturan filter tersimpan",
        "rcfilters-quickfilters-placeholder-title": "Tidak ada pranala tersimpan sekarang",
        "rcfilters-quickfilters-placeholder-description": "Untuk menyimpan pengaturan saringan dan menggunakannya kembali, klik ikon penanda halaman di area Penyaringan Aktif, di bawah.",
        "rcfilters-savedqueries-defaultlabel": "Saringan tersimpan",
        "rcfilters-savedqueries-unsetdefault": "Hapus sebagai baku",
        "rcfilters-savedqueries-remove": "Hapus",
        "rcfilters-savedqueries-new-name-label": "Nama",
-       "rcfilters-savedqueries-apply-label": "Buat pranala cepat",
+       "rcfilters-savedqueries-apply-label": "Simpan pengaturan",
        "rcfilters-savedqueries-cancel-label": "Batalkan",
-       "rcfilters-savedqueries-add-new-title": "Simpan penyaringan sebagai pranala cepat",
+       "rcfilters-savedqueries-add-new-title": "Simpan pengaturan filter ini",
        "rcfilters-restore-default-filters": "Kembalikan filter bawaan",
        "rcfilters-clear-all-filters": "Hapus semua penyaringan",
        "rcfilters-search-placeholder": "Filter perubahan terbaru (jelajahi atau masukan input)",
        "revid": "revisi $1",
        "pageid": "ID halaman $1",
        "rawhtml-notallowed": "Tag &lt;html&gt; tidak dapat digunakan di luar halaman normal.",
-       "gotointerwiki-invalid": "Judul yang ditentukan tidak sah"
+       "gotointerwiki-invalid": "Judul yang ditentukan tidak sah",
+       "pagedata-title": "Data halaman",
+       "pagedata-bad-title": "Judul tidak sah: $1"
 }
index 83a891b..e97fa73 100644 (file)
        "gotointerwiki-invalid": "Il titolo specificato non è valido.",
        "gotointerwiki-external": "Stai per lasciare {{SITENAME}} per visitare [[$2]], che è un sito web diverso.\n\n'''[$1 Continua su $1]'''",
        "undelete-cantedit": "Non puoi ripristinare questa pagina poiché non hai sufficienti permessi per modificarla.",
-       "undelete-cantcreate": "Non puoi ripristinare questa pagina poiché la pagina con questo nome non è ancora inesistente e non hai sufficienti permessi per crearla."
+       "undelete-cantcreate": "Non puoi ripristinare questa pagina poiché la pagina con questo nome non è ancora inesistente e non hai sufficienti permessi per crearla.",
+       "pagedata-not-acceptable": "Nessun formato corrispondente trovato. Tipi MIME supportati: $1",
+       "pagedata-bad-title": "Titolo non valido: $1."
 }
index 82f677d..5657f4e 100644 (file)
        "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "「未登録」の項目が登録済み利用者を絞り込む項目と競合しています。競合している項目は項目選択欄で強調表示されています。",
        "rcfilters-filter-user-experience-level-newcomer-label": "新規利用者",
        "rcfilters-filter-user-experience-level-newcomer-description": "登録から4日以内、かつ10編集以下の利用者",
-       "rcfilters-filter-user-experience-level-learner-label": "Learners",
-       "rcfilters-filter-user-experience-level-learner-description": "「新規参加者」よりも編集経験があり、「Experienced users」より編集経験が少ない利用者",
-       "rcfilters-filter-user-experience-level-experienced-label": "Experienced users",
+       "rcfilters-filter-user-experience-level-learner-label": "初学者",
+       "rcfilters-filter-user-experience-level-learner-description": "「新規参加者」よりも編集経験があり、「経験者」より編集経験が少ない利用者",
+       "rcfilters-filter-user-experience-level-experienced-label": "経験者",
        "rcfilters-filter-user-experience-level-experienced-description": "30日以上、かつ500編集以上の活動履歴がある利用者",
        "rcfilters-filtergroup-automated": "自動編集",
        "rcfilters-filter-bots-label": "ボット",
index b854fe2..3a43d1d 100644 (file)
        "history_short": "Sujarah",
        "history_small": "sujarah",
        "updatedmarker": "wis dianyari kawit tekaku mréné pungkasan",
-       "printableversion": "Vèrsi cithak",
+       "printableversion": "Vèrsi cap-capan",
        "permalink": "Pranala permanèn",
        "print": "Cithak",
        "view": "Deleng",
        "confirmable-confirm": "{{GENDER:$1|Panjenengan}} yakin?",
        "confirmable-yes": "Iya",
        "confirmable-no": "Ora",
-       "thisisdeleted": "Ndeleng utawa mbalèkaké $1?",
+       "thisisdeleted": "Deleng utawa pulihaké $1?",
        "viewdeleted": "Deleng $1?",
        "restorelink": "$1 {{PLURAL:$1|besutan}} sing wis dibusak",
        "feedlinks": "Asupan:",
        "nosuchusershort": "Ora ana panganggo mawa asma \"$1\". Coba dipriksa manèh pasang aksarané (éjaané).",
        "nouserspecified": "Panjenengan kudu milih jeneng panganggo.",
        "login-userblocked": "Panganggo iki pinalangan. Ora kena mbelu.",
-       "wrongpassword": "Tembung sandhi sing dipilih salah. Mangga coba manèh.",
+       "wrongpassword": "Tembung wadi sing diisèkaké salah.\nMangga jajalen manèh.",
        "wrongpasswordempty": "Panjenengan ora milih tembung sandhi. Mangga dicoba manèh.",
        "passwordtooshort": "Tembung sesinglon paling sethithik cacahé {{PLURAL:$1|1 aksara|$1 aksara}}.",
        "passwordtoolong": "Tembung wadi ora kena munjuli {{PLURAL:$1|1 pralambang|$1 pralambang}}.",
        "editingcomment": "Mbesut $1 (pérangan anyar)",
        "editconflict": "Cengkah besutan: $1",
        "explainconflict": "Wong liya wis nyunting kaca iki wiwit panjenengan mau nyunting.\nBagian dhuwur tèks iki ngamot tèks kaca vèrsi saiki.\nPangowahan sing panjenengan lakoni dituduhaké ing bagian ngisor tèks.\nPanjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks sing wis ana.\n'''Namung''' tèks ing bagian dhuwur kaca sing bakal kasimpen menawa panjenengan mencèt \"$1\".",
-       "yourtext": "Tulisan panjenengan",
+       "yourtext": "Tèksé panjenengan",
        "storedversion": "Owahan kasimpen",
        "nonunicodebrowser": "'''PÈNGET: Panjlajah wèb panjenengan ora ndhukung Unicode, mangga gantènana panjlajah wèb panjenengan sadurungé nyunting artikel.'''",
        "editingold": "'''PÈNGET:''' Panjenengan nyunting revisi lawas sawijining kaca. Yèn versi iki panjenengan simpen, mengko pangowahan-pangowahan sing wis digawé wiwit revisi iki bakal ilang.",
-       "yourdiff": "Prabédan",
+       "yourdiff": "Béda",
        "copyrightwarning": "Tulung dipun-gatèkaké menawa kabèh sumbangsih utawa kontribusi kanggo {{SITENAME}} iku dianggep wis diluncuraké miturut $2 GNU (mangga priksanen $1 kanggo ditèlé).\nMenawa panjenengan ora kersa menawa tulisan panjenengan bakal disunting karo disebar, aja didokok ing kéné.<br />\nPanjenengan uga janji menawa apa-apa sing katulis ing kéné, iku karyané panjenengan dhéwé, utawa disalin saka sumber bébas. '''AJA NDOKOK KARYA SING DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
        "copyrightwarning2": "Mangga digatèkaké yèn kabèh kontribusi marang  {{SITENAME}} bisa disunting, diowahi, utawa dibusak déning penyumbang liyané. Yèn panjenengan ora kersa yèn tulisan panjenengan bisa disunting wong liya, aja ngirim artikel panjenengan ing kéné.<br />Panjenengan uga janji yèn tulisan panjenengan iku kasil karya panjenengan dhéwé, utawa disalin saka sumber umum utawa sumber bébas liyané (mangga delengen $1 kanggo informasi sabanjuré). '''AJA NGIRIM KARYA SING DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
        "longpageerror": "'''Kasalahan: Tèks sing Sampéyan lebokaké dawané {{PLURAL:$1|sak kilobita|$1 kilobita}}, luwih dawa saka maksimal {{PLURAL:$2|sak kilobita|$2 kilobita}}.'''\nKuwi ora bisa disimpen.",
        "searchdisabled": "Sawetara wektu iki panjenengan ora bisa nggolèk mawa fungsi golèk {{SITENAME}}. Kanggo saiki mangga panjenengan bisa golèk nganggo Google. Nanging isi indèks Google kanggo {{SITENAME}} bisa waé lawas lan durung dianyari.",
        "search-error": "Ana masalah nalika nggoleki: $1",
        "search-warning": "Ana pepélik nalika nggolèk: $1",
-       "preferences": "Pilihan",
-       "mypreferences": "Pilihan",
+       "preferences": "Pilalan",
+       "mypreferences": "Pilalan",
        "prefs-edits": "Gunggung besutan:",
        "prefsnologintext2": "Mangga mlebua log saperlu ngowahi pilalané panjenengan.",
        "prefs-skin": "Ules",
        "grouppage-sysop": "{{ns:project}}:Pangurus",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrat",
        "grouppage-suppress": "{{ns:project}}:Oversight",
-       "right-read": "Maca kaca-kaca",
+       "right-read": "Waca kaca",
        "right-edit": "Besut kaca",
        "right-createpage": "Gawé kaca (sing dudu kaca parembugan)",
        "right-createtalk": "Gawé kaca parembugan",
        "right-nominornewtalk": "Suntingan sithik (''minor'') ora ngwetokaké prompt pesen anyar",
        "right-apihighlimits": "Nganggo wates sing luwih dhuwur ing kwéri API",
        "right-writeapi": "Nganggo API tulis",
-       "right-delete": "Busak kaca-kaca",
+       "right-delete": "Busak kaca",
        "right-bigdelete": "Busak kaca-kaca mawa sajarah panyuntingan sing gedhé",
        "right-deletelogentry": "Busak lan wurung busak èntri log tartamtu",
        "right-deleterevision": "Busak lan wurung busak owahan tinamtuné kaca",
        "right-undelete": "Wurung busak kaca",
        "right-suppressrevision": "Deleng, dhelikaké, lan wurung dhelikaké owahan tinamtu kaca-kacané panganggo sembarang",
        "right-viewsuppressed": "Deleng owahan sing didhelikaké saka panganggo sembarang",
-       "right-suppressionlog": "Ndeleng log-log pribadi",
+       "right-suppressionlog": "Deleng log priangga",
        "right-block": "Blokir panganggo-panganggo liya saka panyuntingan",
        "right-blockemail": "Blokir sawijining panganggo saka ngirim e-mail",
        "right-hideuser": "Blokir jeneng panganggo, lan delikna saka umum",
        "right-autopatrol": "Gawé supaya suntingan-suntingan ditandhani minangka wis dipatroli",
        "right-patrolmarks": "Ndeleng tandha-tandha patroli owah-owahan anyar",
        "right-unwatchedpages": "Tuduhna daftar kaca-kaca sing ora diawasi",
-       "right-mergehistory": "Gabungna sajarah kaca-kaca",
+       "right-mergehistory": "Gabung sujarah kaca",
        "right-userrights": "Besut kabèh hak panganggo",
        "right-userrights-interwiki": "Besut hak-haking panganggo asal wiki jaba",
        "right-siteadmin": "Kunci lan buka kunci basis data",
        "filehist-dimensions": "Alang ujur",
        "filehist-filesize": "Gedhené berkas",
        "filehist-comment": "Tanggapan",
-       "imagelinks": "Panganggoning barkas",
+       "imagelinks": "Panggunané barkas",
        "linkstoimage": "{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki nggayut barkas iki:",
        "linkstoimage-more": "Luwih saka $1 {{PLURAL:$1|kaca|kaca-kaca}} nduwèni pranala menyang berkas iki.\nDhaftar ing ngisor nuduhaké {{PLURAL:$1|kaca pisanan kanthi pranala langsung|$1 kaca kanthi pranala langsung}} menyang berkas iki.\n[[Special:WhatLinksHere/$2|dhaftar pepak]] uga ana.",
        "nolinkstoimage": "Ora ana kaca sing nggayut menyang barkas iki.",
        "filedelete-otherreason": "Alesan tambahan/liya:",
        "filedelete-reason-otherlist": "Alesan liya",
        "filedelete-reason-dropdown": "*Alesan pambusakan\n** Nglanggar hak cipta\n** Berkas duplikat",
-       "filedelete-edit-reasonlist": "Busak jalaraning pambusak",
+       "filedelete-edit-reasonlist": "Besut alesané mbusak",
        "filedelete-maintenance": "Pambusakan lan pambalikan berkas kanggo sawetara dipatèni salawas ana pangruwatan.",
        "filedelete-maintenance-title": "Ora bisa mbusak berkas",
        "mimesearch": "Panggolèkan MIME",
        "statistics-header-edits": "Pétungan besutan",
        "statistics-header-users": "Statistik panganggo",
        "statistics-header-hooks": "Statistik liya",
-       "statistics-articles": "Kaca-kaca isi",
+       "statistics-articles": "Kaca isi",
        "statistics-pages": "Gunggung kaca",
        "statistics-pages-desc": "Kabèh kaca ing wiki iki, kalebu kaca parembugan, alihan, lsp.",
        "statistics-files": "Berkas sing diunggahaké",
        "statistics-users": "[[Special:ListUsers|Panganggo]] kadhaftar",
        "statistics-users-active": "Para panganggo aktif",
        "statistics-users-active-desc": "Panganggo sing ngayahi aktivitas jroning {{PLURAL:$1|dia|$1 dina}} pungkasan",
-       "pageswithprop": "Kaca-kaca mawa ubarampé",
-       "pageswithprop-legend": "Kaca-kaca mawa ubarampé",
-       "pageswithprop-text": "Kaca iki mratélakaké kaca-kaca sing nganggo deduwèkaning kaca tinamtu.",
+       "pageswithprop": "Kaca mawa properti kaca",
+       "pageswithprop-legend": "Kaca mawa properti kaca",
+       "pageswithprop-text": "Kaca iki mratélakaké kaca-kaca sing nganggo properti kaca mirunggan.",
        "pageswithprop-prop": "Arané ubarampé:",
        "pageswithprop-submit": "Nuju",
        "pageswithprop-prophidden-long": "nilai properti teks dawa didhelikake ($1 kilobita)",
        "allpages": "Kabèh kaca",
        "nextpage": "Kaca sabanjuré ($1)",
        "prevpage": "Kaca sadurungé ($1)",
-       "allpagesfrom": "Kaca-kaca kawiwitan kanthi:",
+       "allpagesfrom": "Pitontonaké kaca sing diwiwiti:",
        "allpagesto": "Tampilaké kaca dipungkasi ing:",
        "allarticles": "Kabèh kaca",
        "allinnamespace": "Kabèh kaca (mandala aran $1)",
        "wlheader-enotif": "Wara-wara layang-èl diurubaké.",
        "wlheader-showupdated": "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
        "wlnote": "Ngisor iki {{PLURAL:$1|owahan pungkasan|'''$1''' owahan pungkasan}} {{PLURAL:$2|jam|'''$2''' jam}} kapungkur, per $3, $4.",
-       "wlshowlast": "Tuduhna $1 jam $2 dina  pungkasan",
+       "wlshowlast": "Tuduhaké $1 jam $2 dina pungkasan",
        "watchlist-hide": "Dhelikaké",
        "watchlist-submit": "Tuduhaké",
        "wlshowtime": "Kala mangsa kanggo dituduhaké:",
        "protect-otherreason": "Alesan liya/tambahan:",
        "protect-otherreason-op": "Alesan liya",
        "protect-dropdown": "*Alesan umum pangreksa\n** Vandalisme makaping-kaping\n** Spam makaping-kaping\n** Perang besutan ora prodhuktif\n** Kaca sing dhuwur trafiké",
-       "protect-edit-reasonlist": "Mbesut jalaraning pangreksa",
+       "protect-edit-reasonlist": "Besut alesané ngreksa",
        "protect-expiry-options": "1 jam:1 hour,1 dina:1 day,1 minggu:1 week,2 minggu:2 weeks,1 wulan:1 month,3 wulan:3 months,6 wulan:6 months,1 taun:1 year,tanpa wates:infinite",
        "restriction-type": "Palilah:",
        "restriction-level": "Tingkatan pambatesan:",
        "unblock": "Uculaké blokirané panganggo",
        "blockip": "Palang {{GENDER:$1|panganggo}}",
        "blockip-legend": "Blokir panganggo",
-       "blockiptext": "Enggonen formulir ing ngisor iki kanggo mblokir sawijining alamat IP utawa panganggo supaya ora bisa nyunting kaca.\nPrekara iki perlu dilakoni kanggo menggak vandalisme, lan miturut [[{{MediaWiki:Policy-url}}|kawicaksanan {{SITENAME}}]].\nLebokna alesan panjenengan ing ngisor iki (contoné njupuk conto kaca sing wis tau dirusak).",
+       "blockiptext": "Enggonen formulir ing ngisor iki saperlu mblokir aksès nulis lumantar alamat IP utawa panganggo mirunggan.\nIki kudu diayahi kanggo ngéndhani vandhalisme, lan minangkani [[{{MediaWiki:Policy-url}}|pranatan]].\nIsinen alesan sing mirunggan ing ngisor iki (contoné, nyitir kaca mirunggan sing dirusak).\nPanjenengan bisa mblokir saprangkat alamat IP lumantar sintaksis [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; kèhé prangkat sing diidinaké ya iku /$1 kanggo IPv4 lan /$2 kanggo IPv6.",
        "ipaddressorusername": "Alamat IP utawa jeneng panganggo",
        "ipbexpiry": "Kadaluwarsa",
        "ipbreason": "Alesan:",
        "ipbreason-dropdown": "*Alesan umum mblokir\n** Mènèhi informasi palsu\n** Mbusak isi kaca\n** Spam pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Tumindak nglècèhaké\n** Ngujar-ujari sawenèh akun\n** Jeneng panganggo ora patut",
-       "ipb-hardblock": "Alangi panganggo sing wis mlebu log nyunting saka alamat IP iki",
+       "ipb-hardblock": "Wurungaké panganggo sing wis mlebu log mbesut saka alamat IP iki",
        "ipbcreateaccount": "Penggak panggawéné akun",
        "ipbemailban": "Penggak panganggo saka ngirim layang-èl",
        "ipbenableautoblock": "Blokir alamat IP pungkasan sing dienggo déning pengguna iki sacara otomatis, lan kabèh alamat sabanjuré sing dicoba arep dienggo nyunting.",
-       "ipbsubmit": "Kirimna",
+       "ipbsubmit": "Blokir panganggo iki",
        "ipbother": "Wektu liya",
        "ipboptions": "2 jam:2 hours,1 dina:1 day,3 dina:3 days,1 minggu:1 week,2 minggu:2 weeks,1 wulan:1 month,3 wulan:3 months,6 wulan:6 months,1 taun:1 year,tanpa wates:infinite",
        "ipbhidename": "Delikna jeneng panganggo saka suntingan lan pratélan",
-       "ipbwatchuser": "Wasi kaca panganggoning lan kaca gegunemaning panganggo iki",
-       "ipb-disableusertalk": "Alangi panganggo iki nyunting kaca gunemané nalika diblokir",
+       "ipbwatchuser": "Wasi kaca panganggo lan kaca parembugané panganggo iki",
+       "ipb-disableusertalk": "Wurungaké panganggo iki mbesut kaca parembugané dhéwé nalika diblokir",
        "ipb-change-block": "Blokir manèh panganggo kanthi sèting iki",
-       "ipb-confirm": "Pesthèkaké blokir",
+       "ipb-confirm": "Konfirmasi blokiran",
        "badipaddress": "Alamat IP klèntu",
-       "blockipsuccesssub": "Pemblokiran suksès",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] wis diblokir.<br />\nDelok [[Special:BlockList|daptar blokir]] kanggo ninjo blokiran.",
+       "blockipsuccesssub": "Suksès mblokir",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] wis diblokir.<br />\nDeleng [[Special:BlockList|pratélan blokir]] saperlu mriksa blokiran.",
        "ipb-blockingself": "Panjenengan arep mblokir panjenengan dhéwé! Panjenengan yakin arep nglakoni kuwi?",
        "ipb-confirmhideuser": "Sampéyan arep mblokir panganggo mawa piranti \"dhelikaké panganggo\" isih murub. Iki bakal nyegah jeneng panganggo ana ing kabèh daptar lan èntri log. Sampéyan yakin arep nglakoni kuwi?",
-       "ipb-edit-dropdown": "Besut jalaraning pamalang",
-       "ipb-unblock-addr": "Ilangna blokir $1",
-       "ipb-unblock": "Ilangna blokir sawijining panganggo utawa alamat IP",
-       "ipb-blocklist": "Ndeleng blokir sing lagi ditrapaké",
+       "ipb-edit-dropdown": "Besut alesané mblokir",
+       "ipb-unblock-addr": "Copot blokiran tumrap $1",
+       "ipb-unblock": "Copot blokiran tumrap jeneng panganggo utawa alamat IP",
+       "ipb-blocklist": "Deleng blokiran sing ana",
        "ipb-blocklist-contribs": "Kontribusi kanggo $1",
        "ipb-blocklist-duration-left": "Kari $1",
        "unblockip": "Copot blokiran panganggo",
        "unblockiptext": "Nggonen formulir ing ngisor iki kanggo mbalèkaké aksès nulis sawijining alamt IP utawa panganggo sing sadurungé diblokir.",
-       "ipusubmit": "Ilangna blokir iki",
+       "ipusubmit": "Copot blokiran iki",
        "unblocked": "Blokir marang [[User:$1|$1]] wis dijabel",
        "unblocked-range": "$1 ora diblokir manèh",
        "unblocked-id": "Blokir $1 wis dijabel",
        "importunknownsource": "Sumber impor ora ditepungi",
        "importcantopen": "Berkas impor ora bisa dibukak",
        "importbadinterwiki": "Pranala interwiki rusak",
-       "importsuccess": "Impor suksès!",
+       "importsuccess": "Ngimpor rampung!",
        "importnosources": "Ora ana sumber impor transwiki sing wis digawé lan pangunggahan sajarah sacara langsung wis dinon-aktifaké.",
        "importnofile": "Ora ana berkas sumber impor sing wis diunggahaké.",
        "importuploaderrorsize": "Pangunggahan berkas impor gagal. Ukuran berkas ngluwihi ukuran sing diidinaké.",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|révisi}} diimpor saka $2",
        "javascripttest": "Panjajalan JavaScript",
        "javascripttest-pagetext-unknownaction": "Tumindak ora dingertèni: $1",
-       "javascripttest-qunit-intro": "Delok [dhokumèntasi panjajalan $1] nèng mediawiki.org.",
-       "tooltip-pt-userpage": "Kaca {{GENDER:|panganggoning sampéyan}}",
+       "javascripttest-qunit-intro": "Deleng [$1 dhokumèntasi uji-coba] ing mediawiki.org.",
+       "tooltip-pt-userpage": "Kaca {{GENDER:|panganggoné panjenengan}}",
        "tooltip-pt-anonuserpage": "Kaca panganggo IP panjenengan",
        "tooltip-pt-mytalk": "Kaca gegunemaning {{GENDER:|sampéyan}}",
        "tooltip-pt-anontalk": "Parembug ing besutan-besutan saka alamat IP iki",
        "tooltip-t-permalink": "Pranala permanèn saka owahan iki",
        "tooltip-ca-nstab-main": "Deleng kaca isi",
        "tooltip-ca-nstab-user": "Deleng kaca panganggo",
-       "tooltip-ca-nstab-media": "Ndeleng kaca média",
+       "tooltip-ca-nstab-media": "Deleng kaca médhia",
        "tooltip-ca-nstab-special": "Iki kaca mirunggan lan ora bisa dibesut",
        "tooltip-ca-nstab-project": "Deleng kaca proyèk",
        "tooltip-ca-nstab-image": "Deleng kaca barkas",
-       "tooltip-ca-nstab-mediawiki": "Ndeleng pesenan sistém",
+       "tooltip-ca-nstab-mediawiki": "Deleng layang sistem",
        "tooltip-ca-nstab-template": "Deleng cithakan",
        "tooltip-ca-nstab-help": "Mirsani kaca pitulung",
        "tooltip-ca-nstab-category": "Deleng kaca kategori",
        "version": "Versi",
        "version-extensions": "Èkstènsi sing wis diinstalasi",
        "version-skins": "Ules sing dipasang",
-       "version-specialpages": "Kaca astaméwa (kaca kusus)",
+       "version-specialpages": "Kaca mirunggan",
        "version-parserhooks": "Canthèlan parser",
        "version-variables": "Variabel",
        "version-antispam": "Pambendhung spam",
        "specialpages-note-top": "Katrangan",
        "specialpages-note": "* Kaca mirunggan sedhengan.\n* <span class=\"mw-specialpagerestricted\">Kaca mirunggan winatesan.</span>",
        "specialpages-group-maintenance": "Lapuran pangopènan",
-       "specialpages-group-other": "Kaca-kaca astaméwa liyané",
+       "specialpages-group-other": "Kaca mirunggan liyané",
        "specialpages-group-login": "Mlebu log / nggawé akun",
        "specialpages-group-changes": "Owah-owahan pungkasan lan log",
        "specialpages-group-media": "Lapuran média lan pangunggahan",
        "revdelete-content-unhid": "kontèn dituduhaké",
        "revdelete-summary-unhid": "tingkesaning besutan ora kadhelikaké",
        "revdelete-uname-unhid": "jeneng panganggo dituduhaké",
-       "revdelete-restricted": "rèstriksi ditrapaké marang para opsis",
+       "revdelete-restricted": "watesan sing dicakaké marang pangurus",
        "revdelete-unrestricted": "rèstriksi marang para opsis dijabel",
        "logentry-block-block": "$1 {{GENDER:$2|mblokir}} {{GENDER:$4|$3}} kanthi wektu kadaluwarsa $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|nyopot blokirané}} {{GENDER:$4|$3}}",
index 772a6cf..f773849 100644 (file)
        "gotointerwiki-invalid": "지정된 제목이 올바르지 않습니다.",
        "gotointerwiki-external": "다른 웹사이트 [[$2]]을(를) 방문하기 위해, {{SITENAME}}을(를) 떠나려고 합니다.\n\n'''[$1 $1(으)로 계속 진행]'''",
        "undelete-cantedit": "이 문서를 편집할 권한이 없으므로 이 문서를 복구할 수 없습니다.",
-       "undelete-cantcreate": "이 이름으로 된 문서가 없고 이 문서를 만들 권한이 없으므로 이 문서를 복구할 수 없습니다."
+       "undelete-cantcreate": "이 이름으로 된 문서가 없고 이 문서를 만들 권한이 없으므로 이 문서를 복구할 수 없습니다.",
+       "pagedata-title": "문서 데이터",
+       "pagedata-text": "이 문서는 문서에 대한 데이터 인터페이스를 제공합니다. 하위 문서 문법을 사용하여 URL에 문서 제목을 지정해 주십시오.\n* 클라이언트의 Accept 헤더에 기반하여 내용이 절충됩니다. 즉, 문서 데이터는 클라이언트가 선호하는 형식으로 제공됩니다.",
+       "pagedata-not-acceptable": "일치하는 형식을 찾을 수 없습니다. 지원하는 MIME 형식: $1",
+       "pagedata-bad-title": "유효하지 않은 제목: $1."
 }
index 92b6003..a1a0c47 100644 (file)
        "tooltip-ca-viewsource": "Оваа страница е заштитена. Можете да го видите изворниот код.",
        "tooltip-ca-history": "Претходни верзии на оваа страница.",
        "tooltip-ca-protect": "Заштити ја страницава",
-       "tooltip-ca-unprotect": "Измени заштита страницава",
+       "tooltip-ca-unprotect": "Измени заштита на страницава",
        "tooltip-ca-delete": "Избриши ја страницава",
        "tooltip-ca-undelete": "Обнови ги уредувањата направени на оваа страница пред да биде избришана",
        "tooltip-ca-move": "Премести ја страницава",
        "gotointerwiki-invalid": "Укажаниот наслов е неважечки.",
        "gotointerwiki-external": "Го напуштате {{SITENAME}} упатени кон [[$2]], кое е посебно мрежно место.\n\n'''[$1 Продолжете кон $1]'''",
        "undelete-cantedit": "Не можете да ја вратите избришаната страница бидејќи уредувањето на страницава не ви е дозволено.",
-       "undelete-cantcreate": "Не можете да ја вратите страницава бидејќи не постои страница со таков назив и не ви е дозволено да ја создадете."
+       "undelete-cantcreate": "Не можете да ја вратите страницава бидејќи не постои страница со таков назив и не ви е дозволено да ја создадете.",
+       "pagedata-title": "Податоци за страницата",
+       "pagedata-text": "Страницава дава посредник за податоци за страниците. Укажете го насловот на страницата во URL-то, користејќи ја синтаксата за потстраници.\n* Префрлањето на содржината се заснова на заглавието Прифати на вашиот клиент. Ова значи дека податоците за страницата ќе бидат ставени во форматот кој го претпочита вашиот клиент.",
+       "pagedata-not-acceptable": "Не најдов соодветен формат. Поддржани MIME-типови: $1",
+       "pagedata-bad-title": "Нважечки наслов: $1."
 }
index 3ebaae2..ed1ed8e 100644 (file)
        "anontalk": "Thó-lūn",
        "navigation": "Se̍h chām",
        "and": "&#32;kap",
-       "qbfind": "Chhōe",
-       "qbbrowse": "Liū-lám",
-       "qbedit": "Siu-kái",
-       "qbpageoptions": "Chit ia̍h",
-       "qbmyoptions": "Goá ê ia̍h",
        "faq": "Būn-tah",
-       "faqpage": "Project:Būn-tah",
        "actions": "Tōng-chok",
        "namespaces": "Miâ-khong-kan",
        "variants": "piàn-thé",
        "edit-local": "改這位的說明",
        "create": "Khai-sí siá",
        "create-local": "ka chhit-tah--ê soat-bêng",
-       "editthispage": "Siu-kái chit ia̍h",
-       "create-this-page": "Khai-sí siá chit ia̍h",
        "delete": "Thâi",
-       "deletethispage": "Thâi chit ia̍h",
-       "undeletethispage": "取消刣掉這頁",
        "undelete_short": "Kiù {{PLURAL:$1|$1|$1}} ê thâi-tiāu ê",
        "viewdeleted_short": "Khoàⁿ {{PLURAL:$1|chi̍t-ê thâi tiàu--ê pian-chi̍p|$1 ê thâi tiàu--ê pian-chi̍p}}",
        "protect": "Pó-hō·",
        "protect_change": "kái-piàn",
-       "protectthispage": "Pó-hō· chit ia̍h",
        "unprotect": "kái pó-hō·",
-       "unprotectthispage": "kái chit ia̍h ê pó-hō͘",
        "newpage": "Sin ia̍h",
-       "talkpage": "Thó-lūn chit ia̍h",
        "talkpagelinktext": "thó-lūn",
        "specialpage": "Te̍k-sû-ia̍h",
        "personaltools": "Kò-jîn kang-khū",
-       "articlepage": "Khoàⁿ loē-iông ia̍h",
        "talk": "Thó-lūn",
        "views": "Khoàⁿ",
        "toolbox": "Ke-si",
        "tool-link-userrights": "Piàn-keng {{GENDER:$1|iōng-chiá}} hun-cho͘",
        "tool-link-userrights-readonly": "Khòaⁿ {{GENDER:$1|iōng-chiá}} hun-cho͘",
        "tool-link-emailuser": "Email hō͘ chit ūi {{GENDER:$1|iōng-chiá}}",
-       "userpage": "Khoàⁿ iōng-chiá ê Ia̍h",
-       "projectpage": "Khoàⁿ sū-kang ia̍h",
        "imagepage": "Khoàⁿ tóng-àn ia̍h",
        "mediawikipage": "Khoàⁿ sìn-sit ia̍h",
        "templatepage": "Khoàⁿ pang-bô͘ ia̍h",
        "confirmemail_body": "Ū lâng (IP $1, tāi-khài sī lí pún-lâng) tī {{SITENAME}} ēng chit-ê e-mail chū-chí chù-chheh 1 ê kháu-chō \"$2\".\n\nChhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si̍t-chāi sī lí ê:\n\n$3\n\nNā-chún *m̄-sī* lí, chhiáⁿ mài tòe liân-kiat khì.  Chit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.",
        "confirmemail_body_changed": "Ū lâng (IP $1, tāi-khài sī lí pún-lâng) tī {{SITENAME}} ēng chit-ê e-mail chū-chí chù-chheh 1 ê kháu-chō \"$2\".\n\nChhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si̍t-chāi sī lí ê:\n\n$3\n\nNā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.\n\n$5\n\nChit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.",
        "confirmemail_body_set": "Ū lâng (IP $1, tāi-khài sī lí pún-lâng) tī {{SITENAME}} ēng chit-ê e-mail chū-chí chù-chheh 1 ê kháu-chō \"$2\".\n\nChhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si̍t-chāi sī lí ê:\n\n$3\n\nNā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.\n\n$5\n\nChit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.",
+       "confirm-purge-title": "Ōaⁿ-sin chit ia̍h",
        "confirm-purge-top": "Kā chit ia̍h ê cache piàⁿ tiāu?",
+       "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "table_pager_next": "Aū-chi̍t-ia̍h",
        "table_pager_prev": "Téng-chi̍t-ia̍h",
index 0a8881c..140ade2 100644 (file)
        "anontalk": "Brukerdiskusjon",
        "navigation": "Navigasjon",
        "and": "&#32;og",
-       "qbfind": "Finn",
-       "qbbrowse": "Bla gjennom",
-       "qbedit": "Rediger",
-       "qbpageoptions": "Sideinnstillinger",
-       "qbmyoptions": "Egne innstillinger",
        "faq": "Ofte stilte spørsmål",
-       "faqpage": "Project:Ofte stilte spørsmål",
        "actions": "Handlinger",
        "namespaces": "Navnerom",
        "variants": "Varianter",
        "edit-local": "Rediger lokal beskrivelse",
        "create": "Opprett",
        "create-local": "Opprett lokal beskrivelse",
-       "editthispage": "Rediger siden",
-       "create-this-page": "Opprett denne siden",
        "delete": "Slett",
-       "deletethispage": "Slett denne siden",
-       "undeletethispage": "Legg tilbake siden",
        "undelete_short": "Gjenopprett {{PLURAL:$1|én revisjon|$1 revisjoner}}",
        "viewdeleted_short": "Vis {{PLURAL:$1|én slettet redigering|$1 slettede redigeringer}}",
        "protect": "Beskytt",
        "protect_change": "endre",
-       "protectthispage": "Lås siden",
        "unprotect": "Endre beskyttelse",
-       "unprotectthispage": "Endre beskyttelsen av denne siden",
        "newpage": "Ny side",
-       "talkpage": "Diskuter denne siden",
        "talkpagelinktext": "diskusjon",
        "specialpage": "Spesialside",
        "personaltools": "Personlige verktøy",
-       "articlepage": "Vis innholdsside",
        "talk": "Diskusjon",
        "views": "Visninger",
        "toolbox": "Verktøy",
        "tool-link-userrights": "Endre {{GENDER:$1|brukergrupper}}",
        "tool-link-userrights-readonly": "Vis {{GENDER:$1|brukergrupper}}",
        "tool-link-emailuser": "Send {{GENDER:$1|brukeren}} en e-post",
-       "userpage": "Vis brukerside",
-       "projectpage": "Vis prosjektside",
        "imagepage": "Vis filside",
        "mediawikipage": "Vis beskjedside",
        "templatepage": "Vis malside",
        "recentchanges-legend-plusminus": "«(±123)»",
        "recentchanges-submit": "Vis",
        "rcfilters-activefilters": "Aktive filtre",
-       "rcfilters-quickfilters": "Raske lenker",
+       "rcfilters-quickfilters": "Lagrede filterinnstillinger",
        "rcfilters-quickfilters-placeholder-title": "Ingen lenker lagret enda",
        "rcfilters-quickfilters-placeholder-description": "For å lagre filterinnstillingene og gjenbruk dem senere, klikk på bokmerkeikonet i området Aktive Filtre under.",
        "rcfilters-savedqueries-defaultlabel": "Lagrede filtre",
        "rcfilters-savedqueries-unsetdefault": "Fjern som standard",
        "rcfilters-savedqueries-remove": "Fjern",
        "rcfilters-savedqueries-new-name-label": "Navn",
-       "rcfilters-savedqueries-apply-label": "Opprett rask lenke",
+       "rcfilters-savedqueries-apply-label": "Lagre innstillinger",
        "rcfilters-savedqueries-cancel-label": "Avbryt",
-       "rcfilters-savedqueries-add-new-title": "Lagre filtre som en rask lenke",
+       "rcfilters-savedqueries-add-new-title": "Lagre de gjeldende filterinnstillingene",
        "rcfilters-restore-default-filters": "Gjenopprett standardfiltre",
        "rcfilters-clear-all-filters": "Nullstill alle filtre",
        "rcfilters-search-placeholder": "Filtrer siste endringer (søk eller begyn å skrive)",
        "gotointerwiki-invalid": "Den gitte tittelen er ugyldig.",
        "gotointerwiki-external": "Du er i ferd med å forlate {{SITENAME}} for å besøke [[$2]], som er et annet nettsted.\n\n'''[$1 Fortsett til $1]'''",
        "undelete-cantedit": "Du kan ikke gjenopprette denne siden fordi du ikke har tillatelse til å redigere den.",
-       "undelete-cantcreate": "Du kan ikke gjenopprette denne siden fordi det ikke er noen eksisterende side med dette navnet, og du ikke har tillatelse til å opprette siden."
+       "undelete-cantcreate": "Du kan ikke gjenopprette denne siden fordi det ikke er noen eksisterende side med dette navnet, og du ikke har tillatelse til å opprette siden.",
+       "pagedata-title": "Sidedata",
+       "pagedata-text": "Denne siden gir et datagrensesnitt til sidene. Oppgi en sidetittel i URL-en, med undersidesyntaks.\n* Innholdsforhandling gjelder basert på din klients Accept-header. Dette betyr at sidedataene vil bli gitt i det formatet som foretrekkes av klienten din.",
+       "pagedata-not-acceptable": "Ingen passende format funnet. Støttede MIME-typer: $1",
+       "pagedata-bad-title": "Ugyldig tittel: $1."
 }
index f90d793..8fc3da1 100644 (file)
        "gotointerwiki-invalid": "O título especificado é inválido.",
        "gotointerwiki-external": "Está prestes a sair da wiki {{SITENAME}} para visitar [[$2]], que é um site externo.\n\n'''[$1 Continuar para $1]'''",
        "undelete-cantedit": "Não pode restaurar esta página, porque não tem privilégios para editar esta página.",
-       "undelete-cantcreate": "Não pode restaurar esta página, porque não existe nenhuma página com este nome e não tem privilégios para criar esta página."
+       "undelete-cantcreate": "Não pode restaurar esta página, porque não existe nenhuma página com este nome e não tem privilégios para criar esta página.",
+       "pagedata-title": "Dados de página",
+       "pagedata-text": "Esta página fornece uma interface de dados para páginas. Forneça o título da página no URL, usando a sintaxe de subpáginas, por favor.\n* Aplica-se a negociação de conteúdo com base no cabeçalho Accept do seu cliente. Isto significa que os dados da página serão fornecidos no formato preferido do seu cliente.",
+       "pagedata-not-acceptable": "Não foi encontrado nenhum formato correspondente. Tipos MIME suportados: $1",
+       "pagedata-bad-title": "Título inválido: $1."
 }
index 6dfd73f..d96657f 100644 (file)
        "undelete-cantedit": "Shown if the user tries to undelete a page that they cannot edit",
        "undelete-cantcreate": "Shown if the user tries to undelete a page which currently does not exist, and they are not allowed to create it. This could for example happen on a wiki with custom protection levels where the page name has been create-protected and the user has the right to undelete but not the right to edit protected pages.",
        "pagedata-title": "Title shown on the special page when a form or text is presented",
-       "pagedata-text": "Error shown when none of the formats acceptable to the client is suppoerted (HTTP error 406). Parameters:\n* $1 - the list of supported MIME types",
+       "pagedata-text": "Error shown when none of the formats acceptable to the client is supported (HTTP error 406). Parameters:\n* $1 - the list of supported MIME types",
        "pagedata-not-acceptable": "No matching format found. Supported MIME types: $1",
        "pagedata-bad-title": "Error shown when the requested title is invalid. Parameters:\n* $1: the malformed ID"
 }
index 1cd1b39..b4f3385 100644 (file)
        "anontalk": "Обсуждение",
        "navigation": "Навигация",
        "and": "&#32;и",
-       "qbfind": "Поиск",
-       "qbbrowse": "Просмотреть",
-       "qbedit": "Править",
-       "qbpageoptions": "Настройки страницы",
-       "qbmyoptions": "Ваши настройки",
        "faq": "ЧаВО",
-       "faqpage": "Project:ЧаВО",
        "actions": "Действия",
        "namespaces": "Пространства имён",
        "variants": "Варианты",
        "edit-local": "Редактировать локальное описание",
        "create": "Создать",
        "create-local": "Создать локально",
-       "editthispage": "Править эту страницу",
-       "create-this-page": "Создать эту страницу",
        "delete": "Удалить",
-       "deletethispage": "Удалить эту страницу",
-       "undeletethispage": "Восстановить эту страницу",
        "undelete_short": "Восстановить {{PLURAL:$1|1=$1 правку|$1 правки|$1 правок|1=правку}}",
        "viewdeleted_short": "Просмотр {{PLURAL:$1|1=$1 удалённой правки|удалённой правки|$1 удалённых правок}}",
        "protect": "Защитить",
        "protect_change": "изменить",
-       "protectthispage": "Защитить эту страницу",
        "unprotect": "Изменить защиту",
-       "unprotectthispage": "Изменить защиту этой страницы",
        "newpage": "Новая страница",
-       "talkpage": "Обсудить эту страницу",
        "talkpagelinktext": "обсуждение",
        "specialpage": "Служебная страница",
        "personaltools": "Персональные инструменты",
-       "articlepage": "Просмотреть статью",
        "talk": "Обсуждение",
        "views": "Просмотры",
        "toolbox": "Инструменты",
        "tool-link-userrights": "Изменить группы {{GENDER:$1|участника|участницы}}",
        "tool-link-userrights-readonly": "Смотреть группы {{GENDER:$1|участника|участницы}}",
        "tool-link-emailuser": "Написать письмо {{GENDER:$1|участнику|участнице}}",
-       "userpage": "Просмотреть страницу участника",
-       "projectpage": "Просмотреть страницу проекта",
        "imagepage": "Просмотреть страницу файла",
        "mediawikipage": "Показать страницу сообщения",
        "templatepage": "Просмотреть страницу шаблона",
        "logentry-move-move_redir": "$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления и без оставления перенаправления",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|отпатрулировал|отпатрулировала}} версию $4 страницы $3",
-       "logentry-patrol-patrol-auto": "$1 автоматически {{GENDER:$2|отпатрулировал|отпатрулировала}} «старым патрулированием» версию $4 страницы $3",
+       "logentry-patrol-patrol-auto": "$1 автоматически {{GENDER:$2|отпатрулировал|отпатрулировала}} версию $4 страницы $3",
        "logentry-newusers-newusers": "{{GENDER:$2|Участник создал|Участница создала}} учётную запись $1",
        "logentry-newusers-create": "{{GENDER:$2|Участник создал|Участница создала}} учётную запись $1",
        "logentry-newusers-create2": "$1 {{GENDER:$2|создал|создала}} учётную запись $3",
        "gotointerwiki-invalid": "Указан некорректный заголовок.",
        "gotointerwiki-external": "Вы покидаете {{grammar:accusative|{{SITENAME}}}} для посещения стороннего сайта [[$2]].\n\n'''[$1 Перейти на $1]'''",
        "undelete-cantedit": "Вы не можете восстановить эту страницу, поскольку у вас недостаточно прав для ее редактирования.",
-       "undelete-cantcreate": "Вы не можете восстановить эту страницу, поскольку она не существует, а у вас недостаточно прав для ее создания."
+       "undelete-cantcreate": "Вы не можете восстановить эту страницу, поскольку она не существует, а у вас недостаточно прав для ее создания.",
+       "pagedata-title": "Данные страницы",
+       "pagedata-text": "Эта страница предоставляет интерфейс к данным страниц. Пожалуйста, введите заголовок страницы в URL, используя синтаксис подстраниц.\n* Согласование содержимого применяется основываясь на заголовке Accept вашего клиента. Это означает, что данные страницы будут предоставлены в формате, предпочитаемом вашим клиентом.",
+       "pagedata-not-acceptable": "Соответствующий формат не найден. Поддерживаемые MIME-типы: $1",
+       "pagedata-bad-title": "Некорректный заголовок: $1."
 }
index 83760b1..6d4e185 100644 (file)
        "uncategorizedcategories": "Ханнык да категорияҕа киирбэтэх категориялар",
        "uncategorizedimages": "Ханнык да категорияҕа киирбэтэх ойуулар",
        "uncategorizedtemplates": "Ханнык да категорияҕа киирбэтэх халыыптар",
+       "uncategorized-categories-exceptionlist": "# Манна Special:UncategorizedCategories ахтыллыа суохтаах категориялар испииһэктэрэ. Устуруока аайы биирдии, «*» бэлиэттэн саҕаланар. Атын бэлиэттэн саҕаланар устуруокалар (арыттан саҕаланар эмиэ) аахсыллыбаттар. Быһаарыы суруйарга «#» бэлиэни тутун.",
        "unusedcategories": "Туттуллубатах категориялар",
        "unusedimages": "Туттулубатах билэлэр",
        "wantedcategories": "Көрдөнүллэр категориялар",
index 5dd3079..1f5b5f9 100644 (file)
@@ -7,7 +7,8 @@
                        "Zordsdavini",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "Pabriežtė nūruodas:",
        "anontalk": "Aptarėms",
        "navigation": "Naršīms",
        "and": "&#32;ėr",
-       "qbfind": "Ėiškuotė",
-       "qbbrowse": "Naršītė",
-       "qbedit": "Taisītė",
-       "qbpageoptions": "Tas poslapis",
-       "qbmyoptions": "Mona poslapē",
        "faq": "TKK",
-       "faqpage": "Project:DOK",
        "actions": "Vēksmā",
        "namespaces": "Vardū srėtis",
        "variants": "Atmainā",
        "edit-local": "Taisītė vėitėni aprašīma",
        "create": "Padėrbtė",
        "create-local": "Prėkergtė vėitėni aprašīma",
-       "editthispage": "Taisītė ton poslapi",
-       "create-this-page": "Dėrbtė ton poslapi",
        "delete": "Trintė",
-       "deletethispage": "Trintė ton poslapi",
-       "undeletethispage": "Ton poslapi padėrbtė apent",
        "undelete_short": "Dėrbtė apent $1 {{PLURAL:$1:pakeitėma|pakeitėmus|pakeitėmu}}",
        "viewdeleted_short": "Veizietė $1 {{PLURAL:$1|ėštrinta keitėma|ėštrintus keitėmus|ėštrintū keitėmu}}",
        "protect": "Apsergietė",
        "protect_change": "pakeistė",
-       "protectthispage": "Apsergietė ton poslapi",
        "unprotect": "Keistė apsarga",
-       "unprotectthispage": "Keistė ton poslapė apsarga",
        "newpage": "Naus poslapis",
-       "talkpage": "Aptartė ton poslapi",
        "talkpagelinktext": "Aptarėms",
        "specialpage": "Specēlos poslapis",
        "personaltools": "Asabėnē rakondā",
-       "articlepage": "Veizietė straipsnė",
        "talk": "Aptarėms",
        "views": "Parveizė̄jėmā",
        "toolbox": "Rakondā",
        "tool-link-userrights": "Mainītė {{GENDER:$1|nauduotuoja|nauduotuojės}} gropės",
        "tool-link-emailuser": "Rašītė gromata {{GENDER:$1|tamou nauduotuojou}}",
-       "userpage": "Ruodītė nauduotuojė poslapi",
-       "projectpage": "Ruodītė pruojekta poslapi",
        "imagepage": "Veizietė abruozdielė poslapi",
        "mediawikipage": "Ruodītė pranešėma poslapi",
        "templatepage": "Ruodītė šabluona poslapi",
        "search-suggest": "Mažnē mīslėjėt ka $1",
        "search-rewritten": "Ruod kas ī soėiškuota pavadėnėmo „$1“. Mažnē geriau ėiškuotė „$2“?",
        "search-interwiki-caption": "Dokterėnē pruojektā",
-       "search-interwiki-default": "Soėiškuota nug $1ː",
+       "search-interwiki-default": "Soėiškuota nug $1:",
        "search-interwiki-more": "(daugiau)",
        "search-relatedarticle": "Sosėjė̄",
        "searchrelated": "sosėjė̄",
index a2114de..05cf315 100644 (file)
        },
        "tog-underline": "Subliña ligasaun sira:",
        "tog-hideminor": "Lá'os hatudu muda ki-ki'ik iha mudansa foufoun sira",
-       "tog-usenewrc": "Iha lista \"mudansa foufoun sira\" no \"lista hateke\": Hatudu mudansa iha grupu sira - grupu ida ba pájina ida (presiza JavaScript)",
-       "tog-showtoolbar": "Hatudu kaixa edita (presiza JavaScript)",
+       "tog-usenewrc": "Iha lista \"mudansa foufoun sira\" no \"lista hateke\": Hatudu mudansa iha grupu sira - grupu ida ba pájina ida",
+       "tog-showtoolbar": "Hatudu kaixa edita",
        "tog-watchcreations": "Hateke pájina no imajen sira-ne'ebé ha'u kria/tau iha arkivu laran",
        "tog-watchdefault": "Hateke pájina sira-ne'ebé ha'u edita",
        "tog-watchmoves": "Hateke pájina sira-ne'ebé ha'u book",
        "tog-watchdeletion": "Hateke pájina sira-ne'ebé ha'u halakon",
        "tog-minordefault": "Edita hotu-hotu \"ki'ik\"",
-       "tog-oldsig": "Asinatura atuál",
+       "tog-oldsig": "Asinatura atuál:",
        "tog-watchlisthideown": "La hatudu ha'u-nia edita iha lista hateke",
        "tog-watchlisthidebots": "Hamsumik bot iha lista hateke",
        "tog-watchlisthideminor": "Hamsumik muda ki-ki'ik iha lista hateke",
        "oct": "Out.",
        "nov": "Nov.",
        "dec": "Dez.",
+       "january-date": "$1 Janeiru",
+       "february-date": "$1 Fevereiru",
+       "march-date": "$1 Marsu",
+       "april-date": "$1 Abríl",
+       "may-date": "$1 Maiu",
+       "june-date": "$1 Juñu",
+       "july-date": "$1 Jullu",
+       "august-date": "$1 Agostu",
+       "september-date": "$1 Setembru",
+       "october-date": "$1 Outubru",
+       "november-date": "$1 Novembru",
+       "december-date": "$1 Dezembru",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategoria|Kategoria}}",
        "category_header": "Artigu iha kategoría \"$1\"",
        "subcategories": "Sub-kategoria sira",
        "moredotdotdot": "Barak liu...",
        "mypage": "Ha'u-nia pájina",
        "mytalk": "Diskusaun",
-       "anontalk": "Diskusaun ba IP ne'e",
+       "anontalk": "Diskusaun",
        "navigation": "Hatudu-dalan",
        "and": "&#32;ho",
-       "qbfind": "Hetan",
-       "qbedit": "Edita",
-       "qbpageoptions": "Pájina ne'e",
-       "qbmyoptions": "Ha'u-nia pájina sira",
        "faq": "FAQ",
-       "faqpage": "Project:FAQ",
        "actions": "Aksaun sira",
+       "namespaces": "Espasu pájina nian",
        "errorpagetitle": "Sala",
        "returnto": "Fali ba $1.",
        "tagline": "Husi {{SITENAME}}",
        "view": "Lee",
        "edit": "Edita",
        "create": "Kria",
-       "editthispage": "Edita pájina ne'e",
-       "create-this-page": "Kria pájina ne'e",
        "delete": "Halakon",
-       "deletethispage": "Halakon pájina ne'e",
        "undelete_short": "Restaurar {{PLURAL:$1|versaun ida|versaun $1}}",
        "protect": "Proteje",
        "protect_change": "muda",
-       "protectthispage": "Proteje pájina ne'e",
        "unprotect": "Muda protesaun",
-       "unprotectthispage": "Muda protesaun pájina ne'e nian",
        "newpage": "Pájina foun",
-       "talkpage": "Diskusaun kona-ba pájina ne'e",
        "talkpagelinktext": "Diskusaun",
        "specialpage": "Pájina espesiál",
        "talk": "Diskusaun",
        "toolbox": "Kaixa besi nian",
-       "userpage": "Haree pájina uza-na'in",
-       "projectpage": "Haree pájina projetu nian",
+       "tool-link-userrights": "Muda grupu {{GENDER:$1|uza-na'in}} nian",
+       "tool-link-userrights-readonly": "Haree grupu {{GENDER:$1|uza-na'in}} nian",
        "imagepage": "Haree pájina imajen nian",
        "mediawikipage": "Haree pájina mensajen nian",
        "viewhelppage": "Haree pájina ajuda",
        "viewsourcetext": "Ó bele lee no kopia testu pájina nian:",
        "namespaceprotected": "Ó la iha priviléjiu ba edita pájina sira iha espasu '''$1'''.",
        "ns-specialprotected": "La ema ida bele edita pájina espesiál sira.",
+       "welcomeuser": "Benvindu, $1!",
        "yourname": "Naran uza-na'in:",
+       "userlogin-yourname": "Naran uza-na'in",
        "login": "Log in",
        "nav-login-createaccount": "Log in / kriar konta ida",
        "logout": "Husik",
index d673d2f..744918b 100644 (file)
        "anontalk": "Thảo luận",
        "navigation": "Xem nhanh",
        "and": "&#32;và",
-       "qbfind": "Tìm kiếm",
-       "qbbrowse": "Duyệt",
-       "qbedit": "Sửa đổi",
-       "qbpageoptions": "Trang này",
-       "qbmyoptions": "Trang cá nhân",
        "faq": "Câu hỏi thường gặp",
-       "faqpage": "Project:Các câu hỏi thường gặp",
        "actions": "Tác vụ",
        "namespaces": "Không gian tên",
        "variants": "Biến thể",
        "edit-local": "Sửa miêu tả địa phương",
        "create": "Tạo",
        "create-local": "Thêm miêu tả địa phương",
-       "editthispage": "Sửa đổi trang này",
-       "create-this-page": "Tạo trang này",
        "delete": "Xóa",
-       "deletethispage": "Xóa trang này",
-       "undeletethispage": "Phục hồi trang này",
        "undelete_short": "Phục hồi {{PLURAL:$1|một sửa đổi|$1 sửa đổi}}",
        "viewdeleted_short": "Xem {{PLURAL:$1|sửa đổi|$1 sửa đổi}} đã xóa",
        "protect": "Khóa",
        "protect_change": "thay đổi",
-       "protectthispage": "Khóa trang này",
        "unprotect": "Đổi mức khóa",
-       "unprotectthispage": "Thay đổi mức khóa của trang này",
        "newpage": "Trang mới",
-       "talkpage": "Thảo luận về trang này",
        "talkpagelinktext": "Thảo luận",
        "specialpage": "Trang đặc biệt",
        "personaltools": "Công cụ cá nhân",
-       "articlepage": "Xem trang nội dung",
        "talk": "Thảo luận",
        "views": "Các hiển thị",
        "toolbox": "Công cụ",
        "tool-link-userrights": "Thay đổi nhóm {{GENDER:$1}}người dùng",
        "tool-link-userrights-readonly": "Xem {{GENDER:$1}}nhóm người dùng",
        "tool-link-emailuser": "Gửi thư cho {{GENDER:$1}}người dùng này",
-       "userpage": "Xem trang thành viên",
-       "projectpage": "Xem trang dự án",
        "imagepage": "Xem trang tập tin",
        "mediawikipage": "Thông điệp giao diện",
        "templatepage": "Xem trang bản mẫu",
        "selfredirect": "<strong>Cảnh báo:</strong> Bạn sắp đổi hướng trang này đến chính trang này.\nCó lẽ bạn đã định rõ mục tiêu sai hoặc bạn đang sửa trang sai.\nNếu bạn bấm “$1” lần nữa, trang đổi hướng sẽ được tạo ra.",
        "missingcommenttext": "Xin hãy gõ vào lời bàn luận ở dưới.",
        "missingcommentheader": "<strong>Nhắc nhở:</strong> Bạn chưa ghi chủ đề/tiêu đề cho bàn luận này.\nNếu bạn nhấn nút “$1” lần nữa, sửa đổi của bạn sẽ được lưu mà không có đề mục.",
-       "summary-preview": "Xem trước dòng tóm lược:",
+       "summary-preview": "Xem trước dòng tóm lược sửa đổi:",
        "subject-preview": "Xem trước đề mục:",
        "previewerrortext": "Có lỗi xảy ra khi xem trước những thay đổi của bạn.",
        "blockedtitle": "Thành viên bị cấm",
        "readonlywarning": "<strong>CẢNH BÁO: Cơ sở dữ liệu đã bị khóa để bảo dưỡng, do đó bạn không thể lưu các sửa đổi của mình. Bạn nên cắt-dán đoạn bạn vừa sửa vào một tập tin và lưu nó lại để sửa đổi sau này.</strong>\n\nQuản trị viên hệ thống khi khóa dữ liệu đã đưa ra lý do: $1",
        "protectedpagewarning": "'''Cảnh báo: Trang này đã bị khóa và chỉ có các thành viên có quyền quản lý mới có thể sửa được.'''\nThông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
        "semiprotectedpagewarning": "'''Lưu ý:''' Trang này đã bị khóa nên chỉ có các thành viên có tài khoản mới có thể sửa đổi được.\nThông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
-       "cascadeprotectedwarning": "'''Cảnh báo:''' Trang này đã bị khóa, chỉ có thành viên có quyền quản lý mới có thể sửa đổi được, vì nó được nhúng vào {{PLURAL:$1|trang|những trang}} bị khóa theo tầng sau:",
+       "cascadeprotectedwarning": "'''Cảnh báo:''' Trang này đã bị khóa, chỉ có thành viên có [[Special:ListGroupRights|quyền quản lý]] mới có thể sửa đổi, vì nó được nhúng vào {{PLURAL:$1|trang|những trang}} bị khóa theo tầng sau:",
        "titleprotectedwarning": "'''Cảnh báo:  Trang này đã bị khóa và bạn phải có một số [[Special:ListGroupRights|quyền nhất định]] mới có thể tạo trang.'''\nThông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
        "templatesused": "{{PLURAL:$1|Bản mẫu|Các bản mẫu}} dùng trong trang này:",
        "templatesusedpreview": "{{PLURAL:$1|Bản mẫu|Các bản mẫu}} sẽ được dùng trong trang này:",
        "post-expand-template-argument-warning": "Cảnh báo: Trang này có chứa ít nhất một tham số bản mẫu có kích thước bung ra quá lớn.\nNhững tham số này sẽ bị bỏ đi.",
        "post-expand-template-argument-category": "Trang có chứa tham số bản mẫu bị loại bỏ",
        "parser-template-loop-warning": "Phát hiện bản mẫu lặp vòng: [[$1]]",
+       "template-loop-category": "Trang có bản mẫu lặp vòng",
+       "template-loop-category-desc": "Trang chứa một hoặc nhiều bản mẫu lặp vòng, tức là những bản mẫu tự gọi đệ quy chính nó.",
        "parser-template-recursion-depth-warning": "Bản mẫu đã vượt quá giới hạn về độ sâu đệ quy ($1)",
        "language-converter-depth-warning": "Đã vượt quá giới hạn độ sâu của bộ chuyển đổi ngôn ngữ ($1)",
        "node-count-exceeded-category": "Trang có số nốt vượt quá giới hạn cho phép",
        "page_first": "đầu",
        "page_last": "cuối",
        "histlegend": "Chọn so sánh: Đánh dấu để chọn các phiên bản để so sánh rồi nhấn Enter hoặc nút ở dưới.<br />\nChú giải: '''({{int:cur}})''' = khác với phiên bản hiện hành, '''({{int:last}})''' = khác với phiên bản trước, '''{{int:minoreditletter}}''' = sửa đổi nhỏ.",
-       "history-fieldset-title": "Tìm trong lịch sử",
-       "history-show-deleted": "Chỉ bị xóa",
+       "history-fieldset-title": "Tìm trong lịch sử trang",
+       "history-show-deleted": "Chỉ những sửa đổi bị xóa",
        "histfirst": "cũ nhất",
        "histlast": "mới nhất",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "search-file-match": "(khớp nội dung tập tin)",
        "search-suggest": "Có phải bạn muốn tìm: $1",
        "search-rewritten": "Đang xem các kết quả cho $1. Tìm kiếm cho $2 thay thế.",
-       "search-interwiki-caption": "Các dự án liên quan",
+       "search-interwiki-caption": "Kết quả từ các dự án liên quan",
        "search-interwiki-default": "Kết quả từ $1:",
        "search-interwiki-more": "(thêm)",
        "search-interwiki-more-results": "thêm kết quả",
        "saveusergroups": "Lưu nhóm {{GENDER:$1}}người dùng",
        "userrights-groupsmember": "Thuộc nhóm:",
        "userrights-groupsmember-auto": "Ngầm thuộc nhóm:",
-       "userrights-groups-help": "Bạn có thể xếp thành viên này vào nhóm khác:\n* Hộp kiểm được đánh dấu có nghĩa rằng thành viên thuộc về nhóm đó.\n* Hộp không được đánh dấu có nghĩa rằng thành viên không thuộc về nhóm đó.\n* Dấu * có nghĩa là bạn sẽ không thể loại thành viên ra khỏi nhóm một khi bạn đã đưa thành viên vào, hoặc ngược lại.\n* Dấu # có nghĩa là bạn chỉ có thể trì hoãn thời hạn của nhóm này; bạn không thể đẩy sớm thời hạn.",
+       "userrights-groups-help": "Bạn có thể thay đổi các nhóm người dùng của thành viên này:\n* Hộp kiểm được đánh dấu có nghĩa rằng thành viên thuộc về nhóm đó.\n* Hộp không được đánh dấu có nghĩa rằng thành viên không thuộc về nhóm đó.\n* Dấu * có nghĩa là bạn sẽ không thể xoá thành viên ra khỏi nhóm này một khi bạn đã thêm họ vào, hoặc ngược lại.\n* Dấu # có nghĩa là bạn chỉ có thể giảm thời hạn thành viên được ở trong nhóm này; bạn không thể tăng thời hạn đó lên được.",
        "userrights-reason": "Lý do:",
        "userrights-no-interwiki": "Bạn không có quyền thay đổi quyền hạn của thành viên tại các wiki khác.",
        "userrights-nodatabase": "Cơ sở dữ liệu $1 không tồn tại hoặc nằm ở bên ngoài.",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Xem",
        "rcfilters-activefilters": "Bộ lọc hiện hành",
+       "rcfilters-savedqueries-setdefault": "Đặt làm mặc định",
+       "rcfilters-savedqueries-unsetdefault": "Loại bỏ mặc định",
        "rcfilters-restore-default-filters": "Mặc định lại các bộ lọc",
        "rcfilters-clear-all-filters": "Xóa sạch các bộ lọc",
        "rcfilters-search-placeholder": "Lọc các thay đổi gần đây (duyệt hoặc bắt đầu đánh chữ)",
        "rcfilters-invalid-filter": "Bộ lọc không hợp lệ",
        "rcfilters-empty-filter": "Không có bộ lọc hiện hành. Tất cả các đóng góp được hiển thị.",
        "rcfilters-filterlist-title": "Bộ lọc",
+       "rcfilters-highlightbutton-title": "Làm nổi bật kết quả",
+       "rcfilters-highlightmenu-title": "Chọn màu",
+       "rcfilters-highlightmenu-help": "Chọn màu để làm nổi bật thuộc tính này",
        "rcfilters-filterlist-noresults": "Không tìm thấy bộ lọc",
+       "rcfilters-noresults-conflict": "Không tìm thấy kết quả nào do tiêu chí tìm kiếm đang bị mâu thuẫn",
        "rcfilters-filtergroup-registration": "Trạng thái đăng ký thành viên",
        "rcfilters-filter-registered-label": "Đã đăng ký",
        "rcfilters-filter-registered-description": "Người dùng đã đăng nhập.",
        "rcfilters-filter-unregistered-label": "Vô danh",
        "rcfilters-filter-unregistered-description": "Người dùng chưa đăng nhập.",
        "rcfilters-filtergroup-authorship": "Người sửa đổi",
-       "rcfilters-filter-editsbyself-label": "Bạn",
-       "rcfilters-filter-editsbyself-description": "Các sửa đổi của bạn.",
-       "rcfilters-filter-editsbyother-label": "Người khác",
+       "rcfilters-filter-editsbyself-label": "Sửa đổi của bạn",
+       "rcfilters-filter-editsbyself-description": "Các sửa đổi do bạn tạo ra.",
+       "rcfilters-filter-editsbyother-label": "Sửa đổi của người khác",
        "rcfilters-filter-editsbyother-description": "Các sửa đổi của người khác.",
        "rcfilters-filtergroup-userExpLevel": "Trình độ (chỉ người dùng đã đăng ký)",
        "rcfilters-filter-user-experience-level-newcomer-label": "Người mới đến",
        "rcfilters-filter-bots-description": "Các sửa đổi của công cụ tự động.",
        "rcfilters-filter-humans-label": "Con người (không phải bot)",
        "rcfilters-filter-humans-description": "Các sửa đổi của người thật.",
+       "rcfilters-filtergroup-reviewstatus": "Tình trạng tuần tra",
+       "rcfilters-filter-patrolled-label": "Đã được tuần tra",
+       "rcfilters-filter-patrolled-description": "Các sửa đổi đã được đánh dấu tuần tra.",
+       "rcfilters-filter-unpatrolled-label": "Chưa được tuần tra",
+       "rcfilters-filter-unpatrolled-description": "Các sửa đổi chưa được đánh dấu tuần tra.",
        "rcfilters-filtergroup-significance": "Sự quan trọng",
        "rcfilters-filter-minor-label": "Sửa đổi nhỏ",
        "rcfilters-filter-minor-description": "Các sửa đổi được tác giả đánh dấu là nhỏ.",
        "rcfilters-filter-major-label": "Sửa đổi không nhỏ",
        "rcfilters-filter-major-description": "Các sửa đổi không được tác giả đánh dấu là nhỏ.",
+       "rcfilters-filtergroup-watchlist": "Các trang theo dõi",
+       "rcfilters-filter-watchlist-watched-label": "Nằm trong danh sách theo dõi",
+       "rcfilters-filter-watchlist-watched-description": "Thay đổi trên các trang nằm trong danh sách theo dõi của bạn.",
+       "rcfilters-filter-watchlist-watchednew-label": "Các sửa đổi mới trong danh sách theo dõi",
+       "rcfilters-filter-watchlist-watchednew-description": "Thay đổi mới trên các trang nằm trong danh sách theo dõi kể từ lần cuối bạn xem trang đó.",
+       "rcfilters-filter-watchlist-notwatched-label": "Không trong danh sách theo dõi",
+       "rcfilters-filter-watchlist-notwatched-description": "Sửa đổi trên các trang không nằm trong danh sách theo dõi của bạn.",
        "rcfilters-filtergroup-changetype": "Kiểu thay đổi",
        "rcfilters-filter-pageedits-label": "Sửa đổi trang",
-       "rcfilters-filter-pageedits-description": "Các sửa đổi đối với nội dung, thảo luận, miêu tả thể loại, …",
+       "rcfilters-filter-pageedits-description": "Các sửa đổi đối với nội dung wiki, các trang thảo luận, các miêu tả thể loại…",
        "rcfilters-filter-newpages-label": "Tạo trang",
        "rcfilters-filter-newpages-description": "Các sửa đổi tạo trang mới.",
        "rcfilters-filter-categorization-label": "Thay đổi thể loại",
        "rcfilters-filter-categorization-description": "Các tác vụ xếp trang vào thể loại hoặc gỡ trang khỏi thể loại.",
        "rcfilters-filter-logactions-label": "Tác vụ được ghi trong nhật trình",
-       "rcfilters-filter-logactions-description": "Các tác vụ bảo quản, mở tài khoản, xóa trang, tải lên, …",
+       "rcfilters-filter-logactions-description": "Các tác vụ bảo quản, mở tài khoản, xóa trang, tải lên…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Bộ lọc \"Các sửa đổi nhỏ\" mâu thuẫn với một hoặc nhiều bộ lọc Loại sửa đổi, bởi có một số loại sửa đổi không thể được đánh dấu là \"nhỏ\". Các bộ lọc mâu thuẫn với nhau được đánh dấu trong mục Bộ lọc hiện hành ở trên.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Một số loại sửa đổi không thể được đánh dấu là \"nhỏ\", do đó bộ lọc này mâu thuẫn với các bộ lọc Loại sửa đổi dưới đây: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Bộ lọc Loại sửa đổi này mâu thuẫn với bộ lọc \"Các sửa đổi nhỏ\". Có một số loại sửa đổi không thể được đánh dấu là \"nhỏ\".",
+       "rcfilters-filtergroup-lastRevision": "Phiên bản mới nhất",
+       "rcfilters-filter-lastrevision-label": "Phiên bản mới nhất",
+       "rcfilters-filter-lastrevision-description": "Sửa đổi mới nhất trên một trang.",
+       "rcfilters-filter-previousrevision-label": "Các sửa đổi trước",
+       "rcfilters-filter-previousrevision-description": "Tất cả các sửa đổi không phải là sửa đổi mới nhất của trang.",
        "rcnotefrom": "Dưới đây là {{PLURAL:$5|thay đổi duy nhất|các thay đổi}} từ <strong>$3 $4</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
+       "rclistfromreset": "Đặt lại lựa chọn ngày",
        "rclistfrom": "Xem các thay đổi từ $2 $3 trở về sau",
        "rcshowhideminor": "$1 sửa đổi nhỏ",
        "rcshowhideminor-show": "Hiện",
        "php-uploaddisabledtext": "Việc tải tập tin trong PHP đã bị tắt. Xin hãy kiểm tra lại thiết lập file_uploads.",
        "uploadscripted": "Tập tin này có chứa mã HTML hoặc kịch bản có thể khiến trình duyệt web thông dịch sai.",
        "upload-scripted-pi-callback": "Không thể tải lên một tập tin có chứa lệnh xử lý xml-stylesheet.",
+       "upload-scripted-dtd": "Không thể tải lên các tập tin SVG chứa khai báo DTD không đúng chuẩn.",
        "uploaded-script-svg": "Tìm thấy phần tử “$1” có khả năng chạy kịch bản trong tập tin SVG được tải lên.",
        "uploaded-hostile-svg": "Tìm thấy CSS nguy hiểm trong phần tử style của tập tin SVG được tải lên.",
        "uploaded-event-handler-on-svg": "Không cho phép đặt thuộc tính xử lý sự kiện <code>$1=\"$2\"</code> trong tập tin SVG.",
        "unblocked-id": "$1 đã hết bị cấm",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] đã được bỏ cấm.",
        "blocklist": "Người dùng bị cấm",
+       "autoblocklist": "Các lệnh cấm tự động",
+       "autoblocklist-submit": "Tìm kiếm",
        "ipblocklist": "Người dùng bị cấm",
        "ipblocklist-legend": "Tìm một thành viên bị cấm",
        "blocklist-userblocks": "Ẩn tác vụ cấm tài khoản",
        "confirmrecreate-noreason": "Người dùng [[User:$1|$1]] ([[User talk:$1|talk]]) xóa trang này sau khi bạn bắt đầu sửa đổi nó. Bạn có chắc chắn muốn tạo lại trang này không?",
        "recreate": "Tạo ra lại",
        "unit-pixel": "điểm ảnh",
+       "confirm-purge-title": "Làm mới trang này",
        "confirm_purge_button": "Làm tươi",
        "confirm-purge-top": "Làm sạch vùng nhớ đệm của trang này?",
        "confirm-purge-bottom": "Làm mới một trang sẽ giúp xóa bộ đệm và buộc hiển thị phiên bản gần nhất.",
        "htmlform-user-not-valid": "<strong>$1</strong> không phải là tên người dùng.",
        "logentry-delete-delete": "$1 {{GENDER:$2}}đã xóa trang “$3”",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2}}đã xóa trang đổi hướng $3 bằng cách ghi đè",
-       "logentry-delete-restore": "$1 {{GENDER:$2}}đã phục hồi trang “$3”",
+       "logentry-delete-restore": "$1 {{GENDER:$2}}đã phục hồi trang $3 ($4)",
        "logentry-delete-event": "$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các mục nhật trình về $3",
        "mw-widgets-titleinput-description-redirect": "đổi hướng đến $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Thêm thể loại…",
        "mw-widgets-usersmultiselect-placeholder": "Thêm nữa…",
+       "date-range-from": "Từ ngày:",
+       "date-range-to": "Đến ngày:",
        "sessionmanager-tie": "Không thể kết hợp nhiều yêu cầu xác thực loại: $1.",
        "sessionprovider-generic": "phiên $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "phiên dựa trên cookie",
        "restrictionsfield-label": "Các dải IP được cho phép:",
        "restrictionsfield-help": "Mỗi dòng một địa chỉ IP hoặc dải CIDR. Để kích hoạt tất cả mọi địa chỉ IP, sử dụng:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "phiên bản $1",
-       "pageid": "số trang $1"
+       "pageid": "số trang $1",
+       "gotointerwiki": "Rời khỏi {{SITENAME}}",
+       "gotointerwiki-invalid": "Tên trang chỉ định không hợp lệ.",
+       "pagedata-title": "Dữ liệu về trang",
+       "pagedata-not-acceptable": "Không tìm thấy định dạng phù hợp. Các kiểu MIME được hỗ trợ: $1",
+       "pagedata-bad-title": "Tiêu đề không hợp lệ: $1."
 }
index 31e3ae9..ea48090 100644 (file)
        "anontalk": "讨论",
        "navigation": "导航",
        "and": "和",
-       "qbfind": "查找",
-       "qbbrowse": "浏览",
-       "qbedit": "编辑",
-       "qbpageoptions": "该页面",
-       "qbmyoptions": "我的页面",
        "faq": "常见问题",
-       "faqpage": "Project:常见问题",
        "actions": "操作",
        "namespaces": "命名空间",
        "variants": "变种",
        "edit-local": "编辑本地说明",
        "create": "创建",
        "create-local": "添加本地说明",
-       "editthispage": "编辑本页",
-       "create-this-page": "创建本页",
        "delete": "删除",
-       "deletethispage": "删除本页",
-       "undeletethispage": "还原本页",
        "undelete_short": "还原$1次编辑",
        "viewdeleted_short": "查看{{PLURAL:$1|$1个被删除的编辑}}",
        "protect": "保护",
        "protect_change": "更改",
-       "protectthispage": "保护本页",
        "unprotect": "更改保护",
-       "unprotectthispage": "更改本页的保护",
        "newpage": "新页面",
-       "talkpage": "讨论本页",
        "talkpagelinktext": "讨论",
        "specialpage": "特殊页面",
        "personaltools": "个人工具",
-       "articlepage": "查看内容页面",
        "talk": "讨论",
        "views": "视图",
        "toolbox": "工具",
        "tool-link-userrights": "更改{{GENDER:$1|用户}}组",
        "tool-link-userrights-readonly": "查看{{GENDER:$1|用户}}组",
        "tool-link-emailuser": "电邮联系该{{GENDER:$1|用户}}",
-       "userpage": "查看用户页面",
-       "projectpage": "查看项目页面",
        "imagepage": "查看文件页面",
        "mediawikipage": "查看信息页面",
        "templatepage": "查看模板页面",
        "gotointerwiki-invalid": "指定的标题无效。",
        "gotointerwiki-external": "您将要离开{{SITENAME}}来访问[[$2]],这是一个独立网站。\n\n'''[$1 继续访问$1]'''",
        "undelete-cantedit": "您不能还原该页面,因为您未被允许编辑该页面。",
-       "undelete-cantcreate": "您不能还原该页面,因为没有使用该页面名称的现有页面,并且您未被允许编辑该页面。"
+       "undelete-cantcreate": "您不能还原该页面,因为没有使用该页面名称的现有页面,并且您未被允许编辑该页面。",
+       "pagedata-title": "页面数据",
+       "pagedata-text": "此页面提供相关页面的数据界面。请在URL中,使用子页面语法提供页面标题。\n* 内容协商基于您客户端的接受标头应用。这意味着页面数据将以您客户端首选的格式提供。",
+       "pagedata-not-acceptable": "没有找到匹配的格式。支持的MIME类型:$1",
+       "pagedata-bad-title": "无效标题:$1。"
 }
index 795d706..e2845a5 100644 (file)
@@ -234,6 +234,7 @@ $magicWords = [
        'stylepath'                 => [ '0', 'مسار_الهيئة', 'STYLEPATH' ],
        'grammar'                   => [ '0', 'قواعد_اللغة:', 'GRAMMAR:' ],
        'gender'                    => [ '0', 'نوع:', 'GENDER:' ],
+       'bidi'                      => [ '0', 'ثا:', 'BIDI:' ],
        'notitleconvert'            => [ '0', '__لاتحويل_عنوان__', '__لاتع__', '__NOTITLECONVERT__', '__NOTC__' ],
        'nocontentconvert'          => [ '0', '__لاتحويل_محتوى__', '__لاتم__', '__NOCONTENTCONVERT__', '__NOCC__' ],
        'currentweek'               => [ '1', 'أسبوع_حالي', 'CURRENTWEEK' ],
@@ -290,6 +291,7 @@ $magicWords = [
        'numberingroup'             => [ '1', 'عدد_في_المجموعة', 'عدد_في_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ],
        'staticredirect'            => [ '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ],
        'protectionlevel'           => [ '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ],
+       'protectionexpiry'          => [ '1', 'انتهاء_الحماية', 'PROTECTIONEXPIRY' ],
        'cascadingsources'          => [ '1', 'مصادر_مضمنة', 'CASCADINGSOURCES' ],
        'formatdate'                => [ '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ],
        'url_path'                  => [ '0', 'مسار', 'PATH' ],
@@ -311,13 +313,17 @@ $specialPageAliases = [
        'AllMyUploads'              => [ 'كل_ملفاتي' ],
        'Allpages'                  => [ 'كل_الصفحات' ],
        'ApiHelp'                   => [ 'مساعدة_إيه_بي_آي' ],
+       'ApiSandbox'                => [ 'ملعب_إيه_بي_آي' ],
        'Ancientpages'              => [ 'صفحات_قديمة' ],
        'Badtitle'                  => [ 'عنوان_سيئ' ],
        'Blankpage'                 => [ 'صفحة_فارغة' ],
        'Block'                     => [ 'منع', 'منع_أيبي', 'منع_مستخدم' ],
        'Booksources'               => [ 'مصادر_كتاب' ],
+       'BotPasswords'              => [ 'كلمات_سر_البوت' ],
        'BrokenRedirects'           => [ 'تحويلات_مكسورة' ],
        'Categories'                => [ 'تصنيفات' ],
+       'ChangeContentModel'        => [ 'تغيير_موديل_المحتوى' ],
+       'ChangeCredentials'         => [ 'تغيير_الاعتمادات' ],
        'ChangeEmail'               => [ 'تغيير_البريد' ],
        'ChangePassword'            => [ 'تغيير_كلمة_السر', 'ضبط_كلمة_السر' ],
        'ComparePages'              => [ 'مقارنة_الصفحات' ],
@@ -328,6 +334,7 @@ $specialPageAliases = [
        'DeletedContributions'      => [ 'مساهمات_محذوفة' ],
        'Diff'                      => [ 'فرق' ],
        'DoubleRedirects'           => [ 'تحويلات_مزدوجة' ],
+       'EditTags'                  => [ 'تعديل_الوسوم' ],
        'EditWatchlist'             => [ 'تعديل_قائمة_المراقبة' ],
        'Emailuser'                 => [ 'مراسلة_المستخدم' ],
        'ExpandTemplates'           => [ 'فرد_القوالب' ],
@@ -340,10 +347,12 @@ $specialPageAliases = [
        'JavaScriptTest'            => [ 'اختبار_جافا_سكريبت' ],
        'BlockList'                 => [ 'قائمة_المنع', 'عرض_المنع', 'قائمة_منع_أيبي' ],
        'LinkSearch'                => [ 'بحث_الوصلات' ],
+       'LinkAccounts'              => [ 'وصل_الحسابات' ],
        'Listadmins'                => [ 'عرض_الإداريين' ],
        'Listbots'                  => [ 'عرض_البوتات' ],
        'Listfiles'                 => [ 'عرض_الملفات', 'قائمة_الملفات', 'قائمة_الصور' ],
        'Listgrouprights'           => [ 'عرض_صلاحيات_المجموعات', 'صلاحيات_مجموعات_المستخدمين' ],
+       'Listgrants'                => [ 'عرض_المنح' ],
        'Listredirects'             => [ 'عرض_التحويلات' ],
        'ListDuplicatedFiles'       => [ 'عرض_الملفات_المكررة', 'عرض_تكرار_الملفات' ],
        'Listusers'                 => [ 'عرض_المستخدمين', 'قائمة_المستخدمين' ],
@@ -384,6 +393,7 @@ $specialPageAliases = [
        'Recentchanges'             => [ 'أحدث_التغييرات' ],
        'Recentchangeslinked'       => [ 'أحدث_التغييرات_الموصولة', 'تغييرات_مرتبطة' ],
        'Redirect'                  => [ 'تحويل' ],
+       'RemoveCredentials'         => [ 'إزالة_الاعتمادات' ],
        'ResetTokens'               => [ 'إعادة_ضبط_المفاتيح' ],
        'Revisiondelete'            => [ 'حذف_مراجعة', 'حذف_نسخة' ],
        'RunJobs'                   => [ 'تشغيل_الوظائف' ],
@@ -399,6 +409,7 @@ $specialPageAliases = [
        'Uncategorizedpages'        => [ 'صفحات_غير_مصنفة' ],
        'Uncategorizedtemplates'    => [ 'قوالب_غير_مصنفة' ],
        'Undelete'                  => [ 'استرجاع' ],
+       'UnlinkAccounts'            => [ 'فك_الحسابات' ],
        'Unlockdb'                  => [ 'فتح_قب' ],
        'Unusedcategories'          => [ 'تصنيفات_غير_مستخدمة' ],
        'Unusedimages'              => [ 'ملفات_غير_مستخدمة', 'صور_غير_مستخدمة' ],
index 8a43998..bb99553 100644 (file)
@@ -42,13 +42,18 @@ $specialPageAliases = [
        'Allmessages'               => [ 'كل_الرسايل' ],
        'AllMyUploads'              => [ 'كل_مرفوعاتى', 'كل_فايلاتى' ],
        'Allpages'                  => [ 'كل_الصفح' ],
+       'ApiHelp'                   => [ 'مساعده_Api' ],
+       'ApiSandbox'                => [ 'ملعب_Api' ],
        'Ancientpages'              => [ 'صفح_قديمه' ],
        'Badtitle'                  => [ 'عنوان_وحش' ],
        'Blankpage'                 => [ 'صفحه_فارضيه' ],
        'Block'                     => [ 'بلوك', 'بلوك_IP', 'بلوك_يوزر' ],
        'Booksources'               => [ 'مصادر_كتاب' ],
+       'BotPasswords'              => [ 'باسووردات_البوت' ],
        'BrokenRedirects'           => [ 'تحويلات_مكسوره' ],
        'Categories'                => [ 'تصانيف' ],
+       'ChangeContentModel'        => [ 'تغيير_موديل_المحتوى' ],
+       'ChangeCredentials'         => [ 'تغيير_الكريدينشيال' ],
        'ChangeEmail'               => [ 'تغيير_الميل' ],
        'ChangePassword'            => [ 'تغيير_الپاسوورد', 'ظبط_الپاسوورد' ],
        'ComparePages'              => [ 'مقارنه_الصفحات' ],
@@ -59,6 +64,7 @@ $specialPageAliases = [
        'DeletedContributions'      => [ 'مساهمات_ممسوحه' ],
        'Diff'                      => [ 'فرق' ],
        'DoubleRedirects'           => [ 'تحويلات_دوبل' ],
+       'EditTags'                  => [ 'تغيير_التاجز' ],
        'EditWatchlist'             => [ 'تغيير_قايمه_المراقبه' ],
        'Emailuser'                 => [ 'ابعت_ايميل_لليوزر' ],
        'ExpandTemplates'           => [ 'فرد-القوالب' ],
@@ -71,16 +77,20 @@ $specialPageAliases = [
        'JavaScriptTest'            => [ 'تجربه_جافا_سكريبت' ],
        'BlockList'                 => [ 'ليستة_البلوك', 'بيّن_البلوك', 'ليستة_بلوك_IP' ],
        'LinkSearch'                => [ 'تدوير_اللينكات' ],
+       'LinkAccounts'              => [ 'توصيل_الحسابات' ],
        'Listadmins'                => [ 'عرض_الاداريين' ],
        'Listbots'                  => [ 'عرض_البوتات' ],
        'Listfiles'                 => [ 'عرض_الفايلات', 'ليستة_الفايلات', 'ليستة_الصور' ],
        'Listgrouprights'           => [ 'عرض_حقوق_الجروپات' ],
+       'Listgrants'                => [ 'عرض_المنح' ],
        'Listredirects'             => [ 'عرض_التحويلات' ],
+       'ListDuplicatedFiles'       => [ 'عرض_الفايلات_المتكرره' ],
        'Listusers'                 => [ 'عرض_اليوزرات', 'ليستة_اليوزرات' ],
        'Lockdb'                    => [ 'قفل_قب' ],
        'Log'                       => [ 'سجل', 'سجلات' ],
        'Lonelypages'               => [ 'صفح_وحدانيه', 'صفح_يتيمه' ],
        'Longpages'                 => [ 'صفح_طويله' ],
+       'MediaStatistics'           => [ 'احصائيات_الميديا' ],
        'MergeHistory'              => [ 'دمج_التاريخ' ],
        'MIMEsearch'                => [ 'تدوير_MIME' ],
        'Mostcategories'            => [ 'اكتر_تصانيف' ],
@@ -113,6 +123,7 @@ $specialPageAliases = [
        'Recentchanges'             => [ 'اخر_تعديلات' ],
        'Recentchangeslinked'       => [ 'اجدد_التغييرات_اللى_معمول_ليها_لينك', 'تغييرات_مرتبطه' ],
        'Redirect'                  => [ 'تحويل' ],
+       'RemoveCredentials'         => [ 'مسح_الكريدينشيال' ],
        'ResetTokens'               => [ 'ضبط_المفاتيح' ],
        'Revisiondelete'            => [ 'مسح_نسخه' ],
        'RunJobs'                   => [ 'تشغيل_الوظايف' ],
@@ -128,6 +139,7 @@ $specialPageAliases = [
        'Uncategorizedpages'        => [ 'صفح_مش_متصنفه' ],
        'Uncategorizedtemplates'    => [ 'قوالب_مش_متصنفه' ],
        'Undelete'                  => [ 'استرجاع' ],
+       'UnlinkAccounts'            => [ 'فك_الحسابات' ],
        'Unlockdb'                  => [ 'فتح_قب' ],
        'Unusedcategories'          => [ 'تصانيف_مش_مستعمله' ],
        'Unusedimages'              => [ 'فايلات_مش_مستعمله', 'صور_مش_مستعمله' ],
index 77c8af8..cc52438 100644 (file)
@@ -1751,6 +1751,7 @@ return [
                        'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js',
                        'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js',
                        'resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js',
+                       'resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js',
                ],
                'dependencies' => [
                        'oojs',
index 59c0a19..dd698cd 100644 (file)
@@ -75,8 +75,8 @@
                        var subsetNames = [],
                                filterItem = new mw.rcfilters.dm.FilterItem( filter.name, model, {
                                        group: model.getName(),
-                                       label: mw.msg( filter.label ),
-                                       description: mw.msg( filter.description ),
+                                       label: filter.label ? mw.msg( filter.label ) : filter.name,
+                                       description: filter.description ? mw.msg( filter.description ) : '',
                                        cssClass: filter.cssClass
                                } );
 
index 375b68b..c5672ae 100644 (file)
@@ -13,7 +13,7 @@
                this.savedQueriesModel = savedQueriesModel;
                this.requestCounter = 0;
                this.baseFilterState = {};
-               this.emptyParameterState = {};
+               this.uriProcessor = null;
                this.initializing = false;
        };
 
@@ -26,7 +26,7 @@
         * @param {Array} filterStructure Filter definition and structure for the model
         */
        mw.rcfilters.Controller.prototype.initialize = function ( filterStructure ) {
-               var parsedSavedQueries, validParameterNames,
+               var parsedSavedQueries,
                        uri = new mw.Uri(),
                        $changesList = $( '.mw-changeslist' ).first().contents();
 
                this.filtersModel.initializeFilters( filterStructure );
 
                this._buildBaseFilterState();
-               this._buildEmptyParameterState();
-               validParameterNames = Object.keys( this._getEmptyParameterState() )
-                       .filter( function ( param ) {
-                               // Remove 'highlight' parameter from this check;
-                               // if it's the only parameter in the URL we still
-                               // want to consider the URL 'empty' for defaults to load
-                               return param !== 'highlight';
-                       } );
+               this.uriProcessor = new mw.rcfilters.UriProcessor(
+                       this.filtersModel
+               );
 
                try {
                        parsedSavedQueries = JSON.parse( mw.user.options.get( 'rcfilters-saved-queries' ) || '{}' );
                // the user loads the base-page and we load defaults.
                // Defaults should only be applied on load (if necessary)
                // or on request
+               this.initializing = true;
                if (
-                       Object.keys( uri.query ).some( function ( parameter ) {
-                               return validParameterNames.indexOf( parameter ) > -1;
-                       } )
+                       this.savedQueriesModel.getDefault() &&
+                       !this.uriProcessor.doesQueryContainRecognizedParams( uri.query )
                ) {
-                       // There are parameters in the url, update model state
-                       this.updateStateBasedOnUrl();
+                       // We have defaults from a saved query.
+                       // We will load them straight-forward (as if
+                       // they were clicked in the menu) so we trigger
+                       // a full ajax request and change of URL
+                       this.applySavedQuery( this.savedQueriesModel.getDefault() );
                } else {
-                       this.initializing = true;
-                       // No valid parameters are given, load defaults
-                       this._updateModelState(
-                               $.extend(
-                                       true,
-                                       // We've ignored the highlight parameter for the sake
-                                       // of seeing whether we need to apply defaults - but
-                                       // while we do load the defaults, we still want to retain
-                                       // the actual value given in the URL for it on top of the
-                                       // defaults
-                                       { highlight: String( Number( uri.query.highlight ) ) },
-                                       this._getDefaultParams()
-                               )
+                       // There are either recognized parameters in the URL
+                       // or there are none, but there is also no default
+                       // saved query (so defaults are from the backend)
+                       // We want to update the state but not fetch results
+                       // again
+                       this.updateStateFromUrl( false );
+
+                       // Update the changes list with the existing data
+                       // so it gets processed
+                       this.changesListModel.update(
+                               $changesList.length ? $changesList : 'NO_RESULTS',
+                               $( 'fieldset.rcoptions' ).first()
                        );
-                       this.updateChangesList();
-                       this.initializing = false;
                }
-
-               // Update the changes list with the existing data
-               // so it gets processed
-               this.changesListModel.update(
-                       $changesList.length ? $changesList : 'NO_RESULTS',
-                       $( 'fieldset.rcoptions' ).first()
-               );
+               this.initializing = false;
        };
 
        /**
         * Reset to default filters
         */
        mw.rcfilters.Controller.prototype.resetToDefaults = function () {
-               this._updateModelState( $.extend( true, { highlight: '0' }, this._getDefaultParams() ) );
+               this.uriProcessor.updateModelBasedOnQuery( this._getDefaultParams() );
                this.updateChangesList();
        };
 
                };
        };
 
-       /**
-        * Build an empty representation of the parameters, where all parameters
-        * are either set to '0' or '' depending on their type.
-        * This must run during initialization, before highlights are set.
-        */
-       mw.rcfilters.Controller.prototype._buildEmptyParameterState = function () {
-               var emptyParams = this.filtersModel.getParametersFromFilters( {} ),
-                       emptyHighlights = this.filtersModel.getHighlightParameters();
-
-               this.emptyParameterState = $.extend(
-                       true,
-                       {},
-                       emptyParams,
-                       emptyHighlights,
-                       { highlight: '0' }
-               );
-       };
-
        /**
         * Get an object representing the base filter state of both
         * filters and highlights. The structure is similar to what we use
                return this.baseFilterState;
        };
 
-       /**
-        * Get an object representing the base state of parameters
-        * and highlights. The structure is similar to what we use
-        * to store each query in the saved queries object:
-        * {
-        *    param1: "value",
-        *    param2: "value1|value2"
-        * }
-        *
-        * @return {Object} Object representing the base state of
-        *  parameters and highlights
-        */
-       mw.rcfilters.Controller.prototype._getEmptyParameterState = function () {
-               return this.emptyParameterState;
-       };
-
        /**
         * Get an object that holds only the parameters and highlights that have
         * values different than the base default value.
         * without adding an history entry.
         */
        mw.rcfilters.Controller.prototype.replaceUrl = function () {
-               window.history.replaceState(
-                       { tag: 'rcfilters' },
-                       document.title,
-                       this._getUpdatedUri().toString()
-               );
+               mw.rcfilters.UriProcessor.static.replaceState( this._getUpdatedUri() );
        };
 
        /**
         * Update filter state (selection and highlighting) based
         * on current URL values.
+        *
+        * @param {boolean} [fetchChangesList=true] Fetch new results into the changes
+        *  list based on the updated model.
         */
-       mw.rcfilters.Controller.prototype.updateStateBasedOnUrl = function () {
-               var uri = new mw.Uri();
+       mw.rcfilters.Controller.prototype.updateStateFromUrl = function ( fetchChangesList ) {
+               fetchChangesList = fetchChangesList === undefined ? true : !!fetchChangesList;
 
-               this._updateModelState( uri.query );
-               this.updateChangesList();
+               this.uriProcessor.updateModelBasedOnQuery( new mw.Uri().query );
+
+               // Only update and fetch new results if it is requested
+               if ( fetchChangesList ) {
+                       this.updateChangesList();
+               }
        };
 
        /**
        };
 
        /**
-        * Update the model state from given the given parameters.
-        *
-        * This is an internal method, and should only be used from inside
-        * the controller.
+        * Get an object representing the default parameter state, whether
+        * it is from the model defaults or from the saved queries.
         *
-        * @param {Object} parameters Object representing the parameters for
-        *  filters and highlights
+        * @return {Object} Default parameters
         */
-       mw.rcfilters.Controller.prototype._updateModelState = function ( parameters ) {
-               // Update filter states
-               this.filtersModel.toggleFiltersSelected(
-                       this.filtersModel.getFiltersFromParameters(
-                               parameters
-                       )
-               );
+       mw.rcfilters.Controller.prototype._getDefaultParams = function () {
+               var data, queryHighlights,
+                       savedParams = {},
+                       savedHighlights = {},
+                       defaultSavedQueryItem = this.savedQueriesModel.getItemByID( this.savedQueriesModel.getDefault() );
 
-               // Update highlight state
-               this.filtersModel.toggleHighlight( !!Number( parameters.highlight ) );
-               this.filtersModel.getItems().forEach( function ( filterItem ) {
-                       var color = parameters[ filterItem.getName() + '_color' ];
-                       if ( color ) {
-                               filterItem.setHighlightColor( color );
-                       } else {
-                               filterItem.clearHighlightColor();
-                       }
-               } );
+               if ( mw.config.get( 'wgStructuredChangeFiltersEnableSaving' ) &&
+                       defaultSavedQueryItem ) {
 
-               // Check all filter interactions
-               this.filtersModel.reassessFilterInteractions();
+                       data = defaultSavedQueryItem.getData();
+
+                       queryHighlights = data.highlights || {};
+                       savedParams = this.filtersModel.getParametersFromFilters( data.filters || {} );
+
+                       // Translate highlights to parameters
+                       savedHighlights.highlight = String( Number( queryHighlights.highlight ) );
+                       $.each( queryHighlights, function ( filterName, color ) {
+                               if ( filterName !== 'highlights' ) {
+                                       savedHighlights[ filterName + '_color' ] = color;
+                               }
+                       } );
+
+                       return $.extend( true, {}, savedParams, savedHighlights );
+               }
+
+               return $.extend(
+                       { highlight: '0' },
+                       this.filtersModel.getDefaultParams()
+               );
        };
 
        /**
         * @param {Object} [params] Extra parameters to add to the API call
         */
        mw.rcfilters.Controller.prototype._updateURL = function ( params ) {
-               var currentFilterState, updatedFilterState, updatedUri,
-                       uri = new mw.Uri(),
-                       notEquivalent = function ( obj1, obj2 ) {
-                               var keys = Object.keys( obj1 ).concat( Object.keys( obj2 ) );
-                               return keys.some( function ( key ) {
-                                       return obj1[ key ] != obj2[ key ]; // eslint-disable-line eqeqeq
-                               } );
-                       };
-
-               params = params || {};
-
-               updatedUri = this._getUpdatedUri();
-               updatedUri.extend( params );
-
-               // Compare states instead of parameters
-               // This will allow us to always have a proper check of whether
-               // the requested new url is one to change or not, regardless of
-               // actual parameter visibility/representation in the URL
-               currentFilterState = this.filtersModel.getFiltersFromParameters( uri.query );
-               updatedFilterState = this.filtersModel.getFiltersFromParameters( updatedUri.query );
-               // HACK: Re-merge extra parameters in
-               // This is a hack and a quickfix; a better, more sustainable
-               // fix is being worked on with a UriProcessor, but for now
-               // we need to make sure the **comparison** of whether currentFilterState
-               // and updatedFilterState differ **includes** the extra parameters in the URL
-               currentFilterState = $.extend( true, {}, uri.query, currentFilterState );
-               updatedFilterState = $.extend( true, {}, updatedUri.query, updatedFilterState );
-
-               // Include highlight states
-               $.extend( true,
-                       currentFilterState,
-                       this.filtersModel.extractHighlightValues( uri.query ),
-                       { highlight: !!Number( uri.query.highlight ) }
-               );
-               $.extend( true,
-                       updatedFilterState,
-                       this.filtersModel.extractHighlightValues( updatedUri.query ),
-                       { highlight: !!Number( updatedUri.query.highlight ) }
-               );
+               var currentUri = new mw.Uri(),
+                       updatedUri = this._getUpdatedUri();
 
-               if ( notEquivalent( currentFilterState, updatedFilterState ) ) {
+               updatedUri.extend( params || {} );
+
+               if (
+                       this.uriProcessor.getVersion( currentUri.query ) !== 2 ||
+                       this.uriProcessor.isNewState( currentUri.query, updatedUri.query )
+               ) {
                        if ( this.initializing ) {
                                // Initially, when we just build the first page load
                                // out of defaults, we want to replace the history
-                               window.history.replaceState( { tag: 'rcfilters' }, document.title, updatedUri.toString() );
+                               mw.rcfilters.UriProcessor.static.replaceState( updatedUri );
                        } else {
-                               window.history.pushState( { tag: 'rcfilters' }, document.title, updatedUri.toString() );
+                               mw.rcfilters.UriProcessor.static.pushState( updatedUri );
                        }
                }
        };
         * @return {mw.Uri} Updated Uri
         */
        mw.rcfilters.Controller.prototype._getUpdatedUri = function () {
-               var uri = new mw.Uri(),
-                       highlightParams = this.filtersModel.getHighlightParameters(),
-                       modelParameters = this.filtersModel.getParametersFromFilters(),
-                       baseParams = this._getEmptyParameterState();
-
-               // Minimize values of the model parameters; show only the values that
-               // are non-zero. We assume that all parameters that are not literally
-               // showing in the URL are set to zero or empty
-               $.each( modelParameters, function ( paramName, value ) {
-                       if ( baseParams[ paramName ] !== value ) {
-                               uri.query[ paramName ] = value;
-                       } else {
-                               // We need to remove this value from the url
-                               delete uri.query[ paramName ];
-                       }
-               } );
+               var uri = new mw.Uri();
 
-               // highlight params
-               if ( this.filtersModel.isHighlightEnabled() ) {
-                       uri.query.highlight = Number( this.filtersModel.isHighlightEnabled() );
-               } else {
-                       delete uri.query.highlight;
-               }
-               $.each( highlightParams, function ( paramName, value ) {
-                       // Only output if it is different than the base parameters
-                       if ( baseParams[ paramName ] !== value ) {
-                               uri.query[ paramName ] = value;
-                       } else {
-                               delete uri.query[ paramName ];
-                       }
-               } );
+               // Minimize url
+               uri.query = this.uriProcessor.minimizeQuery(
+                       $.extend(
+                               true,
+                               {},
+                               // We want to retain unrecognized params
+                               // The uri params from model will override
+                               // any recognized value in the current uri
+                               // query, retain unrecognized params, and
+                               // the result will then be minimized
+                               uri.query,
+                               this.uriProcessor.getUriParametersFromModel(),
+                               { urlversion: '2' }
+                       )
+               );
 
                return uri;
        };
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js
new file mode 100644 (file)
index 0000000..a691c11
--- /dev/null
@@ -0,0 +1,267 @@
+( function ( mw, $ ) {
+       /* eslint no-underscore-dangle: "off" */
+       /**
+        * URI Processor for RCFilters
+        *
+        * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model
+        */
+       mw.rcfilters.UriProcessor = function MwRcfiltersController( filtersModel ) {
+               this.emptyParameterState = {};
+               this.filtersModel = filtersModel;
+
+               // Initialize
+               this._buildEmptyParameterState();
+       };
+
+       /* Initialization */
+       OO.initClass( mw.rcfilters.UriProcessor );
+
+       /* Static methods */
+
+       /**
+        * Replace the url history through replaceState
+        *
+        * @param {mw.Uri} newUri New URI to replace
+        */
+       mw.rcfilters.UriProcessor.static.replaceState = function ( newUri ) {
+               window.history.replaceState(
+                       { tag: 'rcfilters' },
+                       document.title,
+                       newUri.toString()
+               );
+       };
+
+       /**
+        * Push the url to history through pushState
+        *
+        * @param {mw.Uri} newUri New URI to push
+        */
+       mw.rcfilters.UriProcessor.static.pushState = function ( newUri ) {
+               window.history.pushState(
+                       { tag: 'rcfilters' },
+                       document.title,
+                       newUri.toString()
+               );
+       };
+
+       /* Methods */
+
+       /**
+        * Get the version that this URL query is tagged with.
+        *
+        * @param {Object} [uriQuery] URI query
+        * @return {number} URL version
+        */
+       mw.rcfilters.UriProcessor.prototype.getVersion = function ( uriQuery ) {
+               uriQuery = uriQuery || new mw.Uri().query;
+
+               return Number( uriQuery.urlversion || 1 );
+       };
+
+       /**
+        * Update the filters model based on the URI query
+        * This happens on initialization, and from this moment on,
+        * we consider the system synchronized, and the model serves
+        * as the source of truth for the URL.
+        *
+        * This methods should only be called once on initialiation.
+        * After initialization, the model updates the URL, not the
+        * other way around.
+        *
+        * @param {Object} [uriQuery] URI query
+        */
+       mw.rcfilters.UriProcessor.prototype.updateModelBasedOnQuery = function ( uriQuery ) {
+               var parameters = this._getNormalizedQueryParams( uriQuery || new mw.Uri().query );
+
+               // Update filter states
+               this.filtersModel.toggleFiltersSelected(
+                       this.filtersModel.getFiltersFromParameters(
+                               parameters
+                       )
+               );
+
+               // Update highlight state
+               this.filtersModel.toggleHighlight( !!Number( parameters.highlight ) );
+               this.filtersModel.getItems().forEach( function ( filterItem ) {
+                       var color = parameters[ filterItem.getName() + '_color' ];
+                       if ( color ) {
+                               filterItem.setHighlightColor( color );
+                       } else {
+                               filterItem.clearHighlightColor();
+                       }
+               } );
+
+               // Check all filter interactions
+               this.filtersModel.reassessFilterInteractions();
+       };
+
+       /**
+        * Get parameters representing the current state of the model
+        *
+        * @return {Object} Uri query parameters
+        */
+       mw.rcfilters.UriProcessor.prototype.getUriParametersFromModel = function () {
+               return $.extend(
+                       true,
+                       {},
+                       this.filtersModel.getParametersFromFilters(),
+                       this.filtersModel.getHighlightParameters(),
+                       { highlight: String( Number( this.filtersModel.isHighlightEnabled() ) ) }
+               );
+       };
+
+       /**
+        * Build the full parameter representation based on given query parameters
+        *
+        * @private
+        * @param {Object} uriQuery Given URI query
+        * @return {Object} Full parameter state representing the URI query
+        */
+       mw.rcfilters.UriProcessor.prototype._expandModelParameters = function ( uriQuery ) {
+               var filterRepresentation = this.filtersModel.getFiltersFromParameters( uriQuery );
+
+               return $.extend( true,
+                       {},
+                       uriQuery,
+                       this.filtersModel.getParametersFromFilters( filterRepresentation ),
+                       this.filtersModel.extractHighlightValues( uriQuery ),
+                       { highlight: String( Number( uriQuery.highlight ) ) }
+               );
+       };
+
+       /**
+        * Compare two URI queries to decide whether they are different
+        * enough to represent a new state.
+        *
+        * @param {Object} currentUriQuery Current Uri query
+        * @param {Object} updatedUriQuery Updated Uri query
+        * @return {boolean} This is a new state
+        */
+       mw.rcfilters.UriProcessor.prototype.isNewState = function ( currentUriQuery, updatedUriQuery ) {
+               var currentParamState, updatedParamState,
+                       notEquivalent = function ( obj1, obj2 ) {
+                               var keys = Object.keys( obj1 ).concat( Object.keys( obj2 ) );
+                               return keys.some( function ( key ) {
+                                       return obj1[ key ] != obj2[ key ]; // eslint-disable-line eqeqeq
+                               } );
+                       };
+
+               // Compare states instead of parameters
+               // This will allow us to always have a proper check of whether
+               // the requested new url is one to change or not, regardless of
+               // actual parameter visibility/representation in the URL
+               currentParamState = this._expandModelParameters( currentUriQuery );
+               updatedParamState = this._expandModelParameters( updatedUriQuery );
+
+               return notEquivalent( currentParamState, updatedParamState );
+       };
+
+       /**
+        * Check whether the given query has parameters that are
+        * recognized as parameters we should load the system with
+        *
+        * @param {mw.Uri} [uriQuery] Given URI query
+        * @return {boolean} Query contains valid recognized parameters
+        */
+       mw.rcfilters.UriProcessor.prototype.doesQueryContainRecognizedParams = function ( uriQuery ) {
+               var anyValidInUrl,
+                       validParameterNames = Object.keys( this._getEmptyParameterState() )
+                               .filter( function ( param ) {
+                                       // Remove 'highlight' parameter from this check;
+                                       // if it's the only parameter in the URL we still
+                                       // want to consider the URL 'empty' for defaults to load
+                                       return param !== 'highlight';
+                               } );
+
+               uriQuery = uriQuery || new mw.Uri().query;
+
+               anyValidInUrl = Object.keys( uriQuery ).some( function ( parameter ) {
+                       return validParameterNames.indexOf( parameter ) > -1;
+               } );
+
+               // URL version 2 is allowed to be empty or within nonrecognized params
+               return anyValidInUrl || this.getVersion( uriQuery ) === 2;
+       };
+
+       /**
+        * Remove all parameters that have the same value as the base state
+        * This method expects uri queries of the urlversion=2 format
+        *
+        * @private
+        * @param {Object} uriQuery Current uri query
+        * @return {Object} Minimized query
+        */
+       mw.rcfilters.UriProcessor.prototype.minimizeQuery = function ( uriQuery ) {
+               var baseParams = this._getEmptyParameterState(),
+                       uriResult = $.extend( true, {}, uriQuery );
+
+               $.each( uriResult, function ( paramName, paramValue ) {
+                       if (
+                               baseParams[ paramName ] !== undefined &&
+                               baseParams[ paramName ] === paramValue
+                       ) {
+                               // Remove parameter from query
+                               delete uriResult[ paramName ];
+                       }
+               } );
+
+               return uriResult;
+       };
+
+       /**
+        * Get the adjusted URI params based on the url version
+        * If the urlversion is not 2, the parameters are merged with
+        * the model's defaults.
+        *
+        * @private
+        * @param {Object} uriQuery Current URI query
+        * @return {Object} Normalized parameters
+        */
+       mw.rcfilters.UriProcessor.prototype._getNormalizedQueryParams = function ( uriQuery ) {
+               // Check whether we are dealing with urlversion=2
+               // If we are, we do not merge the initial request with
+               // defaults. Not having urlversion=2 means we need to
+               // reproduce the server-side request and merge the
+               // requested parameters (or starting state) with the
+               // wiki default.
+               // Any subsequent change of the URL through the RCFilters
+               // system will receive 'urlversion=2'
+               var base = this.getVersion( uriQuery ) === 2 ?
+                       {} :
+                       this.filtersModel.getDefaultParams();
+
+               return this.minimizeQuery(
+                       $.extend( true, {}, base, uriQuery, { urlversion: '2' } )
+               );
+       };
+
+       /**
+        * Get the representation of an empty parameter state
+        *
+        * @private
+        * @return {Object} Empty parameter state
+        */
+       mw.rcfilters.UriProcessor.prototype._getEmptyParameterState = function () {
+               return this.emptyParameterState;
+       };
+
+       /**
+        * Build an empty representation of the parameters, where all parameters
+        * are either set to '0' or '' depending on their type.
+        * This must run during initialization, before highlights are set.
+        *
+        * @private
+        */
+       mw.rcfilters.UriProcessor.prototype._buildEmptyParameterState = function () {
+               var emptyParams = this.filtersModel.getParametersFromFilters( {} ),
+                       emptyHighlights = this.filtersModel.getHighlightParameters();
+
+               this.emptyParameterState = $.extend(
+                       true,
+                       {},
+                       emptyParams,
+                       emptyHighlights,
+                       { highlight: '0' }
+               );
+       };
+}( mediaWiki, jQuery ) );
index dd8fae0..6e62436 100644 (file)
@@ -37,8 +37,9 @@
                        $( '.rcfilters-head' ).addClass( 'mw-rcfilters-ui-ready' );
 
                        window.addEventListener( 'popstate', function () {
-                               controller.updateStateBasedOnUrl();
-                               controller.updateChangesList();
+                               // Update the state of the model from the URL
+                               // and re-fetch results into the changes list
+                               controller.updateStateFromUrl();
                        } );
 
                        $( 'a.mw-helplink' ).attr(
index d17ffff..7605fae 100644 (file)
 
                // Collect all data from form
                $( e.target ).find( 'input:not([type="hidden"],[type="submit"]), select' ).each( function () {
+                       var value = '';
+
                        if ( !$( this ).is( ':checkbox' ) || $( this ).is( ':checked' ) ) {
-                               data[ $( this ).prop( 'name' ) ] = $( this ).val();
+                               value = $( this ).val();
                        }
+
+                       data[ $( this ).prop( 'name' ) ] = value;
                } );
 
                this.controller.updateChangesList( data );
index d973c3e..44bcdff 100644 (file)
@@ -28315,3 +28315,20 @@ unclosed internal link XSS (T137264)
 !! html/parsoid
 <p>[[#%3Cscript%3Ealert(1)%3C/script%3E|</p>
 !! end
+
+!! test
+Validating that <style> isn't eaten by tidy (T167349)
+!! options
+# Use $wgRawHtml to inject a <style> tag, since you normally can't in wikitext
+wgRawHtml=1
+!! wikitext
+<div class="foo">
+<html><style>.foo::before { content: "<foo>"; }</style></html>
+<html><style data-mw-foobar="baz">.foo::after { content: "<bar>"; }</style></html>
+</div>
+!! html+tidy
+<div class="foo">
+<style>.foo::before { content: "<foo>"; }</style>
+<style data-mw-foobar="baz">.foo::after { content: "<bar>"; }</style>
+</div>
+!! end
index 238b65f..6c44999 100644 (file)
@@ -716,28 +716,33 @@ class TitleTest extends MediaWikiTestCase {
                return [
                        // ns = 0
                        [
-                               Title::makeTitle( NS_MAIN, 'Foobar' ),
-                               'Foobar'
+                               Title::makeTitle( NS_MAIN, 'Foo bar' ),
+                               'Foo bar'
                        ],
                        // ns = 2
                        [
-                               Title::makeTitle( NS_USER, 'Foobar' ),
-                               'User:Foobar'
+                               Title::makeTitle( NS_USER, 'Foo bar' ),
+                               'User:Foo bar'
+                       ],
+                       // ns = 3
+                       [
+                               Title::makeTitle( NS_USER_TALK, 'Foo bar' ),
+                               'User talk:Foo bar'
                        ],
                        // fragment not included
                        [
-                               Title::makeTitle( NS_MAIN, 'Foobar', 'fragment' ),
-                               'Foobar'
+                               Title::makeTitle( NS_MAIN, 'Foo bar', 'fragment' ),
+                               'Foo bar'
                        ],
                        // ns = -2
                        [
-                               Title::makeTitle( NS_MEDIA, 'Foobar' ),
-                               'Media:Foobar'
+                               Title::makeTitle( NS_MEDIA, 'Foo bar' ),
+                               'Media:Foo bar'
                        ],
                        // non-existent namespace
                        [
-                               Title::makeTitle( 100000, 'Foobar' ),
-                               ':Foobar'
+                               Title::makeTitle( 100777, 'Foo bar' ),
+                               'Special:Badtitle/NS100777:Foo bar'
                        ],
                ];
        }
@@ -749,4 +754,47 @@ class TitleTest extends MediaWikiTestCase {
        public function testGetPrefixedText( Title $title, $expected ) {
                $this->assertEquals( $expected, $title->getPrefixedText() );
        }
+
+       public function provideGetPrefixedDBKey() {
+               return [
+                       // ns = 0
+                       [
+                               Title::makeTitle( NS_MAIN, 'Foo_bar' ),
+                               'Foo_bar'
+                       ],
+                       // ns = 2
+                       [
+                               Title::makeTitle( NS_USER, 'Foo_bar' ),
+                               'User:Foo_bar'
+                       ],
+                       // ns = 3
+                       [
+                               Title::makeTitle( NS_USER_TALK, 'Foo_bar' ),
+                               'User_talk:Foo_bar'
+                       ],
+                       // fragment not included
+                       [
+                               Title::makeTitle( NS_MAIN, 'Foo_bar', 'fragment' ),
+                               'Foo_bar'
+                       ],
+                       // ns = -2
+                       [
+                               Title::makeTitle( NS_MEDIA, 'Foo_bar' ),
+                               'Media:Foo_bar'
+                       ],
+                       // non-existent namespace
+                       [
+                               Title::makeTitle( 100777, 'Foo_bar' ),
+                               'Special:Badtitle/NS100777:Foo_bar'
+                       ],
+               ];
+       }
+
+       /**
+        * @covers Title::getPrefixedDBKey
+        * @dataProvider provideGetPrefixedDBKey
+        */
+       public function testGetPrefixedDBKey( Title $title, $expected ) {
+               $this->assertEquals( $expected, $title->getPrefixedDBkey() );
+       }
 }
index 253ac95..ee0ad94 100644 (file)
@@ -174,4 +174,43 @@ class ApiBaseTest extends ApiTestCase {
                ], $user ) );
        }
 
+       /**
+        * @covers ApiBase::dieStatus
+        */
+       public function testDieStatus() {
+               $mock = new MockApi();
+
+               $status = StatusValue::newGood();
+               $status->error( 'foo' );
+               $status->warning( 'bar' );
+               try {
+                       $mock->dieStatus( $status );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'foo' ), 'Exception has "foo"' );
+                       $this->assertFalse( ApiTestCase::apiExceptionHasCode( $ex, 'bar' ), 'Exception has "bar"' );
+               }
+
+               $status = StatusValue::newGood();
+               $status->warning( 'foo' );
+               $status->warning( 'bar' );
+               try {
+                       $mock->dieStatus( $status );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'foo' ), 'Exception has "foo"' );
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'bar' ), 'Exception has "bar"' );
+               }
+
+               $status = StatusValue::newGood();
+               $status->setOk( false );
+               try {
+                       $mock->dieStatus( $status );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'unknownerror-nocode' ),
+                               'Exception has "unknownerror-nocode"' );
+               }
+       }
+
 }
index f01a670..028d3b4 100644 (file)
  */
 class ApiParseTest extends ApiTestCase {
 
-       protected function setUp() {
-               parent::setUp();
-               $this->doLogin();
+       protected static $pageId;
+       protected static $revIds = [];
+
+       public function addDBDataOnce() {
+               $user = static::getTestSysop()->getUser();
+               $title = Title::newFromText( __CLASS__ );
+               $page = WikiPage::factory( $title );
+
+               $status = $page->doEditContent(
+                       ContentHandler::makeContent( 'Test for revdel', $title, CONTENT_MODEL_WIKITEXT ),
+                       __METHOD__ . ' Test for revdel', 0, false, $user
+               );
+               if ( !$status->isOk() ) {
+                       $this->fail( "Failed to create $title: " . $status->getWikiText( false, false, 'en' ) );
+               }
+               self::$pageId = $status->value['revision']->getPage();
+               self::$revIds['revdel'] = $status->value['revision']->getId();
+
+               $status = $page->doEditContent(
+                       ContentHandler::makeContent( 'Test for oldid', $title, CONTENT_MODEL_WIKITEXT ),
+                       __METHOD__ . ' Test for oldid', 0, false, $user
+               );
+               if ( !$status->isOk() ) {
+                       $this->fail( "Failed to edit $title: " . $status->getWikiText( false, false, 'en' ) );
+               }
+               self::$revIds['oldid'] = $status->value['revision']->getId();
+
+               $status = $page->doEditContent(
+                       ContentHandler::makeContent( 'Test for latest', $title, CONTENT_MODEL_WIKITEXT ),
+                       __METHOD__ . ' Test for latest', 0, false, $user
+               );
+               if ( !$status->isOk() ) {
+                       $this->fail( "Failed to edit $title: " . $status->getWikiText( false, false, 'en' ) );
+               }
+               self::$revIds['latest'] = $status->value['revision']->getId();
+
+               RevisionDeleter::createList(
+                       'revision', RequestContext::getMain(), $title, [ self::$revIds['revdel'] ]
+               )->setVisibility( [
+                       'value' => [
+                               Revision::DELETED_TEXT => 1,
+                       ],
+                       'comment' => 'Test for revdel',
+               ] );
+
+               Title::clearCaches(); // Otherwise it has the wrong latest revision for some reason
        }
 
-       public function testParseNonexistentPage() {
-               $somePage = mt_rand();
+       public function testParseByName() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'page' => __CLASS__,
+               ] );
+               $this->assertContains( 'Test for latest', $res[0]['parse']['text'] );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'page' => __CLASS__,
+                       'disablelimitreport' => 1,
+               ] );
+               $this->assertContains( 'Test for latest', $res[0]['parse']['text'] );
+       }
+
+       public function testParseById() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'pageid' => self::$pageId,
+               ] );
+               $this->assertContains( 'Test for latest', $res[0]['parse']['text'] );
+       }
+
+       public function testParseByOldId() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'oldid' => self::$revIds['oldid'],
+               ] );
+               $this->assertContains( 'Test for oldid', $res[0]['parse']['text'] );
+               $this->assertArrayNotHasKey( 'textdeleted', $res[0]['parse'] );
+               $this->assertArrayNotHasKey( 'textsuppressed', $res[0]['parse'] );
+       }
+
+       public function testParseRevDel() {
+               $user = static::getTestUser()->getUser();
+               $sysop = static::getTestSysop()->getUser();
 
                try {
                        $this->doApiRequest( [
                                'action' => 'parse',
-                               'page' => $somePage ] );
+                               'oldid' => self::$revIds['revdel'],
+                       ], null, null, $user );
+                       $this->fail( "API did not return an error as expected" );
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'permissiondenied' ),
+                               "API failed with error 'permissiondenied'" );
+               }
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'oldid' => self::$revIds['revdel'],
+               ], null, null, $sysop );
+               $this->assertContains( 'Test for revdel', $res[0]['parse']['text'] );
+               $this->assertArrayHasKey( 'textdeleted', $res[0]['parse'] );
+               $this->assertArrayNotHasKey( 'textsuppressed', $res[0]['parse'] );
+       }
+
+       public function testParseNonexistentPage() {
+               try {
+                       $this->doApiRequest( [
+                               'action' => 'parse',
+                               'page' => 'DoesNotExist',
+                       ] );
 
                        $this->fail( "API did not return an error when parsing a nonexistent page" );
                } catch ( ApiUsageException $ex ) {
index b6088ff..206655c 100644 (file)
@@ -17,13 +17,13 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 
        protected function assertLastSql( $sqlText ) {
                $this->assertEquals(
-                       $this->database->getLastSqls(),
-                       $sqlText
+                       $sqlText,
+                       $this->database->getLastSqls()
                );
        }
 
        protected function assertLastSqlDb( $sqlText, $db ) {
-               $this->assertEquals( $db->getLastSqls(), $sqlText );
+               $this->assertEquals( $sqlText, $db->getLastSqls() );
        }
 
        /**
@@ -365,7 +365,8 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                        $sql['conds'],
                        __METHOD__,
                        isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : [],
-                       isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : []
+                       isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : [],
+                       isset( $sql['selectJoinConds'] ) ? $sql['selectJoinConds'] : []
                );
                $this->assertLastSql( $sqlTextNative );
 
@@ -380,7 +381,8 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                        $sql['conds'],
                        __METHOD__,
                        isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : [],
-                       isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : []
+                       isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : [],
+                       isset( $sql['selectJoinConds'] ) ? $sql['selectJoinConds'] : []
                );
                $this->assertLastSqlDb( implode( '; ', [ $sqlSelect, $sqlInsert ] ), $dbWeb );
        }
@@ -397,7 +399,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                "INSERT INTO insert_table " .
                                        "(field_insert,field) " .
                                        "SELECT field_select,field2 " .
-                                       "FROM select_table",
+                                       "FROM select_table WHERE *",
                                "SELECT field_select AS field_insert,field2 AS field " .
                                "FROM select_table WHERE *   FOR UPDATE",
                                "INSERT INTO insert_table (field_insert,field) VALUES ('0','1')"
@@ -437,6 +439,28 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                "FROM select_table WHERE field = '2' ORDER BY field  FOR UPDATE",
                                "INSERT IGNORE INTO insert_table (field_insert,field) VALUES ('0','1')"
                        ],
+                       [
+                               [
+                                       'destTable' => 'insert_table',
+                                       'srcTable' => [ 'select_table1', 'select_table2' ],
+                                       'varMap' => [ 'field_insert' => 'field_select', 'field' => 'field2' ],
+                                       'conds' => [ 'field' => 2 ],
+                                       'selectOptions' => [ 'ORDER BY' => 'field', 'FORCE INDEX' => [ 'select_table1' => 'index1' ] ],
+                                       'selectJoinConds' => [
+                                               'select_table2' => [ 'LEFT JOIN', [ 'select_table1.foo = select_table2.bar' ] ],
+                                       ],
+                               ],
+                               "INSERT INTO insert_table " .
+                                       "(field_insert,field) " .
+                                       "SELECT field_select,field2 " .
+                                       "FROM select_table1 LEFT JOIN select_table2 ON ((select_table1.foo = select_table2.bar)) " .
+                                       "WHERE field = '2' " .
+                                       "ORDER BY field",
+                               "SELECT field_select AS field_insert,field2 AS field " .
+                               "FROM select_table1 LEFT JOIN select_table2 ON ((select_table1.foo = select_table2.bar)) " .
+                               "WHERE field = '2' ORDER BY field  FOR UPDATE",
+                               "INSERT INTO insert_table (field_insert,field) VALUES ('0','1')"
+                       ],
                ];
        }
 
index 56790e2..666dcf2 100644 (file)
@@ -87,7 +87,7 @@ class PageDataRequestHandlerTest extends \MediaWikiTestCase {
                $subpageCases = [];
                foreach ( $cases as $c ) {
                        $case = $c;
-                       $case[0] = '';
+                       $case[0] = 'main/';
 
                        if ( isset( $case[1]['target'] ) ) {
                                $case[0] .= $case[1]['target'];
@@ -121,7 +121,7 @@ class PageDataRequestHandlerTest extends \MediaWikiTestCase {
                ];
 
                $cases[] = [
-                       'Helsinki',
+                       '/Helsinki',
                        [],
                        [],
                        '!!',
@@ -131,7 +131,7 @@ class PageDataRequestHandlerTest extends \MediaWikiTestCase {
 
                // #31: /Q5 with "Accept: text/foobar" triggers a 406
                $cases[] = [
-                       'Helsinki',
+                       'main/Helsinki',
                        [],
                        [ 'Accept' => 'text/foobar' ],
                        '!!',
@@ -140,7 +140,7 @@ class PageDataRequestHandlerTest extends \MediaWikiTestCase {
                ];
 
                $cases[] = [
-                       'Helsinki',
+                       'main/Helsinki',
                        [],
                        [ 'Accept' => 'text/HTML' ],
                        '!!',
@@ -148,6 +148,24 @@ class PageDataRequestHandlerTest extends \MediaWikiTestCase {
                        [ 'Location' => '!Helsinki$!' ]
                ];
 
+               $cases[] = [
+                       '/Helsinki',
+                       [],
+                       [ 'Accept' => 'text/HTML' ],
+                       '!!',
+                       303,
+                       [ 'Location' => '!Helsinki$!' ]
+               ];
+
+               $cases[] = [
+                       'main/AC/DC',
+                       [],
+                       [ 'Accept' => 'text/HTML' ],
+                       '!!',
+                       303,
+                       [ 'Location' => '!AC/DC$!' ]
+               ];
+
                return $cases;
        }
 
index 81f0564..d606142 100644 (file)
@@ -22,7 +22,6 @@ class ParserOptionsTest extends MediaWikiTestCase {
                return [
                        'No overrides' => [ true, [] ],
                        'In-key options are ok' => [ true, [
-                               'editsection' => false,
                                'thumbsize' => 1e100,
                                'wrapclass' => false,
                        ] ],
@@ -65,14 +64,14 @@ class ParserOptionsTest extends MediaWikiTestCase {
        }
 
        public static function provideOptionsHashPre30() {
-               $used = [ 'wrapclass', 'editsection', 'printable' ];
+               $used = [ 'wrapclass', 'printable' ];
 
                return [
                        'Canonical options, nothing used' => [ [], '*!*!*!*!*!*', [] ],
-                       'Canonical options, used some options' => [ $used, '*!*!*!*!*', [] ],
+                       'Canonical options, used some options' => [ $used, '*!*!*!*!*!*', [] ],
                        'Used some options, non-default values' => [
                                $used,
-                               '*!*!*!*!*!printable=1!wrapclass=foobar',
+                               '*!*!*!*!*!*!printable=1!wrapclass=foobar',
                                [
                                        'setWrapOutputClass' => 'foobar',
                                        'setIsPrintable' => true,
@@ -87,6 +86,14 @@ class ParserOptionsTest extends MediaWikiTestCase {
                                        'wgHooks' => [ 'PageRenderingHash' => [ [ __CLASS__ . '::onPageRenderingHash' ] ] ],
                                ]
                        ],
+
+                       // Test weird historical behavior is still weird
+                       'Canonical options, editsection=true used' => [ [ 'editsection' ], '*!*!*!*!*', [
+                               'setEditSection' => true,
+                       ] ],
+                       'Canonical options, editsection=false used' => [ [ 'editsection' ], '*!*!*!*!*!edit=0', [
+                               'setEditSection' => false,
+                       ] ],
                ];
        }
 
@@ -117,7 +124,7 @@ class ParserOptionsTest extends MediaWikiTestCase {
        }
 
        public static function provideOptionsHash() {
-               $used = [ 'wrapclass', 'editsection', 'printable' ];
+               $used = [ 'wrapclass', 'printable' ];
 
                $classWrapper = TestingAccessWrapper::newFromClass( ParserOptions::class );
                $classWrapper->getDefaults();
@@ -154,6 +161,30 @@ class ParserOptionsTest extends MediaWikiTestCase {
                $confstr .= '!onPageRenderingHash';
        }
 
+       // Test weird historical behavior is still weird
+       public function testOptionsHashEditSection() {
+               global $wgHooks;
+
+               $this->setMwGlobals( [
+                       'wgRenderHashAppend' => '',
+                       'wgHooks' => [ 'PageRenderingHash' => [] ] + $wgHooks,
+               ] );
+
+               $popt = ParserOptions::newCanonical();
+               $popt->registerWatcher( function ( $name ) {
+                       $this->assertNotEquals( 'editsection', $name );
+               } );
+
+               $this->assertTrue( $popt->getEditSection() );
+               $this->assertSame( 'canonical', $popt->optionsHash( [] ) );
+               $this->assertSame( 'canonical', $popt->optionsHash( [ 'editsection' ] ) );
+
+               $popt->setEditSection( false );
+               $this->assertFalse( $popt->getEditSection() );
+               $this->assertSame( 'canonical', $popt->optionsHash( [] ) );
+               $this->assertSame( 'editsection=0', $popt->optionsHash( [ 'editsection' ] ) );
+       }
+
        /**
         * @expectedException InvalidArgumentException
         * @expectedExceptionMessage Unknown parser option bogus
index 2566875..c93fe47 100644 (file)
@@ -37,21 +37,6 @@ class SpecialPageDataTest extends SpecialPageTestBase {
                        [ 'Location' => '!.+!' ]
                ];
 
-               $subpageCases = [];
-               foreach ( $cases as $c ) {
-                       $case = $c;
-                       $case[0] = '';
-
-                       if ( isset( $case[1]['title'] ) ) {
-                               $case[0] .= $case[1]['title'];
-                               unset( $case[1]['title'] );
-                       }
-
-                       $subpageCases[] = $case;
-               }
-
-               $cases = array_merge( $cases, $subpageCases );
-
                $cases['Accept only HTML'] = [
                        '',
                        [ 'target' => 'Helsinki' ],
@@ -74,7 +59,16 @@ class SpecialPageDataTest extends SpecialPageTestBase {
                ];
 
                $cases['Nothing specified'] = [
-                       'Helsinki',
+                       'main/Helsinki',
+                       [],
+                       [],
+                       '!!',
+                       303,
+                       [ 'Location' => '!Helsinki&action=raw!' ]
+               ];
+
+               $cases['Nothing specified'] = [
+                       '/Helsinki',
                        [],
                        [],
                        '!!',
@@ -83,7 +77,7 @@ class SpecialPageDataTest extends SpecialPageTestBase {
                ];
 
                $cases['Invalid Accept header'] = [
-                       'Helsinki',
+                       'main/Helsinki',
                        [],
                        [ 'Accept' => 'text/foobar' ],
                        '!!',
index 53362c4..ee3cd5b 100644 (file)
@@ -94,6 +94,7 @@ return [
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
                        'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js',
                        'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js',
+                       'tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js',
diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js
new file mode 100644 (file)
index 0000000..38ade4d
--- /dev/null
@@ -0,0 +1,252 @@
+/* eslint-disable camelcase */
+/* eslint no-underscore-dangle: "off" */
+( function ( mw, $ ) {
+       var mockFilterStructure = [ {
+                       name: 'group1',
+                       title: 'Group 1',
+                       type: 'send_unselected_if_any',
+                       filters: [
+                               { name: 'filter1', default: true },
+                               { name: 'filter2' }
+                       ]
+               }, {
+                       name: 'group2',
+                       title: 'Group 2',
+                       type: 'send_unselected_if_any',
+                       filters: [
+                               { name: 'filter3' },
+                               { name: 'filter4', default: true }
+                       ]
+               }, {
+                       name: 'group3',
+                       title: 'Group 3',
+                       type: 'string_options',
+                       filters: [
+                               { name: 'filter5' },
+                               { name: 'filter6' }
+                       ]
+               } ],
+               minimalDefaultParams = {
+                       filter1: '1',
+                       filter4: '1'
+               };
+
+       QUnit.module( 'mediawiki.rcfilters - UriProcessor' );
+
+       QUnit.test( 'getVersion', function ( assert ) {
+               var uriProcessor = new mw.rcfilters.UriProcessor( new mw.rcfilters.dm.FiltersViewModel() );
+
+               assert.ok(
+                       uriProcessor.getVersion( { param1: 'foo', urlversion: '2' } ),
+                       2,
+                       'Retrieving the version from the URI query'
+               );
+
+               assert.ok(
+                       uriProcessor.getVersion( { param1: 'foo' } ),
+                       1,
+                       'Getting version 1 if no version is specified'
+               );
+       } );
+
+       QUnit.test( 'updateModelBasedOnQuery & getUriParametersFromModel', function ( assert ) {
+               var uriProcessor,
+                       filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
+                       baseParams = {
+                               filter1: '0',
+                               filter2: '0',
+                               filter3: '0',
+                               filter4: '0',
+                               group3: '',
+                               highlight: '0',
+                               group1__filter1_color: null,
+                               group1__filter2_color: null,
+                               group2__filter3_color: null,
+                               group2__filter4_color: null,
+                               group3__filter5_color: null,
+                               group3__filter6_color: null
+                       };
+
+               filtersModel.initializeFilters( mockFilterStructure );
+               uriProcessor = new mw.rcfilters.UriProcessor( filtersModel );
+
+               uriProcessor.updateModelBasedOnQuery( {} );
+               assert.deepEqual(
+                       uriProcessor.getUriParametersFromModel(),
+                       $.extend( true, {}, baseParams, minimalDefaultParams ),
+                       'Version 1: Empty url query sets model to defaults'
+               );
+
+               uriProcessor.updateModelBasedOnQuery( { urlversion: '2' } );
+               assert.deepEqual(
+                       uriProcessor.getUriParametersFromModel(),
+                       baseParams,
+                       'Version 2: Empty url query sets model to all-false'
+               );
+
+               uriProcessor.updateModelBasedOnQuery( { filter1: '1', urlversion: '2' } );
+               assert.deepEqual(
+                       uriProcessor.getUriParametersFromModel(),
+                       $.extend( true, {}, baseParams, { filter1: '1' } ),
+                       'Parameters in Uri query set parameter value in the model'
+               );
+
+               uriProcessor.updateModelBasedOnQuery( { highlight: '1', group1__filter1_color: 'c1', urlversion: '2' } );
+               assert.deepEqual(
+                       uriProcessor.getUriParametersFromModel(),
+                       $.extend( true, {}, baseParams, {
+                               highlight: '1',
+                               group1__filter1_color: 'c1'
+                       } ),
+                       'Highlight parameters in Uri query set highlight state in the model'
+               );
+       } );
+
+       QUnit.test( 'isNewState', function ( assert ) {
+               var uriProcessor,
+                       filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
+                       cases = [
+                               {
+                                       states: {
+                                               curr: {},
+                                               new: {}
+                                       },
+                                       result: false,
+                                       message: 'Empty objects are not new state.'
+                               },
+                               {
+                                       states: {
+                                               curr: { filter1: '1' },
+                                               new: { filter1: '0' }
+                                       },
+                                       result: true,
+                                       message: 'Nulified parameter is a new state'
+                               },
+                               {
+                                       states: {
+                                               curr: { filter1: '1' },
+                                               new: { filter1: '1', filter2: '1' }
+                                       },
+                                       result: true,
+                                       message: 'Added parameters are a new state'
+                               },
+                               {
+                                       states: {
+                                               curr: { filter1: '1' },
+                                               new: { filter1: '1', filter2: '0' }
+                                       },
+                                       result: false,
+                                       message: 'Added null parameters are not a new state (normalizing equals old state)'
+                               },
+                               {
+                                       states: {
+                                               curr: { filter1: '1' },
+                                               new: { filter1: '1', foo: 'bar' }
+                                       },
+                                       result: true,
+                                       message: 'Added unrecognized parameters are a new state'
+                               },
+                               {
+                                       states: {
+                                               curr: { filter1: '1', foo: 'bar' },
+                                               new: { filter1: '1', foo: 'baz' }
+                                       },
+                                       result: true,
+                                       message: 'Changed unrecognized parameters are a new state'
+                               }
+                       ];
+
+               filtersModel.initializeFilters( mockFilterStructure );
+               uriProcessor = new mw.rcfilters.UriProcessor( filtersModel );
+
+               cases.forEach( function ( testCase ) {
+                       assert.equal(
+                               uriProcessor.isNewState( testCase.states.curr, testCase.states.new ),
+                               testCase.result,
+                               testCase.message
+                       );
+               } );
+       } );
+
+       QUnit.test( 'doesQueryContainRecognizedParams', function ( assert ) {
+               var uriProcessor,
+                       filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
+                       cases = [
+                               {
+                                       query: {},
+                                       result: false,
+                                       message: 'Empty query is not valid for load.'
+                               },
+                               {
+                                       query: { highlight: '1' },
+                                       result: false,
+                                       message: 'Highlight state alone is not valid for load'
+                               },
+                               {
+                                       query: { urlversion: '2' },
+                                       result: true,
+                                       message: 'urlversion=2 state alone is valid for load as an empty state'
+                               },
+                               {
+                                       query: { filter1: '1', foo: 'bar' },
+                                       result: true,
+                                       message: 'Existence of recognized parameters makes the query valid for load'
+                               },
+                               {
+                                       query: { foo: 'bar', debug: true },
+                                       result: false,
+                                       message: 'Only unrecognized parameters makes the query invalid for load'
+                               }
+                       ];
+
+               filtersModel.initializeFilters( mockFilterStructure );
+               uriProcessor = new mw.rcfilters.UriProcessor( filtersModel );
+
+               cases.forEach( function ( testCase ) {
+                       assert.equal(
+                               uriProcessor.doesQueryContainRecognizedParams( testCase.query ),
+                               testCase.result,
+                               testCase.message
+                       );
+               } );
+       } );
+
+       QUnit.test( '_getNormalizedQueryParams', function ( assert ) {
+               var uriProcessor,
+                       filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
+                       cases = [
+                               {
+                                       query: {},
+                                       result: $.extend( true, { urlversion: '2' }, minimalDefaultParams ),
+                                       message: 'Empty query returns defaults (urlversion 1).'
+                               },
+                               {
+                                       query: { urlversion: '2' },
+                                       result: { urlversion: '2' },
+                                       message: 'Empty query returns empty (urlversion 2)'
+                               },
+                               {
+                                       query: { filter1: '0' },
+                                       result: { urlversion: '2', filter4: '1' },
+                                       message: 'urlversion 1 returns query that overrides defaults'
+                               },
+                               {
+                                       query: { filter3: '1' },
+                                       result: { urlversion: '2', filter1: '1', filter4: '1', filter3: '1' },
+                                       message: 'urlversion 1 with an extra param value returns query that is joined with defaults'
+                               }
+                       ];
+
+               filtersModel.initializeFilters( mockFilterStructure );
+               uriProcessor = new mw.rcfilters.UriProcessor( filtersModel );
+
+               cases.forEach( function ( testCase ) {
+                       assert.deepEqual(
+                               uriProcessor._getNormalizedQueryParams( testCase.query ),
+                               testCase.result,
+                               testCase.message
+                       );
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );