Merge "Sync up with Parsoid parserTests.txt"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 13 Sep 2017 20:36:48 +0000 (20:36 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 13 Sep 2017 20:36:48 +0000 (20:36 +0000)
86 files changed:
autoload.php
includes/CommentStore.php
includes/CommentStoreComment.php
includes/EditPage.php
includes/Licenses.php [deleted file]
includes/Linker.php
includes/Preferences.php
includes/Sanitizer.php
includes/TemplateParser.php
includes/Xml.php
includes/api/i18n/uk.json
includes/changes/EnhancedChangesList.php
includes/diff/DifferenceEngine.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLFormField.php
includes/installer/PostgresUpdater.php
includes/page/Article.php
includes/page/ImageHistoryPseudoPager.php
includes/page/WikiPage.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/skins/Skin.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialImport.php
includes/specials/SpecialUpload.php
includes/specials/formfields/EditWatchlistCheckboxSeriesField.php [new file with mode: 0644]
includes/specials/formfields/Licenses.php [new file with mode: 0644]
includes/specials/formfields/UploadSourceField.php [new file with mode: 0644]
includes/specials/forms/EditWatchlistNormalHTMLForm.php [new file with mode: 0644]
includes/specials/forms/PreferencesForm.php [new file with mode: 0644]
includes/specials/forms/UploadForm.php [new file with mode: 0644]
includes/specials/helpers/ImportReporter.php [new file with mode: 0644]
includes/specials/helpers/License.php [new file with mode: 0644]
languages/data/ZhConversion.php
languages/i18n/ais.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/bn.json
languages/i18n/ca.json
languages/i18n/csb.json
languages/i18n/de.json
languages/i18n/fr.json
languages/i18n/glk.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/it.json
languages/i18n/ko.json
languages/i18n/ku-latn.json
languages/i18n/lfn.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mwl.json
languages/i18n/my.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/pl.json
languages/i18n/pt.json
languages/i18n/ru.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/su.json
languages/i18n/tay.json
languages/i18n/uk.json
languages/i18n/zh-hans.json
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toSimp.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/trad2simp.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/populateIpChanges.php
resources/Resources.php
resources/src/jquery/jquery.byteLength.js
resources/src/mediawiki.action/images/close.png [new file with mode: 0644]
resources/src/mediawiki.action/images/close.svg [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.postEdit.less
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
tests/parser/parserTests.txt
tests/phpunit/data/templates/recurse.mustache [new file with mode: 0644]
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/TemplateParserTest.php
tests/phpunit/includes/XmlTest.php

index 4448204..61fd192 100644 (file)
@@ -421,8 +421,8 @@ $wgAutoloadLocalClasses = [
        'EditAction' => __DIR__ . '/includes/actions/EditAction.php',
        'EditCLI' => __DIR__ . '/maintenance/edit.php',
        'EditPage' => __DIR__ . '/includes/EditPage.php',
-       'EditWatchlistCheckboxSeriesField' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
-       'EditWatchlistNormalHTMLForm' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
+       'EditWatchlistCheckboxSeriesField' => __DIR__ . '/includes/specials/formfields/EditWatchlistCheckboxSeriesField.php',
+       'EditWatchlistNormalHTMLForm' => __DIR__ . '/includes/specials/forms/EditWatchlistNormalHTMLForm.php',
        'EmailConfirmation' => __DIR__ . '/includes/specials/SpecialConfirmemail.php',
        'EmailInvalidation' => __DIR__ . '/includes/specials/SpecialEmailInvalidate.php',
        'EmailNotification' => __DIR__ . '/includes/mail/EmailNotification.php',
@@ -633,7 +633,7 @@ $wgAutoloadLocalClasses = [
        'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php',
        'ImportImages' => __DIR__ . '/maintenance/importImages.php',
        'ImportLogFormatter' => __DIR__ . '/includes/logging/ImportLogFormatter.php',
-       'ImportReporter' => __DIR__ . '/includes/specials/SpecialImport.php',
+       'ImportReporter' => __DIR__ . '/includes/specials/helpers/ImportReporter.php',
        'ImportSiteScripts' => __DIR__ . '/maintenance/importSiteScripts.php',
        'ImportSites' => __DIR__ . '/maintenance/importSites.php',
        'ImportSource' => __DIR__ . '/includes/import/ImportSource.php',
@@ -746,8 +746,8 @@ $wgAutoloadLocalClasses = [
        'Languages' => __DIR__ . '/maintenance/language/languages.inc',
        'LayeredParameterizedPassword' => __DIR__ . '/includes/password/LayeredParameterizedPassword.php',
        'LegacyLogFormatter' => __DIR__ . '/includes/logging/LogFormatter.php',
-       'License' => __DIR__ . '/includes/Licenses.php',
-       'Licenses' => __DIR__ . '/includes/Licenses.php',
+       'License' => __DIR__ . '/includes/specials/helpers/License.php',
+       'Licenses' => __DIR__ . '/includes/specials/formfields/Licenses.php',
        'LinkBatch' => __DIR__ . '/includes/cache/LinkBatch.php',
        'LinkCache' => __DIR__ . '/includes/cache/LinkCache.php',
        'LinkFilter' => __DIR__ . '/includes/LinkFilter.php',
@@ -1135,7 +1135,7 @@ $wgAutoloadLocalClasses = [
        'PostgresInstaller' => __DIR__ . '/includes/installer/PostgresInstaller.php',
        'PostgresUpdater' => __DIR__ . '/includes/installer/PostgresUpdater.php',
        'Preferences' => __DIR__ . '/includes/Preferences.php',
-       'PreferencesForm' => __DIR__ . '/includes/Preferences.php',
+       'PreferencesForm' => __DIR__ . '/includes/specials/forms/PreferencesForm.php',
        'PrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
        'PreprocessDump' => __DIR__ . '/maintenance/preprocessDump.php',
        'Preprocessor' => __DIR__ . '/includes/parser/Preprocessor.php',
@@ -1532,14 +1532,14 @@ $wgAutoloadLocalClasses = [
        'UploadChunkVerificationException' => __DIR__ . '/includes/upload/UploadFromChunks.php',
        'UploadChunkZeroLengthFileException' => __DIR__ . '/includes/upload/UploadFromChunks.php',
        'UploadDumper' => __DIR__ . '/maintenance/dumpUploads.php',
-       'UploadForm' => __DIR__ . '/includes/specials/SpecialUpload.php',
+       'UploadForm' => __DIR__ . '/includes/specials/forms/UploadForm.php',
        'UploadFromChunks' => __DIR__ . '/includes/upload/UploadFromChunks.php',
        'UploadFromFile' => __DIR__ . '/includes/upload/UploadFromFile.php',
        'UploadFromStash' => __DIR__ . '/includes/upload/UploadFromStash.php',
        'UploadFromUrl' => __DIR__ . '/includes/upload/UploadFromUrl.php',
        'UploadLogFormatter' => __DIR__ . '/includes/logging/UploadLogFormatter.php',
        'UploadSourceAdapter' => __DIR__ . '/includes/import/UploadSourceAdapter.php',
-       'UploadSourceField' => __DIR__ . '/includes/specials/SpecialUpload.php',
+       'UploadSourceField' => __DIR__ . '/includes/specials/formfields/UploadSourceField.php',
        'UploadStash' => __DIR__ . '/includes/upload/UploadStash.php',
        'UploadStashBadPathException' => __DIR__ . '/includes/upload/UploadStash.php',
        'UploadStashCleanup' => __DIR__ . '/maintenance/cleanupUploadStash.php',
index 2ed21d1..b8a31e6 100644 (file)
@@ -367,26 +367,7 @@ class CommentStore {
         * @return CommentStoreComment
         */
        public function createComment( IDatabase $dbw, $comment, array $data = null ) {
-               global $wgContLang;
-
-               if ( !$comment instanceof CommentStoreComment ) {
-                       if ( $data !== null ) {
-                               foreach ( $data as $k => $v ) {
-                                       if ( substr( $k, 0, 1 ) === '_' ) {
-                                               throw new InvalidArgumentException( 'Keys in $data beginning with "_" are reserved' );
-                                       }
-                               }
-                       }
-                       if ( $comment instanceof Message ) {
-                               $message = clone $comment;
-                               $text = $message->inLanguage( $wgContLang ) // Avoid $wgForceUIMsgAsContentMsg
-                                       ->setInterfaceMessageFlag( true )
-                                       ->text();
-                               $comment = new CommentStoreComment( null, $text, $message, $data );
-                       } else {
-                               $comment = new CommentStoreComment( null, $comment, null, $data );
-                       }
-               }
+               $comment = CommentStoreComment::newUnsavedComment( $comment, $data );
 
                # Truncate comment in a Unicode-sensitive manner
                $comment->text = $this->lang->truncate( $comment->text, self::MAX_COMMENT_LENGTH );
index afc1374..3920ba0 100644 (file)
@@ -42,7 +42,7 @@ class CommentStoreComment {
        public $data;
 
        /**
-        * @private For use by CommentStore only
+        * @private For use by CommentStore only. Use self::newUnsavedComment() instead.
         * @param int|null $id
         * @param string $text
         * @param Message|null $message
@@ -54,4 +54,39 @@ class CommentStoreComment {
                $this->message = $message ?: new RawMessage( '$1', [ $text ] );
                $this->data = $data;
        }
+
+       /**
+        * Create a new, unsaved CommentStoreComment
+        *
+        * @param string|Message|CommentStoreComment $comment Comment text or Message object.
+        *  A CommentStoreComment is also accepted here, in which case it is returned unchanged.
+        * @param array|null $data Structured data to store. Keys beginning with '_' are reserved.
+        *  Ignored if $comment is a CommentStoreComment.
+        * @return CommentStoreComment
+        */
+       public static function newUnsavedComment( $comment, array $data = null ) {
+               global $wgContLang;
+
+               if ( $comment instanceof CommentStoreComment ) {
+                       return $comment;
+               }
+
+               if ( $data !== null ) {
+                       foreach ( $data as $k => $v ) {
+                               if ( substr( $k, 0, 1 ) === '_' ) {
+                                       throw new InvalidArgumentException( 'Keys in $data beginning with "_" are reserved' );
+                               }
+                       }
+               }
+
+               if ( $comment instanceof Message ) {
+                       $message = clone $comment;
+                       $text = $message->inLanguage( $wgContLang ) // Avoid $wgForceUIMsgAsContentMsg
+                               ->setInterfaceMessageFlag( true )
+                               ->text();
+                       return new CommentStoreComment( null, $text, $message, $data );
+               } else {
+                       return new CommentStoreComment( null, $comment, null, $data );
+               }
+       }
 }
index 06a5cc3..9f3f586 100644 (file)
@@ -2915,7 +2915,7 @@ class EditPage {
                                }
                        }
 
-                       $buttonLabel = $this->context->msg( $this->getSaveButtonLabel() )->text();
+                       $buttonLabel = $this->context->msg( $this->getSubmitButtonLabel() )->text();
 
                        if ( $this->missingComment ) {
                                $out->wrapWikiMsg( "<div id='mw-missingcommenttext'>\n$1\n</div>", 'missingcommenttext' );
@@ -3794,7 +3794,7 @@ class EditPage {
         * @return string
         */
        public function getPreviewText() {
-               global $wgRawHtml, $wgLang;
+               global $wgRawHtml;
                global $wgAllowUserCss, $wgAllowUserJs;
 
                $out = $this->context->getOutput();
@@ -3830,7 +3830,8 @@ class EditPage {
 
                        # provide a anchor link to the editform
                        $continueEditing = '<span class="mw-continue-editing">' .
-                               '[[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' .
+                               '[[#' . self::EDITFORM_ID . '|' .
+                               $this->context->getLanguage()->getArrow() . ' ' .
                                $this->context->msg( 'continue-editing' )->text() . ']]</span>';
                        if ( $this->mTriedSave && !$this->mTokenOk ) {
                                if ( $this->mTokenOkExceptSuffix ) {
@@ -4333,9 +4334,9 @@ class EditPage {
         *
         * @return string
         */
-       private function getSaveButtonLabel() {
+       protected function getSubmitButtonLabel() {
                $labelAsPublish =
-                       $this->mArticle->getContext()->getConfig()->get( 'EditSubmitButtonLabelPublish' );
+                       $this->context->getConfig()->get( 'EditSubmitButtonLabelPublish' );
 
                // Can't use $this->isNew as that's also true if we're adding a new section to an extant page
                $newPage = !$this->mTitle->exists();
@@ -4360,7 +4361,7 @@ class EditPage {
        public function getEditButtons( &$tabindex ) {
                $buttons = [];
 
-               $buttonLabel = $this->context->msg( $this->getSaveButtonLabel() )->text();
+               $buttonLabel = $this->context->msg( $this->getSubmitButtonLabel() )->text();
 
                $attribs = [
                        'name' => 'wpSave',
@@ -4448,11 +4449,10 @@ class EditPage {
         * @param string|array|bool $match Text (or array of texts) which triggered one or more filters
         */
        public function spamPageWithContent( $match = false ) {
-               global $wgLang;
                $this->textbox2 = $this->textbox1;
 
                if ( is_array( $match ) ) {
-                       $match = $wgLang->listToText( $match );
+                       $match = $this->context->getLanguage()->listToText( $match );
                }
                $out = $this->context->getOutput();
                $out->prepareErrorPage( $this->context->msg( 'spamprotectiontitle' ) );
@@ -4640,19 +4640,20 @@ class EditPage {
         * @since 1.29
         */
        protected function addLongPageWarningHeader() {
-               global $wgMaxArticleSize, $wgLang;
+               global $wgMaxArticleSize;
 
                if ( $this->contentLength === false ) {
                        $this->contentLength = strlen( $this->textbox1 );
                }
 
                $out = $this->context->getOutput();
+               $lang = $this->context->getLanguage();
                if ( $this->tooBig || $this->contentLength > $wgMaxArticleSize * 1024 ) {
                        $out->wrapWikiMsg( "<div class='error' id='mw-edit-longpageerror'>\n$1\n</div>",
                                [
                                        'longpageerror',
-                                       $wgLang->formatNum( round( $this->contentLength / 1024, 3 ) ),
-                                       $wgLang->formatNum( $wgMaxArticleSize )
+                                       $lang->formatNum( round( $this->contentLength / 1024, 3 ) ),
+                                       $lang->formatNum( $wgMaxArticleSize )
                                ]
                        );
                } else {
@@ -4660,7 +4661,7 @@ class EditPage {
                                $out->wrapWikiMsg( "<div id='mw-edit-longpage-hint'>\n$1\n</div>",
                                        [
                                                'longpage-hint',
-                                               $wgLang->formatSize( strlen( $this->textbox1 ) ),
+                                               $lang->formatSize( strlen( $this->textbox1 ) ),
                                                strlen( $this->textbox1 )
                                        ]
                                );
@@ -4717,7 +4718,7 @@ class EditPage {
        protected function addExplainConflictHeader( OutputPage $out ) {
                $out->wrapWikiMsg(
                        "<div class='mw-explainconflict'>\n$1\n</div>",
-                       [ 'explainconflict', $this->context->msg( $this->getSaveButtonLabel() )->text() ]
+                       [ 'explainconflict', $this->context->msg( $this->getSubmitButtonLabel() )->text() ]
                );
        }
 
diff --git a/includes/Licenses.php b/includes/Licenses.php
deleted file mode 100644 (file)
index 6467777..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-<?php
-/**
- * License selector for use on Special:Upload.
- *
- * 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 SpecialPage
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- */
-
-/**
- * A License class for use on Special:Upload
- */
-class Licenses extends HTMLFormField {
-       /** @var string */
-       protected $msg;
-
-       /** @var array */
-       protected $licenses = [];
-
-       /** @var string */
-       protected $html;
-       /**#@-*/
-
-       /**
-        * @param array $params
-        */
-       public function __construct( $params ) {
-               parent::__construct( $params );
-
-               $this->msg = empty( $params['licenses'] )
-                       ? wfMessage( 'licenses' )->inContentLanguage()->plain()
-                       : $params['licenses'];
-               $this->selected = null;
-
-               $this->makeLicenses();
-       }
-
-       /**
-        * @private
-        */
-       protected function makeLicenses() {
-               $levels = [];
-               $lines = explode( "\n", $this->msg );
-
-               foreach ( $lines as $line ) {
-                       if ( strpos( $line, '*' ) !== 0 ) {
-                               continue;
-                       } else {
-                               list( $level, $line ) = $this->trimStars( $line );
-
-                               if ( strpos( $line, '|' ) !== false ) {
-                                       $obj = new License( $line );
-                                       $this->stackItem( $this->licenses, $levels, $obj );
-                               } else {
-                                       if ( $level < count( $levels ) ) {
-                                               $levels = array_slice( $levels, 0, $level );
-                                       }
-                                       if ( $level == count( $levels ) ) {
-                                               $levels[$level - 1] = $line;
-                                       } elseif ( $level > count( $levels ) ) {
-                                               $levels[] = $line;
-                                       }
-                               }
-                       }
-               }
-       }
-
-       /**
-        * @param string $str
-        * @return array
-        */
-       protected function trimStars( $str ) {
-               $numStars = strspn( $str, '*' );
-               return [ $numStars, ltrim( substr( $str, $numStars ), ' ' ) ];
-       }
-
-       /**
-        * @param array &$list
-        * @param array $path
-        * @param mixed $item
-        */
-       protected function stackItem( &$list, $path, $item ) {
-               $position =& $list;
-               if ( $path ) {
-                       foreach ( $path as $key ) {
-                               $position =& $position[$key];
-                       }
-               }
-               $position[] = $item;
-       }
-
-       /**
-        * @param array $tagset
-        * @param int $depth
-        */
-       protected function makeHtml( $tagset, $depth = 0 ) {
-               foreach ( $tagset as $key => $val ) {
-                       if ( is_array( $val ) ) {
-                               $this->html .= $this->outputOption(
-                                       $key, '',
-                                       [
-                                               'disabled' => 'disabled',
-                                               'style' => 'color: GrayText', // for MSIE
-                                       ],
-                                       $depth
-                               );
-                               $this->makeHtml( $val, $depth + 1 );
-                       } else {
-                               $this->html .= $this->outputOption(
-                                       $val->text, $val->template,
-                                       [ 'title' => '{{' . $val->template . '}}' ],
-                                       $depth
-                               );
-                       }
-               }
-       }
-
-       /**
-        * @param string $message
-        * @param string $value
-        * @param null|array $attribs
-        * @param int $depth
-        * @return string
-        */
-       protected function outputOption( $message, $value, $attribs = null, $depth = 0 ) {
-               $msgObj = $this->msg( $message );
-               $text = $msgObj->exists() ? $msgObj->text() : $message;
-               $attribs['value'] = $value;
-               if ( $value === $this->selected ) {
-                       $attribs['selected'] = 'selected';
-               }
-
-               $val = str_repeat( /* &nbsp */ "\xc2\xa0", $depth * 2 ) . $text;
-               return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n";
-       }
-
-       /**#@-*/
-
-       /**
-        *  Accessor for $this->licenses
-        *
-        * @return array
-        */
-       public function getLicenses() {
-               return $this->licenses;
-       }
-
-       /**
-        * Accessor for $this->html
-        *
-        * @param bool $value
-        *
-        * @return string
-        */
-       public function getInputHTML( $value ) {
-               $this->selected = $value;
-
-               $this->html = $this->outputOption( wfMessage( 'nolicense' )->text(), '',
-                       (bool)$this->selected ? null : [ 'selected' => 'selected' ] );
-               $this->makeHtml( $this->getLicenses() );
-
-               $attribs = [
-                       'name' => $this->mName,
-                       'id' => $this->mID
-               ];
-               if ( !empty( $this->mParams['disabled'] ) ) {
-                       $attibs['disabled'] = 'disabled';
-               }
-
-               return Html::rawElement( 'select', $attribs, $this->html );
-       }
-}
-
-/**
- * A License class for use on Special:Upload (represents a single type of license).
- */
-class License {
-       /** @var string */
-       public $template;
-
-       /** @var string */
-       public $text;
-
-       /**
-        * @param string $str License name??
-        */
-       function __construct( $str ) {
-               list( $text, $template ) = explode( '|', strrev( $str ), 2 );
-
-               $this->template = strrev( $template );
-               $this->text = strrev( $text );
-       }
-}
index dccd99c..403b10a 100644 (file)
@@ -76,7 +76,7 @@ class Linker {
         * @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
         * @deprecated since 1.28, use MediaWiki\Linker\LinkRenderer instead
         *
-        * @param Title $target Can currently only be a Title, but this may
+        * @param LinkTarget $target Can currently only be a LinkTarget, but this may
         *   change to support Images, literal URLs, etc.
         * @param string $html The HTML contents of the <a> element, i.e.,
         *   the link text.  This is raw HTML and will not be escaped.  If null,
@@ -107,8 +107,8 @@ class Linker {
        public static function link(
                $target, $html = null, $customAttribs = [], $query = [], $options = []
        ) {
-               if ( !$target instanceof Title ) {
-                       wfWarn( __METHOD__ . ': Requires $target to be a Title object.', 2 );
+               if ( !$target instanceof LinkTarget ) {
+                       wfWarn( __METHOD__ . ': Requires $target to be a LinkTarget object.', 2 );
                        return "<!-- ERROR -->$html";
                }
 
@@ -1175,7 +1175,7 @@ class Linker {
                                                        $sectionTitle = Title::newFromText( '#' . $section );
                                                } else {
                                                        $sectionTitle = Title::makeTitleSafe( $title->getNamespace(),
-                                                               $title->getDBkey(), $section );
+                                                               $title->getDBkey(), Sanitizer::decodeCharReferences( $section ) );
                                                }
                                                if ( $sectionTitle ) {
                                                        $link = Linker::makeCommentLink( $sectionTitle, $wgLang->getArrow(), $wikiId, 'noclasses' );
@@ -1291,9 +1291,7 @@ class Linker {
                                                        if ( $target->getText() == '' && !$target->isExternal()
                                                                && !$local && $title
                                                        ) {
-                                                               $newTarget = clone $title;
-                                                               $newTarget->setFragment( '#' . $target->getFragment() );
-                                                               $target = $newTarget;
+                                                               $target = $title->createFragmentTarget( $target->getFragment() );
                                                        }
 
                                                        $thelink = Linker::makeCommentLink( $target, $linkText . $inside, $wikiId ) . $trail;
@@ -1321,7 +1319,7 @@ class Linker {
         *
         * @note This is only public for technical reasons. It's not intended for use outside Linker.
         *
-        * @param Title $title
+        * @param LinkTarget $linkTarget
         * @param string $text
         * @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
         *  as used by WikiMap.
@@ -1330,23 +1328,23 @@ class Linker {
         * @return string HTML link
         */
        public static function makeCommentLink(
-               Title $title, $text, $wikiId = null, $options = []
+               LinkTarget $linkTarget, $text, $wikiId = null, $options = []
        ) {
-               if ( $wikiId !== null && !$title->isExternal() ) {
+               if ( $wikiId !== null && !$linkTarget->isExternal() ) {
                        $link = self::makeExternalLink(
                                WikiMap::getForeignURL(
                                        $wikiId,
-                                       $title->getNamespace() === 0
-                                               ? $title->getDBkey()
-                                               : MWNamespace::getCanonicalName( $title->getNamespace() ) . ':'
-                                                       . $title->getDBkey(),
-                                       $title->getFragment()
+                                       $linkTarget->getNamespace() === 0
+                                               ? $linkTarget->getDBkey()
+                                               : MWNamespace::getCanonicalName( $linkTarget->getNamespace() ) . ':'
+                                                       . $linkTarget->getDBkey(),
+                                       $linkTarget->getFragment()
                                ),
                                $text,
                                /* escape = */ false // Already escaped
                        );
                } else {
-                       $link = self::link( $title, $text, [], [], $options );
+                       $link = self::link( $linkTarget, $text, [], [], $options );
                }
 
                return $link;
index c29c4b9..0bb1d28 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Form to edit user preferences.
- *
  * 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
@@ -1635,123 +1633,3 @@ class Preferences {
                return $timeZoneList;
        }
 }
-
-/** Some tweaks to allow js prefs to work */
-class PreferencesForm extends HTMLForm {
-       // Override default value from HTMLForm
-       protected $mSubSectionBeforeFields = false;
-
-       private $modifiedUser;
-
-       /**
-        * @param User $user
-        */
-       public function setModifiedUser( $user ) {
-               $this->modifiedUser = $user;
-       }
-
-       /**
-        * @return User
-        */
-       public function getModifiedUser() {
-               if ( $this->modifiedUser === null ) {
-                       return $this->getUser();
-               } else {
-                       return $this->modifiedUser;
-               }
-       }
-
-       /**
-        * Get extra parameters for the query string when redirecting after
-        * successful save.
-        *
-        * @return array
-        */
-       public function getExtraSuccessRedirectParameters() {
-               return [];
-       }
-
-       /**
-        * @param string $html
-        * @return string
-        */
-       function wrapForm( $html ) {
-               $html = Xml::tags( 'div', [ 'id' => 'preferences' ], $html );
-
-               return parent::wrapForm( $html );
-       }
-
-       /**
-        * @return string
-        */
-       function getButtons() {
-               $attrs = [ 'id' => 'mw-prefs-restoreprefs' ];
-
-               if ( !$this->getModifiedUser()->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
-                       return '';
-               }
-
-               $html = parent::getButtons();
-
-               if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
-                       $t = $this->getTitle()->getSubpage( 'reset' );
-
-                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
-                       $html .= "\n" . $linkRenderer->makeLink( $t, $this->msg( 'restoreprefs' )->text(),
-                               Html::buttonAttributes( $attrs, [ 'mw-ui-quiet' ] ) );
-
-                       $html = Xml::tags( 'div', [ 'class' => 'mw-prefs-buttons' ], $html );
-               }
-
-               return $html;
-       }
-
-       /**
-        * Separate multi-option preferences into multiple preferences, since we
-        * have to store them separately
-        * @param array $data
-        * @return array
-        */
-       function filterDataForSubmit( $data ) {
-               foreach ( $this->mFlatFields as $fieldname => $field ) {
-                       if ( $field instanceof HTMLNestedFilterable ) {
-                               $info = $field->mParams;
-                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
-                               foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
-                                       $data["$prefix$key"] = $value;
-                               }
-                               unset( $data[$fieldname] );
-                       }
-               }
-
-               return $data;
-       }
-
-       /**
-        * Get the whole body of the form.
-        * @return string
-        */
-       function getBody() {
-               return $this->displaySection( $this->mFieldTree, '', 'mw-prefsection-' );
-       }
-
-       /**
-        * Get the "<legend>" for a given section key. Normally this is the
-        * prefs-$key message but we'll allow extensions to override it.
-        * @param string $key
-        * @return string
-        */
-       function getLegend( $key ) {
-               $legend = parent::getLegend( $key );
-               Hooks::run( 'PreferencesGetLegend', [ $this, $key, &$legend ] );
-               return $legend;
-       }
-
-       /**
-        * Get the keys of each top level preference section.
-        * @return array of section keys
-        */
-       function getPreferenceSections() {
-               return array_keys( array_filter( $this->mFieldTree, 'is_array' ) );
-       }
-}
index 7d17cd1..a7f963a 100644 (file)
@@ -1203,8 +1203,6 @@ class Sanitizer {
                global $wgExperimentalHtmlIds;
                $options = (array)$options;
 
-               $id = self::decodeCharReferences( $id );
-
                if ( $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
                        $id = preg_replace( '/[ \t\n\r\f_\'"&#%]+/', '_', $id );
                        $id = trim( $id, '_' );
@@ -1313,8 +1311,6 @@ class Sanitizer {
         * @return string
         */
        private static function escapeIdInternal( $id, $mode ) {
-               $id = self::decodeCharReferences( $id );
-
                switch ( $mode ) {
                        case 'html5':
                                $id = str_replace( ' ', '_', $id );
index 2759ff9..2293dab 100644 (file)
@@ -38,6 +38,13 @@ class TemplateParser {
         */
        protected $forceRecompile = false;
 
+       /**
+        * @var int Compilation flags passed to LightnCandy
+        */
+       // Do not add more flags here without discussion.
+       // If you do add more flags, be sure to update unit tests as well.
+       protected $compileFlags = LightnCandy::FLAG_ERROR_EXCEPTION;
+
        /**
         * @param string $templateDir
         * @param bool $forceRecompile
@@ -47,6 +54,18 @@ class TemplateParser {
                $this->forceRecompile = $forceRecompile;
        }
 
+       /**
+        * Enable/disable the use of recursive partials.
+        * @param bool $enable
+        */
+       public function enableRecursivePartials( $enable ) {
+               if ( $enable ) {
+                       $this->compileFlags = $this->compileFlags | LightnCandy::FLAG_RUNTIMEPARTIAL;
+               } else {
+                       $this->compileFlags = $this->compileFlags & ~LightnCandy::FLAG_RUNTIMEPARTIAL;
+               }
+       }
+
        /**
         * Constructs the location of the the source Mustache template
         * @param string $templateName The name of the template
@@ -73,11 +92,13 @@ class TemplateParser {
         * @throws RuntimeException
         */
        protected function getTemplate( $templateName ) {
+               $templateKey = $templateName . '|' . $this->compileFlags;
+
                // If a renderer has already been defined for this template, reuse it
-               if ( isset( $this->renderers[$templateName] ) &&
-                       is_callable( $this->renderers[$templateName] )
+               if ( isset( $this->renderers[$templateKey] ) &&
+                       is_callable( $this->renderers[$templateKey] )
                ) {
-                       return $this->renderers[$templateName];
+                       return $this->renderers[$templateKey];
                }
 
                $filename = $this->getTemplateFilename( $templateName );
@@ -90,7 +111,7 @@ class TemplateParser {
                $fileContents = file_get_contents( $filename );
 
                // Generate a quick hash for cache invalidation
-               $fastHash = md5( $fileContents );
+               $fastHash = md5( $this->compileFlags . '|' . $fileContents );
 
                // Fetch a secret key for building a keyed hash of the PHP code
                $config = MediaWikiServices::getInstance()->getMainConfig();
@@ -127,7 +148,7 @@ class TemplateParser {
                if ( !is_callable( $renderer ) ) {
                        throw new RuntimeException( "Requested template, {$templateName}, is not callable" );
                }
-               $this->renderers[$templateName] = $renderer;
+               $this->renderers[$templateKey] = $renderer;
                return $renderer;
        }
 
@@ -168,9 +189,7 @@ class TemplateParser {
                return LightnCandy::compile(
                        $code,
                        [
-                               // Do not add more flags here without discussion.
-                               // If you do add more flags, be sure to update unit tests as well.
-                               'flags' => LightnCandy::FLAG_ERROR_EXCEPTION,
+                               'flags' => $this->compileFlags,
                                'basedir' => $this->templateDir,
                                'fileext' => '.mustache',
                        ]
index 16a5a9d..0091513 100644 (file)
@@ -493,7 +493,8 @@ class Xml {
        }
 
        /**
-        * Build a drop-down box from a textual list.
+        * Build a drop-down box from a textual list. This is a wrapper
+        * for Xml::listDropDownOptions() plus the XmlSelect class.
         *
         * @param string $name Name and id for the drop-down
         * @param string $list Correctly formatted text (newline delimited) to be
@@ -507,60 +508,91 @@ class Xml {
        public static function listDropDown( $name = '', $list = '', $other = '',
                $selected = '', $class = '', $tabindex = null
        ) {
-               $optgroup = false;
+               $options = self::listDropDownOptions( $list, [ 'other' => $other ] );
+
+               $xmlSelect = new XmlSelect( $name, $name, $selected );
+               $xmlSelect->addOptions( $options );
+
+               if ( $class ) {
+                       $xmlSelect->setAttribute( 'class', $class );
+               }
+               if ( $tabindex ) {
+                       $xmlSelect->setAttribute( 'tabindex', $tabindex );
+               }
 
-               $options = self::option( $other, 'other', $selected === 'other' );
+               return $xmlSelect->getHTML();
+       }
 
+       /**
+        * Build options for a drop-down box from a textual list.
+        *
+        * The result of this function can be passed to XmlSelect::addOptions()
+        * (to render a plain `<select>` dropdown box) or to Xml::listDropDownOptionsOoui()
+        * and then OOUI\DropdownInputWidget() (to render a pretty one).
+        *
+        * @param string $list Correctly formatted text (newline delimited) to be
+        *   used to generate the options.
+        * @param array $params Extra parameters
+        * @param string $params['other'] If set, add an option with this as text and a value of 'other'
+        * @return array Array keys are textual labels, values are internal values
+        */
+       public static function listDropDownOptions( $list, $params = [] ) {
+               $options = [];
+
+               if ( isset( $params['other'] ) ) {
+                       $options[ $params['other'] ] = 'other';
+               }
+
+               $optgroup = false;
                foreach ( explode( "\n", $list ) as $option ) {
                        $value = trim( $option );
                        if ( $value == '' ) {
                                continue;
                        } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
-                               // A new group is starting ...
+                               # A new group is starting...
                                $value = trim( substr( $value, 1 ) );
-                               if ( $optgroup ) {
-                                       $options .= self::closeElement( 'optgroup' );
-                               }
-                               $options .= self::openElement( 'optgroup', [ 'label' => $value ] );
-                               $optgroup = true;
+                               $optgroup = $value;
                        } elseif ( substr( $value, 0, 2 ) == '**' ) {
-                               // groupmember
-                               $value = trim( substr( $value, 2 ) );
-                               $options .= self::option( $value, $value, $selected === $value );
-                       } else {
-                               // groupless reason list
-                               if ( $optgroup ) {
-                                       $options .= self::closeElement( 'optgroup' );
+                               # groupmember
+                               $opt = trim( substr( $value, 2 ) );
+                               if ( $optgroup === false ) {
+                                       $options[$opt] = $opt;
+                               } else {
+                                       $options[$optgroup][$opt] = $opt;
                                }
-                               $options .= self::option( $value, $value, $selected === $value );
+                       } else {
+                               # groupless reason list
                                $optgroup = false;
+                               $options[$option] = $option;
                        }
                }
 
-               if ( $optgroup ) {
-                       $options .= self::closeElement( 'optgroup' );
-               }
-
-               $attribs = [];
-
-               if ( $name ) {
-                       $attribs['id'] = $name;
-                       $attribs['name'] = $name;
-               }
+               return $options;
+       }
 
-               if ( $class ) {
-                       $attribs['class'] = $class;
-               }
+       /**
+        * Convert options for a drop-down box into a format accepted by OOUI\DropdownInputWidget etc.
+        *
+        * TODO Find a better home for this function.
+        *
+        * @param array $options Options, as returned e.g. by Xml::listDropDownOptions()
+        * @return array
+        */
+       public static function listDropDownOptionsOoui( $options ) {
+               $optionsOoui = [];
 
-               if ( $tabindex ) {
-                       $attribs['tabindex'] = $tabindex;
+               foreach ( $options as $text => $value ) {
+                       if ( is_array( $value ) ) {
+                               $optionsOoui[] = [ 'optgroup' => (string)$text ];
+                               foreach ( $value as $text2 => $value2 ) {
+                                       $optionsOoui[] = [ 'data' => (string)$value2, 'label' => (string)$text2 ];
+                               }
+                       } else {
+                               $optionsOoui[] = [ 'data' => (string)$value, 'label' => (string)$text ];
+                       }
                }
 
-               return self::openElement( 'select', $attribs )
-                       . "\n"
-                       . $options
-                       . "\n"
-                       . self::closeElement( 'select' );
+               return $optionsOoui;
        }
 
        /**
index e9a7f9b..75a50b7 100644 (file)
        "apihelp-parse-paramvalue-prop-sections": "Дає розділи в аналізованому вікітексті.",
        "apihelp-parse-paramvalue-prop-revid": "Додає ідентифікатор версії аналізованої сторінки.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Додає заголовок аналізованого вікітексту.",
-       "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Застаріло.</span> Дає елементи для вставки в <code>&lt;head&gt;</code> сторінки.",
+       "apihelp-parse-paramvalue-prop-headitems": "Дає елементи для вставки в <code>&lt;head&gt;</code> сторінки.",
        "apihelp-parse-paramvalue-prop-headhtml": "Дає проаналізований <code>&lt;head&gt;</code> сторінки.",
        "apihelp-parse-paramvalue-prop-modules": "Дає модулі ResourceLoader, використані на сторінці. Щоб завантажити, використовуйте <code>mw.loader.using()</code>. Чи <kbd>jsconfigvars</kbd>, чи <kbd>encodedjsconfigvars</kbd> має бути запитано разом з <kbd>modules</kbd>.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Дає змінні конфігурації JavaScript, притаманні для сторінки. Щоб застосувати, використайте <code>mw.config.set()</code>.",
        "apihelp-query+search-paramvalue-prop-sectiontitle": "Додає заголовок відповідного розділу.",
        "apihelp-query+search-paramvalue-prop-categorysnippet": "Додає проаналізований уривок відповідної категорії.",
        "apihelp-query+search-paramvalue-prop-isfilematch": "Додає перемикач, який показує, є пошук знайшов вміст файлу.",
-       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Застаріло й інгорується.</span>",
-       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Застаріло й інгорується.</span>",
+       "apihelp-query+search-paramvalue-prop-score": "Інгорується.",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "Ігнорується.",
        "apihelp-query+search-param-limit": "Скільки всього сторінок виводити.",
        "apihelp-query+search-param-interwiki": "Включати інтервікі в результатах пошуку, якщо доступно.",
        "apihelp-query+search-param-backend": "Який бекенд пошуку використовувати, якщо не за замовчуванням.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Перелічує усі права, які має поточний користувач.",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Перелічує групи, у які користувач може додавати і з яких вилучати.",
        "apihelp-query+userinfo-paramvalue-prop-options": "Перелічує усі налаштування, які поточний користувач встановив.",
-       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Застаріле.</span> Отримати знак для зміни налаштувань поточного користувача.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Отримати токен для зміни налаштувань поточного користувача.",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "Додає кількість редагувань поточного користувача.",
        "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Перелічує усі ліміти оцінок, застосовні до поточного користувача.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "Додає справжнє ім'я користувача.",
        "api-format-prettyprint-header-only-html": "Це HTML-представлення призначене для налагодження, однак не придатне для прикладного використання.\n\nДив. [[mw:Special:MyLanguage/API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
        "api-format-prettyprint-header-hyperlinked": "Це — HTML-репрезентація формату $1. HTML добрий для виправлення помилок, але непридатний для використання додатків.\n\nВкажіть параметр <var>format</var>, щоб змінити формат виводу. Щоб побачити репрезентацію формату $1 не у формі HTML, вкажіть [$3 <kbd>format=$2</kbd>].\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку API]], щоб дізнатися більше.",
        "api-format-prettyprint-status": "Відповідь повернеться із HTTP-статусом $1 $2.",
+       "api-login-fail-aborted": "Автентифікація вимагає взаємодії з користувачем, яка не підтримується <kbd>action=login</kbd>. Щоб мати змогу увійти в систему за допомогою <kbd>action=login</kbd>, див. [[Special:BotPasswords]]. Щоб продовжити використовувати вхід у систему через основний обліковий запис, див.<kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-aborted-nobotpw": "Автентифікація вимагає взаємодії з користувачем, яка не підтримується <kbd>action=login</kbd>. Щоб увійти в систему, див. <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-badsessionprovider": "Неможливо увійти в систему при використанні $1.",
+       "api-login-fail-sameorigin": "Неможливо увійти в систему, коли не застосовується ''політика того ж походження''.",
        "api-pageset-param-titles": "Список назв над якими працювати.",
        "api-pageset-param-pageids": "Список ідентифікаторів сторінок над якими працювати.",
        "api-pageset-param-revids": "Список ідентифікаторів версій над якими працювати.",
        "api-help-title": "Довідка API MediaWiki",
        "api-help-lead": "Це автоматично генерована сторінка документації API MediaWiki.\n\nДокументація та приклади: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Головний модуль",
+       "api-help-undocumented-module": "Для модуля $1 відсутня документація.",
        "api-help-flag-deprecated": "Цей модуль є застарілим.",
        "api-help-flag-internal": "<strong>Цей модуль є внутрішнім або нестабільним.</strong> Його робота може бути змінена без сповіщення.",
        "api-help-flag-readrights": "Цей модуль вимагає прав на читання.",
        "api-help-param-upload": "Повинно бути надіслано у формі надсилання файлу використовуючи multipart/form-data.",
        "api-help-param-multi-separate": "Розділіть значення з допомогою <kbd>|</kbd> або [[Special:ApiHelp/main#main/datatypes|альтернативу]].",
        "api-help-param-multi-max": "Максимальна кількість значень — {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} для ботів).",
+       "api-help-param-multi-max-simple": "Максимальна кількість значень становить {{PLURAL:$1|$1}}.",
        "api-help-param-multi-all": "Щоб зазначити всі значення, використовуйте <kbd>$1</kbd>.",
        "api-help-param-default": "За замовчуванням: $1",
        "api-help-param-default-empty": "За замовчуванням: <span class=\"apihelp-empty\">(пусто)</span>",
        "apierror-changeauth-norequest": "Не вдалося створити запит на зміну.",
        "apierror-chunk-too-small": "Мінімальний розмір шматка становить $1 {{PLURAL:$1|байт|байти|байтів}} для некінцевих шматків.",
        "apierror-cidrtoobroad": "$1 CIDR-діапазони, ширші ніж /$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": "Наданий Вами вміст перевищує ліміт у $1 {{PLURAL:$1|кілобайт|кілобайти|кілобайтів}} розміру сторінки.",
        "apierror-copyuploadbaddomain": "Завантаження за URL-адресою недозволені з цього домену.",
        "apierror-maxlag": "Очікування на $2: затримка $1 {{PLURAL:$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. Використовується лише ширина і висота.",
        "apiwarn-badutf8": "Значення, вказане для <var>$1</var>, містить недійсні або ненормалізовані дані. Текстові дані мають бути дійсними, NFC-нормалізований Unicode без контрольних символів 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 8e24efe..0df6828 100644 (file)
@@ -383,7 +383,7 @@ class EnhancedChangesList extends ChangesList {
                ) {
                        $classes[] = 'mw-enhanced-watched';
                }
-               $classes = array_merge( $classes, $this->getHTMLClassesForFilters( $rcObj ) );
+               $classes = array_merge( $classes, $this->getHTMLClasses( $rcObj, $rcObj->watched ) );
 
                $separator = ' <span class="mw-changeslist-separator">. .</span> ';
 
index 34f2852..ed8cbb4 100644 (file)
@@ -181,7 +181,8 @@ class DifferenceEngine extends ContextSource {
        public function deletedLink( $id ) {
                if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
                        $dbr = wfGetDB( DB_REPLICA );
-                       $row = $dbr->selectRow( 'archive', '*',
+                       $row = $dbr->selectRow( 'archive',
+                               Revision::selectArchiveFields(),
                                [ 'ar_rev_id' => $id ],
                                __METHOD__ );
                        if ( $row ) {
index 8aea7ab..96e7a7e 100644 (file)
@@ -1129,11 +1129,9 @@ class LocalFile extends File {
 
                if ( $this->historyLine == 0 ) { // called for the first time, return line from cur
                        $this->historyRes = $dbr->select( 'image',
-                               [
-                                       '*',
-                                       "'' AS oi_archive_name",
-                                       '0 as oi_deleted',
-                                       'img_sha1'
+                               self::selectFields() + [
+                                       'oi_archive_name' => $dbr->addQuotes( '' ),
+                                       'oi_deleted' => 0,
                                ],
                                [ 'img_name' => $this->title->getDBkey() ],
                                $fname
@@ -1145,7 +1143,9 @@ class LocalFile extends File {
                                return false;
                        }
                } elseif ( $this->historyLine == 1 ) {
-                       $this->historyRes = $dbr->select( 'oldimage', '*',
+                       $this->historyRes = $dbr->select(
+                               'oldimage',
+                               OldLocalFile::selectFields(),
                                [ 'oi_name' => $this->title->getDBkey() ],
                                $fname,
                                [ 'ORDER BY' => 'oi_timestamp DESC' ]
index dfd18ba..e642c2c 100644 (file)
@@ -1076,33 +1076,8 @@ abstract class HTMLFormField {
                                $this->mOptionsLabelsNotFromMessage = true;
                                $this->mOptions = self::forceToStringRecursive( $this->mParams['options'] );
                        } elseif ( array_key_exists( 'options-message', $this->mParams ) ) {
-                               /** @todo This is copied from Xml::listDropDown(), deprecate/avoid duplication? */
                                $message = $this->getMessage( $this->mParams['options-message'] )->inContentLanguage()->plain();
-
-                               $optgroup = false;
-                               $this->mOptions = [];
-                               foreach ( explode( "\n", $message ) as $option ) {
-                                       $value = trim( $option );
-                                       if ( $value == '' ) {
-                                               continue;
-                                       } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
-                                               # A new group is starting...
-                                               $value = trim( substr( $value, 1 ) );
-                                               $optgroup = $value;
-                                       } elseif ( substr( $value, 0, 2 ) == '**' ) {
-                                               # groupmember
-                                               $opt = trim( substr( $value, 2 ) );
-                                               if ( $optgroup === false ) {
-                                                       $this->mOptions[$opt] = $opt;
-                                               } else {
-                                                       $this->mOptions[$optgroup][$opt] = $opt;
-                                               }
-                                       } else {
-                                               # groupless reason list
-                                               $optgroup = false;
-                                               $this->mOptions[$option] = $option;
-                                       }
-                               }
+                               $this->mOptions = Xml::listDropDownOptions( $message );
                        } else {
                                $this->mOptions = null;
                        }
@@ -1122,16 +1097,7 @@ abstract class HTMLFormField {
                        return null;
                }
 
-               $options = [];
-
-               foreach ( $oldoptions as $text => $data ) {
-                       $options[] = [
-                               'data' => (string)$data,
-                               'label' => (string)$text,
-                       ];
-               }
-
-               return $options;
+               return Xml::listDropDownOptionsOoui( $oldoptions );
        }
 
        /**
index e5a5c94..07aeb13 100644 (file)
@@ -783,7 +783,8 @@ END;
                $info = $this->db->fieldInfo( $table, $field );
                if ( $info->defaultValue() !== $default ) {
                        $this->output( "Changing '$table.$field' default value\n" );
-                       $this->db->query( "ALTER TABLE $table ALTER $field SET DEFAULT " . $default );
+                       $this->db->query( "ALTER TABLE $table ALTER $field SET DEFAULT "
+                               . $this->db->addQuotes( $default ) );
                }
        }
 
index 5b03a22..b91bd9a 100644 (file)
@@ -1695,24 +1695,11 @@ class Article implements Page {
 
                $outputPage->enableOOUI();
 
-               $options = [];
-               $options[] = [
-                       'data' => 'other',
-                       'label' => $ctx->msg( 'deletereasonotherlist' )->inContentLanguage()->text(),
-               ];
-               $list = $ctx->msg( 'deletereason-dropdown' )->inContentLanguage()->text();
-               foreach ( explode( "\n", $list ) as $option ) {
-                       $value = trim( $option );
-                       if ( $value == '' ) {
-                               continue;
-                       } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
-                               $options[] = [ 'optgroup' => trim( substr( $value, 1 ) ) ];
-                       } elseif ( substr( $value, 0, 2 ) == '**' ) {
-                               $options[] = [ 'data' => trim( substr( $value, 2 ) ) ];
-                       } else {
-                               $options[] = [ 'data' => trim( $value ) ];
-                       }
-               }
+               $options = Xml::listDropDownOptions(
+                       $ctx->msg( 'deletereason-dropdown' )->inContentLanguage()->text(),
+                       [ 'other' => $ctx->msg( 'deletereasonotherlist' )->inContentLanguage()->text() ]
+               );
+               $options = Xml::listDropDownOptionsOoui( $options );
 
                $fields[] = new OOUI\FieldLayout(
                        new OOUI\DropdownInputWidget( [
index 4785ef1..20bc614 100644 (file)
@@ -55,8 +55,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        public function __construct( $imagePage ) {
                parent::__construct( $imagePage->getContext() );
                $this->mImagePage = $imagePage;
-               $this->mTitle = clone $imagePage->getTitle();
-               $this->mTitle->setFragment( '#filehistory' );
+               $this->mTitle = $imagePage->getTitle()->createFragmentTarget( 'filehistory' );
                $this->mImg = null;
                $this->mHist = [];
                $this->mRange = [ 0, 0 ]; // display range
index 6fc36f6..bbf22ba 100644 (file)
@@ -1921,10 +1921,10 @@ class WikiPage implements Page, IDBAccessObject {
                                        $wikiPage = $this;
                                        // Trigger post-create hook
                                        $params = [ &$wikiPage, &$user, $content, $summary,
-                                               $flags & EDIT_MINOR, null, null, &$flags, $revision ];
+                                                               $flags & EDIT_MINOR, null, null, &$flags, $revision ];
                                        Hooks::run( 'PageContentInsertComplete', $params );
                                        // Trigger post-save hook
-                                       $params = array_merge( $params, [ &$status, $meta['baseRevId'] ] );
+                                       $params = array_merge( $params, [ &$status, $meta['baseRevId'], 0 ] );
                                        Hooks::run( 'PageContentSaveComplete', $params );
                                }
                        ),
index ff4936d..e901f6f 100644 (file)
@@ -4204,6 +4204,8 @@ class Parser {
                        # Save headline for section edit hint before it's escaped
                        $headlineHint = $safeHeadline;
 
+                       # Decode HTML entities
+                       $safeHeadline = Sanitizer::decodeCharReferences( $safeHeadline );
                        $fallbackHeadline = Sanitizer::escapeIdForAttribute( $safeHeadline, Sanitizer::ID_FALLBACK );
                        $linkAnchor = Sanitizer::escapeIdForLink( $safeHeadline );
                        $safeHeadline = Sanitizer::escapeIdForAttribute( $safeHeadline, Sanitizer::ID_PRIMARY );
@@ -5764,6 +5766,7 @@ class Parser {
                # Strip out wikitext links(they break the anchor)
                $text = $this->stripSectionName( $text );
                $text = Sanitizer::normalizeSectionNameWhitespace( $text );
+               $text = Sanitizer::decodeCharReferences( $text );
                return '#' . Sanitizer::escapeIdForLink( $text );
        }
 
@@ -5782,6 +5785,7 @@ class Parser {
                # Strip out wikitext links(they break the anchor)
                $text = $this->stripSectionName( $text );
                $text = Sanitizer::normalizeSectionNameWhitespace( $text );
+               $text = Sanitizer::decodeCharReferences( $text );
 
                if ( isset( $wgFragmentMode[1] ) && $wgFragmentMode[1] === 'legacy' ) {
                        // ForAttribute() and ForLink() are the same for legacy encoding
index 06319e5..3480a51 100644 (file)
@@ -259,7 +259,7 @@ class ParserOutput extends CacheTime {
                                        global $wgOut, $wgLang;
                                        $editsectionPage = Title::newFromText( htmlspecialchars_decode( $m[1] ) );
                                        $editsectionSection = htmlspecialchars_decode( $m[2] );
-                                       $editsectionContent = isset( $m[4] ) ? $m[3] : null;
+                                       $editsectionContent = isset( $m[4] ) ? Sanitizer::decodeCharReferences( $m[3] ) : null;
 
                                        if ( !is_object( $editsectionPage ) ) {
                                                throw new MWException( "Bad parser output text." );
index df7a9ed..54bba30 100644 (file)
@@ -1578,8 +1578,6 @@ abstract class Skin extends ContextSource {
 
                $attribs = [];
                if ( !is_null( $tooltip ) ) {
-                       # T27462: undo double-escaping.
-                       $tooltip = Sanitizer::decodeCharReferences( $tooltip );
                        $attribs['title'] = wfMessage( 'editsectionhint' )->rawParams( $tooltip )
                                ->inLanguage( $lang )->text();
                }
@@ -1611,7 +1609,7 @@ abstract class Skin extends ContextSource {
 
                $result .= implode(
                        '<span class="mw-editsection-divider">'
-                               . wfMessage( 'pipe-separator' )->inLanguage( $lang )->text()
+                               . wfMessage( 'pipe-separator' )->inLanguage( $lang )->escaped()
                                . '</span>',
                        $linksHtml
                );
index e1ecfe8..d2940e4 100644 (file)
@@ -770,38 +770,3 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                );
        }
 }
-
-/**
- * Extend HTMLForm purely so we can have a more sane way of getting the section headers
- */
-class EditWatchlistNormalHTMLForm extends HTMLForm {
-       public function getLegend( $namespace ) {
-               $namespace = substr( $namespace, 2 );
-
-               return $namespace == NS_MAIN
-                       ? $this->msg( 'blanknamespace' )->escaped()
-                       : htmlspecialchars( $this->getContext()->getLanguage()->getFormattedNsText( $namespace ) );
-       }
-
-       public function getBody() {
-               return $this->displaySection( $this->mFieldTree, '', 'editwatchlist-' );
-       }
-}
-
-class EditWatchlistCheckboxSeriesField extends HTMLMultiSelectField {
-       /**
-        * HTMLMultiSelectField throws validation errors if we get input data
-        * that doesn't match the data set in the form setup. This causes
-        * problems if something gets removed from the watchlist while the
-        * form is open (T34126), but we know that invalid items will
-        * be harmless so we can override it here.
-        *
-        * @param string $value The value the field was submitted with
-        * @param array $alldata The data collected from the form
-        * @return bool|string Bool true on success, or String error to display.
-        */
-       function validate( $value, $alldata ) {
-               // Need to call into grandparent to be a good citizen. :)
-               return HTMLFormField::validate( $value, $alldata );
-       }
-}
index beb454d..9ce52ef 100644 (file)
@@ -24,8 +24,6 @@
  * @ingroup SpecialPage
  */
 
-use MediaWiki\MediaWikiServices;
-
 /**
  * MediaWiki page data importer
  *
@@ -524,172 +522,3 @@ class SpecialImport extends SpecialPage {
                return 'pagetools';
        }
 }
-
-/**
- * Reporting callback
- * @ingroup SpecialPage
- */
-class ImportReporter extends ContextSource {
-       private $reason = false;
-       private $logTags = [];
-       private $mOriginalLogCallback = null;
-       private $mOriginalPageOutCallback = null;
-       private $mLogItemCount = 0;
-
-       /**
-        * @param WikiImporter $importer
-        * @param bool $upload
-        * @param string $interwiki
-        * @param string|bool $reason
-        */
-       function __construct( $importer, $upload, $interwiki, $reason = false ) {
-               $this->mOriginalPageOutCallback =
-                       $importer->setPageOutCallback( [ $this, 'reportPage' ] );
-               $this->mOriginalLogCallback =
-                       $importer->setLogItemCallback( [ $this, 'reportLogItem' ] );
-               $importer->setNoticeCallback( [ $this, 'reportNotice' ] );
-               $this->mPageCount = 0;
-               $this->mIsUpload = $upload;
-               $this->mInterwiki = $interwiki;
-               $this->reason = $reason;
-       }
-
-       /**
-        * Sets change tags to apply to the import log entry and null revision.
-        *
-        * @param array $tags
-        * @since 1.29
-        */
-       public function setChangeTags( array $tags ) {
-               $this->logTags = $tags;
-       }
-
-       function open() {
-               $this->getOutput()->addHTML( "<ul>\n" );
-       }
-
-       function reportNotice( $msg, array $params ) {
-               $this->getOutput()->addHTML(
-                       Html::element( 'li', [], $this->msg( $msg, $params )->text() )
-               );
-       }
-
-       function reportLogItem( /* ... */ ) {
-               $this->mLogItemCount++;
-               if ( is_callable( $this->mOriginalLogCallback ) ) {
-                       call_user_func_array( $this->mOriginalLogCallback, func_get_args() );
-               }
-       }
-
-       /**
-        * @param Title $title
-        * @param ForeignTitle $foreignTitle
-        * @param int $revisionCount
-        * @param int $successCount
-        * @param array $pageInfo
-        * @return void
-        */
-       public function reportPage( $title, $foreignTitle, $revisionCount,
-                       $successCount, $pageInfo ) {
-               $args = func_get_args();
-               call_user_func_array( $this->mOriginalPageOutCallback, $args );
-
-               if ( $title === null ) {
-                       # Invalid or non-importable title; a notice is already displayed
-                       return;
-               }
-
-               $this->mPageCount++;
-               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
-               if ( $successCount > 0 ) {
-                       // <bdi> prevents jumbling of the versions count
-                       // in RTL wikis in case the page title is LTR
-                       $this->getOutput()->addHTML(
-                               "<li>" . $linkRenderer->makeLink( $title ) . " " .
-                                       "<bdi>" .
-                                       $this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
-                                       "</bdi>" .
-                                       "</li>\n"
-                       );
-
-                       $logParams = [ '4:number:count' => $successCount ];
-                       if ( $this->mIsUpload ) {
-                               $detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
-                                       $successCount )->inContentLanguage()->text();
-                               $action = 'upload';
-                       } else {
-                               $pageTitle = $foreignTitle->getFullText();
-                               $fullInterwikiPrefix = $this->mInterwiki;
-                               Hooks::run( 'ImportLogInterwikiLink', [ &$fullInterwikiPrefix, &$pageTitle ] );
-
-                               $interwikiTitleStr = $fullInterwikiPrefix . ':' . $pageTitle;
-                               $interwiki = '[[:' . $interwikiTitleStr . ']]';
-                               $detail = $this->msg( 'import-logentry-interwiki-detail' )->numParams(
-                                       $successCount )->params( $interwiki )->inContentLanguage()->text();
-                               $action = 'interwiki';
-                               $logParams['5:title-link:interwiki'] = $interwikiTitleStr;
-                       }
-                       if ( $this->reason ) {
-                               $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
-                                       . $this->reason;
-                       }
-
-                       $comment = $detail; // quick
-                       $dbw = wfGetDB( DB_MASTER );
-                       $latest = $title->getLatestRevID();
-                       $nullRevision = Revision::newNullRevision(
-                               $dbw,
-                               $title->getArticleID(),
-                               $comment,
-                               true,
-                               $this->getUser()
-                       );
-
-                       $nullRevId = null;
-                       if ( !is_null( $nullRevision ) ) {
-                               $nullRevId = $nullRevision->insertOn( $dbw );
-                               $page = WikiPage::factory( $title );
-                               # Update page record
-                               $page->updateRevisionOn( $dbw, $nullRevision );
-                               Hooks::run(
-                                       'NewRevisionFromEditComplete',
-                                       [ $page, $nullRevision, $latest, $this->getUser() ]
-                               );
-                       }
-
-                       // Create the import log entry
-                       $logEntry = new ManualLogEntry( 'import', $action );
-                       $logEntry->setTarget( $title );
-                       $logEntry->setComment( $this->reason );
-                       $logEntry->setPerformer( $this->getUser() );
-                       $logEntry->setParameters( $logParams );
-                       $logid = $logEntry->insert();
-                       if ( count( $this->logTags ) ) {
-                               $logEntry->setTags( $this->logTags );
-                       }
-                       // Make sure the null revision will be tagged as well
-                       $logEntry->setAssociatedRevId( $nullRevId );
-
-                       $logEntry->publish( $logid );
-
-               } else {
-                       $this->getOutput()->addHTML( "<li>" . $linkRenderer->makeKnownLink( $title ) . " " .
-                               $this->msg( 'import-nonewrevisions' )->escaped() . "</li>\n" );
-               }
-       }
-
-       function close() {
-               $out = $this->getOutput();
-               if ( $this->mLogItemCount > 0 ) {
-                       $msg = $this->msg( 'imported-log-entries' )->numParams( $this->mLogItemCount )->parse();
-                       $out->addHTML( Xml::tags( 'li', null, $msg ) );
-               } elseif ( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
-                       $out->addHTML( "</ul>\n" );
-
-                       return Status::newFatal( 'importnopages' );
-               }
-               $out->addHTML( "</ul>\n" );
-
-               return Status::newGood( $this->mPageCount );
-       }
-}
index b98fad1..59f9796 100644 (file)
@@ -22,7 +22,6 @@
  * @ingroup Upload
  */
 
-use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
 
 /**
@@ -846,476 +845,3 @@ class SpecialUpload extends SpecialPage {
                return $bitmapHandler->autoRotateEnabled();
        }
 }
-
-/**
- * Sub class of HTMLForm that provides the form section of SpecialUpload
- */
-class UploadForm extends HTMLForm {
-       protected $mWatch;
-       protected $mForReUpload;
-       protected $mSessionKey;
-       protected $mHideIgnoreWarning;
-       protected $mDestWarningAck;
-       protected $mDestFile;
-
-       protected $mComment;
-       protected $mTextTop;
-       protected $mTextAfterSummary;
-
-       protected $mSourceIds;
-
-       protected $mMaxFileSize = [];
-
-       protected $mMaxUploadSize = [];
-
-       public function __construct( array $options = [], IContextSource $context = null,
-               LinkRenderer $linkRenderer = null
-       ) {
-               if ( $context instanceof IContextSource ) {
-                       $this->setContext( $context );
-               }
-
-               if ( !$linkRenderer ) {
-                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
-               }
-
-               $this->mWatch = !empty( $options['watch'] );
-               $this->mForReUpload = !empty( $options['forreupload'] );
-               $this->mSessionKey = isset( $options['sessionkey'] ) ? $options['sessionkey'] : '';
-               $this->mHideIgnoreWarning = !empty( $options['hideignorewarning'] );
-               $this->mDestWarningAck = !empty( $options['destwarningack'] );
-               $this->mDestFile = isset( $options['destfile'] ) ? $options['destfile'] : '';
-
-               $this->mComment = isset( $options['description'] ) ?
-                       $options['description'] : '';
-
-               $this->mTextTop = isset( $options['texttop'] )
-                       ? $options['texttop'] : '';
-
-               $this->mTextAfterSummary = isset( $options['textaftersummary'] )
-                       ? $options['textaftersummary'] : '';
-
-               $sourceDescriptor = $this->getSourceSection();
-               $descriptor = $sourceDescriptor
-                       + $this->getDescriptionSection()
-                       + $this->getOptionsSection();
-
-               Hooks::run( 'UploadFormInitDescriptor', [ &$descriptor ] );
-               parent::__construct( $descriptor, $context, 'upload' );
-
-               # Add a link to edit MediaWiki:Licenses
-               if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
-                       $this->getOutput()->addModuleStyles( 'mediawiki.special.upload.styles' );
-                       $licensesLink = $linkRenderer->makeKnownLink(
-                               $this->msg( 'licenses' )->inContentLanguage()->getTitle(),
-                               $this->msg( 'licenses-edit' )->text(),
-                               [],
-                               [ 'action' => 'edit' ]
-                       );
-                       $editLicenses = '<p class="mw-upload-editlicenses">' . $licensesLink . '</p>';
-                       $this->addFooterText( $editLicenses, 'description' );
-               }
-
-               # Set some form properties
-               $this->setSubmitText( $this->msg( 'uploadbtn' )->text() );
-               $this->setSubmitName( 'wpUpload' );
-               # Used message keys: 'accesskey-upload', 'tooltip-upload'
-               $this->setSubmitTooltip( 'upload' );
-               $this->setId( 'mw-upload-form' );
-
-               # Build a list of IDs for javascript insertion
-               $this->mSourceIds = [];
-               foreach ( $sourceDescriptor as $field ) {
-                       if ( !empty( $field['id'] ) ) {
-                               $this->mSourceIds[] = $field['id'];
-                       }
-               }
-       }
-
-       /**
-        * Get the descriptor of the fieldset that contains the file source
-        * selection. The section is 'source'
-        *
-        * @return array Descriptor array
-        */
-       protected function getSourceSection() {
-               if ( $this->mSessionKey ) {
-                       return [
-                               'SessionKey' => [
-                                       'type' => 'hidden',
-                                       'default' => $this->mSessionKey,
-                               ],
-                               'SourceType' => [
-                                       'type' => 'hidden',
-                                       'default' => 'Stash',
-                               ],
-                       ];
-               }
-
-               $canUploadByUrl = UploadFromUrl::isEnabled()
-                       && ( UploadFromUrl::isAllowed( $this->getUser() ) === true )
-                       && $this->getConfig()->get( 'CopyUploadsFromSpecialUpload' );
-               $radio = $canUploadByUrl;
-               $selectedSourceType = strtolower( $this->getRequest()->getText( 'wpSourceType', 'File' ) );
-
-               $descriptor = [];
-               if ( $this->mTextTop ) {
-                       $descriptor['UploadFormTextTop'] = [
-                               'type' => 'info',
-                               'section' => 'source',
-                               'default' => $this->mTextTop,
-                               'raw' => true,
-                       ];
-               }
-
-               $this->mMaxUploadSize['file'] = min(
-                       UploadBase::getMaxUploadSize( 'file' ),
-                       UploadBase::getMaxPhpUploadSize()
-               );
-
-               $help = $this->msg( 'upload-maxfilesize',
-                               $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
-                       )->parse();
-
-               // If the user can also upload by URL, there are 2 different file size limits.
-               // This extra message helps stress which limit corresponds to what.
-               if ( $canUploadByUrl ) {
-                       $help .= $this->msg( 'word-separator' )->escaped();
-                       $help .= $this->msg( 'upload_source_file' )->parse();
-               }
-
-               $descriptor['UploadFile'] = [
-                       'class' => 'UploadSourceField',
-                       'section' => 'source',
-                       'type' => 'file',
-                       'id' => 'wpUploadFile',
-                       'radio-id' => 'wpSourceTypeFile',
-                       'label-message' => 'sourcefilename',
-                       'upload-type' => 'File',
-                       'radio' => &$radio,
-                       'help' => $help,
-                       'checked' => $selectedSourceType == 'file',
-               ];
-
-               if ( $canUploadByUrl ) {
-                       $this->mMaxUploadSize['url'] = UploadBase::getMaxUploadSize( 'url' );
-                       $descriptor['UploadFileURL'] = [
-                               'class' => 'UploadSourceField',
-                               'section' => 'source',
-                               'id' => 'wpUploadFileURL',
-                               'radio-id' => 'wpSourceTypeurl',
-                               'label-message' => 'sourceurl',
-                               'upload-type' => 'url',
-                               'radio' => &$radio,
-                               'help' => $this->msg( 'upload-maxfilesize',
-                                       $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
-                               )->parse() .
-                                       $this->msg( 'word-separator' )->escaped() .
-                                       $this->msg( 'upload_source_url' )->parse(),
-                               'checked' => $selectedSourceType == 'url',
-                       ];
-               }
-               Hooks::run( 'UploadFormSourceDescriptors', [ &$descriptor, &$radio, $selectedSourceType ] );
-
-               $descriptor['Extensions'] = [
-                       'type' => 'info',
-                       'section' => 'source',
-                       'default' => $this->getExtensionsMessage(),
-                       'raw' => true,
-               ];
-
-               return $descriptor;
-       }
-
-       /**
-        * Get the messages indicating which extensions are preferred and prohibitted.
-        *
-        * @return string HTML string containing the message
-        */
-       protected function getExtensionsMessage() {
-               # Print a list of allowed file extensions, if so configured.  We ignore
-               # MIME type here, it's incomprehensible to most people and too long.
-               $config = $this->getConfig();
-
-               if ( $config->get( 'CheckFileExtensions' ) ) {
-                       $fileExtensions = array_unique( $config->get( 'FileExtensions' ) );
-                       if ( $config->get( 'StrictFileExtensions' ) ) {
-                               # Everything not permitted is banned
-                               $extensionsList =
-                                       '<div id="mw-upload-permitted">' .
-                                       $this->msg( 'upload-permitted' )
-                                               ->params( $this->getLanguage()->commaList( $fileExtensions ) )
-                                               ->numParams( count( $fileExtensions ) )
-                                               ->parseAsBlock() .
-                                       "</div>\n";
-                       } else {
-                               # We have to list both preferred and prohibited
-                               $fileBlacklist = array_unique( $config->get( 'FileBlacklist' ) );
-                               $extensionsList =
-                                       '<div id="mw-upload-preferred">' .
-                                               $this->msg( 'upload-preferred' )
-                                                       ->params( $this->getLanguage()->commaList( $fileExtensions ) )
-                                                       ->numParams( count( $fileExtensions ) )
-                                                       ->parseAsBlock() .
-                                       "</div>\n" .
-                                       '<div id="mw-upload-prohibited">' .
-                                               $this->msg( 'upload-prohibited' )
-                                                       ->params( $this->getLanguage()->commaList( $fileBlacklist ) )
-                                                       ->numParams( count( $fileBlacklist ) )
-                                                       ->parseAsBlock() .
-                                       "</div>\n";
-                       }
-               } else {
-                       # Everything is permitted.
-                       $extensionsList = '';
-               }
-
-               return $extensionsList;
-       }
-
-       /**
-        * Get the descriptor of the fieldset that contains the file description
-        * input. The section is 'description'
-        *
-        * @return array Descriptor array
-        */
-       protected function getDescriptionSection() {
-               $config = $this->getConfig();
-               if ( $this->mSessionKey ) {
-                       $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $this->getUser() );
-                       try {
-                               $file = $stash->getFile( $this->mSessionKey );
-                       } catch ( Exception $e ) {
-                               $file = null;
-                       }
-                       if ( $file ) {
-                               global $wgContLang;
-
-                               $mto = $file->transform( [ 'width' => 120 ] );
-                               if ( $mto ) {
-                                       $this->addHeaderText(
-                                               '<div class="thumb t' . $wgContLang->alignEnd() . '">' .
-                                               Html::element( 'img', [
-                                                       'src' => $mto->getUrl(),
-                                                       'class' => 'thumbimage',
-                                               ] ) . '</div>', 'description' );
-                               }
-                       }
-               }
-
-               $descriptor = [
-                       'DestFile' => [
-                               'type' => 'text',
-                               'section' => 'description',
-                               'id' => 'wpDestFile',
-                               'label-message' => 'destfilename',
-                               'size' => 60,
-                               'default' => $this->mDestFile,
-                               # @todo FIXME: Hack to work around poor handling of the 'default' option in HTMLForm
-                               'nodata' => strval( $this->mDestFile ) !== '',
-                       ],
-                       'UploadDescription' => [
-                               'type' => 'textarea',
-                               'section' => 'description',
-                               'id' => 'wpUploadDescription',
-                               'label-message' => $this->mForReUpload
-                                       ? 'filereuploadsummary'
-                                       : 'fileuploadsummary',
-                               'default' => $this->mComment,
-                               'cols' => 80,
-                               'rows' => 8,
-                       ]
-               ];
-               if ( $this->mTextAfterSummary ) {
-                       $descriptor['UploadFormTextAfterSummary'] = [
-                               'type' => 'info',
-                               'section' => 'description',
-                               'default' => $this->mTextAfterSummary,
-                               'raw' => true,
-                       ];
-               }
-
-               $descriptor += [
-                       'EditTools' => [
-                               'type' => 'edittools',
-                               'section' => 'description',
-                               'message' => 'edittools-upload',
-                       ]
-               ];
-
-               if ( $this->mForReUpload ) {
-                       $descriptor['DestFile']['readonly'] = true;
-               } else {
-                       $descriptor['License'] = [
-                               'type' => 'select',
-                               'class' => 'Licenses',
-                               'section' => 'description',
-                               'id' => 'wpLicense',
-                               'label-message' => 'license',
-                       ];
-               }
-
-               if ( $config->get( 'UseCopyrightUpload' ) ) {
-                       $descriptor['UploadCopyStatus'] = [
-                               'type' => 'text',
-                               'section' => 'description',
-                               'id' => 'wpUploadCopyStatus',
-                               'label-message' => 'filestatus',
-                       ];
-                       $descriptor['UploadSource'] = [
-                               'type' => 'text',
-                               'section' => 'description',
-                               'id' => 'wpUploadSource',
-                               'label-message' => 'filesource',
-                       ];
-               }
-
-               return $descriptor;
-       }
-
-       /**
-        * Get the descriptor of the fieldset that contains the upload options,
-        * such as "watch this file". The section is 'options'
-        *
-        * @return array Descriptor array
-        */
-       protected function getOptionsSection() {
-               $user = $this->getUser();
-               if ( $user->isLoggedIn() ) {
-                       $descriptor = [
-                               'Watchthis' => [
-                                       'type' => 'check',
-                                       'id' => 'wpWatchthis',
-                                       'label-message' => 'watchthisupload',
-                                       'section' => 'options',
-                                       'default' => $this->mWatch,
-                               ]
-                       ];
-               }
-               if ( !$this->mHideIgnoreWarning ) {
-                       $descriptor['IgnoreWarning'] = [
-                               'type' => 'check',
-                               'id' => 'wpIgnoreWarning',
-                               'label-message' => 'ignorewarnings',
-                               'section' => 'options',
-                       ];
-               }
-
-               $descriptor['DestFileWarningAck'] = [
-                       'type' => 'hidden',
-                       'id' => 'wpDestFileWarningAck',
-                       'default' => $this->mDestWarningAck ? '1' : '',
-               ];
-
-               if ( $this->mForReUpload ) {
-                       $descriptor['ForReUpload'] = [
-                               'type' => 'hidden',
-                               'id' => 'wpForReUpload',
-                               'default' => '1',
-                       ];
-               }
-
-               return $descriptor;
-       }
-
-       /**
-        * Add the upload JS and show the form.
-        */
-       public function show() {
-               $this->addUploadJS();
-               parent::show();
-       }
-
-       /**
-        * Add upload JS to the OutputPage
-        */
-       protected function addUploadJS() {
-               $config = $this->getConfig();
-
-               $useAjaxDestCheck = $config->get( 'UseAjax' ) && $config->get( 'AjaxUploadDestCheck' );
-               $useAjaxLicensePreview = $config->get( 'UseAjax' ) &&
-                       $config->get( 'AjaxLicensePreview' ) && $config->get( 'EnableAPI' );
-               $this->mMaxUploadSize['*'] = UploadBase::getMaxUploadSize();
-
-               $scriptVars = [
-                       'wgAjaxUploadDestCheck' => $useAjaxDestCheck,
-                       'wgAjaxLicensePreview' => $useAjaxLicensePreview,
-                       'wgUploadAutoFill' => !$this->mForReUpload &&
-                               // If we received mDestFile from the request, don't autofill
-                               // the wpDestFile textbox
-                               $this->mDestFile === '',
-                       'wgUploadSourceIds' => $this->mSourceIds,
-                       'wgCheckFileExtensions' => $config->get( 'CheckFileExtensions' ),
-                       'wgStrictFileExtensions' => $config->get( 'StrictFileExtensions' ),
-                       'wgFileExtensions' => array_values( array_unique( $config->get( 'FileExtensions' ) ) ),
-                       'wgCapitalizeUploads' => MWNamespace::isCapitalized( NS_FILE ),
-                       'wgMaxUploadSize' => $this->mMaxUploadSize,
-                       'wgFileCanRotate' => SpecialUpload::rotationEnabled(),
-               ];
-
-               $out = $this->getOutput();
-               $out->addJsConfigVars( $scriptVars );
-
-               $out->addModules( [
-                       'mediawiki.special.upload', // Extras for thumbnail and license preview.
-               ] );
-       }
-
-       /**
-        * Empty function; submission is handled elsewhere.
-        *
-        * @return bool False
-        */
-       function trySubmit() {
-               return false;
-       }
-}
-
-/**
- * A form field that contains a radio box in the label
- */
-class UploadSourceField extends HTMLTextField {
-
-       /**
-        * @param array $cellAttributes
-        * @return string
-        */
-       function getLabelHtml( $cellAttributes = [] ) {
-               $id = $this->mParams['id'];
-               $label = Html::rawElement( 'label', [ 'for' => $id ], $this->mLabel );
-
-               if ( !empty( $this->mParams['radio'] ) ) {
-                       if ( isset( $this->mParams['radio-id'] ) ) {
-                               $radioId = $this->mParams['radio-id'];
-                       } else {
-                               // Old way. For the benefit of extensions that do not define
-                               // the 'radio-id' key.
-                               $radioId = 'wpSourceType' . $this->mParams['upload-type'];
-                       }
-
-                       $attribs = [
-                               'name' => 'wpSourceType',
-                               'type' => 'radio',
-                               'id' => $radioId,
-                               'value' => $this->mParams['upload-type'],
-                       ];
-
-                       if ( !empty( $this->mParams['checked'] ) ) {
-                               $attribs['checked'] = 'checked';
-                       }
-
-                       $label .= Html::element( 'input', $attribs );
-               }
-
-               return Html::rawElement( 'td', [ 'class' => 'mw-label' ] + $cellAttributes, $label );
-       }
-
-       /**
-        * @return int
-        */
-       function getSize() {
-               return isset( $this->mParams['size'] )
-                       ? $this->mParams['size']
-                       : 60;
-       }
-}
diff --git a/includes/specials/formfields/EditWatchlistCheckboxSeriesField.php b/includes/specials/formfields/EditWatchlistCheckboxSeriesField.php
new file mode 100644 (file)
index 0000000..cb93bb2
--- /dev/null
@@ -0,0 +1,37 @@
+<?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
+ */
+
+class EditWatchlistCheckboxSeriesField extends HTMLMultiSelectField {
+       /**
+        * HTMLMultiSelectField throws validation errors if we get input data
+        * that doesn't match the data set in the form setup. This causes
+        * problems if something gets removed from the watchlist while the
+        * form is open (T34126), but we know that invalid items will
+        * be harmless so we can override it here.
+        *
+        * @param string $value The value the field was submitted with
+        * @param array $alldata The data collected from the form
+        * @return bool|string Bool true on success, or String error to display.
+        */
+       function validate( $value, $alldata ) {
+               // Need to call into grandparent to be a good citizen. :)
+               return HTMLFormField::validate( $value, $alldata );
+       }
+}
diff --git a/includes/specials/formfields/Licenses.php b/includes/specials/formfields/Licenses.php
new file mode 100644 (file)
index 0000000..f499cc1
--- /dev/null
@@ -0,0 +1,189 @@
+<?php
+/**
+ * License selector for use on Special:Upload.
+ *
+ * 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 SpecialPage
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+/**
+ * A License class for use on Special:Upload
+ */
+class Licenses extends HTMLFormField {
+       /** @var string */
+       protected $msg;
+
+       /** @var array */
+       protected $licenses = [];
+
+       /** @var string */
+       protected $html;
+       /**#@-*/
+
+       /**
+        * @param array $params
+        */
+       public function __construct( $params ) {
+               parent::__construct( $params );
+
+               $this->msg = empty( $params['licenses'] )
+                       ? wfMessage( 'licenses' )->inContentLanguage()->plain()
+                       : $params['licenses'];
+               $this->selected = null;
+
+               $this->makeLicenses();
+       }
+
+       /**
+        * @private
+        */
+       protected function makeLicenses() {
+               $levels = [];
+               $lines = explode( "\n", $this->msg );
+
+               foreach ( $lines as $line ) {
+                       if ( strpos( $line, '*' ) !== 0 ) {
+                               continue;
+                       } else {
+                               list( $level, $line ) = $this->trimStars( $line );
+
+                               if ( strpos( $line, '|' ) !== false ) {
+                                       $obj = new License( $line );
+                                       $this->stackItem( $this->licenses, $levels, $obj );
+                               } else {
+                                       if ( $level < count( $levels ) ) {
+                                               $levels = array_slice( $levels, 0, $level );
+                                       }
+                                       if ( $level == count( $levels ) ) {
+                                               $levels[$level - 1] = $line;
+                                       } elseif ( $level > count( $levels ) ) {
+                                               $levels[] = $line;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @param string $str
+        * @return array
+        */
+       protected function trimStars( $str ) {
+               $numStars = strspn( $str, '*' );
+               return [ $numStars, ltrim( substr( $str, $numStars ), ' ' ) ];
+       }
+
+       /**
+        * @param array &$list
+        * @param array $path
+        * @param mixed $item
+        */
+       protected function stackItem( &$list, $path, $item ) {
+               $position =& $list;
+               if ( $path ) {
+                       foreach ( $path as $key ) {
+                               $position =& $position[$key];
+                       }
+               }
+               $position[] = $item;
+       }
+
+       /**
+        * @param array $tagset
+        * @param int $depth
+        */
+       protected function makeHtml( $tagset, $depth = 0 ) {
+               foreach ( $tagset as $key => $val ) {
+                       if ( is_array( $val ) ) {
+                               $this->html .= $this->outputOption(
+                                       $key, '',
+                                       [
+                                               'disabled' => 'disabled',
+                                               'style' => 'color: GrayText', // for MSIE
+                                       ],
+                                       $depth
+                               );
+                               $this->makeHtml( $val, $depth + 1 );
+                       } else {
+                               $this->html .= $this->outputOption(
+                                       $val->text, $val->template,
+                                       [ 'title' => '{{' . $val->template . '}}' ],
+                                       $depth
+                               );
+                       }
+               }
+       }
+
+       /**
+        * @param string $message
+        * @param string $value
+        * @param null|array $attribs
+        * @param int $depth
+        * @return string
+        */
+       protected function outputOption( $message, $value, $attribs = null, $depth = 0 ) {
+               $msgObj = $this->msg( $message );
+               $text = $msgObj->exists() ? $msgObj->text() : $message;
+               $attribs['value'] = $value;
+               if ( $value === $this->selected ) {
+                       $attribs['selected'] = 'selected';
+               }
+
+               $val = str_repeat( /* &nbsp */ "\xc2\xa0", $depth * 2 ) . $text;
+               return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n";
+       }
+
+       /**#@-*/
+
+       /**
+        *  Accessor for $this->licenses
+        *
+        * @return array
+        */
+       public function getLicenses() {
+               return $this->licenses;
+       }
+
+       /**
+        * Accessor for $this->html
+        *
+        * @param bool $value
+        *
+        * @return string
+        */
+       public function getInputHTML( $value ) {
+               $this->selected = $value;
+
+               $this->html = $this->outputOption( wfMessage( 'nolicense' )->text(), '',
+                       (bool)$this->selected ? null : [ 'selected' => 'selected' ] );
+               $this->makeHtml( $this->getLicenses() );
+
+               $attribs = [
+                       'name' => $this->mName,
+                       'id' => $this->mID
+               ];
+               if ( !empty( $this->mParams['disabled'] ) ) {
+                       $attibs['disabled'] = 'disabled';
+               }
+
+               return Html::rawElement( 'select', $attribs, $this->html );
+       }
+}
diff --git a/includes/specials/formfields/UploadSourceField.php b/includes/specials/formfields/UploadSourceField.php
new file mode 100644 (file)
index 0000000..251a286
--- /dev/null
@@ -0,0 +1,68 @@
+<?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
+ */
+
+/**
+ * A form field that contains a radio box in the label
+ */
+class UploadSourceField extends HTMLTextField {
+
+       /**
+        * @param array $cellAttributes
+        * @return string
+        */
+       function getLabelHtml( $cellAttributes = [] ) {
+               $id = $this->mParams['id'];
+               $label = Html::rawElement( 'label', [ 'for' => $id ], $this->mLabel );
+
+               if ( !empty( $this->mParams['radio'] ) ) {
+                       if ( isset( $this->mParams['radio-id'] ) ) {
+                               $radioId = $this->mParams['radio-id'];
+                       } else {
+                               // Old way. For the benefit of extensions that do not define
+                               // the 'radio-id' key.
+                               $radioId = 'wpSourceType' . $this->mParams['upload-type'];
+                       }
+
+                       $attribs = [
+                               'name' => 'wpSourceType',
+                               'type' => 'radio',
+                               'id' => $radioId,
+                               'value' => $this->mParams['upload-type'],
+                       ];
+
+                       if ( !empty( $this->mParams['checked'] ) ) {
+                               $attribs['checked'] = 'checked';
+                       }
+
+                       $label .= Html::element( 'input', $attribs );
+               }
+
+               return Html::rawElement( 'td', [ 'class' => 'mw-label' ] + $cellAttributes, $label );
+       }
+
+       /**
+        * @return int
+        */
+       function getSize() {
+               return isset( $this->mParams['size'] )
+                       ? $this->mParams['size']
+                       : 60;
+       }
+}
diff --git a/includes/specials/forms/EditWatchlistNormalHTMLForm.php b/includes/specials/forms/EditWatchlistNormalHTMLForm.php
new file mode 100644 (file)
index 0000000..723093a
--- /dev/null
@@ -0,0 +1,36 @@
+<?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
+ */
+
+/**
+ * Extend HTMLForm purely so we can have a more sane way of getting the section headers
+ */
+class EditWatchlistNormalHTMLForm extends HTMLForm {
+       public function getLegend( $namespace ) {
+               $namespace = substr( $namespace, 2 );
+
+               return $namespace == NS_MAIN
+                       ? $this->msg( 'blanknamespace' )->escaped()
+                       : htmlspecialchars( $this->getContext()->getLanguage()->getFormattedNsText( $namespace ) );
+       }
+
+       public function getBody() {
+               return $this->displaySection( $this->mFieldTree, '', 'editwatchlist-' );
+       }
+}
diff --git a/includes/specials/forms/PreferencesForm.php b/includes/specials/forms/PreferencesForm.php
new file mode 100644 (file)
index 0000000..d4e5ef4
--- /dev/null
@@ -0,0 +1,143 @@
+<?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
+ */
+
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Form to edit user preferences.
+ */
+class PreferencesForm extends HTMLForm {
+       // Override default value from HTMLForm
+       protected $mSubSectionBeforeFields = false;
+
+       private $modifiedUser;
+
+       /**
+        * @param User $user
+        */
+       public function setModifiedUser( $user ) {
+               $this->modifiedUser = $user;
+       }
+
+       /**
+        * @return User
+        */
+       public function getModifiedUser() {
+               if ( $this->modifiedUser === null ) {
+                       return $this->getUser();
+               } else {
+                       return $this->modifiedUser;
+               }
+       }
+
+       /**
+        * Get extra parameters for the query string when redirecting after
+        * successful save.
+        *
+        * @return array
+        */
+       public function getExtraSuccessRedirectParameters() {
+               return [];
+       }
+
+       /**
+        * @param string $html
+        * @return string
+        */
+       function wrapForm( $html ) {
+               $html = Xml::tags( 'div', [ 'id' => 'preferences' ], $html );
+
+               return parent::wrapForm( $html );
+       }
+
+       /**
+        * @return string
+        */
+       function getButtons() {
+               $attrs = [ 'id' => 'mw-prefs-restoreprefs' ];
+
+               if ( !$this->getModifiedUser()->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
+                       return '';
+               }
+
+               $html = parent::getButtons();
+
+               if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
+                       $t = $this->getTitle()->getSubpage( 'reset' );
+
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                       $html .= "\n" . $linkRenderer->makeLink( $t, $this->msg( 'restoreprefs' )->text(),
+                               Html::buttonAttributes( $attrs, [ 'mw-ui-quiet' ] ) );
+
+                       $html = Xml::tags( 'div', [ 'class' => 'mw-prefs-buttons' ], $html );
+               }
+
+               return $html;
+       }
+
+       /**
+        * Separate multi-option preferences into multiple preferences, since we
+        * have to store them separately
+        * @param array $data
+        * @return array
+        */
+       function filterDataForSubmit( $data ) {
+               foreach ( $this->mFlatFields as $fieldname => $field ) {
+                       if ( $field instanceof HTMLNestedFilterable ) {
+                               $info = $field->mParams;
+                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
+                               foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
+                                       $data["$prefix$key"] = $value;
+                               }
+                               unset( $data[$fieldname] );
+                       }
+               }
+
+               return $data;
+       }
+
+       /**
+        * Get the whole body of the form.
+        * @return string
+        */
+       function getBody() {
+               return $this->displaySection( $this->mFieldTree, '', 'mw-prefsection-' );
+       }
+
+       /**
+        * Get the "<legend>" for a given section key. Normally this is the
+        * prefs-$key message but we'll allow extensions to override it.
+        * @param string $key
+        * @return string
+        */
+       function getLegend( $key ) {
+               $legend = parent::getLegend( $key );
+               Hooks::run( 'PreferencesGetLegend', [ $this, $key, &$legend ] );
+               return $legend;
+       }
+
+       /**
+        * Get the keys of each top level preference section.
+        * @return array of section keys
+        */
+       function getPreferenceSections() {
+               return array_keys( array_filter( $this->mFieldTree, 'is_array' ) );
+       }
+}
diff --git a/includes/specials/forms/UploadForm.php b/includes/specials/forms/UploadForm.php
new file mode 100644 (file)
index 0000000..44d91a8
--- /dev/null
@@ -0,0 +1,446 @@
+<?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
+ */
+
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Sub class of HTMLForm that provides the form section of SpecialUpload
+ */
+class UploadForm extends HTMLForm {
+       protected $mWatch;
+       protected $mForReUpload;
+       protected $mSessionKey;
+       protected $mHideIgnoreWarning;
+       protected $mDestWarningAck;
+       protected $mDestFile;
+
+       protected $mComment;
+       protected $mTextTop;
+       protected $mTextAfterSummary;
+
+       protected $mSourceIds;
+
+       protected $mMaxFileSize = [];
+
+       protected $mMaxUploadSize = [];
+
+       public function __construct( array $options = [], IContextSource $context = null,
+               LinkRenderer $linkRenderer = null
+       ) {
+               if ( $context instanceof IContextSource ) {
+                       $this->setContext( $context );
+               }
+
+               if ( !$linkRenderer ) {
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+               }
+
+               $this->mWatch = !empty( $options['watch'] );
+               $this->mForReUpload = !empty( $options['forreupload'] );
+               $this->mSessionKey = isset( $options['sessionkey'] ) ? $options['sessionkey'] : '';
+               $this->mHideIgnoreWarning = !empty( $options['hideignorewarning'] );
+               $this->mDestWarningAck = !empty( $options['destwarningack'] );
+               $this->mDestFile = isset( $options['destfile'] ) ? $options['destfile'] : '';
+
+               $this->mComment = isset( $options['description'] ) ?
+                       $options['description'] : '';
+
+               $this->mTextTop = isset( $options['texttop'] )
+                       ? $options['texttop'] : '';
+
+               $this->mTextAfterSummary = isset( $options['textaftersummary'] )
+                       ? $options['textaftersummary'] : '';
+
+               $sourceDescriptor = $this->getSourceSection();
+               $descriptor = $sourceDescriptor
+                       + $this->getDescriptionSection()
+                       + $this->getOptionsSection();
+
+               Hooks::run( 'UploadFormInitDescriptor', [ &$descriptor ] );
+               parent::__construct( $descriptor, $context, 'upload' );
+
+               # Add a link to edit MediaWiki:Licenses
+               if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
+                       $this->getOutput()->addModuleStyles( 'mediawiki.special.upload.styles' );
+                       $licensesLink = $linkRenderer->makeKnownLink(
+                               $this->msg( 'licenses' )->inContentLanguage()->getTitle(),
+                               $this->msg( 'licenses-edit' )->text(),
+                               [],
+                               [ 'action' => 'edit' ]
+                       );
+                       $editLicenses = '<p class="mw-upload-editlicenses">' . $licensesLink . '</p>';
+                       $this->addFooterText( $editLicenses, 'description' );
+               }
+
+               # Set some form properties
+               $this->setSubmitText( $this->msg( 'uploadbtn' )->text() );
+               $this->setSubmitName( 'wpUpload' );
+               # Used message keys: 'accesskey-upload', 'tooltip-upload'
+               $this->setSubmitTooltip( 'upload' );
+               $this->setId( 'mw-upload-form' );
+
+               # Build a list of IDs for javascript insertion
+               $this->mSourceIds = [];
+               foreach ( $sourceDescriptor as $field ) {
+                       if ( !empty( $field['id'] ) ) {
+                               $this->mSourceIds[] = $field['id'];
+                       }
+               }
+       }
+
+       /**
+        * Get the descriptor of the fieldset that contains the file source
+        * selection. The section is 'source'
+        *
+        * @return array Descriptor array
+        */
+       protected function getSourceSection() {
+               if ( $this->mSessionKey ) {
+                       return [
+                               'SessionKey' => [
+                                       'type' => 'hidden',
+                                       'default' => $this->mSessionKey,
+                               ],
+                               'SourceType' => [
+                                       'type' => 'hidden',
+                                       'default' => 'Stash',
+                               ],
+                       ];
+               }
+
+               $canUploadByUrl = UploadFromUrl::isEnabled()
+                       && ( UploadFromUrl::isAllowed( $this->getUser() ) === true )
+                       && $this->getConfig()->get( 'CopyUploadsFromSpecialUpload' );
+               $radio = $canUploadByUrl;
+               $selectedSourceType = strtolower( $this->getRequest()->getText( 'wpSourceType', 'File' ) );
+
+               $descriptor = [];
+               if ( $this->mTextTop ) {
+                       $descriptor['UploadFormTextTop'] = [
+                               'type' => 'info',
+                               'section' => 'source',
+                               'default' => $this->mTextTop,
+                               'raw' => true,
+                       ];
+               }
+
+               $this->mMaxUploadSize['file'] = min(
+                       UploadBase::getMaxUploadSize( 'file' ),
+                       UploadBase::getMaxPhpUploadSize()
+               );
+
+               $help = $this->msg( 'upload-maxfilesize',
+                               $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
+                       )->parse();
+
+               // If the user can also upload by URL, there are 2 different file size limits.
+               // This extra message helps stress which limit corresponds to what.
+               if ( $canUploadByUrl ) {
+                       $help .= $this->msg( 'word-separator' )->escaped();
+                       $help .= $this->msg( 'upload_source_file' )->parse();
+               }
+
+               $descriptor['UploadFile'] = [
+                       'class' => 'UploadSourceField',
+                       'section' => 'source',
+                       'type' => 'file',
+                       'id' => 'wpUploadFile',
+                       'radio-id' => 'wpSourceTypeFile',
+                       'label-message' => 'sourcefilename',
+                       'upload-type' => 'File',
+                       'radio' => &$radio,
+                       'help' => $help,
+                       'checked' => $selectedSourceType == 'file',
+               ];
+
+               if ( $canUploadByUrl ) {
+                       $this->mMaxUploadSize['url'] = UploadBase::getMaxUploadSize( 'url' );
+                       $descriptor['UploadFileURL'] = [
+                               'class' => 'UploadSourceField',
+                               'section' => 'source',
+                               'id' => 'wpUploadFileURL',
+                               'radio-id' => 'wpSourceTypeurl',
+                               'label-message' => 'sourceurl',
+                               'upload-type' => 'url',
+                               'radio' => &$radio,
+                               'help' => $this->msg( 'upload-maxfilesize',
+                                       $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
+                               )->parse() .
+                                       $this->msg( 'word-separator' )->escaped() .
+                                       $this->msg( 'upload_source_url' )->parse(),
+                               'checked' => $selectedSourceType == 'url',
+                       ];
+               }
+               Hooks::run( 'UploadFormSourceDescriptors', [ &$descriptor, &$radio, $selectedSourceType ] );
+
+               $descriptor['Extensions'] = [
+                       'type' => 'info',
+                       'section' => 'source',
+                       'default' => $this->getExtensionsMessage(),
+                       'raw' => true,
+               ];
+
+               return $descriptor;
+       }
+
+       /**
+        * Get the messages indicating which extensions are preferred and prohibitted.
+        *
+        * @return string HTML string containing the message
+        */
+       protected function getExtensionsMessage() {
+               # Print a list of allowed file extensions, if so configured.  We ignore
+               # MIME type here, it's incomprehensible to most people and too long.
+               $config = $this->getConfig();
+
+               if ( $config->get( 'CheckFileExtensions' ) ) {
+                       $fileExtensions = array_unique( $config->get( 'FileExtensions' ) );
+                       if ( $config->get( 'StrictFileExtensions' ) ) {
+                               # Everything not permitted is banned
+                               $extensionsList =
+                                       '<div id="mw-upload-permitted">' .
+                                       $this->msg( 'upload-permitted' )
+                                               ->params( $this->getLanguage()->commaList( $fileExtensions ) )
+                                               ->numParams( count( $fileExtensions ) )
+                                               ->parseAsBlock() .
+                                       "</div>\n";
+                       } else {
+                               # We have to list both preferred and prohibited
+                               $fileBlacklist = array_unique( $config->get( 'FileBlacklist' ) );
+                               $extensionsList =
+                                       '<div id="mw-upload-preferred">' .
+                                               $this->msg( 'upload-preferred' )
+                                                       ->params( $this->getLanguage()->commaList( $fileExtensions ) )
+                                                       ->numParams( count( $fileExtensions ) )
+                                                       ->parseAsBlock() .
+                                       "</div>\n" .
+                                       '<div id="mw-upload-prohibited">' .
+                                               $this->msg( 'upload-prohibited' )
+                                                       ->params( $this->getLanguage()->commaList( $fileBlacklist ) )
+                                                       ->numParams( count( $fileBlacklist ) )
+                                                       ->parseAsBlock() .
+                                       "</div>\n";
+                       }
+               } else {
+                       # Everything is permitted.
+                       $extensionsList = '';
+               }
+
+               return $extensionsList;
+       }
+
+       /**
+        * Get the descriptor of the fieldset that contains the file description
+        * input. The section is 'description'
+        *
+        * @return array Descriptor array
+        */
+       protected function getDescriptionSection() {
+               $config = $this->getConfig();
+               if ( $this->mSessionKey ) {
+                       $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $this->getUser() );
+                       try {
+                               $file = $stash->getFile( $this->mSessionKey );
+                       } catch ( Exception $e ) {
+                               $file = null;
+                       }
+                       if ( $file ) {
+                               global $wgContLang;
+
+                               $mto = $file->transform( [ 'width' => 120 ] );
+                               if ( $mto ) {
+                                       $this->addHeaderText(
+                                               '<div class="thumb t' . $wgContLang->alignEnd() . '">' .
+                                               Html::element( 'img', [
+                                                       'src' => $mto->getUrl(),
+                                                       'class' => 'thumbimage',
+                                               ] ) . '</div>', 'description' );
+                               }
+                       }
+               }
+
+               $descriptor = [
+                       'DestFile' => [
+                               'type' => 'text',
+                               'section' => 'description',
+                               'id' => 'wpDestFile',
+                               'label-message' => 'destfilename',
+                               'size' => 60,
+                               'default' => $this->mDestFile,
+                               # @todo FIXME: Hack to work around poor handling of the 'default' option in HTMLForm
+                               'nodata' => strval( $this->mDestFile ) !== '',
+                       ],
+                       'UploadDescription' => [
+                               'type' => 'textarea',
+                               'section' => 'description',
+                               'id' => 'wpUploadDescription',
+                               'label-message' => $this->mForReUpload
+                                       ? 'filereuploadsummary'
+                                       : 'fileuploadsummary',
+                               'default' => $this->mComment,
+                               'cols' => 80,
+                               'rows' => 8,
+                       ]
+               ];
+               if ( $this->mTextAfterSummary ) {
+                       $descriptor['UploadFormTextAfterSummary'] = [
+                               'type' => 'info',
+                               'section' => 'description',
+                               'default' => $this->mTextAfterSummary,
+                               'raw' => true,
+                       ];
+               }
+
+               $descriptor += [
+                       'EditTools' => [
+                               'type' => 'edittools',
+                               'section' => 'description',
+                               'message' => 'edittools-upload',
+                       ]
+               ];
+
+               if ( $this->mForReUpload ) {
+                       $descriptor['DestFile']['readonly'] = true;
+               } else {
+                       $descriptor['License'] = [
+                               'type' => 'select',
+                               'class' => 'Licenses',
+                               'section' => 'description',
+                               'id' => 'wpLicense',
+                               'label-message' => 'license',
+                       ];
+               }
+
+               if ( $config->get( 'UseCopyrightUpload' ) ) {
+                       $descriptor['UploadCopyStatus'] = [
+                               'type' => 'text',
+                               'section' => 'description',
+                               'id' => 'wpUploadCopyStatus',
+                               'label-message' => 'filestatus',
+                       ];
+                       $descriptor['UploadSource'] = [
+                               'type' => 'text',
+                               'section' => 'description',
+                               'id' => 'wpUploadSource',
+                               'label-message' => 'filesource',
+                       ];
+               }
+
+               return $descriptor;
+       }
+
+       /**
+        * Get the descriptor of the fieldset that contains the upload options,
+        * such as "watch this file". The section is 'options'
+        *
+        * @return array Descriptor array
+        */
+       protected function getOptionsSection() {
+               $user = $this->getUser();
+               if ( $user->isLoggedIn() ) {
+                       $descriptor = [
+                               'Watchthis' => [
+                                       'type' => 'check',
+                                       'id' => 'wpWatchthis',
+                                       'label-message' => 'watchthisupload',
+                                       'section' => 'options',
+                                       'default' => $this->mWatch,
+                               ]
+                       ];
+               }
+               if ( !$this->mHideIgnoreWarning ) {
+                       $descriptor['IgnoreWarning'] = [
+                               'type' => 'check',
+                               'id' => 'wpIgnoreWarning',
+                               'label-message' => 'ignorewarnings',
+                               'section' => 'options',
+                       ];
+               }
+
+               $descriptor['DestFileWarningAck'] = [
+                       'type' => 'hidden',
+                       'id' => 'wpDestFileWarningAck',
+                       'default' => $this->mDestWarningAck ? '1' : '',
+               ];
+
+               if ( $this->mForReUpload ) {
+                       $descriptor['ForReUpload'] = [
+                               'type' => 'hidden',
+                               'id' => 'wpForReUpload',
+                               'default' => '1',
+                       ];
+               }
+
+               return $descriptor;
+       }
+
+       /**
+        * Add the upload JS and show the form.
+        */
+       public function show() {
+               $this->addUploadJS();
+               parent::show();
+       }
+
+       /**
+        * Add upload JS to the OutputPage
+        */
+       protected function addUploadJS() {
+               $config = $this->getConfig();
+
+               $useAjaxDestCheck = $config->get( 'UseAjax' ) && $config->get( 'AjaxUploadDestCheck' );
+               $useAjaxLicensePreview = $config->get( 'UseAjax' ) &&
+                       $config->get( 'AjaxLicensePreview' ) && $config->get( 'EnableAPI' );
+               $this->mMaxUploadSize['*'] = UploadBase::getMaxUploadSize();
+
+               $scriptVars = [
+                       'wgAjaxUploadDestCheck' => $useAjaxDestCheck,
+                       'wgAjaxLicensePreview' => $useAjaxLicensePreview,
+                       'wgUploadAutoFill' => !$this->mForReUpload &&
+                               // If we received mDestFile from the request, don't autofill
+                               // the wpDestFile textbox
+                               $this->mDestFile === '',
+                       'wgUploadSourceIds' => $this->mSourceIds,
+                       'wgCheckFileExtensions' => $config->get( 'CheckFileExtensions' ),
+                       'wgStrictFileExtensions' => $config->get( 'StrictFileExtensions' ),
+                       'wgFileExtensions' => array_values( array_unique( $config->get( 'FileExtensions' ) ) ),
+                       'wgCapitalizeUploads' => MWNamespace::isCapitalized( NS_FILE ),
+                       'wgMaxUploadSize' => $this->mMaxUploadSize,
+                       'wgFileCanRotate' => SpecialUpload::rotationEnabled(),
+               ];
+
+               $out = $this->getOutput();
+               $out->addJsConfigVars( $scriptVars );
+
+               $out->addModules( [
+                       'mediawiki.special.upload', // Extras for thumbnail and license preview.
+               ] );
+       }
+
+       /**
+        * Empty function; submission is handled elsewhere.
+        *
+        * @return bool False
+        */
+       function trySubmit() {
+               return false;
+       }
+}
diff --git a/includes/specials/helpers/ImportReporter.php b/includes/specials/helpers/ImportReporter.php
new file mode 100644 (file)
index 0000000..63addb8
--- /dev/null
@@ -0,0 +1,190 @@
+<?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
+ */
+
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Reporting callback
+ * @ingroup SpecialPage
+ */
+class ImportReporter extends ContextSource {
+       private $reason = false;
+       private $logTags = [];
+       private $mOriginalLogCallback = null;
+       private $mOriginalPageOutCallback = null;
+       private $mLogItemCount = 0;
+
+       /**
+        * @param WikiImporter $importer
+        * @param bool $upload
+        * @param string $interwiki
+        * @param string|bool $reason
+        */
+       function __construct( $importer, $upload, $interwiki, $reason = false ) {
+               $this->mOriginalPageOutCallback =
+                       $importer->setPageOutCallback( [ $this, 'reportPage' ] );
+               $this->mOriginalLogCallback =
+                       $importer->setLogItemCallback( [ $this, 'reportLogItem' ] );
+               $importer->setNoticeCallback( [ $this, 'reportNotice' ] );
+               $this->mPageCount = 0;
+               $this->mIsUpload = $upload;
+               $this->mInterwiki = $interwiki;
+               $this->reason = $reason;
+       }
+
+       /**
+        * Sets change tags to apply to the import log entry and null revision.
+        *
+        * @param array $tags
+        * @since 1.29
+        */
+       public function setChangeTags( array $tags ) {
+               $this->logTags = $tags;
+       }
+
+       function open() {
+               $this->getOutput()->addHTML( "<ul>\n" );
+       }
+
+       function reportNotice( $msg, array $params ) {
+               $this->getOutput()->addHTML(
+                       Html::element( 'li', [], $this->msg( $msg, $params )->text() )
+               );
+       }
+
+       function reportLogItem( /* ... */ ) {
+               $this->mLogItemCount++;
+               if ( is_callable( $this->mOriginalLogCallback ) ) {
+                       call_user_func_array( $this->mOriginalLogCallback, func_get_args() );
+               }
+       }
+
+       /**
+        * @param Title $title
+        * @param ForeignTitle $foreignTitle
+        * @param int $revisionCount
+        * @param int $successCount
+        * @param array $pageInfo
+        * @return void
+        */
+       public function reportPage( $title, $foreignTitle, $revisionCount,
+                       $successCount, $pageInfo ) {
+               $args = func_get_args();
+               call_user_func_array( $this->mOriginalPageOutCallback, $args );
+
+               if ( $title === null ) {
+                       # Invalid or non-importable title; a notice is already displayed
+                       return;
+               }
+
+               $this->mPageCount++;
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+               if ( $successCount > 0 ) {
+                       // <bdi> prevents jumbling of the versions count
+                       // in RTL wikis in case the page title is LTR
+                       $this->getOutput()->addHTML(
+                               "<li>" . $linkRenderer->makeLink( $title ) . " " .
+                                       "<bdi>" .
+                                       $this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
+                                       "</bdi>" .
+                                       "</li>\n"
+                       );
+
+                       $logParams = [ '4:number:count' => $successCount ];
+                       if ( $this->mIsUpload ) {
+                               $detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
+                                       $successCount )->inContentLanguage()->text();
+                               $action = 'upload';
+                       } else {
+                               $pageTitle = $foreignTitle->getFullText();
+                               $fullInterwikiPrefix = $this->mInterwiki;
+                               Hooks::run( 'ImportLogInterwikiLink', [ &$fullInterwikiPrefix, &$pageTitle ] );
+
+                               $interwikiTitleStr = $fullInterwikiPrefix . ':' . $pageTitle;
+                               $interwiki = '[[:' . $interwikiTitleStr . ']]';
+                               $detail = $this->msg( 'import-logentry-interwiki-detail' )->numParams(
+                                       $successCount )->params( $interwiki )->inContentLanguage()->text();
+                               $action = 'interwiki';
+                               $logParams['5:title-link:interwiki'] = $interwikiTitleStr;
+                       }
+                       if ( $this->reason ) {
+                               $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                                       . $this->reason;
+                       }
+
+                       $comment = $detail; // quick
+                       $dbw = wfGetDB( DB_MASTER );
+                       $latest = $title->getLatestRevID();
+                       $nullRevision = Revision::newNullRevision(
+                               $dbw,
+                               $title->getArticleID(),
+                               $comment,
+                               true,
+                               $this->getUser()
+                       );
+
+                       $nullRevId = null;
+                       if ( !is_null( $nullRevision ) ) {
+                               $nullRevId = $nullRevision->insertOn( $dbw );
+                               $page = WikiPage::factory( $title );
+                               # Update page record
+                               $page->updateRevisionOn( $dbw, $nullRevision );
+                               Hooks::run(
+                                       'NewRevisionFromEditComplete',
+                                       [ $page, $nullRevision, $latest, $this->getUser() ]
+                               );
+                       }
+
+                       // Create the import log entry
+                       $logEntry = new ManualLogEntry( 'import', $action );
+                       $logEntry->setTarget( $title );
+                       $logEntry->setComment( $this->reason );
+                       $logEntry->setPerformer( $this->getUser() );
+                       $logEntry->setParameters( $logParams );
+                       $logid = $logEntry->insert();
+                       if ( count( $this->logTags ) ) {
+                               $logEntry->setTags( $this->logTags );
+                       }
+                       // Make sure the null revision will be tagged as well
+                       $logEntry->setAssociatedRevId( $nullRevId );
+
+                       $logEntry->publish( $logid );
+
+               } else {
+                       $this->getOutput()->addHTML( "<li>" . $linkRenderer->makeKnownLink( $title ) . " " .
+                               $this->msg( 'import-nonewrevisions' )->escaped() . "</li>\n" );
+               }
+       }
+
+       function close() {
+               $out = $this->getOutput();
+               if ( $this->mLogItemCount > 0 ) {
+                       $msg = $this->msg( 'imported-log-entries' )->numParams( $this->mLogItemCount )->parse();
+                       $out->addHTML( Xml::tags( 'li', null, $msg ) );
+               } elseif ( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
+                       $out->addHTML( "</ul>\n" );
+
+                       return Status::newFatal( 'importnopages' );
+               }
+               $out->addHTML( "</ul>\n" );
+
+               return Status::newGood( $this->mPageCount );
+       }
+}
diff --git a/includes/specials/helpers/License.php b/includes/specials/helpers/License.php
new file mode 100644 (file)
index 0000000..4f94b4d
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * License selector for use on Special:Upload.
+ *
+ * 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 SpecialPage
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+/**
+ * A License class for use on Special:Upload (represents a single type of license).
+ */
+class License {
+       /** @var string */
+       public $template;
+
+       /** @var string */
+       public $text;
+
+       /**
+        * @param string $str License name??
+        */
+       function __construct( $str ) {
+               list( $text, $template ) = explode( '|', strrev( $str ), 2 );
+
+               $this->template = strrev( $template );
+               $this->text = strrev( $text );
+       }
+}
index 03ebe21..64cce78 100644 (file)
@@ -3155,6 +3155,7 @@ public static $zh2Hant = [
 '上签约' => '上簽約',
 '上签署' => '上簽署',
 '上签订' => '上簽訂',
+'上签证' => '上簽證',
 '上签' => '上籤',
 '上系上' => '上繫上',
 '上课钟' => '上課鐘',
@@ -3172,6 +3173,7 @@ public static $zh2Hant = [
 '下签约' => '下簽約',
 '下签署' => '下簽署',
 '下签订' => '下簽訂',
+'下签证' => '下簽證',
 '下签' => '下籤',
 '下课钟' => '下課鐘',
 '不干不净' => '不乾不淨',
@@ -3247,6 +3249,7 @@ public static $zh2Hant = [
 '中签约' => '中簽約',
 '中签署' => '中簽署',
 '中签订' => '中簽訂',
+'中签证' => '中簽證',
 '中签' => '中籤',
 '中风后' => '中風後',
 '丰仪' => '丰儀',
@@ -4322,7 +4325,6 @@ public static $zh2Hant = [
 '台子女' => '台子女',
 '台子孙' => '台子孫',
 '台州' => '台州',
-'台布景' => '台布景',
 '台历史' => '台歷史',
 '台钟' => '台鐘',
 '台风奖' => '台風獎',
@@ -4867,6 +4869,8 @@ public static $zh2Hant = [
 '尸祝' => '尸祝',
 '尸祿' => '尸祿',
 '尸禄' => '尸祿',
+'尸罗' => '尸羅',
+'尸羅' => '尸羅',
 '尸罗精舍' => '尸羅精舍',
 '尸羅精舍' => '尸羅精舍',
 '尸臣' => '尸臣',
@@ -5883,6 +5887,7 @@ public static $zh2Hant = [
 '星历' => '星曆',
 '星期后' => '星期後',
 '星历史' => '星歷史',
+'星露谷物语' => '星露谷物語',
 '春游' => '春遊',
 '春香斗学' => '春香鬥學',
 '昭惠后' => '昭惠后',
@@ -6034,6 +6039,7 @@ public static $zh2Hant = [
 '架钟' => '架鐘',
 '某只' => '某隻',
 '染殿后' => '染殿后',
+'染发生' => '染發生',
 '染发' => '染髮',
 '柜上' => '柜上',
 '柜子' => '柜子',
@@ -6063,7 +6069,6 @@ public static $zh2Hant = [
 '杆菌' => '桿菌',
 '梁上君子' => '梁上君子',
 '梁启超' => '梁啓超',
-'条干' => '條幹',
 '条文里' => '條文裡',
 '梨干' => '梨乾',
 '梯冲' => '梯衝',
@@ -6139,7 +6144,6 @@ public static $zh2Hant = [
 '横征暴敛' => '橫徵暴斂',
 '横梁' => '橫樑',
 '横冲' => '橫衝',
-'台布' => '檯布',
 '台历' => '檯曆',
 '台灯' => '檯燈',
 '台球' => '檯球',
@@ -8494,6 +8498,10 @@ public static $zh2Hant = [
 '闯荡' => '闖蕩',
 '闯炼' => '闖鍊',
 '关系' => '關係',
+'关系列' => '關系列',
+'关系所' => '關系所',
+'关系科' => '關系科',
+'关系统' => '關系統',
 '辟佛' => '闢佛',
 '辟作' => '闢作',
 '辟划' => '闢劃',
@@ -9710,6 +9718,7 @@ public static $zh2Hans = [
 '圞' => '𪢮',
 '坿' => '附',
 '垜' => '垛',
+'垻' => '坝',
 '埡' => '垭',
 '執' => '执',
 '堅' => '坚',
@@ -13498,6 +13507,7 @@ public static $zh2Hans = [
 '崑崙' => '昆仑',
 '崑劇' => '昆剧',
 '崑山' => '昆山',
+'崑島' => '昆岛',
 '崑曲' => '昆曲',
 '崑腔' => '昆腔',
 '崑蘇' => '昆苏',
@@ -13875,6 +13885,9 @@ public static $zh2TW = [
 '哥特式' => '哥德式',
 '哥斯达黎加' => '哥斯大黎加',
 '哥斯達黎加' => '哥斯大黎加',
+'唐纳德·特朗普' => '唐納·川普',
+'當勞·特朗普' => '唐納·川普',
+'當奴·特朗普' => '唐納·川普',
 '卡拉奇' => '喀拉蚩',
 '乔治·奥威尔' => '喬治·歐威爾',
 '佐治亚' => '喬治亞',
@@ -13951,6 +13964,7 @@ public static $zh2TW = [
 '尼日尔' => '尼日',
 '尼日爾' => '尼日',
 '雅马哈' => '山葉',
+'特朗普' => '川普',
 '机床' => '工具機',
 '機床' => '工具機',
 '珍寶客機' => '巨無霸客機',
@@ -14105,6 +14119,7 @@ public static $zh2TW = [
 '奥巴马' => '歐巴馬',
 '奧巴馬' => '歐巴馬',
 '正在叱咤' => '正在叱咤',
+'圣佩德罗苏拉' => '汕埠',
 '文莱' => '汶萊',
 '沙律' => '沙拉',
 '沙地阿拉伯' => '沙烏地阿拉伯',
@@ -14270,7 +14285,8 @@ public static $zh2TW = [
 '毛里塔尼亞' => '茅利塔尼亞',
 '霍尔木兹' => '荷姆茲',
 '霍爾木茲' => '荷姆茲',
-'荷李活道' => '荷李活道',
+'荷里活廣場' => '荷里活廣場',
+'荷里活道' => '荷里活道',
 '莫桑比克' => '莫三比克',
 '瓦文萨' => '華勒沙',
 '華里沙' => '華勒沙',
@@ -14349,6 +14365,8 @@ public static $zh2TW = [
 '屏幕' => '螢幕',
 '行人路权' => '行人路權',
 '行人路權' => '行人路權',
+'流動作業系統' => '行動作業系統',
+'移动操作系统' => '行動作業系統',
 '流動網絡' => '行動網路',
 '移动网络' => '行動網路',
 '流動電話' => '行動電話',
@@ -14840,6 +14858,7 @@ public static $zh2HK = [
 '占高枝' => '佔高枝',
 '維德角' => '佛得角',
 '作品里' => '作品裏',
+'操作系统' => '作業系統',
 '來著' => '來着',
 '來著作' => '來著作',
 '來著名' => '來著名',
@@ -15843,6 +15862,8 @@ public static $zh2HK = [
 '數碼訊號' => '數碼訊號',
 '数字电视' => '數碼電視',
 '數位電視' => '數碼電視',
+'数字音乐' => '數碼音樂',
+'數位音樂' => '數碼音樂',
 '數著作' => '數著作',
 '數著名' => '數著名',
 '數著稱' => '數著稱',
@@ -15974,7 +15995,6 @@ public static $zh2HK = [
 '枕著述' => '枕著述',
 '枕著錄' => '枕著錄',
 '檯' => '枱',
-'台布' => '枱布',
 '台历' => '枱曆',
 '台灯' => '枱燈',
 '台面上' => '枱面上',
@@ -16101,6 +16121,8 @@ public static $zh2HK = [
 '活著者' => '活著者',
 '活著述' => '活著述',
 '活著錄' => '活著錄',
+'移动操作系统' => '流動作業系統',
+'行動作業系統' => '流動作業系統',
 '移动网络' => '流動網絡',
 '行動網路' => '流動網絡',
 '移动电话' => '流動電話',
@@ -16313,6 +16335,8 @@ public static $zh2HK = [
 '畫著稱' => '畫著稱',
 '畫著者' => '畫著者',
 '画里' => '畫裏',
+'唐納·川普' => '當勞·特朗普',
+'唐纳德·特朗普' => '當勞·特朗普',
 '當著' => '當着',
 '當著作' => '當著作',
 '過著作' => '當著作',
@@ -18118,6 +18142,9 @@ public static $zh2CN = [
 '哭著稱' => '哭著称',
 '哭著者' => '哭著者',
 '哭著述' => '哭著述',
+'唐納·川普' => '唐纳德·特朗普',
+'當勞·特朗普' => '唐纳德·特朗普',
+'當奴·特朗普' => '唐纳德·特朗普',
 '唱著' => '唱着',
 '唱著書' => '唱著书',
 '唱著作' => '唱著作',
@@ -18180,6 +18207,7 @@ public static $zh2CN = [
 '土魯斯' => '图卢兹',
 '吐瓦魯' => '图瓦卢',
 '原子筆' => '圆珠笔',
+'汕埠' => '圣佩德罗苏拉',
 '聖露西亞' => '圣卢西亚',
 '聖克里斯多福及尼維斯' => '圣基茨和尼维斯',
 '聖吉斯納域斯' => '圣基茨和尼维斯',
@@ -18204,6 +18232,7 @@ public static $zh2CN = [
 '艾菲爾' => '埃菲尔',
 '葉里溫' => '埃里温',
 '功能變數名稱' => '域名',
+'網域名稱' => '域名',
 '吉里巴斯' => '基里巴斯',
 '堂姊' => '堂姐',
 '坎培拉' => '堪培拉',
@@ -18783,6 +18812,7 @@ public static $zh2CN = [
 '數位技術' => '数字技术',
 '數位電視' => '数字电视',
 '數碼電視' => '数字电视',
+'數位音樂' => '数字音乐',
 '資料庫' => '数据库',
 '數著' => '数着',
 '數位照相機' => '数码照相机',
@@ -18964,10 +18994,10 @@ public static $zh2CN = [
 '梳著者' => '梳著者',
 '梳著述' => '梳著述',
 '梵谷' => '梵高',
-'機率' => '概率',
 '欠帳' => '欠账',
 '死帳' => '死账',
 '庇里牛斯' => '比利牛斯',
+'披索' => '比索',
 '畢卡索' => '毕加索',
 '茅利塔尼亞' => '毛里塔尼亚',
 '模里西斯' => '毛里求斯',
@@ -19406,6 +19436,8 @@ public static $zh2CN = [
 '葛摩' => '科摩罗',
 '象牙海岸' => '科特迪瓦',
 '積極份子' => '积极分子',
+'流動作業系統' => '移动操作系统',
+'行動作業系統' => '移动操作系统',
 '流動電話' => '移动电话',
 '行動電話' => '移动电话',
 '流動網絡' => '移动网络',
@@ -19609,6 +19641,8 @@ public static $zh2CN = [
 '螢光棒' => '荧光棒',
 '螢屏' => '荧屏',
 '霍爾斯坦' => '荷尔斯泰因',
+'荷里活廣場' => '荷里活广场',
+'荷里活道' => '荷里活道',
 '莫三比克' => '莫桑比克',
 '雷伊泰灣' => '莱特湾',
 '賴索托' => '莱索托',
index 525be3c..53c4cd5 100644 (file)
@@ -12,7 +12,7 @@
        "tog-watchlisthidecategorization": "midimut kasabelih kakuniza",
        "tog-showhiddencats": "paazih madimutay a kakuniza",
        "underline-always": "mahizatuay",
-       "underline-never": "caaytu",
+       "underline-never": "amana kanca caay",
        "editfont-default": "saazih sakaluk pataayaw tu kawaw a sulyang",
        "editfont-monospace": "malecad ilaed a kataci nu silit",
        "editfont-sansserif": "pacabay tu telay a kataci nu sulit",
        "toolbox": "sakaluk",
        "otherlanguages": "zumaay a kamu",
        "redirectedfrom": "(miliyawtu tazuma nay $1)",
-       "redirectpagesub": "miliyaw tazuma kasabelih",
-       "redirectto": "miliyaw tazuma tu:",
+       "redirectpagesub": "miliyaw patatuzu’",
+       "redirectto": "miliyaw patatuzu’ i:",
        "lastmodifiedat": "uyni kasabelih sazikuz mikawaway tu kalumyiti i $1 $2.",
        "protectedpage": "madiputay a kasabelih",
        "jumpto": "taayaw:",
        "toc": "dilyikotoling",
        "showtoc": "paazih",
        "hidetoc": "midimut",
+       "collapsible-collapse": "piked",
        "collapsible-expand": "micuwat",
        "confirmable-yes": "hang",
        "confirmable-no": "caay",
        "createacct-yourpasswordagain-ph": "pisulitan ku mima kinacacay aca",
        "userlogin-remembermypassword": "i balucu’en aku patalabu setyitase",
        "cannotlogin-title": "la’cus patalabu",
+       "cannotlogin-text": "la’cus patalabu.",
        "cannotloginnow-title": "la’cus patalabu ayza",
        "cannotcreateaccount-title": "la’cusay panganganen ku canghaw",
        "yourdomainname": "numisuay a calay-subal(wangyi):",
        "sig_tip": "misuay a sulit nu ngangan atu demiad, tuki",
        "hr_tip": "Sapisasuala (cayka yadah kawiza)",
        "summary": "pecu’ nu lacul:",
-       "subject": "taazihan tu kawaw:",
+       "subject": "satangahan:",
        "minoredit": "payni mikilulay a mikawaway-kalumyiti",
        "watchthis": "miazih tuyni kasabelih",
        "savearticle": "misuped kasabelih",
        "nextrevision": "kilulay masumad →",
        "currentrevisionlink": "sabaluhay masumad",
        "cur": "ayza",
-       "next": "nuzikuzan",
+       "next": "zikuzan a cacay",
        "last": "ayaway",
        "page_last": "sazikuzay a kasabelih",
        "history-fieldset-title": "mikilim masumad nu ayaway",
        "titlematches": "kasabelih satangah matatungus",
        "textmatches": "kasabelih lacul matatungus",
        "prevn": "ayaw saka {{PLURAL:$1|$1}}",
-       "nextn": "zikuzan saka {{PLURAL:$1|$1}}",
+       "nextn": "zikuzan a cacay {{PLURAL:$1|$1}}",
        "prev-page": "ayaway a belih",
        "next-page": "zikuzan a belih",
        "nextn-title": "nuzikuzan saka {{PLURAL:$1|a heci}}",
        "viewprevnext": "ciwsace ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong> uyni Wiki patizeng ku kasabelih  \"[[:$1]]\"!</strong>{{PLURAL:$2|0=| acasa miazih tu tatenga’ay patalabuay a matepa’ay a heci. |acasa miazih tu tatenga’ay zuma matepa’ay a heci.}}",
        "searchprofile-articles": "lacul kasabelih",
-       "searchprofile-images": "malocimyidiya",
+       "searchprofile-images": "kayadah-myiti",
        "searchprofile-everything": "hamin",
        "searchprofile-advanced": "tapabaw",
        "searchprofile-articles-tooltip": "i labu nu $1 mikilim",
        "searchresultshead": "kilim",
        "stub-threshold-sample-link": "maaziahan",
        "stub-threshold-disabled": "mapasatezep",
+       "timezonelegend": "tatukian a kakitizaan:",
        "localtime": "itiniay a tuki:",
        "servertime": "sefuci-kikay a tuki:",
        "timezoneregion-africa": "Afilika",
        "timezoneregion-america": "Amilikaco",
        "timezoneregion-antarctica": "Nancico",
-       "timezoneregion-arctic": "Sasaamisan",
+       "timezoneregion-arctic": "Sasaamisan nu kitakit",
        "timezoneregion-asia": "Yaco",
        "timezoneregion-australia": "Awco",
        "timezoneregion-europe": "Ouco",
        "group-suppress": "misisipay",
        "group-all": "(hamin)",
        "group-bot-member": "{{GENDER:$1|kikay a tademaw}}",
+       "group-bureaucrat-member": "{{GENDER:$1|situngusay-mikawaway}}",
        "grouppage-bot": "{{ns:project}}:kikay a tademaw",
        "grouppage-sysop": "{{ns:project}}:mikuwanay",
        "grouppage-bureaucrat": "{{ns:project}}:situngusay a mikawaway",
        "grant-uploadfile": "patapabaw ku baluhay a tangan",
        "grant-basic": "anganganay a tungus",
        "newuserlogpage": "patizeng misaungayay nasulitan nakawawan",
+       "action-read": "miasip tina kasabelih",
        "action-edit": "mikawaway-kalumyiti uyni a kasabelih",
+       "action-createpage": "patizeng tina kasabelih",
        "action-move-categorypages": "milimad kakuniza a kasabelih",
        "action-movefile": "milimad tina tangan",
        "action-upload": "patapabaw tina tangan",
+       "action-delete": "misipu tina kasabelih",
        "action-deleterevision": "misipu tu masumaday nu ayaway",
        "action-deletelogentry": "masipu nasulitan nazipa’an  kasacacay",
        "action-sendemail": "pabahel imyiyo(email)",
+       "action-purge": "misipu tina kasabelih",
        "nchanges": "$1 {{PLURAL:$1|misumad}}",
        "enhancedrc-history": "nazipa’an",
        "recentchanges": "capi a demaiday a sumad",
        "upload-file-error": "ilabuay a mungangaw",
        "upload-dialog-button-cancel": "palawpes",
        "upload-dialog-button-back": "tatiku",
-       "upload-dialog-button-done": "pahezek",
+       "upload-dialog-button-done": "malahecitu",
        "upload-dialog-button-save": "suped",
        "upload-dialog-button-upload": "patapabaw",
        "upload-form-label-infoform-title": "pulitaay a kalunasulitan",
        "upload-form-label-infoform-name": "kalungangan",
-       "upload-form-label-infoform-description": "patahkal",
+       "upload-form-label-infoform-description": "sapuelac",
        "upload-form-label-infoform-categories": "kakuniza",
        "upload-form-label-infoform-date": "demiad",
        "uploadstash": "patapabaw ku sulu nu pisipetan",
        "listfiles_name": "kalungangan",
        "listfiles_user": "misaungayay",
        "listfiles_size": "hacica-tabaki",
-       "listfiles_description": "patahkal",
+       "listfiles_description": "sapuelac",
        "listfiles_count": "baziyong",
        "listfiles-latestversion": "ayzaay a baziyong",
        "listfiles-latestversion-yes": "hang",
        "filehist": "tangan nu nazipa’an",
        "filehist-help": "sapecec ku demiad/tuki sapiciwsace ku tuki nina demiad a tangan baziyong",
        "filehist-deleteall": "haminan misipu",
+       "filehist-revert": "patiku",
        "filehist-current": "ayza",
        "filehist-datetime": "demiad/tuki",
        "filehist-thumb": "sukep tu zunga",
        "apihelp": "buhci tu kamu nu API",
        "apisandbox": "bunac haku nu API",
        "apisandbox-fullscreen": "micuwat tu sapat",
+       "apisandbox-unfullscreen": "paazih  kasabelih",
        "apisandbox-submit": "miawaw tu milunguc",
        "apisandbox-reset": "palawpis",
        "apisandbox-retry": "miliyaw mitaneng",
        "emailusernamesubmit": "patayzaan",
        "emailfrom": "patigamiay:",
        "emailto": "katukuh:",
-       "emailsubject": "taazihan tu kawaw:",
+       "emailsubject": "satangahan:",
        "emailmessage": "palatuh:",
        "emailsend": "patigamitu",
        "watchlist": "miazihay a piazihan tu sulit",
        "protect-othertime": "zuma a tatukian:",
        "protect-otherreason-op": "zuma a mahicaay",
        "protect-edit-reasonlist": "midiput a mahicaay nu mikawaway-kalumyiti",
-       "restriction-type": "pabeli tu kinli mahasa:",
+       "restriction-type": "tungus:",
        "restriction-level": "kelec kasaselal:",
        "minimum-size": "makaadidi’ay a sausi",
        "maximum-size": "sakatabakiay a sausi:",
        "restriction-create": "patizeng",
        "restriction-upload": "patapabaw",
        "restriction-level-sysop": "maenapay a diput",
-       "restriction-level-autoconfirmed": "madiputay a kasabelih - satizep mikawaway tu kalumyiti",
+       "restriction-level-autoconfirmed": "lalusa-diput",
        "restriction-level-all": "amahicahicaay a kasalelal",
        "undelete-fieldset-title": "patiku misumad nu ayaway",
        "undeletebtn": "patiku",
+       "undeleteinvert": "kabelihan mipili’",
        "undeletecomment": "mahicaay:",
        "undelete-search-submit": "kilim",
        "undelete-show-file-submit": "hang",
        "whatlinkshere-title": "masasiket tazumaay a \"$1\" kasabelih",
        "whatlinkshere-page": "Kasabelih:",
        "linkshere": "isasaay a kasabelih masasiket tazuma tu <strong>[[:$1]]</strong>:",
-       "isredirect": "miliyaw tazuma kasabelih",
+       "isredirect": "miliyaw patatuzu’",
        "istemplate": "palaculen tu kasabelih",
        "isimage": "tangan-tangan misiket",
        "whatlinkshere-prev": "saka {{PLURAL:$1|nuayaway}}",
        "ipb-confirm": "malucekay tu langat",
        "blockipsuccesssub": "milangat malahci",
        "ipb-edit-dropdown": "malangat a mahicaay nu mikawaway-kalumyiti",
+       "ipb-unblock-addr": "mihulak tu langat $1",
        "ipb-blocklist-duration-left": "$1 pakawili",
        "ipusubmit": "misipu tina langat",
        "autoblocklist-submit": "kilim",
        "noautoblockblock": "mapasatezep lunuk  milangat",
        "emailblock": "mapasatezep imyiyo(email)",
        "blocklink": "milangat",
+       "unblocklink": "mihulak tu langat",
        "change-blocklink": "misumad tu langat",
        "contribslink": "paanin",
        "emaillink": "pabahel imyiyo(email)",
        "allmessages-filter-translate": "mibelih",
        "thumbnail-more": "patabaki(micuwat)",
        "filemissing": "tangan mahedaw",
+       "thumbnail_image-missing": "tangan mahedaw: $1",
        "import": "pacumuden kasabelih",
        "import-interwiki-sourcepage": "saangangan kasabelih:",
        "import-interwiki-templates": "yamalyilu sacahamin  taazihan mitudung",
        "tooltip-ca-edit": "mikawaway-kalumyiti uyni a kasabelih",
        "tooltip-ca-viewsource": "uyni kasabelih madiputay tuway.\nkapah kisu miciwsace tuyni kasabelih sakatizeng bangu",
        "tooltip-ca-history": "uyini kasabelih nasawniay a sumad",
+       "tooltip-ca-protect": "midiput tina kasabelih",
+       "tooltip-ca-delete": "misipu tina kasabelih",
        "tooltip-ca-move": "milimad tina kasabelih",
        "tooltip-ca-watch": "paynien kasabelih micunus misuay cyinse piazihan tu sulit",
        "tooltip-search": "kilim {{SITENAME}}",
        "show-big-image-preview": "pataayaway miazih hacica ku tabaki: $1.",
        "show-big-image-size": "$1 × $2 syangsu",
        "file-info-gif-looped": "palalacalen",
-       "file-info-gif-frames": "$1 {{PLURAL:$1|misabacu}}",
-       "file-info-png-frames": "$1 {{PLURAL:$1|misabacu}}",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|kulit sapat}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|kulit sapat}}",
        "newimages": "baluhay tangan a sulu nu zunga",
        "newimages-legend": "kilim",
        "noimages": "inayi’ amahicahica tu zunga.",
        "gallery-slideshow-toggle": "ketun mibalic sukep tu zunga",
        "ilsubmit": "kilim",
        "bydate": "ahizan tu demiad",
+       "seconds": "$1 a {{PLURAL:$1|abeti}}",
        "minutes": "{{PLURAL:$1|$1 widi}}",
        "hours": "{{PLURAL:$1|$1 tuki}}",
        "days": "$1 {{PLURAL:$1|a demiad}}",
        "ago": "ayaw nu $1",
        "just-now": "nasawni",
+       "hours-ago": "ayaw $1 {{PLURAL:$1|a tuki}}",
+       "minutes-ago": "ayaw $1 {{PLURAL:$1|widi}}",
+       "seconds-ago": "ayaw $1 {{PLURAL:$1|a beti}}",
        "monday-at": "sakacacay a demiad nu lipay i$1",
        "friday-at": "sakalima a demied nu lipay i $1",
        "saturday-at": "sakaenem a demiad nu lipay i $1",
+       "sunday-at": "pilipayan i $1",
        "metadata": "pulita tu kalunasulitan",
        "metadata-help": "uyni tangan labuay amin yamalyilu zuma cesyun, uyni a cesyun akay nay suewyi  sasasing asaca sapisekyin i tapang asaca suwyihwa saayaw katukuh pahzekan a nakawawan mapacunusay. anu nay tangan saayaway setyitase masumadtu, hatizaay pulita kalunasulitan akay la’cus mileku mabetil a misumad tu tangan.",
+       "metadata-expand": "paazih pulita kalunasulitan",
+       "metadata-collapse": "midimut pulitaay a kalunasulitan",
        "metadata-fields": "i tini palatuh patahkal i labuay a EXIF pulita tu kalunasulitanay a kakitizaan, yamalyilu i zunga paazih kasabelih, sapipulita tu cudad nu nasulitan malepi’ paazih palatuh.\nzumaay a pulita tu cudad pataayaw tu kawaw midimut.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "ahebal",
        "exif-imagelength": "takalaw sulyang",
        "exif-gaincontrol": "makaazihay misimaw",
        "exif-contrast": "e-contrast",
        "exif-saturation": "matumesay a sulyang",
+       "exif-sharpness": "kacidem",
        "exif-devicesettingdescription": "sakaluk setin sapuelac",
+       "exif-subjectdistancerange": "baat nu tatizengan a liwliw",
        "exif-gpslatituderef": "pyiwyi asaca nanwyi",
        "exif-gpslongituderef": "tongcing asaca sicing",
        "exif-gpsaltituderef": "nutakalaw namakay bayu’ miazih tu tatenga’ay a sulyang",
        "exif-gpsdatestamp": "GPS a demiad",
        "exif-keywords": "aazihen dulit",
        "exif-worldregioncreated": "zunga masasing a kakitizaan",
+       "exif-countrycreated": "zunga masasingan a kanatal",
        "exif-provinceorstatecreated": "yakuwanan a sasing",
        "exif-citycreated": "yatukay a sasing",
        "exif-countrydest": "paazih tu kanatal",
        "exif-label": "aazihen paya",
        "exif-rightscertificate": "nisanga’an niza tu tungus a kawaw nu makuwanay a pincen",
        "exif-copyrighted": "nisanga’an niza tu tungus a kawaw setyitase",
+       "exif-copyrightowner": "nizaay nisanga’an tu tungus a kawaw",
        "exif-usageterms": "mamaala a cedang",
        "exif-webstatement": "nabalucu'an nu i telay nisanga’an niza tu tungus a kawaw",
        "exif-morepermissionsurl": "paliyuh pabeli tu kinli a cesyun",
        "exif-exposureprogram-4": "kiyata maluayaw",
        "exif-subjectdistance-value": "$1 mi",
        "exif-meteringmode-2": "pikuwanan pacunus lalet",
+       "exif-meteringmode-3": "baniyut-ditek",
+       "exif-meteringmode-4": "kayadah- baniyut-ditek",
        "exif-meteringmode-5": "muse",
+       "exif-meteringmode-6": "liyad",
        "exif-meteringmode-255": "zuma",
        "exif-lightsource-1": "likat",
        "exif-lightsource-2": "inkwang a tinghuy",
        "exif-lightsource-9": "cilalah a demiad",
        "exif-lightsource-10": "kenutan",
        "exif-lightsource-11": "iduutay",
+       "exif-lightsource-17": "tatungus likat nu dingki A",
+       "exif-lightsource-18": "tatungus likat nu dingki B",
+       "exif-lightsource-19": "tatungus likat nu dingki C",
        "exif-lightsource-255": "zuma katahkalan nu likat",
        "exif-flash-fired-0": "sabelabelatay a tinghui caay henay miwawah",
        "exif-flash-fired-1": "sabelabelatay a tinghui miwawah tuway",
        "exif-objectcycle-b": "namalanam atu namalahuk",
        "exif-gpsdirection-t": "tatengaay tatuzu’an",
        "exif-gpsdirection-m": "tatuzu'an nu tyice",
+       "exif-ycbcrpositioning-1": "teban",
        "exif-ycbcrpositioning-2": "palecad miala tu maaziahan",
        "exif-dc-contributor": "paaninay tu kalusasing",
        "exif-dc-date": "demiad",
        "exif-iimcategory-spo": "wundukay",
        "exif-iimcategory-wea": "demidad",
        "exif-urgency-normal": "tatungus ($1)",
+       "exif-urgency-low": "pu’nel ($1)",
        "exif-urgency-high": "takalaw ($1)",
        "namespacesall": "hamin",
        "monthsall": "hamin",
        "recreate": "miliyaw miteka patizeng",
+       "confirm-purge-title": "misipu tina kasabelih",
        "confirm_purge_button": "malucekay",
        "confirm-watch-button": "malucekay",
        "confirm-unwatch-button": "malucekay",
        "confirm-rollback-button": "malucekay",
        "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "ayaway cacay a belih",
        "imgmultipagenext": "zikuzan a belih →",
        "imgmultigo": "mileku!",
        "img-lang-default": "(pataayaw tu kawaw a kamu)",
        "ascending_abbrev": "masalaylay adidi’ay katukuh tabakiay",
        "descending_abbrev": "masalaylay tabakiay katukuh adidi’ay",
        "table_pager_next": "zikuzan a belih",
+       "table_pager_first": "sakacacay a belih",
        "table_pager_last": "sazikuzay a kasabelih",
        "table_pager_limit_label": "paybelih a sulit:",
        "table_pager_limit_submit": "mileku",
        "watchlistedit-normal-title": "miazihay a piazihan tu sulit nu mikawaway-kalumyiti",
        "watchlistedit-normal-submit": "misipu satangahan",
        "watchlistedit-clear-title": "misipu miazihay a piazihan tu sulit",
+       "watchlisttools-clear": "misipu miazihay a piazihan tu sulit",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1| sasukamu ]])",
        "timezone-local": "itizaay",
        "version": "baziyong",
        "version-skins": "malacul tu nuhekalan",
        "version-specialpages": "sazumaay a kasabelih",
        "version-parserhooks": "kulawid nu saheciay sakaluk",
+       "version-variables": "masumaday-sausi",
+       "version-antispam": "mitena’ tu babakahen a latuh",
        "version-other": "zuma",
        "version-mediahandlers": "myiti saungayay a sakaluk",
        "version-hooks": "kulawid",
        "version-skin-colheader-name": "nuhekalan",
        "version-ext-colheader-version": "baziyong",
        "version-ext-colheader-license": "sapabeli tu kinli a cedang",
-       "version-ext-colheader-description": "patahkal",
+       "version-ext-colheader-description": "sapuelac",
        "version-ext-colheader-credits": "masacudaday",
        "version-poweredby-others": "zuma",
        "version-software": "malacul tu ku zwanti",
        "version-libraries-library": "sulu nu cengse",
        "version-libraries-version": "baziyong",
        "version-libraries-license": "sapabeli tu kinli a cedang",
-       "version-libraries-description": "patahkal",
+       "version-libraries-description": "sapuelac",
        "version-libraries-authors": "masacudaday",
        "redirect-submit": "mileku",
+       "redirect-lookup": "palalitemuh tu kawaw:",
+       "redirect-value": "sulyang:",
        "redirect-page": "kasabelih ID",
        "redirect-file": "kalungangan nu tangan",
        "redirect-logid": "nasulitan nazipa’an ID",
        "tag-filter-submit": "kilim",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|aazihen paya’}}]]: $2)",
        "tag-mw-contentmodelchange": "lacul tatudungen misanga’  misumad",
+       "tags-title": "aazihen a paya",
        "tags-tag": "aazihen a paya  kalungangan",
        "tags-source-header": "saangangan",
+       "tags-active-header": "miwawah",
        "tags-actions-header": "saungay",
        "tags-active-yes": "hang",
        "tags-active-no": "caay",
        "logentry-move-move": "$1 {{GENDER:$2|milimad tuway}} kasabelih $3 katukuh $4",
        "logentry-newusers-create": "{{GENDER:$2|patizeng}} misaungayay canghaw tuway $1",
        "logentry-upload-upload": "$1 {{GENDER:$2|masayacay tuway}} $3",
+       "log-name-managetags": "aazihan a paya kuwan tu  nasulitan",
        "log-name-tag": "aazihen a paya nasulitan nazipa’an",
        "rightsnone": "(nayi’)",
        "feedback-back": "tatiku",
        "feedback-cancel": "palawpes",
-       "feedback-close": "pahezek",
+       "feedback-close": "malahecitu",
        "feedback-external-bug-report-button": "munday nu patubeli",
+       "feedback-dialog-title": "patahkal tu kamu mihwidubaku",
        "feedback-message": "palatuh:",
-       "feedback-subject": "taazihan tu kawaw:",
+       "feedback-subject": "satangahan:",
        "feedback-submit": "patayzaan",
        "feedback-thanks-title": "kukay tisuwanan!",
        "searchsuggest-search": "kilim {{SITENAME}}",
        "api-error-unknownerror": "caay kapulita ku mungangaw: \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|a beti}}",
+       "duration-minutes": "$1 {{PLURAL:$1|widi}}",
        "duration-hours": "$1 {{PLURAL:$1|tuki}}",
        "duration-weeks": "$1 {{PLURAL:$1|a lipas}}",
        "duration-years": "$1 {{PLURAL:$1|a mihca}}",
        "action-pagelang": "misumad kasabelih a kamu",
        "log-name-pagelang": "kamu misumad a nasulitan nazipa’an",
        "mediastatistics": "myiti sausi cesyun",
+       "mediastatistics-table-mimetype": "MIME nikalahizaan",
        "mediastatistics-table-extensions": "kapah saungay a mikilulay a ngangan nu tangan",
        "mediastatistics-table-count": "tangan nikayadah",
        "mediastatistics-table-totalbytes": "pulung sausi nu hacica-tabaki",
        "log-action-filter-all": "hamin",
        "log-action-filter-block-block": "milangat",
        "log-action-filter-block-reblock": "milangat tu sapisumad",
+       "log-action-filter-block-unblock": "mihulak tu langat",
        "log-action-filter-delete-delete": "misipu kasabelih",
        "log-action-filter-delete-delete_redir": "miliyaw patatuzu’ mipakutay tu sulit",
        "log-action-filter-delete-restore": "kasabelih milawpes tu sipu",
        "log-action-filter-managetags-create": "patizeng aazihen paya",
        "log-action-filter-managetags-delete": "misipu aazihen a paya",
        "log-action-filter-managetags-activate": "aazihen a paya miteka",
+       "log-action-filter-managetags-deactivate": "aazihan a paya palawpesen ku pisaungay",
        "log-action-filter-newusers-autocreate": "lunuk patizeng",
        "log-action-filter-patrol-patrol": "lima-saungay tayza mikibi",
        "log-action-filter-patrol-autopatrol": "lunuk tayza mikibi",
        "authmanager-provider-temporarypassword": "nanunuz a mima",
        "authprovider-confirmlink-request-label": "manakanca masasiket tu canghaw",
        "authprovider-resetpass-skip-label": "sekipo",
+       "authform-newtoken": "mahedaw mima-sacukcuk. $1",
        "authform-wrongtoken": "mima-sacukcuk mungangaw",
        "specialpage-securitylevel-not-allowed-title": "amana",
        "cannotauth-not-allowed-title": "caykataneng ku tungus",
-       "changecredentials": "misumad tu sapangangan",
+       "changecredentials": "misumad tu sapangangan-wacay",
        "removecredentials": "misipu sapangangan",
        "credentialsform-provider": "pincen nikalahizaan:",
        "credentialsform-account": "canghaw kalungangan:",
index d2173a2..3628ddf 100644 (file)
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (həmçinin bax: [[Special:NewPages|yeni səhifələrin siyahısı]])",
        "recentchanges-submit": "Göstər",
+       "rcfilters-legend-heading": "<strong>Abreviaturalar siyahısı:</strong>",
+       "rcfilters-other-review-tools": "<strong>Digər yoxlama alətləri</strong>",
+       "rcfilters-group-results-by-page": "Dəyişiklikləri səhifələrə görə qruplaşdır",
+       "rcfilters-grouping-title": "Qruplaşdırma",
+       "rcfilters-activefilters": "Aktiv filtrlər",
+       "rcfilters-advancedfilters": "Geniş filtr",
+       "rcfilters-limit-title": "Göstərilməli dəyişikliklər",
+       "rcfilters-limit-shownum": "Son {{PLURAL:$1|dəyişikliyi|$1 dəyişikliyi}} göstər",
+       "rcfilters-days-title": "Son günlər",
+       "rcfilters-hours-title": "Son saatlar",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|gün|gün}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|saat|saat}}",
+       "rcfilters-quickfilters": "Yaddaşdakı filtrlər",
+       "rcfilters-quickfilters-placeholder-title": "Yaddaşa verilmiş keçid yoxdur",
+       "rcfilters-quickfilters-placeholder-description": "Filtr nizamlamalarını yaddaşda saxlamaq və sonradan təkrar istifadə etmək üçün aşağıdakı Aktiv Filtrlər bölməsindəki əlfəcin nişanını tıqlayın.",
+       "rcfilters-savedqueries-remove": "Sil",
        "rcfilters-savedqueries-new-name-label": "Ad",
        "rcfilters-savedqueries-cancel-label": "Ləğv et",
+       "rcfilters-savedqueries-add-new-title": "Hazırkı filtr nizamlamalarını yaddaşa ver",
+       "rcfilters-restore-default-filters": "Standart filtrləri bərpa et",
+       "rcfilters-clear-all-filters": "Bütün filtrləri sil",
+       "rcfilters-show-new-changes": "Ən son dəyişiklikləri göstər",
+       "rcfilters-search-placeholder": "Son dəyişiklikləri filtrlə (siyahıdan seçin və ya yazın)",
+       "rcfilters-empty-filter": "Aktiv filtr yoxdur. Bütün redaktələr göstərilir.",
        "rcfilters-filterlist-title": "Filtrlər",
+       "rcfilters-filterlist-feedbacklink": "Bu (yeni) filtrasiya alətləri barədə fikirlərinizi bizimlə bölüşün",
+       "rcfilters-highlightbutton-title": "Nəticələri vurğula",
+       "rcfilters-highlightmenu-title": "Rəng seçin",
+       "rcfilters-highlightmenu-help": "Bu xüsusiyyəti rəngləmək üçün rəng seçin",
+       "rcfilters-filtergroup-authorship": "Redaktələrin müəllifliyi",
+       "rcfilters-filter-editsbyself-label": "Öz dəyişiklikləriniz",
+       "rcfilters-filter-editsbyother-label": "Başqalarının dəyişiklikləri",
+       "rcfilters-filtergroup-userExpLevel": "İstifadəçi qeydiyyatı və təcrübəsi",
+       "rcfilters-filter-user-experience-level-registered-label": "Qeydiyyatlı",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Qeydiyyatsız",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Təcrübəsizlər",
+       "rcfilters-filter-user-experience-level-learner-label": "Öyrənənlər",
+       "rcfilters-filter-user-experience-level-experienced-label": "Təcrübəli istifadəçilər",
+       "rcfilters-filtergroup-automated": "Avtomatik redaktələr",
        "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-humans-label": "İnsan (qeyri-bot)",
+       "rcfilters-filtergroup-significance": "Əhəmiyyətlilik",
        "rcfilters-filter-minor-label": "Kiçik redaktələr",
+       "rcfilters-filter-major-label": "Adi redaktələr",
+       "rcfilters-filtergroup-watchlist": "İzləmə siyahısındakı səhifələr",
+       "rcfilters-filter-watchlist-watched-label": "İzləmə siyahısında olan",
+       "rcfilters-filter-watchlist-watchednew-label": "İzləmə siyahısında yeni redaktələr",
+       "rcfilters-filter-watchlist-notwatched-label": "İzləmə siyahısında olmayan",
+       "rcfilters-filtergroup-changetype": "Dəyişiklik növü",
+       "rcfilters-filter-pageedits-label": "Səhifə redaktələri",
+       "rcfilters-filter-newpages-label": "Səhifə yaradılmaları",
+       "rcfilters-filter-categorization-label": "Kateqoriya dəyişiklikləri",
+       "rcfilters-filter-logactions-label": "Qeydiyyatlı redaktələr",
+       "rcfilters-filter-logactions-description": "İnzibati tədbirlər, hesab yaradılmaları, səhifə silinmələri, yükləmələr…",
+       "rcfilters-filtergroup-lastRevision": "Son versiyalar",
+       "rcfilters-filter-lastrevision-label": "Hazırkı versiya",
+       "rcfilters-filter-previousrevision-label": "Sonuncu olmayan versiya",
+       "rcfilters-exclude-button-off": "Seçilənləri istisna et",
+       "rcfilters-exclude-button-on": "Seçilmişlərin çıxarılması",
+       "rcfilters-view-advanced-filters-label": "Genişləndirilmiş filtrlər",
+       "rcfilters-view-tags": "Etiketlənmiş redaktələr",
+       "rcfilters-view-namespaces-tooltip": "Nəticələri adlar fəzasına görə filtrlə",
+       "rcfilters-view-tags-tooltip": "Nəticələri redaktə etiketləri əsasında filtrlə",
        "rcnotefrom": "Aşağıda <strong>$2</strong>-dən bu yana olan dəyişikliklər göstərilib (<strong>$1</strong>-dən çox olmayaraq).",
        "rclistfrom": "$3 $2 vaxtından başlayaraq yeni dəyişiklikləri göstər",
        "rcshowhideminor": "Kiçik redaktələri $1",
        "recentchangeslinked-summary": "Aşağıdakı siyahı, qeyd olunan səhifəyə (və ya qeyd olunan kateqoriyadakı səhifələrə) daxili keçid verən səhifələrdə edilmiş son dəyişikliklərin siyahısıdır.\n[[Special:Watchlist|İzləmə siyahınızdakı]] səhifələr '''qalın''' şriftlə göstərilmişdir.",
        "recentchangeslinked-page": "Səhifə adı:",
        "recentchangeslinked-to": "Qeyd olunan səhifədəki deyil, ona daxili keçid verən səhifələrdəki dəyişiklikləri göstər",
+       "recentchanges-page-added-to-category": "[[:$1]] kateqoriyaya əlavə edildi",
        "upload": "Fayl yüklə",
        "uploadbtn": "Sənəd yüklə",
        "reuploaddesc": "Return to the upload form.",
index e21d635..8b650ca 100644 (file)
        "search-interwiki-caption": "قارداش پروژه‌لر",
        "search-interwiki-default": "$1 دان سونوجلار:",
        "search-interwiki-more": "(داها)",
-       "search-interwiki-more-results": "داها چوْخ سوْنوج‌لار",
+       "search-interwiki-more-results": "داها چوْخ نتیجه‌لر",
        "search-relatedarticle": "ایلگیلی",
        "searchrelated": "ایلگیلی",
        "searchall": "بوتون",
        "prefs-help-prefershttps": "سیزین بو ترجیحینیزین اثری سیزین سونراکی گیریشینیز دن سونرا اولاجاق.",
        "prefswarning-warning": "ترجیحلرینیزه اولان دَییشیک لر هله آرتیریلمیب.\nایر بو صفحه نین \"$1\" اوستونه باسیلمامیشدان اونجه ترک ائتسز ترجیحلرینیز آرتیریلمییاجاق.",
        "prefs-tabs-navigation-hint": "ایپ اوجو : سیز ائلیه بیلرسیز ساغ و سول جهت نیما کیلید لریندن نیشانه نه نین دولانماسی نیشانه لر لیستینده ایستفاده ائده سیز.",
-       "userrights": "ایشلدیجی حاقلاری",
-       "userrights-lookup-user": "بیر ایشدیجی سئچ",
+       "userrights": "ایشلدن حاقلاری",
+       "userrights-lookup-user": "بیر ایشلدن سئچ",
        "userrights-user-editname": "ایستیفاده‌چی آدی‌نیزی یازین",
        "editusergroup": "ایستیفاده‌چی قروپونو دَییشدیر",
        "editinguser": "ایستیفاده‌چی '[[User:$1|$1]]' $2 اوچون ایستیفاده‌چی حقوق‌لاری دییشدیریلیر",
        "userrights-changeable-col": "ديَیشدیره بیلدیگینیز قروپلار",
        "userrights-unchangeable-col": "ديَیشدیره بیلمه‌دیگینیز قروپلار",
        "userrights-expiry-current": "$1-ده قۇرتولور",
-       "userrights-expiry-othertime": "باشÙ\82ا Ù\88اخت",
+       "userrights-expiry-othertime": "Ø¢Û\8cرÛ\8c Ú\86اغ",
        "userrights-conflict": "ایستیفاده‌چی حاقلاری توققوشماسی! لوطفاً گوزله ین و دَییشدیرمه‌لرینیزی یئنی‌دن ائدین.",
        "group": "گروه:",
        "group-user": "ایستفاده‌چیلر",
index ce6ae9e..de3c418 100644 (file)
        "parser-template-loop-warning": "Выяўлены цыкль у шаблёнах: [[$1]]",
        "template-loop-category": "Старонкі з цыклямі шаблёнаў",
        "template-loop-category-desc": "Старонка ўтрымлівае цыкль шаблёну, г. зн., шаблён уключае сам сябе рэкурсіўна.",
+       "template-loop-warning": "<strong>Папярэджаньне:</strong> гэтая старонка выклікае [[:$1]], які зьяўляецца прычынай цыклю шаблёнаў (бясконцы рэкурсіўны выклік).",
        "parser-template-recursion-depth-warning": "Перавышаны ліміт глыбіні рэкурсіі шаблёну ($1)",
        "language-converter-depth-warning": "Перавышанае абмежаваньне глыбіні канвэртару варыянтаў мовы ($1)",
        "node-count-exceeded-category": "Старонкі зь перавышанай колькасьцю вузлоў",
        "rcfilters-watchlist-markseen-button": "Пазначыць усе зьмены як прагледжаныя",
        "rcfilters-watchlist-edit-watchlist-button": "Рэдагаваць ваш сьпіс назіраньня за старонкамі",
        "rcfilters-watchlist-showupdated": "Зьмены старонак, якія вы не наведвалі пасьля гэтых зьменаў, пазначаныя <strong>тоўстым</strong> з адпаведнымі пазнакамі.",
+       "rcfilters-preference-label": "Схаваць палепшаную вэрсію апошніх зьменаў",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
        "rclistfromreset": "Скінуць выбар даты",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "cannotlink-no-provider-title": "Няма рахункаў для далучэньня",
        "cannotlink-no-provider": "Няма рахункаў для далучэньня.",
        "linkaccounts": "Далучэньне рахункаў",
-       "linkaccounts-success-text": "Рахунак быў далучаны."
+       "linkaccounts-success-text": "Рахунак быў далучаны.",
+       "linkaccounts-submit": "Далучыць рахункі"
 }
index 6812863..77d0083 100644 (file)
@@ -71,6 +71,7 @@
        "tog-watchlisthideminor": "অনুল্লেখ্য সম্পাদনাগুলো নজরতালিকায় লুকিয়ে রাখা হোক",
        "tog-watchlisthideliu": "অ্যাকাউন্টে প্রবেশকৃত ব্যবহারকারীদের সম্পাদনাগুলি নজরতালিকায় লুকিয়ে রাখা হোক",
        "tog-watchlistreloadautomatically": "প্রতিবার একটি ছাঁকনি পরিবর্তন হওয়া মাত্রই স্বয়ংক্রিয়ভাবে নজরতালিকাটি পুনঃলোড করা হোক (জাভাস্ক্রিপ্ট প্রয়োজন)",
+       "tog-watchlistunwatchlinks": "নজরতালিকার ভুক্তিতে সরাসরি দেখা/না দেখার সংযোগ যুক্ত করুন (এই কার্যকারিতা জন্য জাভাস্ক্রিপ্ট প্রয়োজন)",
        "tog-watchlisthideanons": "বেনামী ব্যবহারকারীদের সম্পাদনাগুলি নজরতালিকায় আড়ালে রাখা হোক",
        "tog-watchlisthidepatrolled": "পরীক্ষিত সম্পাদনাগুলি নজরতালিকায় লুকিয়ে রাখা হোক",
        "tog-watchlisthidecategorization": "পাতার শ্রেণীবদ্ধকরণ লুকিয়ে রাখা হোক",
        "permissionserrorstext-withaction": "আপনার $2 অনুমতি নেই, যার {{PLURAL:$1|কারণটি|কারণগুলি}} হল:",
        "contentmodelediterror": "আপনি এই পুনর্বিবেচনা সম্পাদনা করতে পারবেন না কারণ এর বিষয়বস্তু মডেল <code>$1</code>, যা বর্তমান বিষয়বস্তু মডেল <code>$2</code>-এর থেকে ভিন্ন।",
        "recreate-moveddeleted-warn": "'''সতর্কীকরণ: আপনি এমন একটি পাতা পুনরায় তৈরি করছেন যা পূর্বে অপসারণ করা হয়েছিল।'''\n\nআপনি পাতাটি সম্পাদনা চালিয়ে যাওয়া ঠিক হবে কিনা, তা বিবেচনা করুন।\nআপনার সুবিধার্থে পাতাটির অপলুপ্তি লগ এখানে দেয়া হলো:",
-       "moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এ পাতার অবলুপ্তি লগ দেওয়া হলো।",
+       "moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এই পাতার অপসারণ, সুরক্ষা ও স্থানান্তর লগ দেওয়া হলো।",
        "moveddeleted-notice-recent": "দুঃখিত, এই পাতাটি সাম্প্রতি অপসারিত হয়েছে (সর্বশেষ ২৪ ঘণ্টায়)।\nসূত্র হিসেবে নিচে এই পাতা অপসারণ, সুরক্ষা ও স্থানান্তর লগ দেয়া হয়েছে।",
        "log-fulllog": "সম্পূর্ণ লগ দেখুন",
        "edit-hook-aborted": "হূক দ্বারা সম্পাদনা পরিত্যক্ত হয়েছে।\nএর কোন ব্যাখ্যা নাই।",
        "rcfilters-savedqueries-new-name-label": "নাম",
        "rcfilters-savedqueries-new-name-placeholder": "ছাঁকনির উদ্দেশ্য বর্ণনা করুন",
        "rcfilters-savedqueries-apply-label": "ছাঁকনি তৈরি করুন",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "পূর্বনির্ধারিত ছাঁকনি তৈরি করুন",
        "rcfilters-savedqueries-cancel-label": "বাতিল",
        "rcfilters-savedqueries-add-new-title": "বর্তমান ছাঁকনির সেটিং সংরক্ষণ করুন",
        "rcfilters-restore-default-filters": "পূর্বনির্ধারিত ছাঁকনি পুনরুদ্ধার করুন",
        "rcfilters-filterlist-noresults": "কোনও ছাঁকনি পাওয়া যায়নি",
        "rcfilters-noresults-conflict": "কোনও ফলাফল পাওয়া যায়নি কারণ অনুসন্ধানের মাপকাঠিগুলির মধ্যে সংঘর্ষ আছে",
        "rcfilters-state-message-subset": "এই ছাঁকনিটির কোন প্রভাব নেই কারণ এর ফলাফলগুলি নিম্নোক্ত বৃহত্তর পরিধির {{PLURAL:$2|ছাঁকনিটির|ছাঁকনিগুলির}} মধ্যে অন্তর্ভুক্ত আছে (আলোকপাত করে এটিকে আলাদা করে দেখার চেষ্টা করুন): $1",
-       "rcfilters-state-message-fullcoverage": "à¦\95à§\8bন à¦¦à¦²à§\87র à¦¸à¦®à¦¸à§\8dত à¦\9bাà¦\81à¦\95নি à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦\95রা à¦\8fবà¦\82 à¦\95à§\8bন à¦\9bাà¦\81à¦\95নিà¦\87 à¦¨à¦¿à¦°à§\8dবাà¦\9aন না করা একই কথা, তাই এই ছাঁকনিটির কোন প্রভাব নেই। এই দলে অন্তর্ভুক্ত ছাঁকনিগুলি হল: $1",
+       "rcfilters-state-message-fullcoverage": "à¦\8fà¦\87 à¦¦à¦²à§\87র à¦¸à¦®à¦¸à§\8dত à¦\9bাà¦\81à¦\95নি à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦\95রা, না করা একই কথা, তাই এই ছাঁকনিটির কোন প্রভাব নেই। এই দলে অন্তর্ভুক্ত ছাঁকনিগুলি হল: $1",
        "rcfilters-filtergroup-authorship": "কার দ্বারা পরিবর্তিত",
        "rcfilters-filter-editsbyself-label": "আপনার দ্বারা পরিবর্তিত",
        "rcfilters-filter-editsbyself-description": "আপনার নিজস্ব অবদান।",
        "rcfilters-filter-watchlist-notwatched-label": "নজরতালিকাভুক্ত নয়",
        "rcfilters-filter-watchlist-notwatched-description": "আপনার নজরতালিকায় থাকা পাতাগুলি ব্যতীয় সবকিছু।",
        "rcfilters-filtergroup-watchlistactivity": "নজরতালিকার কার্যক্রম",
+       "rcfilters-filter-watchlistactivity-unseen-label": "অদেখা পরিবর্তন",
+       "rcfilters-filter-watchlistactivity-seen-label": "দেখা পরিবর্তন",
        "rcfilters-filtergroup-changetype": "পরিবর্তনের ধরন",
        "rcfilters-filter-pageedits-label": "পাতার সম্পাদনা",
        "rcfilters-filter-pageedits-description": "উইকি বিষয়বস্তু, আলোচনা, বিষয়শ্রেণীর বিবরণ... ইত্যাদিতে সম্পাদনা",
        "rcfilters-tag-prefix-namespace-inverted": "$1 <strong>:নয়</strong>",
        "rcfilters-view-advanced-filters-label": "উন্নত ছাঁকনি",
        "rcfilters-view-tags": "ট্যাগকৃত সম্পাদনা",
+       "rcfilters-view-namespaces-tooltip": "নামস্থান অনুযায়ী ফলাফল ছাঁকুন",
        "rcfilters-view-tags-tooltip": "সম্পাদনা ট্যাগ ব্যবহার করে ফলাফল ছাঁকুন",
        "rcfilters-view-return-to-default-tooltip": "মূল ছাঁকনির মেনুতে ফিরুন",
        "rcfilters-liveupdates-button": "সরাসরি হালনাগাদ",
        "rcfilters-liveupdates-button-title-on": "সরাসরি হালনাগাদ বন্ধ করুন",
+       "rcfilters-watchlist-markseen-button": "দেখা হিসাবে সব পরিবর্তন চিহ্নিত করুন",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
        "rclistfromreset": "তারিখ নির্বাচন পুনঃস্থাপন করুন",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "unwatchthispage": "নজর সরিয়ে নিন",
        "notanarticle": "বিষয়বস্তু পাতা নয়",
        "notvisiblerev": "অপর একজন ব্যবহারকারী কর্তৃক প্রণীত সর্বশেষ সংস্করণটি অপসারিত হয়েছে",
-       "watchlist-details": "à¦\86পনার à¦¨à¦\9cরতালিà¦\95াতà§\87 {{PLURAL:$1|$1à¦\9fি à¦ªà¦¾à¦¤à¦¾}} à¦\86à¦\9bà§\87 (à¦\86লাপ à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি à¦\97ণনায় à¦¨à¦¾ à¦§à¦°à§\87)।",
+       "watchlist-details": "à¦\86পনার à¦¨à¦\9cরতালিà¦\95ায় {{PLURAL:$1|$1à¦\9fি à¦ªà¦¾à¦¤à¦¾}} à¦\86à¦\9bà§\87 (à¦\86লাপ à¦ªà¦¾à¦¤à¦¾à¦¸à¦¹)।",
        "wlheader-enotif": "ইমেল বিজ্ঞপ্তি সক্রিয় করা আছে।",
        "wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
        "wlnote": "নিচে $3, $4 তারিখ থেকে বিগত {{PLURAL:$2|১ ঘন্টায়|<strong>$2</strong> ঘন্টায়}} সংঘটিত {{PLURAL:$1|শেষ ১টি পরিবর্তন|শেষ <strong>$1টি</strong> পরিবর্তন}} দেখানো হল।",
        "compare-title-not-exists": "আপনার কাঙ্ক্ষিত শিরোনামটি নেই।",
        "compare-revision-not-exists": "আপনার কাঙ্ক্ষিত সংস্করণটি নেই।",
        "diff-form": "পার্থক্য",
+       "diff-form-submit": "পার্থক্য দেখান",
+       "permanentlink": "স্থায়ী সংযোগ",
+       "permanentlink-revid": "সংশোধন আইডি",
        "permanentlink-submit": "এই সংশোধনে যান",
        "dberr-problems": " দুঃখিত! এই সাইটটি বর্তমানে কারীগরী অসুবিধার মুখোমুখি হয়েছে।",
        "dberr-again": "কয়েক মিনিট পর পুনরায় পরিদর্শনের চেষ্টা করুন।",
        "undelete-cantedit": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ আপনার এই পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "undelete-cantcreate": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ এই নামে কোন পাতা বিদ্যমান নেই ও আপনার এই পাতাটি তৈরি করার অনুমতি নেই।",
        "pagedata-title": "পাতার উপাত্ত",
+       "pagedata-not-acceptable": "কোন মিলে যাওয়া বিন্যাস পাওয়া যায় নি। সমর্থিত MIME ধরনগুলি হল: $1",
        "pagedata-bad-title": "অপ্রযোজ্য শিরোনাম: \"$1\""
 }
index d99bf55..b53395e 100644 (file)
@@ -56,7 +56,8 @@
                        "Jaumeortola",
                        "Kippelboy",
                        "Syum90",
-                       "Xð"
+                       "Xð",
+                       "Abella"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "hidden-category-category": "Categories ocultes",
        "category-subcat-count": "{{PLURAL:$2|Aquesta categoria només té la següent subcategoria.|Aquesta categoria conté {{PLURAL:$1|la següent subcategoria|les següents $1 subcategories}}, d'un total de $2.}}",
        "category-subcat-count-limited": "Aquesta categoria conté {{PLURAL:$1|la següent subcategoria|les següents $1 subcategories}}.",
-       "category-article-count": "{{PLURAL:$2|Aquesta categoria només té la pàgina següent.|{{PLURAL:$1|La pàgina següent és|Les $1 pàgines següents són}} dins d’aquesta categoria, d’un total de $2.}}",
+       "category-article-count": "{{PLURAL:$2|Aquesta categoria només conté la pàgina següent.|{{PLURAL:$1|La pàgina és|Les $1 pàgines són}} dins d'aquesta categoria, d'un total de $2.}}",
        "category-article-count-limited": "{{PLURAL:$1|La següent pàgina és|Les següents $1 pàgines són}} dins la categoria actual.",
-       "category-file-count": "{{PLURAL:$2|Aquesta categoria només té el fitxer següent.|{{PLURAL:$1|El fitxer següent és|Els $1 fitxers següents són}} dins d’aquesta categoria, d’un total de $2.}}",
+       "category-file-count": "{{PLURAL:$2|Aquesta categoria només conté el fitxer següent.|{{PLURAL:$1|El fitxer és|Els $1 fitxers són}} dins d'aquesta categoria, d'un total de $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|El següent fitxer és|Els següents $1 fitxers són}} dins la categoria actual.",
        "listingcontinuesabbrev": " cont.",
        "index-category": "Pàgines indexades",
        "viewhelppage": "Visualitza la pàgina d'ajuda",
        "categorypage": "Visualitza la pàgina de la categoria",
        "viewtalkpage": "Visualitza la pàgina de discussió",
-       "otherlanguages": "En altres llengües",
+       "otherlanguages": "En altres idiomes",
        "redirectedfrom": "(S'ha redirigit des de: $1)",
        "redirectpagesub": "Pàgina de redirecció",
        "redirectto": "Redirigeix a:",
        "lastmodifiedat": "La pàgina va ser modificada per darrera vegada el $1 a les $2.",
        "viewcount": "S'ha visitat aquesta pàgina {{PLURAL:$1|una vegada|$1 vegades}}.",
        "protectedpage": "Pàgina protegida",
-       "jumpto": "Dreceres ràpides:",
+       "jumpto": "Salta a:",
        "jumptonavigation": "navegació",
        "jumptosearch": "cerca",
        "view-pool-error": "Disculpeu, els servidors es troben sobrecarregats.\nMassa usuaris estan tractant d'accedir a aquesta pàgina.\nPer favor, esperau una mica abans de tornar a accedir a aquesta pàgina.\n\n$1",
        "pool-servererror": "El servei de recompte de la reserva no és disponible ($1).",
        "poolcounter-usage-error": "Error d'ús: $1",
        "aboutsite": "Quant al projecte {{SITENAME}}",
-       "aboutpage": "Project:Quant a",
+       "aboutpage": "Project:Quant al",
        "copyright": "El contingut està disponible sota la llicència $1 si no s'indica el contrari.",
        "copyrightpage": "{{ns:project}}:Drets d'autor",
        "currentevents": "Actualitat",
        "currentevents-url": "Project:Actualitat",
-       "disclaimers": "Avís general",
-       "disclaimerpage": "Project:Avís general",
+       "disclaimers": "Renúncies",
+       "disclaimerpage": "Project:Descàrrec general",
        "edithelp": "Ajuda per a l'edició",
        "helppage-top-gethelp": "Ajuda",
        "mainpage": "Pàgina principal",
        "feed-invalid": "La subscripció no és vàlida pel tipus de sindicament.",
        "feed-unavailable": "Els canals de sindicació no estan disponibles",
        "site-rss-feed": "Canal RSS $1",
-       "site-atom-feed": "Canal Atom $1",
+       "site-atom-feed": "Font Atom $1",
        "page-rss-feed": "«$1» RSS Feed",
        "page-atom-feed": "Canal Atom «$1»",
        "feed-atom": "Atom",
        "recentchanges-page-removed-from-category": "[[:$1]] treta de la categoria",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] treta de la categoria, [[Special:WhatLinksHere/$1|aquesta pàgina està inclosa en d'altres]]",
        "autochange-username": "Canvi automàtic del MediaWiki",
-       "upload": "Carregueu un fitxer",
+       "upload": "Pujar un fitxer",
        "uploadbtn": "Carrega un fitxer",
        "reuploaddesc": "Torna al formulari per apujar.",
        "upload-tryagain": "Envia la descripció del fitxer modificat",
        "tooltip-pt-login": "Us animem a registrar-vos, però no és obligatori",
        "tooltip-pt-login-private": "Cal que inicieu una sessió per a utilitzar aquest wiki",
        "tooltip-pt-logout": "Finalitza la sessió d'usuari",
-       "tooltip-pt-createaccount": "Us animem a què creeu un compte i inicieu sessió, encara que no és obligatori",
+       "tooltip-pt-createaccount": "Us animem a què creeu un compte i inicieu una sessió, encara que no és obligatori",
        "tooltip-ca-talk": "Discussió sobre el contingut d'aquesta pàgina",
        "tooltip-ca-edit": "Modifica aquesta pàgina",
        "tooltip-ca-addsection": "Comença una secció nova",
        "tooltip-search-fulltext": "Cerca aquest text a les pàgines",
        "tooltip-p-logo": "Visiteu la pàgina principal",
        "tooltip-n-mainpage": "Visiteu la pàgina principal",
-       "tooltip-n-mainpage-description": "Vegeu la pàgina principal",
-       "tooltip-n-portal": "Sobre el projecte, què podeu fer, on podeu trobar coses",
+       "tooltip-n-mainpage-description": "Visiteu la pàgina principal",
+       "tooltip-n-portal": "Sobre el projecte, què podeu fer, on trobareu les coses",
        "tooltip-n-currentevents": "Per trobar informació general sobre l'actualitat",
-       "tooltip-n-recentchanges": "Llista de canvis recents al wiki",
+       "tooltip-n-recentchanges": "Una llista dels canvis recents al wiki",
        "tooltip-n-randompage": "Carrega una pàgina a l’atzar",
-       "tooltip-n-help": "El lloc per saber més coses",
-       "tooltip-t-whatlinkshere": "Llista de totes les pàgines wiki que enllacen aquí",
+       "tooltip-n-help": "El lloc per saber més coses",
+       "tooltip-t-whatlinkshere": "Una llista de totes les pàgines wiki que enllacen amb aquesta",
        "tooltip-t-recentchangeslinked": "Canvis recents a pàgines enllaçades des d'aquesta pàgina",
        "tooltip-feed-rss": "Canal RSS d'aquesta pàgina",
        "tooltip-feed-atom": "Canal Atom d'aquesta pàgina",
        "tooltip-t-contributions": "Llista de les contribucions d'{{GENDER:$1|aquest usuari|aquesta usuària}}",
        "tooltip-t-emailuser": "Envia un correu a {{GENDER:$1|aquest usuari|aquesta usuària}}",
        "tooltip-t-info": "Més informació sobre aquesta pàgina",
-       "tooltip-t-upload": "Carregueu fitxers",
-       "tooltip-t-specialpages": "Llista de totes les pàgines especials",
+       "tooltip-t-upload": "Pujar alguns fitxers",
+       "tooltip-t-specialpages": "Llista totes les pàgines especials",
        "tooltip-t-print": "Versió per a impressió d'aquesta pàgina",
        "tooltip-t-permalink": "Enllaç permanent a aquesta versió de la pàgina",
        "tooltip-ca-nstab-main": "Vegeu el contingut de la pàgina",
index c66fdf9..405e14f 100644 (file)
        "unwatch": "Òprzestôj ùzerac",
        "unwatchthispage": "Òprzestôj ùzerac ną starnã",
        "notanarticle": "To nie je artikel",
-       "watchlist-details": "Twòjô lësta ùzérónych starnów zamëkô w se {{PLURAL:$1|$1 pozycjã|$1 pozycje|$1 pozycjów}}, nie rechùjąc diskùsëjów.",
+       "watchlist-details": "{{PLURAL:$1|Starna je |$1 Starnë są}} na twòji lësce ùzérónych starnów (diskùsëji téż)",
        "wlheader-showupdated": "Artiklë jakczé òstałë zmienioné òd Twòji slédny wizytë są wëapratnioné <strong>pògrëbieniém</strong>",
        "wlnote": "Niżi môsz wëskrzënioné {{PLURAL:$1|slédną zmianã|<strong>$1</strong> slédnëch zmianów}} zrobioné òb {{PLURAL:$2|gòdzënã|<strong>$2</strong> gòdzënë/gòdzënów}}, rëchùjąc òd $3 dnia $4.",
        "wlshowlast": "Wëskrzëni zjinaczi z $1 gòdzënów $2 dni",
index e0a83eb..162c4c2 100644 (file)
        "parser-template-loop-warning": "Vorlagenschleife entdeckt: [[$1]]",
        "template-loop-category": "Seiten mit Vorlagenschleifen",
        "template-loop-category-desc": "Die Seite enthält eine Vorlagenschleife, z.&nbsp;B. eine Vorlage, die sich selbst rekursiv aufruft.",
+       "template-loop-warning": "<strong>Warnung:</strong> Diese Seite ruft [[:$1]] auf, die eine Vorlagenschleife verursacht (ein unendlicher rekursiver Aufruf).",
        "parser-template-recursion-depth-warning": "Vorlagenrekursionstiefengrenze überschritten ($1)",
        "language-converter-depth-warning": "Sprachkonvertertiefenlimit überschritten ($1)",
        "node-count-exceeded-category": "Seiten, die die Knotenanzahl überschritten haben",
        "rcfilters-watchlist-markseen-button": "Alle Änderungen als gesehen markieren",
        "rcfilters-watchlist-edit-watchlist-button": "Deine Liste der beobachteten Seiten bearbeiten",
        "rcfilters-watchlist-showupdated": "Änderungen an Seiten, die du seit ihrem Auftreten nicht besucht hast, sind <strong>fett</strong> markiert.",
+       "rcfilters-preference-label": "Die verbesserte Version der Letzten Änderungen ausblenden",
+       "rcfilters-preference-help": "Macht die Neugestaltung der Oberfläche aus dem Jahr 2017 und alle seitdem hinzugefügten Werkzeuge wieder rückgängig.",
        "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfromreset": "Datumsauswahl zurücksetzen",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
index f6242e3..9493dd4 100644 (file)
        "parser-template-loop-warning": "Modèle en boucle détecté : [[$1]]",
        "template-loop-category": "Pages avec des boucles de modèle",
        "template-loop-category-desc": "La page contient une boucle dans le modèle, c.à.d. un modèle qui s’appelle lui-même récursivement.",
+       "template-loop-warning": "<strong>Avertissement :</strong> Cette page appelle [[:$1]] ce qui provoque une boucle de modèles (un appel récursif infini).",
        "parser-template-recursion-depth-warning": "Limite de profondeur des appels récursifs de modèles dépassée ($1)",
        "language-converter-depth-warning": "Limite de profondeur du convertisseur de langue dépassée ($1)",
        "node-count-exceeded-category": "Pages dépassant le nombre de nœuds maximal",
        "rcfilters-watchlist-markseen-button": "Marquer toutes les modifications comme vues",
        "rcfilters-watchlist-edit-watchlist-button": "Modifier votre liste de pages suivies",
        "rcfilters-watchlist-showupdated": "Les modifications faites aux pages que vous n’avez pas visitées depuis qu’elles ont été modifiées sont en <strong>gras</strong>, avec des balises unies.",
+       "rcfilters-preference-label": "Masquer la version améliorée des modifications récentes",
+       "rcfilters-preference-help": "Restitue la version 2017 de l'interface ainsi que de tous les outils ajoutés alors et depuis.",
        "rcnotefrom": "Ci-dessous {{PLURAL:$5|la modification effectuée|les modifications effectuées}} depuis le <strong>$3, $4</strong> (affichées jusqu’à <strong>$1</strong>).",
        "rclistfromreset": "Réinitialiser la sélection de la date",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "tooltip-t-contributions": "Voir la liste des contributions de {{GENDER:$1|cet utilisateur|cette utilisatrice}}",
        "tooltip-t-emailuser": "Envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}",
        "tooltip-t-info": "Plus d’information sur cette page",
-       "tooltip-t-upload": "Importer des fichiers",
+       "tooltip-t-upload": "Téléverser des fichiers",
        "tooltip-t-specialpages": "Liste de toutes les pages spéciales",
        "tooltip-t-print": "Version imprimable de cette page",
        "tooltip-t-permalink": "Adresse permanente de cette version de la page",
        "exif-relatedsoundfile": "Fichier audio associé",
        "exif-datetimeoriginal": "Date de la prise originelle",
        "exif-datetimedigitized": "Date de la numérisation",
-       "exif-subsectime": "Date de modification",
+       "exif-subsectime": "Date en fraction de seconde",
        "exif-subsectimeoriginal": "Date de la prise originelle",
        "exif-subsectimedigitized": "Date de la numérisation",
        "exif-exposuretime": "Temps d'exposition",
index d521606..0cbdff4 100644 (file)
        "template-semiprotected": "(نيمه بپأسه)",
        "hiddencategories": "اي ولگ {{PLURAL:$1|ىکته جخۊته جرگه|$1 جخۊته جرگه}} مئن دره:",
        "moveddeleted-notice": "اي ولگ حذفأبؤکه.\nحذف ؤ اينتقالˇ سياهه اي ولگˇ ويسين اي بۊن نۊشؤن بدأکه.",
+       "content-model-wikitext": "ويکي-وؤت",
        "viewpagelogs": "اي ولگˇ سياهه'نه دئن",
        "currentrev-asof": "هسأىي نۊسخه تا $1",
        "revisionasof": "نۊسخه $1",
        "currentrevisionlink": "هسأىى نۊسخهٰ نۊشؤن دأن",
        "cur": "ألؤن",
        "last": "دأميشکي",
+       "history-feed-title": "دچينواچينؤنˇ تاريخچه",
        "rev-deleted-user": "(کارگيري نؤم حذفأبؤ)",
        "rev-delundel": "نۊشؤن دأن/جۊخۊسانئن",
        "revdelete-hide-user": "کارگيري نؤم/آى.پي",
        "revdelete-reason-dropdown": "*حذفˇ هرماله دليلؤن\n** چاکۊدنحقه نقض گۊدن\n** نظر ىا اطلاعاتي که مؤناسب نيه\n** کارگيري نؤمي که مؤناسب نيه\n** اطلاعاتي که اۊنˇ مئن تؤهمت دره",
+       "mergelog": "ادغامˇ سياهه",
        "history-title": "\"$1\"ˇ واگرداني تارئخ",
        "difference-title": "$1: نۊسخه'نˇ تؤفير",
        "lineno": "رچ $1:",
        "right-sendemail": "باخي کارگيرؤنه ايمىل بخسأن",
        "newuserlogpage": "کارگير چاگۊدنˇ سياهه",
        "newuserlogpagetext": "اي ىکته سياهه' کارگير چاگۊدنؤنˇ جي",
+       "rightslog": "کارگيرˇ اختياراتˇ سياهه",
        "action-edit": "اي ولگه دچينواچين بکۊن",
        "action-createaccount": "اي کارگيري حيسابه چاکۊن",
        "action-move-categorypages": "جرگه ولگؤنه جابجا گۊدن",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کارگير}} پىگير]",
        "rc-change-size-new": "$1 {{PLURAL:$1|باىت}} تغييرˇ پسي",
        "recentchangeslinked": "مۊرتبطˇ تغىيرؤن",
+       "recentchangeslinked-feed": "مۊرتبطˇ تغييرؤن",
        "recentchangeslinked-toolbox": "مۊرتبطˇ تغىيرؤن",
        "recentchangeslinked-title": "\"$1\"ˇ مۊرتبط تغييرؤن",
        "recentchangeslinked-summary": "اي جير، ىکته ليسته تينين بىنين آخري تغييرؤن أجي اۊ ولگؤنˇ مئن کي اي ولگˇ جي خال ببؤن (ىا جرگهٔ مؤردˇ نظرˇ جي). اۊ ولگؤني که [[Special:Watchlist|شيمئه پىگيري ليست]]۱ميئن دبۊن پۊررنگ نۊشؤن بدأبۊنن.",
        "upload-file-error-text": "وختي حقسأى بؤدبۊ که سرورˇ مئن ىکته مؤوقتي فاىل چاگۊده بۊبۊن، سأب بۊبؤ.\n\nىکته [[Special:ListUsers/sysop|کيا]] أمرأ تماس بگيرين.",
        "upload-misc-error-text": "جيرأکشئنˇ زمت، ىکته سأب بۊبؤ که مألۊم نيه چيسه.\nلؤطف بکۊنين بىنين اينترنتي نۊشؤني مؤعتبر ؤ دسفأرس ايسه ؤ هندئه حقسأى بکۊنين.\n\nأگه هندئه دۊرۊسأنۊبؤ، ىکته [[Special:ListUsers/sysop|کيا'ن]] أمرأ تماس بگيرين.",
        "img-auth-accessdenied": "شيمئه دسفأرس نيه",
+       "license": "جواز نؤمه:",
        "license-header": "جواز",
        "license-nopreview": "(پيشادئن ئبه هيچي ننأ)",
        "listfiles-userdoesnotexist": "\"$1\" کارگيري حيساب ثبت نۊبؤ.",
        "suppress": "دۊخۊسانگري",
        "booksources": "کيتابˇ سربسؤن",
        "booksources-search": "وامج",
+       "specialloguserlabel": "مۊجري:",
        "log": "سياههٰ‌ن",
+       "all-logs-page": "همته عۊمۊمي سياهه'ن",
+       "allpages": "همته ولگؤن",
        "allarticles": "همته ولگؤن",
        "allpagessubmit": "بۊشۊ",
        "categories": "جرگه'ن",
        "emailuser-title-target": "اي {{GENDER:$1|کارگيره}} ايمىل بخسأن.",
        "usermaildisabled": "نشأنه کارگير ئبه ايمىل خسأنئن.",
        "usermaildisabledtext": "شمه اي ويکي مئن مننين باخي کارگيرؤنه ايمىل بخسأنين",
+       "usermessage-editor": "سيستمˇ پيغؤم-رسؤن",
+       "watchlist": "پىگيتنؤنˇ ليست",
        "mywatchlist": "پىگيتنؤنˇ ليست",
        "watch": "پىگيتن",
        "wlheader-enotif": "فأندرˇ ايمىل کار کؤنه.",
        "alreadyrolled": "نشأنه [[:$1]]ˇ آخري دچينواچينه که [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); بؤده، پساوگردانئن؛ اينˇ پيشي، ىک نفر وانيويسه دچينواچين ىا پساوگردان بؤده.\n\nولگˇ آخري دچينواچينه [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) بؤده.",
        "protectlogpage": "پأسنˇ سياهه",
        "protect-level-sysop": "فقط کيا'ن",
+       "restriction-edit": "دچينواچين",
+       "restriction-move": "جابجا گۊدن",
        "restriction-level-sysop": "قاىم بپأسه",
        "undeletehistorynoadmin": "اي ولگ حذفأبؤ.\nاي ولگˇ حذفأبؤنˇ دليل باني اۊ کارگيرؤنˇ نۊشؤني که حذفˇ پيشي اي ولگه دچينواچين بؤده بؤن، جيري فيچالˇ مئن بمأ.\nاي حذفأبؤ دچينواچينؤنˇ أصلˇ وؤت خالي کيا'نˇ دسفأرسه.",
        "namespace": "نؤمفضا:",
        "contributions": "{{GENDER:$1|کارگير}}ˇ مۊشارکتؤن",
        "mycontris": "مۊشارکتؤن",
        "anoncontribs": "مۊشارکتؤن",
+       "contribsub2": "{{GENDER:$3|$1}} ($2)ˇ ويسين",
+       "uctop": "(ألؤنˇ نۊسخه)",
        "month": "اي ماه مئن (ؤ دأميشک):",
        "year": "اي سالˇ مئن (ؤ دأميشک):",
+       "sp-contributions-blocklog": "دبۊستنˇ سياهه'ن",
        "sp-contributions-uploads": "جؤرأکشئنؤن",
+       "sp-contributions-logs": "سياههٰ‌ن",
        "sp-contributions-talk": "گب",
+       "sp-contributions-search": "مۊشارکتؤنˇ وامج",
+       "sp-contributions-username": "آى-پيˇ آدرس يا کارگيري نؤم:",
        "sp-contributions-submit": "وامج",
        "whatlinkshere": "هرچي خال ببؤ ائره",
        "whatlinkshere-title": "ولگؤني گه «$1»ˇ أمرأ خال دأنن",
        "contribslink": "ياوري‌ئن",
        "block-log-flags-nousertalk": "مننه خۊ گبˇ ولگه دچينواچين بکۊنه",
        "block-log-flags-hiddenname": "دۊخۊسانئه کارگيري نؤم",
+       "proxyblocker": "پراکسي دبۊستنچي",
        "movecategorypage-warning": "<strong>اخظار:</strong> شمه جرگه ولگه جابجا کأدرين. شيمه حواس بمؤنه کي فقط ولگ جابجا بنه ؤ ولگؤن قديمي جرگه مئن مؤنن ؤ تازه جرگه مئن <em>نشنن</em>.",
        "cant-move-category-page": "شمه اجازه ندأنين جرگهٰ‌نˇ ولگه جابجا بکۊنين.",
        "cant-move-to-category-page": "شمه ايجازه ندأنين ىکته ولگه ببرين ىکته جرگه ولگˇ مئن.",
        "tooltip-summary": "فيچالسه وارد بکۊنين",
        "pageinfo-header-edits": "تاريخچهٰ دچينواچين گۊدن",
        "pageinfo-header-restrictions": "ولگه پأسن",
+       "pageinfo-header-properties": "ولگˇ ويژگيئن",
+       "pageinfo-display-title": "تيتره نۊشؤن دأن",
+       "pageinfo-article-id": "ولگˇ شناسه",
        "pageinfo-robot-index": "مؤجاز",
        "pageinfo-firstuser": "ولگˇ چاکۊنکس",
+       "pageinfo-firsttime": "ولگˇ چاگۊدنˇ زمت",
+       "pageinfo-lastuser": "آخري دچينواچين گۊدنکس",
+       "pageinfo-lasttime": "آخري دچينواچينˇ تاريخ",
+       "pageinfo-edits": "همته دچينواچينؤنˇ تعداد",
+       "pageinfo-recent-edits": "آخري دچينواچينؤنˇ تعداد ($1 ˇ أخيرˇ ميئن)",
+       "pageinfo-recent-authors": "آخري تنها نويشتنکسؤنˇ تعداد",
        "pageinfo-hidden-categories": "جخۊته {{PLURAL:$1| جرگه|جرگه}} ( $1 )",
        "pageinfo-toolboxlink": "ولگˇ اطلاعات",
+       "pageinfo-contentpage-yes": "أهأ",
        "pageinfo-category-info": "جرگه اطلاعات",
+       "patrol-log-page": "گشتˇ سياهه",
        "previousdiff": "→ قديمي‌ترˇ دچينواچين",
        "nextdiff": "تازه‌ترˇ دچينواچين ←",
        "file-info-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل، فاىلˇ واويراز: $3، نوع MIME فاىل: $4",
        "monthsall": "همه",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|گب]])",
        "redirect-submit": "بۊشۊ",
+       "redirect-lookup": "وامج:",
+       "redirect-value": "مقدار:",
+       "redirect-user": "کارگيرˇ شناسه",
+       "redirect-page": "ولگˇ شناسه",
+       "redirect-revision": "ولگˇ نۊسخه",
        "redirect-file": "فايلˇ نؤم",
        "specialpages": "خاصˇ ولگؤن",
        "specialpages-group-login": "ديرين/ثبتˇ نؤم",
        "logentry-newusers-create": "کارگيري حساب $1 {{GENDER:$2|چاگۊده-بۊبؤ}}",
        "logentry-upload-upload": "$1 $3 {{GENDER:$2|جؤرأکشئه}}",
        "searchsuggest-search": "{{SITENAME}} مئن وامج",
+       "duration-days": "$1 رۊز",
        "expand_templates_preview": "پيشادئن",
        "default-skin-not-found": "اؤخ! پيشفرضˇ قالبي که شيمه ويکي ئبه <code dir=\"ltr\"<$wgDefaultSkin</code> مئن تعريف ببؤ به عنوانˇ <code>$1</code>، دسفرس نيه.\n\nبه نظر می‌آید نصب شما شامل پوسته‌های زیر می‌شود. [https://www.mediawiki.org/wiki/Manual:Skin_configuration راهنما: تنظیمات پوسته] را برای کسب اطلاعات در باره چگونگی فعال‌ساختن آن‌ها و انتخاب پیش‌فرض ببینید.\n\n$2\n\n; اگر اخیراً مدیاویکی را نصب کرده‌اید:\n: احتمالاً از گیت، یا به طور مستقیم از کد مبدأ که از چند متد دیگر استفاده می‌کند نصب کردید. انتظار می‌رود. چند {{PLURAL:$4|پوسته|پوسته}} از [https://www.mediawiki.org/wiki/Category:All_skins فهرست پوسته mediawiki.org] نصب کنید، که همراه چندین پوسته و افزونه هستند. شما می‌توانید شاخه <code>skins/</code> را از آن نسخه‌برداری کرده و بچسبانید.\n\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins استفاده از گیت برای دریافت پوسته‌ها].\n: انجام این کار با مخزن گیت‌تان تداخل نمی‌کند اگر توسعه‌دهنده مدیاویکی هستید.\n\n; اگر اخیراً مدیاویکی را ارتقاء دادید:\n: مدیاویکی ۱٫۲۴ و تازه‌تر دیگر به طور خودکار پوسته‌های نصب‌شده را فعال نمی‌کند ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery راهنما: کشف خودکار پوسته] را ببینید). شما می‌توانید خطوط زیر را به داخل <code>LocalSettings.php</code> بچسبانید تا {{PLURAL:$5|همه|همه}} پوسته‌های نصب‌شده را فعال کنید:\n\n<pre dir=\"ltr\">$3</pre>\n\n; اگر اخیراً <code>LocalSettings.php</code> را تغییر دادید:\n: نام پوسته‌ها را برای غلط املایی دوباره بررسی کنید."
 }
index 6a15951..a03e55e 100644 (file)
        "filerenameerror": "\"$1\" નું નામ બદલીને \"$2\" કરવામાં નિષ્ફળ.",
        "filedeleteerror": "\"$1\" ફાઇલ હટાવી ન શકાઇ.",
        "directorycreateerror": "ડિરેક્ટરી \"$1\" ન બનાવી શકાઇ.",
+       "directoryreadonlyerror": "ડિરેક્ટરી \"$1\" ફક્ત વાંચવા માટે છે.",
+       "directorynotreadableerror": "ડિરેક્ટરી \"$1\" વાંચી શકાય તેવું નથી.",
        "filenotfound": "ફાઇલ \"$1\" ન મળી.",
        "unexpected": "અણધારી કિંમત: \"$1\"=\"$2\".",
        "formerror": "ત્રુટિ: પત્રક રજૂ થયું નહીં",
        "cannotdelete": "ફાઇલ કે પાનું \"$1\" હટાવી શકાયું નથી.\nશક્ય છે કે અન્ય કોઈએ પહેલેથી હટાવી દીધું હોય.",
        "cannotdelete-title": "\"$1\" પાનું કાઢી શકતા નથી",
        "delete-hook-aborted": "દૂર કરવાનું હૂક વડે રોકી રાખવામાં આવ્યું.\nતે કોઇ કારણ આપતું નથી.",
+       "no-null-revision": "પૃષ્ઠ \"$1\" માટે નવો નલ પુનરાવર્તન બનાવી શક્યું નથી",
        "badtitle": "ખરાબ શિર્ષક",
        "badtitletext": "આપનું ઈચ્છિત શીર્ષક અમાન્ય છે, ખાલી છે, અથવાતો અયોગ્ય રીતે આંતર-ભાષિય કે આંતર-વિકિ સાથે જોડાયેલું શીર્ષક છે.\nશક્ય છે કે તેમાં એક કે વધુ એવા અક્ષર કે ચિહ્નો છે કે જે પાનાનાં શીર્ષક માટે અવૈધ છે.",
+       "title-invalid-empty": "વિનંતી કરેલું પાનું શીર્ષક ખાલી છે અથવા તેમાં ફક્ત નામસ્થળનું નામ છે.",
+       "title-invalid-utf8": "વિનંતી કરાયેલ પૃષ્ઠ શીર્ષકમાં અમાન્ય UTF-8 ક્રમ છે.",
+       "title-invalid-interwiki": "માગણી કરેલ પૃષ્ઠ શીર્ષકમાં એક આંતરવિકિ કડી છે જેનો ઉપયોગ શીર્ષકમાં કરી શકાતો નથી.",
+       "title-invalid-talk-namespace": "વિનંતી કરાયેલ પાનું શીર્ષક એવા ચર્ચા પૃષ્ઠનો ઉલ્લેખ કરે છે જે અસ્તિત્વમાં નથી.",
+       "title-invalid-characters": "માગણી કરેલ પૃષ્ઠ શીર્ષકમાં અમાન્ય અક્ષરો છે: \"$1\".",
        "perfcached": "નીચે દર્શાવેલી માહિતી જૂના સંગ્રહમાંથી લીધેલી છે અને શક્ય છે કે તે હાલની પરિસ્થિતિમાં સચોટ ના હોય. વધુમાં વધુ {{PLURAL:$1|એક પરિણામ|$1 પરિણામો}} આ સંગ્રહમાં ઉપલબ્ધ છે.",
        "perfcachedts": "નીચેની વિગતો જૂના સંગ્રહમાથી છે અને તે છેલ્લે $1એ તાજી કરવામાં આવી હતી. વધુમાં વધુ {{PLURAL:$4|એક પરિણામ|$4 પરિણામો}} આ સંગ્રહમાં ઉપલબ્ધ છે.",
        "querypage-no-updates": "આ પાનાની નવી આવૃત્તિઓ હાલમાં અક્રિય છે.\nઅહીંની વિગતો હાલમાં રિફ્રેશ કરવામાં નહી આવે.",
index 0e3a579..a8bd06e 100644 (file)
        "parser-template-loop-warning": "נמצאה תבנית הקוראת לעצמה: [[$1]]",
        "template-loop-category": "דפים עם לולאות בתבנית",
        "template-loop-category-desc": "הדף הזה מכיל לולאה בתבנית, כלומר תבנית שקוראת לעצמה באופן רקורסיבי.",
+       "template-loop-warning": "<strong>אזהרה:</strong> הדף הזה קורא ל[[:$1]], וזה גורם ללולאה בתבנית (קריאה רקורסיבית אינסופית).",
        "parser-template-recursion-depth-warning": "עומק התבניות המוכללות זו בזו עבר את המגבלה ($1)",
        "language-converter-depth-warning": "עומק ממיר השפה עבר את המגבלה ($1)",
        "node-count-exceeded-category": "דפים שבהם מספר הצמתים גדול מדי",
index 955aa00..cc103c5 100644 (file)
        "rcfilters-view-tags-tooltip": "Filtra risultati per etichette di modifica",
        "rcfilters-view-return-to-default-tooltip": "Torna al menu filtri principale",
        "rcfilters-watchlist-edit-watchlist-button": "Modifica il tuo elenco di pagine osservate",
+       "rcfilters-preference-label": "Nascondi la versione migliorata delle ultime modifiche",
+       "rcfilters-preference-help": "Ripristina la riprogettazione dell'interfaccia 2017 e tutti gli strumenti aggiunti allora e da allora.",
        "rcnotefrom": "Di seguito {{PLURAL:$5|è elencata la modifica apportata|sono elencate le modifiche apportate}} a partire da <strong>$3, $4</strong> (mostrate fino a <strong>$1</strong>).",
        "rclistfromreset": "Reimposta la selezione della data",
        "rclistfrom": "Mostra le nuove modifiche a partire daː $2, $3",
index c7cd4e2..0e9370f 100644 (file)
        "rcfilters-watchlist-markseen-button": "모든 변경사항을 본 것으로 표시",
        "rcfilters-watchlist-edit-watchlist-button": "내 주시문서 목록 편집",
        "rcfilters-watchlist-showupdated": "변경이 발생한 이후로 방문한 적이 없는 문서의 변경사항은 <strong>굵게</strong> 표시됩니다.",
+       "rcfilters-preference-label": "개선된 버전의 최근 바뀜 숨기기",
        "rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 표시됨)",
        "rclistfromreset": "날짜 선택 초기화",
        "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "special-characters-group-sinhala": "싱할라 문자",
        "special-characters-group-gujarati": "구자라트 문자",
        "special-characters-group-devanagari": "데바나가리어",
-       "special-characters-group-thai": "í\83\80ì\9d´어",
+       "special-characters-group-thai": "í\83\9cêµ­어",
        "special-characters-group-lao": "라오어",
        "special-characters-group-khmer": "크메르어",
        "special-characters-group-canadianaboriginal": "캐나다 원주민 언어",
index 7a1c129..b596b8d 100644 (file)
@@ -65,6 +65,8 @@
        "underline-never": "Qet",
        "underline-default": "Tercîhên lêgerokê",
        "editfont-default": "Tercîhên lêgerokê",
+       "editfont-sansserif": "Fonta Sans-serif'ê",
+       "editfont-serif": "Fonta Serif'ê",
        "sunday": "yekşem",
        "monday": "duşem",
        "tuesday": "sêşem",
        "feb": "reş",
        "mar": "adr",
        "apr": "avr",
-       "may": "gulan",
+       "may": "gln",
        "jun": "pûş",
        "jul": "tîr",
-       "aug": "teb",
+       "aug": "Glw",
        "sep": "rez",
        "oct": "kew",
        "nov": "ser",
        "currentevents": "Bûyerên rojane",
        "currentevents-url": "Project:Bûyerên rojane",
        "disclaimers": "Ferexetname",
-       "disclaimerpage": "Project:Ferexetname",
+       "disclaimerpage": "Project:Ferexetnameya giştî",
        "edithelp": "Alîkariya guherandinê",
        "helppage-top-gethelp": "Alîkarî",
        "mainpage": "Destpêk",
        "portal": "Portala komê",
        "portal-url": "Project:Portala komê",
        "privacy": "Siyaseta veşarîtiyê",
-       "privacypage": "Project:Parastina daneyan",
+       "privacypage": "Project:Siyaseta veşarîtiyê",
        "badaccess": "Çewtiya destûrê",
        "badaccess-group0": "Tu nikarî vî tiştî bikî.",
        "badaccess-groups": "Ev tişta tu dixwazî bikî tenê ji bikarhênerên {{PLURAL:$2|van koman|vê komê}} re {{PLURAL:$2|ne|ye}}: $1.",
        "nstab-media": "Medya",
        "nstab-special": "Rûpela taybet",
        "nstab-project": "Rûpela projeyê",
-       "nstab-image": "Wêne",
+       "nstab-image": "Dosye",
        "nstab-mediawiki": "Peyam",
        "nstab-template": "Şablon",
        "nstab-help": "Alîkarî",
        "templatesused": "{{PLURAL:$1|Şablona|Şablonên}} ku li ser vê rûpelê {{PLURAL:$1|tê|tên}} bikaranîn:",
        "templatesusedpreview": "{{PLURAL:$1|Şablona|Şablonên}} di vê pêşdîtinê de {{PLURAL:$1|tê|tên}} bikaranîn:",
        "templatesusedsection": "{{PLURAL:$1|Şablona ku di vê beşê de tê bikaranîn|Şablonên ku di vê beşê de tên bikaranîn}}:",
-       "template-protected": "(tê parastin)",
+       "template-protected": "()",
        "template-semiprotected": "(nîv-parastî)",
        "hiddencategories": "Ev rûpel endamê {{PLURAL:$1|1 kategoriya veşartî|$1 kategoriyên veşartî}} ye:",
        "nocreate-loggedin": "Destûra te tune ye ku tu rûpelên nu biafirînî.",
        "searchprofile-everything": "Her tişt",
        "searchprofile-advanced": "Pêşketî",
        "searchprofile-articles-tooltip": "Di $1 da lêbigere",
-       "searchprofile-images-tooltip": "Li pelan bigere",
+       "searchprofile-images-tooltip": "Li nav dosyeyan bigere",
        "searchprofile-everything-tooltip": "Di hemû naverokada bigere (tevî gotûbêja)",
        "search-result-size": "$1 ({{PLURAL:$2|peyvek|$2 peyv}})",
        "search-redirect": "(beralîkirina ji $1)",
        "recentchanges-legend": "Vebijarkên guherandinên dawî",
        "recentchanges-summary": "Guhertinên herî dawî yên wîkiyê li ser vê rûpelê bişopîne.",
        "recentchanges-label-newpage": "Rûpeleke nû hate çêkirin",
-       "recentchanges-label-minor": "Ev guherîneke biçûk e",
+       "recentchanges-label-minor": "Ev guhertineke Biçûk e",
        "recentchanges-label-bot": "Ev guherîn ji aliyê botekê ve hate çêkirin",
        "recentchanges-label-unpatrolled": "Ev gotar hêjî nehatiye sererastkirin",
        "recentchanges-label-plusminus": "Qebareya vê rûpelê bi ev qas biteyan hate guherandin",
        "filetype-banned": "Dosyeyên bi vê cureye hatîye qedexekirin.",
        "verification-error": "Ev dosye, rastandina dosyeye derbas nekir.",
        "unknown-error": "Çewtiyeke nenas pêk hat.",
-       "large-file": "Mezinbûna pelê bila ji $1 ne mezintir be; ev pel $2 e.",
+       "large-file": "Mezinbûna dosyeyê divê ji $1 ne mezintir be; ev dosye $2 e.",
        "emptyfile": "Data'ya barkirî vala ye. Sedemê valabûnê belkî şaşnivîsek di navê data'yê da ye. Xêra xwe seke, ku tu rast dixazê vê data'yê barbikê.",
        "fileexists": "Datayek bi vê navê berê heye.\nEger tu niha li „Tomarbike“ xê, ew wêneyê kevin ê here û wêneyê te ê were barkirin di bin wê navê.\nDi bin <strong>[[:$1]]</strong> du dikarî sekê, ku di dixwazê wê wêneyê biguherînê.\nEger tu naxazê, xêra xwe li „Betal“ xe.\n[[$1|thumb]]",
        "fileexists-extension": "Datayek wek vê navê berê heye: [[$2|thumb]]\n* Navî datayê yê tê barkirin: <strong>[[:$1]]</strong>\n* Navî datayê yê berê heyê: <strong>[[:$2]]</strong>\nXêra xwe navekî din bibîne.",
        "filehist-user": "Bikarhêner",
        "filehist-dimensions": "Mezinahî",
        "filehist-filesize": "Mezinahiya pelê",
-       "filehist-comment": "Şîrove",
+       "filehist-comment": "Şirove",
        "imagelinks": "Bikaranîna pelê",
        "linkstoimage": "Di van rûpelan de {{PLURAL:$1|page links|$1  lînkek}} ji vî dosyeye re heye:",
        "nolinkstoimage": "Rûpelekî ku ji vî wêneyî re girêdankê çêdike nîne.",
        "linkstoimage-redirect": "$1 (beralîkirina pelê) $2",
-       "sharedupload-desc-here": "Ev pel ji $1 û dibe ku ji aliyê projeyên din ve jî hatibe bikaranîn.\nAgahdariya li ser [$2 rûpela danasîna pelê] li jêr tê nîşandan.",
+       "sharedupload-desc-here": "Ev dosye ji $1 û dibe ku ji aliyê projeyên din ve jî hatibe bikaranîn.\nAgahdariya li ser [$2 rûpela danasîna dosyeyê] li jêr tê nîşandan.",
        "filepage-nofile-link": "Dosyeyek bi vî navî tune ye, lê tu dikarî wê [$1 bar bikî].",
        "uploadnewversion-linktext": "Versiyoneke nû ya vê daneyê barbike",
        "shared-repo-from": "ji $1",
index 8df8bb1..49c7e06 100644 (file)
@@ -46,6 +46,7 @@
        "tog-watchlisthideminor": "Asconde editas minor de la lista de pajes oservada",
        "tog-watchlisthideliu": "Asconde editas par usores identifiada de la lista de pajes oservada",
        "tog-watchlistreloadautomatically": "Recarga automata la lista de pajes oservada cuando un filtre es cambiada (JavaScript nesesada)",
+       "tog-watchlistunwatchlinks": "Ajunta lias direta per monitori/desmonitori a pajes monitorida (JavaScript es usada per alterna entre la du)",
        "tog-watchlisthideanons": "Asconde editas par usores anonim de la lista de pajes oservada",
        "tog-watchlisthidepatrolled": "Asconde editas patruliada de la lista de pajes oservada",
        "tog-watchlisthidecategorization": "Asconde la categori de pajes",
        "jumptosearch": "xerca",
        "view-pool-error": "Pardona, la servadores es tro cargada a esta ora.\nTro multe usores es atenta vide esta paje.\nPer favore espeta ante cuanto tu atenta vide esta paje denova.\n\n$1",
        "generic-pool-error": "Pardona, la servadores es tro cargada a esta ora.\nTro multe usores es atentante vide esta recurso.\nPer favore espeta ante cuando tu atenta vide esta recurso denova.",
+       "pool-timeout": "Semafor nonotenable: atenta abandonada",
+       "pool-queuefull": "Filo de servadores es plen",
        "pool-errorunknown": "Era nonconoseda",
+       "pool-servererror": "La manejador de servadores no es disponable ($1)",
+       "poolcounter-usage-error": "Era de usa: $1",
        "aboutsite": "Sur {{SITENAME}}",
        "aboutpage": "Project:Sur",
        "copyright": "La contenida es disponeda su $1, estra diferes notada.",
        "portal-url": "Project:Porton de comunia",
        "privacy": "Promete de privatia",
        "privacypage": "Project:Promete de privatia",
+       "badaccess": "Era de permete",
+       "badaccess-group0": "Tu no es permeteda a fa la ata cual tu ia solisita.",
+       "badaccess-groups": "La ata cual tu ia solisita es limitada a usores en {{PLURAL:$2|la grupo|un de la grupos}}: $1.",
+       "versionrequired": "Revisa $1 de MediaWiki es nesesada",
+       "versionrequiredtext": "Revisa $1 de MediaWiki es nesesada per usa esta paje.\nVide la [[Special:Version|paje de varias]].",
        "ok": "Oce",
        "retrievedfrom": "Retraeda de \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|Tu ave}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Tu ave}} $1 de {{PLURAL:$3|un otra usor|$3 usores}} ($2).",
+       "youhavenewmessagesmanyusers": "Tu ave $1 de multe usores ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|un mesaje nova|999=mesajes nova}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|cambia|cambias}} resente",
        "youhavenewmessagesmulti": "Tu ave mesajes nova en $1",
        "confirmable-confirm": "Esce {{GENDER:$1|tu}} es serta?",
        "confirmable-yes": "Si",
        "confirmable-no": "No",
+       "thisisdeleted": "Vide o restora $1?",
        "viewdeleted": "Vide $1?",
+       "restorelink": "{{PLURAL:$1|un edita sutraeda|$1 editas sutraeda}}",
        "feedlinks": "Flue:",
+       "feed-invalid": "Tipo de flue no es valida.",
+       "feed-unavailable": "Flues no es disponable",
        "site-rss-feed": "$1 RSS Flue",
        "site-atom-feed": "$1 Flue Atom",
        "page-rss-feed": "\"$1\" RSS Flue",
        "page-atom-feed": "\"$1\" Flue Atom",
        "red-link-title": "$1 (paje no esiste)",
+       "sort-descending": "Ordina desendente",
+       "sort-ascending": "Ordina asendente",
        "nstab-main": "Paje",
        "nstab-user": "Paje de usor",
        "nstab-media": "Paje de medio",
        "nstab-help": "Paje de aida",
        "nstab-category": "Categoria",
        "mainpage-nstab": "Paje xef",
+       "nosuchactiontext": "La ata spesifada par la URL es nonvalida.\nCisa tu ia maltape la URL o ia segue un lia noncoreta.\nO cisa esta indica un defeto en la program usada par {{SITENAME}}.",
        "nosuchspecialpage": "Paje spesial nonesistente",
        "nospecialpagetext": "<strong>Tu ia solisita un paje spesial nonvalida.</strong>\n\nUn lista de pajes spesial valida es disponable en [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Era",
        "databaseerror": "Era de base de datos",
+       "databaseerror-text": "Un era ia aveni en interoga la banco de datos.\nCisa esta indica un defeto en la program.",
+       "databaseerror-textcl": "Un era ia aveni en interoga la banco de datos.",
+       "databaseerror-query": "Interoga: $1",
+       "databaseerror-function": "Funsiona: $1",
+       "databaseerror-error": "Era: $1",
        "missingarticle-diff": "(Difere: $1, $2)",
        "internalerror": "Era interna",
        "internalerror_info": "Era interna: $1",
+       "internalerror-fatal-exception": "Era nonreparable de tipo \"$1\"",
+       "filecopyerror": "Fix \"$1\" no ia pote es copiada a \"$2\".",
+       "filerenameerror": "Fix \"$1\" no ia pote es renomida a \"$2\".",
+       "filedeleteerror": "Fix \"$1\" no ia pote es sutraeda.",
+       "directorycreateerror": "Arcivo \"$1\" no ia pote es creada.",
+       "directoryreadonlyerror": "Arcivo \"$1\" es nonscrivable.",
+       "directorynotreadableerror": "Arcivo \"$1\" es nonlejable.",
+       "filenotfound": "Fix \"$1\" no ia pote es trovada.",
        "badtitle": "Mal titulo",
        "badtitletext": "La titulo de la paje spesifada es nonlegal, vacua, o un titulo interlingual o intervici de lia noncoreta. Cisa lo conteni un o plu sinias cual on no pote usa en titulos.",
        "viewsource": "Mostra la fonte",
        "myprivateinfoprotected": "Tu no ave permete per edita tua informa privata.",
        "mypreferencesprotected": "Tu no ave permete per edita tua preferes.",
        "ns-specialprotected": "La pajes spesial no pote es editada.",
+       "virus-badscanner": "Malajustada: scanador antivirusal nonconoseda: <em>$1</em>",
+       "virus-scanfailed": "fali de scane (codigo $1)",
+       "virus-unknownscanner": "scanador antivirusal nonconoseda:",
        "logouttext": "<strong>Tu es aora desautenticida.</strong>\n\nNota ce cisa alga pajes va continua es mostrada como si tu ta es ancora autenticida asta cuando tu vacui la memoria de tua surfador.",
        "cannotlogoutnow-title": "Tu no pote desautentici a presente",
        "cannotlogoutnow-text": "Desautentici no es posible cuando tu usa $1.",
        "createacct-benefit-body1": "{{PLURAL:$1|edita|editas}}",
        "createacct-benefit-body2": "{{PLURAL:$1|paje|pajes}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribuor|contribuores}} resente",
+       "badretype": "La claves cual tu ia tape no es egal.",
+       "usernameinprogress": "Un crea de conta per esta nom de usor aveni ja.\nEspeta, per favore.",
+       "userexists": "La nom spesifada de usor es ja usada.\nEleje un otra nom, per favore.",
        "loginerror": "Era de entra",
+       "createacct-error": "Era de crea de conta",
+       "createaccounterror": "La conta no ia pote es creada: $1",
+       "nocookiesnew": "La conta de usor es aora creada, ma tu no ia autentici.\n{{SITENAME}} usa cucis per autentici usores.\nTu ia descomuta cucis.\nPer favore, comuta los e autentici con tua nom de usor nova e tua clave.",
+       "nocookieslogin": "{{SITENAME}} usa cucis per autentici usores.\nTu ia descomuta cucis.\nPer favore, comuta los e atenta denova.",
+       "nocookiesfornew": "La conta de usor no ia es creada, car nos no ia pote confirma sua fonte.\nSerti ce tu ia comuta cucis, recarga esta paje, e atenta denova.",
+       "createacct-loginerror": "La crea de la conta ia susede, ma tu no ia pote es automata autenticida. Per favore, vade a la paje de [[Special:UserLogin|autentici nonautomata]].",
+       "noname": "Tu no ia spesifa un nom de usor valida.",
        "loginsuccesstitle": "Tu ia entra",
        "loginsuccess": "'''Tu ia entrada aora a {{SITENAME}} como \"$1\".'''",
        "nosuchuser": "On no ave un usor con la nom \"$1\".\nOn distingui entre leteras major e minor per nomes de usores.\nEsamina la spele, o [[Special:CreateAccount|crea un conta nova]].",
        "passwordremindertitle": "Sinia secreta temporer nova per {{SITENAME}}",
        "passwordremindertext": "Algun (tu, probable, de adirije IP $1)\nia demanda un sinia secreta nova per {{SITENAME}} ($4).\nLa sinia secreta tempora per usor \"$2\" es aora \"$3\". Si esta ia es tua intende, tu debe identifia tu denova per entra e eleje tua sinia nova aora.\nTua sinia tempora va desvalidi en {{PLURAL:$5|un dia|$5 dias}}.\n\nSi algun otra ca tu ia envia esta demanda a nos, o si tu ia recorda tua sinia secreta e no vole cambia lo aora, tu pote iniora esta mesaje e continua usa tua sinia secreta vea.",
        "noemail": "No es un adirije de eposta per usor \"$1\".",
+       "noemailcreate": "Tu debe furni un adirije de eposta valida.",
        "passwordsent": "Un sinia secreta ia es enviada a la adirije de eposta per \"$1\".\nPer favore, sinia per entra ancora pos tu ia reseta el.",
        "eauthentsent": "Un eposta de serti ia es enviada a la adirije de eposta spesifada.\nAnte cualce otra epostas es enviada a tua conta, tu va nesesa segue la instruis en la eposta, per serti ce la conta es vera la tua.",
+       "throttled-mailpassword": "Un eposta de reinisia la clave ia es ja enviada, en la {{PLURAL:$1|ora|$1 oras}} la plu resente.\nPer preveni malusa, sola un tal eposta va es enviada per {{PLURAL:$1|ora|$1 oras}}.",
        "mailerror": "Era en envia eposta: $1",
        "acct_creation_throttle_hit": "Visitores a esta vici, usante tua adirije IP, ia crea {{PLURAL:$1|1 conta|$1 contas}} en la $2 la plu resente, cual es la masima permeteda en esta periodo.\nComo resulta, visitores con esta adirije IP no pote crea plu contas a esta tempo.",
+       "emailauthenticated": "Tua adirije de eposta ia es confirmada a $2 a $3.",
        "emailconfirmlink": "Aproba tu adirije de eposta",
+       "cannotchangeemail": "On no pote cambia adirijes de eposta per contas en esta vici.",
+       "emaildisabled": "Esta vici no pote envia epostas.",
        "accountcreated": "Conta es creada",
+       "accountcreatedtext": "La conta de usor per [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discute]]) ia es creada.",
+       "createaccount-title": "Crea de conta per {{SITENAME}}",
+       "createaccount-text": "Algun ia crea un conta per tua adirije de eposta a {{SITENAME}} ($4) nomida \"$2\", con clave \"$3\".\nTu debe autentici e cambia tua clave aora.\n\nTu pote iniora esta mesaje, si esta conta ia es creada par era.",
+       "login-throttled": "Tu ia fa resente tro multe atentas de autentici.\nPer favore, pausa per $1 ante atenta denova.",
+       "login-abort-generic": "Tua autentici ia fali - Abortada",
+       "login-migrated-generic": "Tua conta ia es migrada, e tua nom de usor no esiste plu en esta vici.",
        "loginlanguagelabel": "Lingua: $1",
+       "suspicious-userlogout": "Tua solisita de desautentici ia es refusada car lo pare es enviada par un surfador o proxi malfunsionante.",
+       "createacct-another-realname-tip": "La nom vera es nonobligante.\nSi tu eleje furni lo, lo va es usada per atribui la laboras fada par la usor.",
        "pt-login": "Identifia se",
        "pt-login-button": "Identifia",
        "pt-login-continue-button": "Continua autentici",
        "pt-createaccount": "Crea un conta",
        "pt-userlogout": "Desidentifia",
+       "php-mail-error-unknown": "Era nonconoseda en la funsiona mail() de PHP.",
+       "user-mail-no-addy": "On ia atenta envia un eposta sin adirije de eposta.",
+       "user-mail-no-body": "On ia atenta envia un eposta con corpo vacua o nonormal corta.",
+       "changepassword": "Cambia clave",
+       "resetpass_announce": "Per fini autentici, tu debe furni un clave nova.",
+       "resetpass_header": "Cambia clave de conta",
        "oldpassword": "Sinia secreta vea:",
        "newpassword": "Sinia secreta nova:",
        "retypenew": "Re-entra tu sinia secreta nova:",
        "changepassword-throttled": "Tu ia fa resente tro multe atentas de autentici.\nPer favore, pausa per $1 ante atenta denova.",
        "botpasswords": "Claves de bot",
        "botpasswords-summary": "<em>Claves de bot</em> permete ce on asede un conta de usor par API sin usa la identia xef de la conta. La diretos de usor disponable pos autentici par clave de bot es cisa restrinjeda.\n\nSi tu no sabe perce on ta vole fa esta, probable tu debe no fa lo. Nunca un otra person debe demanda ce tu jenera un de estas e dona lo a el.",
+       "botpasswords-disabled": "Claves de bot es descomutada.",
        "botpasswords-no-central-id": "Per usa claves de bot, tu debe es autenticida con conta sentral.",
        "botpasswords-existing": "Claves esistente de bot",
        "botpasswords-createnew": "Crea un clave nova de bot",
        "botpasswords-created-body": "La clave de bot \"$1\" de usor \"$2\" ia es creada.",
        "botpasswords-updated-title": "Clave de bot cambiada",
        "botpasswords-updated-body": "La clave de bot \"$1\" de usor \"$2\" ia es cambiada.",
+       "botpasswords-deleted-title": "Clave de bot sutraeda",
+       "botpasswords-deleted-body": "La clave de bot \"$1\" de usor \"$2\" ia es sutraeda.",
+       "botpasswords-newpassword": "La clave nova per autentici con <strong>$1</strong> es <strong>$2</strong>. <em>Per favore, nota esta per refere futur.</em> <br> (Per botes vea de cual sua nom de autentici debe es la mesma como la nom de usor ultima, tu pote usa ance <strong>$3</strong> como nom de usor e <strong>$4</strong> como clave.)",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider no es disponable.",
+       "botpasswords-restriction-failed": "Restrinjes de clave de bot preveni esta autentici.",
+       "botpasswords-invalid-name": "La nom de usor spesifada no conteni la sinia separante de claves de bot (\"$1\").",
+       "botpasswords-not-exist": "Usor \"$1\" no ave un clave de bot nomida \"$2\".",
        "resetpass_forbidden": "Claves no pote es cambiada",
        "resetpass_forbidden-reason": "Claves no pote es cambiada: $1",
        "resetpass-no-info": "Tu debe es autenticida per asede direta esta paje.",
        "nocreatetext": "{{SITENAME}} ave un restringe a la capas per crea pajes nova.\nTu pote vade a retro e edita un paje esistente, o  [[Special:UserLogin|sinia per entra o crea un conta]].",
        "nocreate-loggedin": "Tu no es permeteda a crea pajes nova.",
        "sectioneditnotsupported-title": "La edita de partes no es suportada",
+       "sectioneditnotsupported-text": "La edita de partes no es suportada en esta paje.",
        "permissionserrors": "Era de permete",
        "permissionserrorstext-withaction": "Tu no pote $2, per la {{PLURAL:$1|razona|razonas}} seguente:",
        "recreate-moveddeleted-warn": "<strong>Avisa: Tu recrea un paje cual on ia sutrae a ante.</strong>\n\nConsidera esce lo conveni ce tu continua edita esta paje. La arcivos de sutrae e move per la paje es presentada asi per aida:",
        "rev-showdeleted": "mostra",
        "revdelete-nooldid-title": "Revisa destinal nonvalida",
        "revdelete-show-file-submit": "Si",
+       "revdelete-hide-comment": "Resoma de edita",
        "revdelete-radio-set": "Ascondeda",
        "revdelete-radio-unset": "Vidable",
        "revdelete-log": "Razona:",
index 13a9fd1..d6974ee 100644 (file)
        "parser-template-loop-warning": "Пронајдена е јамка во шаблонот: [[$1]]",
        "template-loop-category": "Страници со шаблонски јамки",
        "template-loop-category-desc": "Страницава содржи шаблонска јамка, т.е. шаблон кој повторливо се самоповикува",
+       "template-loop-warning": "<strong>Предупредување:</strong> Страницава го повикува [[:$1]], што предизвикува јамка во шаблонот (бесконечно повторлив повик).",
        "parser-template-recursion-depth-warning": "Пречекорена е границата на длабочината на рекурзијата во шаблонот ($1)",
        "language-converter-depth-warning": "Пречекорена е границата на длабочината на јазичниот претворач ($1)",
        "node-count-exceeded-category": "Страници каде е надминат бројот на јазли",
index 5e835fa..e151d5d 100644 (file)
@@ -35,9 +35,9 @@
                ]
        },
        "tog-underline": "കണ്ണികൾക്ക് അടിവരയിടുക:",
-       "tog-hideminor": "à´ªàµ\81തിയ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95യിൽ à´\9aàµ\86റിയ à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´\95ൾ à´ªàµ\8dരദർശിപàµ\8dപിà´\95àµ\8dà´\95ാതിരിക്കുക",
-       "tog-hidepatrolled": "à´±àµ\8bà´¨àµ\8dà´¤àµ\81à´\9aàµ\81à´±àµ\8dറിയ à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´\95ൾ à´ªàµ\81തിയമാറàµ\8dà´±à´\99àµ\8dà´\99ളിൽ à´ªàµ\8dരദർശിപàµ\8dപിà´\95àµ\8dà´\95ാതിരിക്കുക",
-       "tog-newpageshidepatrolled": "à´±àµ\8bà´¨àµ\8dà´¤àµ\81à´\9aàµ\81à´±àµ\8dറപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9f à´¤à´¾à´³àµ\81à´\95ൾ à´ªàµ\81തിയതാളàµ\81à´\95à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95യിൽ à´ªàµ\8dരദർശിപàµ\8dപിà´\95àµ\8dà´\95ാതിരിക്കുക",
+       "tog-hideminor": "à´ªàµ\81തിയ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95യിൽ à´\9aàµ\86റിയ à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´\95ൾ à´®à´±à´¯àµ\8dക്കുക",
+       "tog-hidepatrolled": "à´±àµ\8bà´¨àµ\8dà´¤àµ\81à´\9aàµ\81à´±àµ\8dറിയ à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´\95ൾ à´ªàµ\81തിയമാറàµ\8dà´±à´\99àµ\8dà´\99ളിൽ à´®à´±à´¯àµ\8dക്കുക",
+       "tog-newpageshidepatrolled": "à´±àµ\8bà´¨àµ\8dà´¤àµ\81à´\9aàµ\81à´±àµ\8dറപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9f à´¤à´¾à´³àµ\81à´\95ൾ à´ªàµ\81തിയതാളàµ\81à´\95à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95യിൽ à´®à´±à´¯àµ\8dക്കുക",
        "tog-hidecategorization": "താളുകളുടെ വർഗ്ഗീകരണം മറയ്ക്കുക",
        "tog-extendwatchlist": "ഏറ്റവും പുതിയവ മാത്രമല്ല, എല്ലാ മാറ്റങ്ങളും ദൃശ്യമാകുന്ന വിധത്തിൽ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക വികസിപ്പിക്കുക.",
        "tog-usenewrc": "സമീപകാല മാറ്റങ്ങൾ, ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക എന്നീ താളുകളിൽ മാറ്റങ്ങൾ ഗണംതിരിക്കുക",
index 377611c..041be72 100644 (file)
        "navigation": "Nabegaçon",
        "and": "&#32;i",
        "faq": "FAQ",
+       "namespaces": "Domínios",
+       "variants": "Bariadades",
+       "navigation-heading": "Menu de nabegaçon",
        "errorpagetitle": "Erro",
        "returnto": "Retornar pa $1.",
        "tagline": "De {{SITENAME}}",
        "printableversion": "Berson pa ampremir",
        "permalink": "Lhigaçon pa siempre",
        "print": "Ampremir",
+       "view": "Ber",
        "edit": "Eiditar",
        "create": "Criar",
        "create-local": "Poner çcriçon lhocal",
        "protect_change": "demudar",
        "unprotect": "Altarar la proteçon",
        "newpage": "Páigina nuoba",
-       "talkpagelinktext": "Cumbersar",
+       "talkpagelinktext": "cumbersa",
        "specialpage": "Páigina special",
        "personaltools": "Ferramientas pessonales",
        "talk": "Cumbersa",
        "emailauthenticated": "L sou andereço de correio eiletrónico fui cunfirmado la $2, a las $3.",
        "emailconfirmlink": "Cunfirma la tue morada de correio eiletrónico",
        "loginlanguagelabel": "Lhéngua: $1",
+       "pt-login": "Antrar",
+       "pt-createaccount": "Criar ua cuonta",
        "pt-userlogout": "Salir",
        "changepassword": "Demudar palabra-chabe",
        "resetpass_header": "Demudar palabra-chabe de la cuonta",
        "nocreatetext": "{{SITENAME}} restringe la possibilidade de criar nuobas páiginas.\nPuode buoltar atrás i eiditar ua páigina yá eisistente, ó [[Special:UserLogin|outenticar-se ó criar ua cuonta]].",
        "permissionserrorstext-withaction": "Tu nun tenes premisson pa $2, {{PLURAL:$1|pula seguinte rezon|pulas seguintes rezones}}:",
        "recreate-moveddeleted-warn": "<strong>Abiso: Tu stás a criar ua páigina que yá fui d'atrás botada fuora.</strong>\n\nBei bien se ye própio cuntinar a eiditar esta páigina.\nL registro de la eileminaçon i de l arrastrar ye amostrado eiqui por cumbeniéncia:",
-       "moveddeleted-notice": "Esta páigina fui apagada.\nL registro de la eileminaçon, proteçon i arrastrar desta páigina stá ambaixo pa refréncia.",
+       "moveddeleted-notice": "Esta páigina fui botada fuora.\nL registro de la eileminaçon, porteçon i arrastramiento desta páigina stá ambaixo pa refréncia.",
        "viewpagelogs": "Ber registros pa esta páigina",
        "currentrev": "Rebison atual",
        "currentrev-asof": "Eidiçon atual cumo $1",
        "history-feed-item-nocomment": "$1 a $2",
        "rev-delundel": "amostrar/scunder",
        "revdel-restore": "Demudar besiblidade",
+       "revdelete-edit-reasonlist": "Eiditar rezones de botar fuora",
        "mergehistory-submit": "Misturar eidiçones",
        "revertmerge": "Çfazer ounion",
        "history-title": "Stórico de eidiçones de \"$1\"",
        "notextmatches": "Nun fui possible achar, ne l cuntenido de las páiginas, la palabra percurada",
        "prevn": "{{PLURAL:$1|anterior|$1 anteriores}}",
        "nextn": "{{PLURAL:$1|próssimo|próssimos $1}}",
+       "shown-title": "Amostrar $1 {{PLURAL:$1|resultado|resultados}} por páigina",
        "viewprevnext": "Ber ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong>Criar la páigina \"[[:$1]]\" nesta berson!</strong> {{PLURAL:$2|0=|Beija tamien la páigina ancontrada na percura.|Beija tamien ls resultados de la percura.}}",
        "searchprofile-articles": "Páiginas de cuntenido",
        "searchprofile-images": "Multimédia",
        "searchprofile-everything": "Todo",
        "searchprofile-advanced": "Abançado",
+       "searchprofile-articles-tooltip": "Percurar an $1",
        "searchprofile-images-tooltip": "Percurar fexeiros",
+       "searchprofile-everything-tooltip": "Percurar an todo l cuntenido (ancluindo páiginas de cumbersa)",
        "searchprofile-advanced-tooltip": "Personalizar ls domínios adonde percurar",
        "search-result-size": "$1 ({{PLURAL:$2|1 palabra|$2 palabras}})",
        "search-redirect": "(ancaminamiento pa $1)",
        "right-edit": "Eiditar páiginas",
        "right-move": "Arrastrar páiginas",
        "right-movefile": "Arrastrar fexeiros",
+       "right-writeapi": "Outelizar la API de scrita",
        "grant-editmycssjs": "Eiditar l sou CSS/JavaScript personalizado",
        "newuserlogpage": "Registro de criaçon de outelizadores",
        "rightslog": "Registro de dreitos de l outelizador",
        "recentchanges": "Redadeiras altaraçones",
        "recentchanges-legend": "Oupçones de las redadeiras altaraçones",
        "recentchanges-feed-description": "Acumpanha las redadeiras altaraçones de l biqui por esta semiente.",
+       "recentchanges-label-newpage": "Esta eidiçon criou ua nuoba páigina",
+       "recentchanges-label-minor": "Esta ye ua eidiçon pequerrixa",
+       "recentchanges-label-bot": "Esta eidiçon fui feita por un robó",
+       "recentchanges-label-plusminus": "Altaraçon ne l tamanho de la páigina, an bytes",
+       "recentchanges-legend-heading": "<strong>Lhegenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ber tamien la [[Special:NewPages|lhista de páiginas nuobas]])",
+       "recentchanges-submit": "Amostrar",
        "rcfilters-filtergroup-watchlist": "Páiginas begiadas",
        "rcnotefrom": "Ambaixo {{PLURAL:$5|stá la altaraçon feita|stan las alteraçones feitas}} zde <strong>$2</strong> (amostradas até <strong>$1</strong>).",
        "rclistfrom": "Amostrar las noubas altaraçones a partir de $2 de $3",
        "rcshowhideminor": "$1 eidiçones pequerrixas",
+       "rcshowhideminor-show": "Amostrar",
        "rcshowhidebots": "$1 robós",
+       "rcshowhidebots-show": "Amostrar",
        "rcshowhideliu": "$1 outelizadores registrados",
+       "rcshowhideliu-show": "Amostrar",
        "rcshowhideanons": "$1 outelizadores anónimos",
+       "rcshowhideanons-show": "Amostrar",
        "rcshowhidepatr": "$1 eidiçones patrulhadas",
+       "rcshowhidepatr-show": "Amostrar",
        "rcshowhidemine": "$1 mies eidiçones",
+       "rcshowhidemine-show": "Amostrar",
+       "rcshowhidecategorization-show": "Amostrar",
        "rclinks": "Amostrar las redadeiras $1 altaraçones ne ls redadeiros $2 dies",
        "diff": "defr",
        "hist": "stór",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc_categories_any": "Qualquiera de ls scolhidos",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} açpuis las altaraçones",
        "newsectionsummary": "/* $1 */ nuobo cacho",
        "rc-enhanced-expand": "Amostrar detailhes",
        "rc-enhanced-hide": "Scunder detailhes",
        "filehist-datetime": "Data i hora",
        "filehist-thumb": "Amostra",
        "filehist-thumbtext": "Amostra de la berson de las $1",
+       "filehist-nothumb": "Meniatura andisponible",
        "filehist-user": "Outelizador",
        "filehist-dimensions": "Tamanho",
        "filehist-filesize": "Tamanho de l fexeiro",
        "linkstoimage": "{{PLURAL:$1|Esta páigina lhiga|Estas $1 páiginas lhigan}} este fexeiro:",
        "nolinkstoimage": "Nanhua páigina apunta pa este fexeiro.",
        "sharedupload": "Este fexeiro ye de $1 i puode ser outelizado por outros porjetos.",
+       "sharedupload-desc-here": "Este fexeiro ye de $1 i puode ser outelizado por outros porjetos.\nLa çcriçon na [$2 páigina oureginal] ye amostrada ambaixo.",
        "uploadnewversion-linktext": "Cargar ua nuoba berson deste fexeiro",
        "shared-repo-from": "de $1",
        "filerevert-comment": "Motibo:",
        "filedelete-submit": "Apagar",
        "filedelete-nofile": "'''$1''' nun eisiste.",
        "filedelete-reason-otherlist": "Outra rezon",
+       "filedelete-edit-reasonlist": "Eiditar rezones de botar fuora",
        "mimesearch": "Percura MIME",
        "listredirects": "Amostrar ancaminamientos",
        "unusedtemplates": "Modelos nun outelizados",
        "mostimages": "Eimaiges cun mais refréncias",
        "mostrevisions": "Páiginas de cuntenido cun mais rebisones",
        "prefixindex": "Todas las páiginas cun perfixo",
+       "prefixindex-submit": "Amostrar",
        "shortpages": "Páiginas pequeinhas",
        "longpages": "Páiginas cumpridas",
        "deadendpages": "Páiginas sin salida",
        "protectedtitles": "Títalos portegidos",
        "listusers": "Lhista de outelizadores",
        "newpages": "Páiginas nuobas",
+       "newpages-submit": "Amostrar",
        "ancientpages": "Páiginas mais antigas",
        "move": "Arrastrar",
        "movethispage": "Arrastrar esta páigina",
        "specialloguserlabel": "Outelizador(a):",
        "speciallogtitlelabel": "Albo (títalo ó páigina ó {{ns:user}}:nome d'outelizador):",
        "log": "Registros",
+       "logeventslist-submit": "Amostrar",
        "all-logs-page": "Todos ls registros públicos",
        "logempty": "Nun eisiste nanhue antrada correspondente ne l registro.",
        "allpages": "Todas las páiginas",
        "allpagessubmit": "Bota",
        "allpagesprefix": "Amostrar páiginas cul perfixo:",
        "categories": "Catadories",
+       "categories-submit": "Amostrar",
        "linksearch": "Percura de lhigaçones sternas",
        "linksearch-ok": "Percurar",
        "listusers-submit": "Amostrar",
        "watch": "Begiar",
        "watchthispage": "Begiar esta páigina",
        "unwatch": "Zantressar-se",
-       "watchlist-details": "{{PLURAL:$1|Eisiste $1 páigina|Eisisten $1 páiginas}} na sue lhista de páiginas begiadas, scluindo las páiginas de cumbersa.",
+       "watchlist-details": "{{PLURAL:$1|Eisiste $1 páigina|Eisisten $1 páiginas}} na sue lhista de páiginas begiadas (mais las páiginas de cumbersa).",
        "wlheader-enotif": "La notificaçon por correio eiletrónico stá atiba.",
        "wlheader-showupdated": "Las páiginas altaradas zde la redadeira beç que las besitou aparecen çtacadas an <strong>negrito</strong>.",
        "wlshowlast": "Ber redadeiras $1 horas $2 dies",
+       "watchlist-submit": "Amostrar",
        "watchlist-options": "Oupçones de la lhista de páiginas begiadas",
        "watching": "A begiar...",
        "unwatching": "A deixar de begiar...",
        "enotif_reset": "Marcar todas las páiginas cumo bejitadas",
        "created": "criada",
        "changed": "demudada",
-       "deletepage": "Botar fuora páigina",
+       "deletepage": "Botar fuora la páigina",
+       "excontentauthor": "l cuntenido era: \"$1\", i {{GENDER:$2|l único eiditor|la única eiditora|l(a) único(a) eiditor(a)}} era [[Special:Contributions/$2|$2]] ([[User talk:$2|cumbersa]])",
        "delete-confirm": "Botar fuora \"$1\"",
        "delete-legend": "Botar fuora",
        "historywarning": "<strong>Abiso:</strong> La páigina que stás quaije a botar fuora ten un stórico cun aprossimadamente $1 {{PLURAL:$1|rebison|rebisones}}:",
+       "historyaction-submit": "Amostrar",
        "confirmdeletetext": "Stás quaije a botar fuora para siempre ua páigina ó ua eimaige i todos ls sous stóricos.\nPor fabor, bei se ye esso que quieres fazer, que antendes las cunsequéncias i se esso stá d'acordo culas [[{{MediaWiki:Policy-url}}|políticas]].",
        "actioncomplete": "Acion acabada",
-       "deletedtext": "\"$1\" fue elhiminada.\nConsulte $2 para um registo de eliminações recentes.",
+       "deletedtext": "\"$1\" fue botada fuora.\nCunsulte $2 pa un registro reciente de las páiginas botadas fuora.",
        "dellogpage": "Registro de botado fuora",
        "deletecomment": "Rezon:",
        "deleteotherreason": "Rezon adicional:",
        "deletereasonotherlist": "Outra rezon",
        "deletereason-dropdown": "* Motibos d'eliminaçon quemuns\n** Spam\n** Bandalismo\n** Biolaçon de dreitos d'outor\n** Pedido de l'outor\n** Ancaminamiento ambálido",
+       "delete-edit-reasonlist": "Eiditar rezones de botar fuora",
        "rollbacklink": "retornar",
+       "rollbacklinkcount": "çfazer $1 {{PLURAL:$1|eidiçon|eidiçones}}",
+       "revertpage": "Fúrun çfeitas las eidiçones de [[Special:Contributions/$2|$2]] ([[User talk:$2|cumbersa]]) pa la redadeira rebison de [[User:$1|$1]]",
        "protectlogpage": "Registro de porteçon",
        "protectedarticle": "porteger \"[[$1]]\"",
        "modifiedarticleprotection": "demudeste l nible de porteçon pa \"[[$1]]\"",
        "undeletelink": "ber/restourar",
        "namespace": "Spácio de nomes:",
        "invert": "Amberter scuolha",
+       "tooltip-invert": "Marque esta caixa pa scunder las altaraçones la páiginas ne l domínio selecionado (i ne l domínio associado, se scolheu la oupçon)",
+       "namespace_association": "Domínio associado",
+       "tooltip-namespace_association": "Marque esta caixa pa ancluir tamien l domínio de cuntenido ó de cumbersa associado a la sue seleçon",
        "blanknamespace": "(Percipal)",
        "contributions": "Cuntribuiçones {{GENDER:$1|de l outelizador|de la outelizadora|de l(a) outelizador(a)}}",
        "contributions-title": "Upas {{GENDER:$1|de l outelizador|de la outelizadora}} $1",
        "move-watch": "Begiar esta páigina",
        "movepagebtn": "Arrastrar páigina",
        "pagemovedsub": "Páigina arrastrada cumo debe de ser",
-       "movepage-moved": "'''\"$1\" fui arrastrado pa \"$2\"'''",
+       "movepage-moved": "<strong>\"$1\" fui arrastrada pa \"$2\"</strong>",
+       "movepage-moved-redirect": "Fui criado un ancaminamiento.",
+       "movepage-moved-noredirect": "La criaçon dun ancaminamiento fui suprimida.",
        "articleexists": "Yá eisiste ua páigina cun este títalo, ou l títalo que scolhiste ye ambálido.\nPor fabor, scuolhe outro nome.",
        "movetalk": "Arrastrar tamien la páigina de cumbersa associada",
        "move-subpages": "Arrastrar subpáiginas (anté $1)",
        "revertmove": "poner al robés",
        "move-leave-redirect": "Criar un ancaminamiento",
        "export": "Sportar páiginas",
+       "export-submit": "Sportar",
        "export-download": "Grabar cumo fexeiro",
        "allmessages": "Todas las mensaiges de l sistema",
        "allmessagesname": "Nome",
        "tooltip-pt-mycontris": "{{GENDER:|Mies}} upas",
        "tooltip-pt-login": "Tu sós animado pa que te outentiques, inda que esso nun seia oubrigatório.",
        "tooltip-pt-logout": "Salir",
+       "tooltip-pt-createaccount": "Ye ancorajado a criar ua cuonta i ampeçar sesson; inda assi, nun ye oubrigatório",
        "tooltip-ca-talk": "Cumbersa subre l cuntenido de la páigina",
        "tooltip-ca-edit": "Eiditar esta páigina",
        "tooltip-ca-addsection": "Ampeçar un cacho nuobo",
        "tooltip-rollback": "\"{{int:rollbacklink}}\" çfazer, cun un solo clique, las eidiçones de l redadeiro eiditor desta páigina.",
        "tooltip-undo": "\"Çfazer\" çfaç esta eidiçoni abre ls campos de eidiçon ne l modo \"ber cumo queda\".\nPremite ajuntar la rezon de la eidiçon ne l sumário.",
        "lastmodifiedatby": "Esta páigina fui eiditada pula redadeira beç a la(s) $2 de $1 por $3.",
+       "pageinfo-robot-noindex": "Nun premitida",
+       "pageinfo-subpages-name": "Subpáiginas desta páigina",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|ancaminamiento|ancaminamientos}}; $3 {{PLURAL:$3|nun ancaminamiento|nun ancaminamientos}})",
+       "pageinfo-magic-words": "{{PLURAL:$1|Palabra mágica|Palabras mágicas}} ($1)",
        "pageinfo-toolboxlink": "Anformaçones de la páigina",
        "previousdiff": "← Eidiçon d'atrás",
        "nextdiff": "Redadeira eidiçon →",
        "file-nohires": "Sin resoluçon maior çponible.",
        "svg-long-desc": "fexeiro SVG, de $1 × $2 píxeles, tamanho: $3",
        "show-big-image": "Fexeiro oureginal",
+       "show-big-image-preview": "Tamanho desta antebison: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Outra resoluçon|Outras resoluçones}}: $1.",
+       "show-big-image-size": "$1 × $2 píxeles",
        "newimages": "Galerie de nuobos fexeiros",
        "noimages": "Nun hai nada pa ber.",
        "ilsubmit": "Percurar",
        "specialpages-group-pagetools": "Ferramienta de páiginas",
        "specialpages-group-wiki": "Dados i ferramientas",
        "specialpages-group-redirects": "Páiginas speciales de ancaminamientos",
+       "tag-filter": "Filtrar las [[Special:Tags|etiquetas]]:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)",
        "tags-title": "Eitiquetas",
        "tags-edit": "eiditar",
        "tags-activate": "atibar",
        "logentry-move-move": "$1 {{GENDER:$2|arrastrou}} $3 pa $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|arrastrou}} $3 pa $4 sin deixar un ancaminamiento",
        "logentry-move-move_redir": "$1 {{GENDER:$2|arrastrou}} $3 pa l sou ancaminamiento $4",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|arrastrou}} $3 pa l sou ancaminamiento $4, suprimindo l purmeiro",
+       "logentry-newusers-create": "La cuonta de {{GENDER:$2|outelizador|outelizadora}} $1 fui criada",
        "rightsnone": "(nanhun)",
        "searchsuggest-search": "Percurar an {{SITENAME}}",
        "mediastatistics-header-multimedia": "Média anriquecida",
index 8c67a7c..13f49bc 100644 (file)
        "createaccount-title": "{{SITENAME}} အတွက် အကောင့်ပြုလုပ်ခြင်း",
        "login-throttled": "သင်သည် login ဝင်ရန် အကြိမ်မြောက်မြားစွာ အားထုတ်ခဲ့ပြီးဖြစ်သည်။\nကျေးဇူးပြု၍ ထပ်မဝင်ခင် $1 စောင့်ပေးပါ။",
        "login-abort-generic": "လော့ဂ်အင်ဝင်ခြင်း မအောင်မြင်ပါ - ဖျက်သိမ်းပြီး",
-       "loginlanguagelabel": "ဘာသာ: $1",
+       "loginlanguagelabel": "ဘာသာစကား: $1",
        "pt-login": "အကောင့်ဝင်ရန်",
        "pt-login-button": "အကောင့်ဝင်ရန်",
        "pt-login-continue-button": "ဆက်လက် ဝင်ရောက်ပါ",
        "prefs-memberingroups": "{{PLURAL:$1|အုပ်စု|အုပ်စုများ}}၏ {{GENDER:$2|အဖွဲ့ဝင်}}",
        "prefs-registration": "မှတ်ပုံတင်သည့် အချိန် -",
        "yourrealname": "နာမည်ရင်း -",
-       "yourlanguage": "ဘာသာစကား -",
+       "yourlanguage": "ဘာသာစကား:",
        "yournick": "လက်မှတ်အသစ် -",
        "badsig": "တရားမဝင်သည့် လက်မှတ်အကြမ်း။\nHTML tags ကို စစ်ဆေးပါ။",
        "badsiglength": "သင့်လက်မှတ်သည် ရှည်လွန်းနေပါသည်။\nယင်းသည် စာလုံး {{PLURAL:$1|လုံး|လုံး}}ထက် မရှည်ရပါ။",
        "allmessages-filter-unmodified": "မပြုပြင်ထားသော",
        "allmessages-filter-all": "အားလုံး",
        "allmessages-filter-modified": "ပြုပြင်ထားသော",
-       "allmessages-language": "ဘာသာ -",
+       "allmessages-language": "ဘာသာစကား:",
        "allmessages-filter-submit": "သွား",
        "thumbnail-more": "ပုံကြီးချဲ့ရန်",
        "filemissing": "ဖိုင်ပျောက်နေသည်",
index 7c60994..ed2acac 100644 (file)
        "rcfilters-empty-filter": "Ingen aktive filtre. Alle bidrag vises.",
        "rcfilters-filterlist-title": "Filtre",
        "rcfilters-filterlist-whatsthis": "Hvordan virker dette?",
-       "rcfilters-filterlist-feedbacklink": "Gi tilbakemelding på de nye (beta)filtrene",
+       "rcfilters-filterlist-feedbacklink": "Gi tilbakemelding på disse (nye) filterverktøyene",
        "rcfilters-highlightbutton-title": "Marker resultater",
        "rcfilters-highlightmenu-title": "Velg en farge",
        "rcfilters-highlightmenu-help": "Velg en farge for å merke denne egenskapen",
        "rcfilters-liveupdates-button-title-on": "Slå av live-oppdateringer",
        "rcfilters-liveupdates-button-title-off": "Vis nye endringer når de skjer",
        "rcfilters-watchlist-markseen-button": "Merk alle endringer som sett.",
+       "rcfilters-watchlist-edit-watchlist-button": "Rediger listen over sider du overvåker",
+       "rcfilters-watchlist-showupdated": "Endringer til sider du ikke har besøkt siden endringene ble gjort vises med <strong>fet</strong> skrift.",
        "rcnotefrom": "Nedenfor er vist {{PLURAL:$5|endringen|endringene}} som er gjort siden <strong>$3, $4</strong> (frem til <strong>$1</strong>).",
        "rclistfromreset": "Nullstill datovalg",
        "rclistfrom": "Vis nye endringer fra og med $3 $2",
        "sp-contributions-newonly": "Bare vis bidrag som er sideopprettinger",
        "sp-contributions-hideminor": "Skjul mindre endringer",
        "sp-contributions-submit": "Søk",
+       "sp-contributions-outofrange": "Kan ikke vise resultater. Det gitte IP-intervallet er større enn CIDR-grensen på /$1.",
        "whatlinkshere": "Det som lenker hit",
        "whatlinkshere-title": "Sider som lenker til «$1»",
        "whatlinkshere-page": "Side:",
index 3bf9a31..73d0df8 100644 (file)
        "parser-template-loop-warning": "Er is een kringloop in sjablonen geconstateerd: [[$1]]",
        "template-loop-category": "Pagina's met sjablonen die zichzelf insluiten",
        "template-loop-category-desc": "De pagina bevat een sjabloon dat zichzelf insluit, bijvoorbeeld een sjabloon dat zichzelf recursief aanroept.",
+       "template-loop-warning": "<strong>Waarschuwing:</strong> Deze pagina roept [[:$1]] aan, wat een sjabloon kringloop veroorzaakt (een oneindige recursieve aanroep).",
        "parser-template-recursion-depth-warning": "De recursiediepte voor sjablonen is overschreden ($1)",
        "language-converter-depth-warning": "De dieptelimiet voor de taalconvertor is overschreden ($1)",
        "node-count-exceeded-category": "Pagina's waar het maximaal aantal nodes is overschreden",
        "rcfilters-liveupdates-button-title-off": "Toon nieuwe wijzigingen op het moment dat ze gebeuren",
        "rcfilters-watchlist-markseen-button": "Alle wijzigingen markeren als bezocht.",
        "rcfilters-watchlist-edit-watchlist-button": "Bewerk uw volglijst",
+       "rcfilters-preference-label": "Verberg de verbeterde versie van Recente Wijzigingen",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
        "rclistfromreset": "Datum selectie opnieuw instellen",
        "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
index c33f954..7641cca 100644 (file)
        "last": "førre",
        "page_first": "fyrste",
        "page_last": "siste",
-       "histlegend": "Merk av for dei versjonane du vil samanlikne og trykk [Enter] eller klikk på knappen nedst på sida.<br />Forklaring: (no) = skilnad frå den noverande versjonen, (førre) = skilnad frå den førre versjonen, <b>s</b> = småplukk",
+       "histlegend": "Merk av for dei versjonane du vil samanlikne og trykk [Enter] eller klikk på knappen nedst på sida.<br />\nForklaring: <strong>({{int:cur}})</strong> = skilnad frå den noverande versjonen, <strong>({{int:last}})</strong> = skilnad frå den førre versjonen, <strong>{{int:minoreditletter}}</strong> = småplukk",
        "history-fieldset-title": "Søk etter versjonar",
        "history-show-deleted": "Berre sletta versjonar",
        "histfirst": "eldste",
index 8fcd2b7..f18a32f 100644 (file)
@@ -89,7 +89,8 @@
                        "Kirsan",
                        "Krottyianock",
                        "Mazab IZW",
-                       "InternerowyGołąb"
+                       "InternerowyGołąb",
+                       "Wojtas"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "rcfilters-liveupdates-button-title-off": "Wyświetlaj nowe zmiany zaraz po tym jak nastąpią",
        "rcfilters-watchlist-markseen-button": "Oznacz wszystkie zmiany jako obejrzane",
        "rcfilters-watchlist-edit-watchlist-button": "Edytuj swoją listę obserwowanych stron",
+       "rcfilters-preference-label": "Wyłącz ulepszenia strony Ostatnie zmiany",
        "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
        "rclistfromreset": "Zresetuj wybór daty",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "htmlform-int-toolow": "Podana wartość jest poniżej dopuszczalnego minimum $1",
        "htmlform-int-toohigh": "Podana wartość jest powyżej dopuszczalnego maximum $1",
        "htmlform-required": "Podanie tej wartości jest wymagane",
-       "htmlform-submit": "Wyślij",
+       "htmlform-submit": "Prześlij",
        "htmlform-reset": "Cofnij zmiany",
        "htmlform-selectorother-other": "Inne",
        "htmlform-no": "Nie",
index e6f323e..6749e35 100644 (file)
        "parser-template-loop-warning": "Ciclo de predefinições detetado: [[$1]]",
        "template-loop-category": "Páginas com ciclos infinitos de predefinições",
        "template-loop-category-desc": "Esta página contém um ciclo infinito de predefinições, isto é, uma predefinição que se chama a si própria recursivamente.",
+       "template-loop-warning": "<strong>Aviso:</strong> Esta página chama [[:$1]] o que causa um ciclo infinito de predefinições (uma chamada recursiva sem término).",
        "parser-template-recursion-depth-warning": "Foi excedido o limite da profundidade de recursividade nas predefinições ($1)",
        "language-converter-depth-warning": "O limite de profundidade do conversor de idiomas excedeu a ($1)",
        "node-count-exceeded-category": "Páginas em que o total de nós é excedido",
        "rcfilters-watchlist-markseen-button": "Marcar todas as modificações como já vistas",
        "rcfilters-watchlist-edit-watchlist-button": "Editar a sua lista de páginas vigiadas",
        "rcfilters-watchlist-showupdated": "As mudanças das páginas que ainda não visitou após terem sido alteradas aparecem a <strong>negrito</strong>, com marcadores sólidos.",
+       "rcfilters-preference-label": "Ocultar a versão melhorada das mudanças recentes",
+       "rcfilters-preference-help": "Reverte o redesenho da interface de 2017 e todas as ferramentas adicionadas na altura e desde então.",
        "rcnotefrom": "Abaixo {{PLURAL:$5|está a mudança|estão as mudanças}} desde <strong>$2</strong> (mostradas até <strong>$1</strong>).",
        "rclistfromreset": "Reiniciar a seleção da data",
        "rclistfrom": "Mostrar as novas mudanças a partir das $2 de $3",
index 5ace4bf..d8de413 100644 (file)
                        "MustangDSG",
                        "Valeri'swiki",
                        "Marat-avgust",
-                       "Ernác"
+                       "Ernác",
+                       "Wertuose"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "parser-template-loop-warning": "Обнаружена петля в шаблонах: [[$1]]",
        "template-loop-category": "Страницы с петлями в шаблонах",
        "template-loop-category-desc": "Эта страница содержит петлю в шаблоне, т.е. шаблон, который рекурсивно вызывает сам себя.",
+       "template-loop-warning": "<strong>Предупреждение:</ strong> Эта страница вызывает [[:$1]], который приводит к возникновению цикла в шаблоне (бесконечный рекурсивный вызов).",
        "parser-template-recursion-depth-warning": "Превышен предел глубины рекурсии шаблона ($1)",
        "language-converter-depth-warning": "Превышен предел глубины преобразователя языков ($1)",
        "node-count-exceeded-category": "Страницы, на которых превышено число узлов",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Показать",
        "rcfilters-tag-remove": "Удалить '$1'",
-       "rcfilters-legend-heading": "<strong>Ð\9aÑ\8aÑ\8bÑ\81Ñ\85аÑ\80Ñ\82Ñ\8bÑ\83ланÑ\8b Ñ\82измеÑ\81и:</strong>",
+       "rcfilters-legend-heading": "<strong>СпиÑ\81ок Ñ\81окÑ\80аÑ\89ений:</strong>",
        "rcfilters-other-review-tools": "<strong>Другие инструменты проверки</strong>",
        "rcfilters-group-results-by-page": "Группировать результаты по странице",
        "rcfilters-grouping-title": "Группировка",
        "rcfilters-view-advanced-filters-label": "Расширенные фильтры",
        "rcfilters-view-tags": "Тегированные правки",
        "rcfilters-view-namespaces-tooltip": "Результаты фильтра по пространствам имён",
-       "rcfilters-view-tags-tooltip": "РезÑ\83лÑ\8cÑ\82аÑ\82Ñ\8b Ñ\84илÑ\8cÑ\82Ñ\80а, Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8eÑ\89его метки правок",
+       "rcfilters-view-tags-tooltip": "ФилÑ\8cÑ\82Ñ\80оваÑ\82Ñ\8c Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82Ñ\8b, Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8f метки правок",
        "rcfilters-view-return-to-default-tooltip": "Вернуться в главное меню фильтров",
        "rcfilters-liveupdates-button": "Обновлять автоматически",
        "rcfilters-liveupdates-button-title-on": "Отключить автоматические обновления",
        "rcfilters-watchlist-markseen-button": "Отметить все изменения как просмотренные",
        "rcfilters-watchlist-edit-watchlist-button": "Редактировать ваш список просмотренных страниц",
        "rcfilters-watchlist-showupdated": "Изменения страниц, которые вы не посещали с того момента, как они изменились, выделены <strong>жирным</strong> и отмечены полным маркером.",
+       "rcfilters-preference-label": "Скрыть улучшенную версию Последних изменений",
+       "rcfilters-preference-help": "Откатывает редизайн интерфейса 2017 года и все инструменты, добавленные с тех пор.",
        "rcnotefrom": "Ниже {{PLURAL:$5|указано изменение|перечислены изменения}} с <strong>$3, $4</strong> (показано не более <strong>$1</strong>).",
        "rclistfromreset": "Сбросить выбор даты",
        "rclistfrom": "Показать изменения с $3 $2.",
index 99a793b..bc9b0ce 100644 (file)
        "parser-template-loop-warning": "V predlogi je bila odkrita zanka: [[$1]]",
        "template-loop-category": "Strani z zankami predlog",
        "template-loop-category-desc": "Stran vsebuje zanko predloge, tj. predlogo, ki rekurzivno kliče sama sebe.",
+       "template-loop-warning": "<strong>Opozorilo:</strong> Ta stran kliče [[:$1]], kar povzroči zanko predloge (neskončni rekurzivni klic).",
        "parser-template-recursion-depth-warning": "Prekoračena globina rekurzije predlog ($1)",
        "language-converter-depth-warning": "Prekoračena globina pretvorbe jezikov ($1)",
        "node-count-exceeded-category": "Strani s prekoračenim številom vozlišč",
        "rcfilters-watchlist-markseen-button": "Označi vse spremembe kot pregledane",
        "rcfilters-watchlist-edit-watchlist-button": "Uredite svoj seznam nadzorovanih strani",
        "rcfilters-watchlist-showupdated": "Spremembe strani, ki jih niste obiskali od zadnje spremembe, so prikazane <strong>krepko</strong>, z močnimi oznakami.",
+       "rcfilters-preference-label": "Skrij izboljšano različico Zadnjih sprememb",
+       "rcfilters-preference-help": "Povrne preoblikovanje vmesnika leta 2017 in vsa takrat in od takrat dodana orodja.",
        "rcnotefrom": "{{PLURAL:$5|Navedena je sprememba|Navedeni sta spremembi|Navedene so spremembe}} od <strong>$3 $4</strong> dalje (prikazujem jih do <strong>$1</strong>).",
        "rclistfromreset": "Ponastavi izbiro datuma",
        "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
index 69e3252..c933046 100644 (file)
        "permissionserrorstext": "Немате овлашћење за ову радњу из {{PLURAL:$1|1=следећег|следећих}} разлога:",
        "permissionserrorstext-withaction": "Немате дозволу за $2 из {{PLURAL:$1|следећег|следећих}} разлога:",
        "recreate-moveddeleted-warn": "<strong>Упозорење: поново правите страницу која је претходно обрисана.</strong>\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:",
-       "moveddeleted-notice": "Ова страница је обрисана.\nИсторија њеног брисања и премештања налази се испод:",
+       "moveddeleted-notice": "Ова страница је обрисана.\nИсторија њеног брисања, заштите и премештања налази се испод:",
        "moveddeleted-notice-recent": "Жао нам је, ова страница је недавно обрисана (у последњих 24 сата).\nОвде је наведена историја брисања и премештања с образложењем.",
        "log-fulllog": "Погледај целу историју",
        "edit-hook-aborted": "Измену је прекинула кука.\nНије дато никакво образложење.",
        "mw-widgets-mediasearch-noresults": "Нема резултата.",
        "mw-widgets-titleinput-description-new-page": "страница још увек не постоји",
        "mw-widgets-titleinput-description-redirect": "преусмерава на $1",
+       "mw-widgets-usersmultiselect-placeholder": "Додај још...",
        "date-range-from": "Од датума:",
        "date-range-to": "До датума:",
        "randomrootpage": "Случајна коренска страница",
index 231f0ce..a400895 100644 (file)
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kasalahan internal: $1",
        "internalerror-fatal-exception": "Mahiwal dina ketikan \"$1\"",
-       "filecopyerror": "Teu bisa nyalin koropak \"$1\" ka \"$2\".",
-       "filerenameerror": "Teu bisa ngaganti ngaran koropak \"$1\" jadi \"$2\".",
-       "filedeleteerror": "Teu bisa ngahapus koropak \"$1\".",
+       "filecopyerror": "Teu bisa néplak berkas \"$1\" ka \"$2\".",
+       "filerenameerror": "Teu bisa ngarobah ngaran berkas \"$1\" jadi \"$2\".",
+       "filedeleteerror": "Teu bisa mupus berkas \"$1\".",
        "directorycreateerror": "Henteu bisa nyieun diréktori \"$1\".",
        "directoryreadonlyerror": "Diréktori \"$1\" ukur-baca.",
        "directorynotreadableerror": "Diréktori \"$1\" henteu bisa dibaca.",
-       "filenotfound": "Teu bisa manggihan koropak \"$1\".",
+       "filenotfound": "Teu bisa manggihan berkas \"$1\".",
        "unexpected": "Peunteun di luar hontalan: \"$1\"=\"$2\".",
        "formerror": "Kasalahan: teu bisa ngirim formulir",
        "badarticleerror": "Peta ieu teu bisa dipigawé na kaca ieu.",
        "timezoneregion-europe": "Éropah",
        "timezoneregion-indian": "Samudra Indonésia",
        "timezoneregion-pacific": "Samudra Pasifik",
-       "allowemail": "Buka koropak pikeun nampa surélék ti nu séjén",
+       "allowemail": "Buka berkas pikeun nampa surélék ti nu séjén",
        "prefs-searchoptions": "Paluruh",
        "prefs-namespaces": "Ngaranspasi",
        "default": "ti dituna",
-       "prefs-files": "Koropak",
+       "prefs-files": "Berkas",
        "prefs-custom-css": "CSS sakahayang",
        "prefs-custom-js": "JavaScript sakahayang",
        "prefs-common-css-js": "CSS/JavaScript dipaké pikeun sakabéh kulit:",
        "userrights-expiry": "Kadaluwarsa:",
        "userrights-expiry-existing": "Waktu kadaluwarsa kiwari: $3, $2",
        "userrights-expiry-othertime": "Séjén waktu:",
+       "userrights-invalid-expiry": "Waktu kadaluwarsa pikeun gorombolan \"$1\" teu sah.",
+       "userrights-expiry-in-past": "Waktu kadaluwarsa pikeun gorombolan \"$1\" geus kaliwat berlalu.",
        "group": "Gorombolan:",
        "group-user": "Pamaké",
        "group-autoconfirmed": "Pamaké anu otomatis dikonfirmasi",
        "right-createpage": "Nyieun kaca anyar (nu lain kaca obrolan)",
        "right-createtalk": "Nyieun kaca obrolan",
        "right-createaccount": "Nyieun akun anyar",
+       "right-autocreateaccount": "Otomatis asup log ku akun pamaké luar",
        "right-minoredit": "Nandaan éditan minor",
        "right-move": "Mindahkeun kaca",
        "right-move-subpages": "Pindahkeun kaca katut sakabéh subkacana",
        "right-movefile": "Mindahkeun berkas",
        "right-suppressredirect": "Henteu nyieun hiji alihan ti ngaran lila sabot mindahkeun kaca",
        "right-upload": "Unjal berkas",
-       "right-reupload": "Nimpah koropak nu geus aya",
+       "right-reupload": "Ngalandih berkas nu geus aya",
        "right-reupload-own": "Nimpah koropak nu geus aya nu dimuat ku sorangan",
        "right-reupload-shared": "Nampik gambar-gambar dina média lokal babarengan",
        "right-upload_by_url": "Unjal berkas tina alamat URL",
        "right-unblockself": "buka peungpeuk sorangan",
        "right-protect": "Ngarobah hambalan protéksi jeung édit kaca anu dikonci",
        "right-editprotected": "Edit kaca anu dikonci salaku \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Édit kaca nu ditantayungan minangka \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Édit modél kontén kaca",
        "right-editinterface": "Édit antarbenget pamaké",
        "right-editusercss": "Édit berkas CSS pamaké séjén",
        "right-editmyusercss": "Édit berkas CSS pamaké anjeun",
        "right-editmyuserjs": "Édit berkas JavaScript pamaké anjeun",
        "right-viewmywatchlist": "Tempo awaskeuneun anjeun",
+       "right-editmywatchlist": "Édit daptar awaskeuneun anjeung. Masih aya cara nambahkeun kaca tanpa kudu mibanda ieu hak.",
        "right-viewmyprivateinfo": "Tempo data pribadi anjeun (alamat surélék, ngaran asli)",
        "right-editmyprivateinfo": "Robah data pribadi anjeun (alamat surélék, ngaran asli)",
        "right-editmyoptions": "Robah préferénsi anjeun",
+       "right-rollback": "Geuwat malikkeun éditan-éditan pamaké panungtung nu ngédit kaca tinangtu",
        "right-markbotedits": "Nandaan pamalikan révisi minangka éditan bot",
        "right-noratelimit": "Teu dipangaruhan ku wawatesan jumlah éditan",
        "right-import": "Ngimpor kaca ti wiki séjén",
        "action-move-categorypages": "pindahkeun kaca kategori",
        "action-movefile": "mindahkeun ieu berkas",
        "action-upload": "ngamuat ieu berkas",
-       "action-reupload": "nimpah berkas nu geus aya ieu",
+       "action-reupload": "ngalandih berkas nu geus aya",
        "action-reupload-shared": "nimpah ier berkas dina gudang sadaya",
        "action-upload_by_url": "ngamuat ieu berkas ti URL",
        "action-writeapi": "maké API",
        "action-editcontentmodel": "ngédit modél kontén hiji kaca",
        "action-managechangetags": "jieun sarta pareuman tag",
        "action-applychangetags": "larapkeun tag bareng jeung parobahan anjeun",
+       "action-changetags": "nambahan jeung mupus tag sakahanyar dina révisi individu jeung éntri log",
        "action-deletechangetags": "pupus tag tina basis data",
        "action-purge": "hapus sindangan ieu kaca",
        "nchanges": "$1 {{PLURAL:$1|parobahan|parobahan}}",
        "rcfilters-highlighted-filters-list": "Disorot: $1",
        "rcfilters-quickfilters": "Saringan kasimpen",
        "rcfilters-quickfilters-placeholder-title": "Can aya tutumbu kasimpen",
+       "rcfilters-quickfilters-placeholder-description": "Pikeun nyimpen pangaturan saringan jeung makéna deui, klik ikon ciciri kaca di aréa Panyaringan Aktif, di handap.",
        "rcfilters-savedqueries-defaultlabel": "Saringan kasimpen",
        "rcfilters-savedqueries-rename": "Robah ngaran",
        "rcfilters-savedqueries-setdefault": "Atur minangka baku",
        "rcfilters-empty-filter": "Euweuh filter aktif. Sakumna kontribusi ditémbongkeun.",
        "rcfilters-filterlist-title": "Saringan",
        "rcfilters-filterlist-whatsthis": "Kumaha bet bisa kieu?",
-       "rcfilters-filterlist-feedbacklink": "Béré eupan balik pikeun saringan uji coba anyar",
+       "rcfilters-filterlist-feedbacklink": "Béjaan kami kedalan anjeun ngeunaan ieu alat panyaringan (anyar)",
        "rcfilters-highlightbutton-title": "Hasil sorotan",
        "rcfilters-highlightmenu-title": "Pilih warna",
        "rcfilters-highlightmenu-help": "Pilih warna pikeun nyorot ieu properti",
        "rcfilters-filterlist-noresults": "Taya saringan nu kapanggih",
+       "rcfilters-noresults-conflict": "Hasil teu kapanggih lantaran kritéria pamaluruhanna pajiin-jiin",
        "rcfilters-filtergroup-authorship": "Kontribusi kapangarangan",
        "rcfilters-filter-editsbyself-label": "Éditan meunang anjeun",
        "rcfilters-filter-editsbyself-description": "Kontribusi anjeun.",
        "rcfilters-filter-newpages-label": "Panyieunan kaca",
        "rcfilters-filter-newpages-description": "Éditan nu nyieun kaca anyar.",
        "rcfilters-filter-categorization-label": "Parobahan kategori",
+       "rcfilters-filter-categorization-description": "Rékaman kaca nu geus ditambahkeun atawa dipupus tina kategori.",
        "rcfilters-filter-logactions-label": "Tarékah kacatet",
        "rcfilters-filtergroup-lastRevision": "Révisi panganyarna",
        "rcfilters-filter-lastrevision-label": "Révisi panganyarna",
        "rcfilters-liveupdates-button-title-off": "Témbongkeun parobahan anyar nalika éta parobahan prung",
        "rcfilters-watchlist-markseen-button": "Tandaan sakumna parobahan minangka katémbong",
        "rcfilters-watchlist-edit-watchlist-button": "Édit daptar kaca awaskeuneun anjeun",
+       "rcfilters-preference-label": "Samunikeun vérsi Anyar Robah nu geus diropéa",
        "rcnotefrom": "Di handap ieu {{PLURAL:$5|parobahan}} ti <strong>$3, $4</strong> (nepi ka <strong>$1</strong> ditémbongkeun).",
        "rclistfromreset": "Rését pilihan kaping",
        "rclistfrom": "Témbongkeun nu anyar robah nepi ka $3 $2",
        "upload-preferred": "Tipeu koropak nu dianjurkeun: $1.",
        "upload-prohibited": "{{PLURAL:$2|Jinis}} berkas nu dilarang: $1.",
        "uploadlogpage": "Log unggahan",
-       "uploadlogpagetext": "Di handap mangrupa daptar muatan koropak nu panganyarna. Titimangsa nu katémbong dumasar titimangsa server.",
-       "filename": "Ngaran koropak",
+       "uploadlogpagetext": "Di handap téh daptar unjalan berkas panganyarna. \nTémbong [[Special:NewFiles|galéri berkas anyar]] pikeun pidangan visual.",
+       "filename": "Ngaran berkas",
        "filedesc": "Ringkesna",
        "fileuploadsummary": "Ringkesan:",
        "filereuploadsummary": "Parobahan berkas:",
        "filesource": "Sumber:",
        "ignorewarning": "Ulah diwaro, simpen baé koropakna.",
        "ignorewarnings": "Tong diwaro panginget naon baé",
-       "minlength1": "Ngaran koropak sahanteuna kudu diwangun ku hiji aksara.",
-       "illegalfilename": "Ngaran koropak \"$1\" ngandung aksara nu teu diwenangkeun pikeun judul kaca. Mangga gentos ngaranna tur cobi muatkeun deui.",
+       "minlength1": "Ngaran koropak sahenteuna ngandung sahurup.",
+       "illegalfilename": "Ngaran berkas \"$1\" ngandung aksara nu teu diwenangkeun pikeun judul kaca. Mangga ganti ngaranna tur coba unjal deui.",
        "filename-toolong": "Ngaran berkas teu meunang leuwih ti 240 bit.",
        "badfilename": "Ngaran gambar geus dirobah jadi \"$1\".",
        "filetype-mime-mismatch": "Éksténsi berkas \".$1\" teu luyu jeung tipeu MIME anu kadetéksi ti berkas ($2).",
        "unknown-error": "Aya kasalahan anu teu dikanyahoankeun.",
        "tmp-create-error": "Teu bisa nyieun berkas sementara.",
        "tmp-write-error": "Éror nulis berkas sementara.",
-       "large-file": "Hadéna mah koropak nu dimuat téh teu leuwih ti $1 bit; ieu koropak gedéna $2 bit.",
-       "largefileserver": "Ieu koropak badag teuing, ngaleuwihan wates nu diwenangkeun ku server.",
-       "emptyfile": "Koropak nu dimuatkeun ku anjeun jigana kosong. Hal ieu bisa jadi alatan sarupaning ''typo'' na ngaran koropakna. Mangga parios deui yén anjeun leres-leres hoyong ngamuat koropak éta.",
+       "large-file": "Alusna mah ukuran berkas téh teu leuwih ti $1;\nari ieu berkas $2.",
+       "largefileserver": "Ieu berkas leuwih badag tina nu diwenangkeun ku sérver.",
+       "emptyfile": "Berkas nu diunjal ku anjeun jigana mah kosong. Ieu perkara meureun alatan salah ketik dina ngaran berkasna. Pék pastikeun yén anjeun téh bener-bener hayang ngunjal éta berkas.",
        "windows-nonascii-filename": "Ieu wiki teu ngarojong ngaran berkas anu maké aksara husus.",
        "fileexists": "Berkas nu ngaranna kieu geus aya, mangga parios <strong>[[:$1]]</strong> mun {{GENDER:|anjeun}} teu yakin rék ngaganti.\n[[$1|thumb]]",
        "fileexists-extension": "Geus aya berkas anu ngaranna sarupa: [[$2|thumb]]\n* Ngaran berkas nu dimuat: <strong>[[:$1]]</strong>\n* Ngaran berkas nu geus aya: <strong>[[:$2]]</strong>\nPilih ngaran séjén.",
        "file-deleted-duplicate": "Berkas anu sarua jeung [[:$1]] geus kungsi dihapus.\nPariksa heula jujutan hapusanana saméméh neruskeun ngamuat deui éta berkas.",
        "uploadwarning": "Pépéling ngamuat",
        "uploadwarning-text": "Ropéa pedaran berkas di handap terus cobaan deui.",
-       "savefile": "Simpen koropak",
+       "savefile": "Simpen berkas",
        "uploaddisabled": "Punten, ngamuat ayeuna ditumpurkeun.",
        "copyuploaddisabled": "Unggahan dumasar URL ditumpurkeun.",
-       "uploaddisabledtext": "Fungsi ngamuat koropak ditumpurkeun.",
-       "uploadscripted": "Koropak ieu ngandung kode HTML atawa skrip nu bisa dibaca ngaco ku panyungsi ramat (''web browser'').",
+       "uploaddisabledtext": "Fungsi ngunjal berkas ditumpurkeun.",
+       "uploadscripted": "Ieu berkas ngandung kodeu HTML atawa skrip nu bisa dibaca ngaco ku panyungsi ramat.",
        "uploaded-setting-href-svg": "Maké tag \"sét\" pikeun nambahkeun atribut \"href\" kana élemén utama dipeungpeuk.",
        "uploadinvalidxml": "XML na berkas nu diunjal teu bisa didadarkeun.",
        "uploadvirus": "Koropakna ngandung virus! Katrangan: $1",
-       "upload-source": "Koropak sumber",
-       "sourcefilename": "Ngaran koropak sumber:",
+       "upload-source": "Berkas sumber",
+       "sourcefilename": "Ngaran berkas sumber:",
        "sourceurl": "URL sumber:",
-       "destfilename": "Ngaran koropak tujuan:",
-       "upload-maxfilesize": "Ukuran koropak panggedéna: $1",
-       "upload-description": "Pedaran koropak",
+       "destfilename": "Ngaran berkas tujuan:",
+       "upload-maxfilesize": "Ukuran maksimum berkas: $1",
+       "upload-description": "Pedaran berkas",
        "upload-options": "Pilihan muat",
        "watchthisupload": "Awaskeun ieu kaca",
-       "filewasdeleted": "Ngaran koropak ieu geus di hapus. Anjeun kudu ningali ka $1 sa acan muatkeun koropak deui",
+       "filewasdeleted": "Berkas nu ngaranna kieu pernah diunjal sarta tuluy dipupus. Pék riksa heula $1 saméméh ngunjal éta berkas téh.",
        "upload-proto-error": "Salah protokol",
        "upload-file-error": "Kasalahan internal",
        "upload-misc-error": "Kasalahan muat anu teu kanyahoan",
        "upload-http-error": "Aya galat HTTP: $1",
        "upload-copy-upload-invalid-domain": "Unjalan téplakan teu sayaga ti ieu domain.",
        "upload-foreign-cant-upload": "Ieu wiki teu diatur pikeun ngunjal berkas ka gudang panyindangan asing.",
+       "upload-dialog-disabled": "Unjal berkas maké ieu dialog dipareuman di ieu wiki.",
        "upload-dialog-title": "Unjal berkas",
        "upload-dialog-button-cancel": "Bolay",
        "upload-dialog-button-back": "Balik deui",
        "upload-dialog-button-upload": "Unjal",
        "upload-form-label-infoform-title": "Wincikan",
        "upload-form-label-infoform-name": "Ngaran",
+       "upload-form-label-infoform-name-tooltip": "Judul déskriptif anu unik pikeun berkas, anu bakal miboga fungsi minangka ngaran berkas. Anjeun bisa maké basa basajan kalawan spasi. Ulah ngawuwuhkeun éksténsi berkas",
        "upload-form-label-infoform-description": "Pedaran",
        "upload-form-label-usage-title": "Pamakéan",
        "upload-form-label-usage-filename": "Ngaran berkas",
        "upload-form-label-own-work": "Ieu mah karya kuring sorangan",
        "upload-form-label-infoform-categories": "Kategori",
        "upload-form-label-infoform-date": "Ping",
+       "upload-form-label-not-own-work-local-generic-local": "Sugan anjeun hayang nyoba [[Special:Upload|kaca unjalan baku]].",
        "backend-fail-stream": "Teu bisa malidkeun berkas \"$1\"",
        "backend-fail-backup": "Teu bisa nyadangkeun berkas \"$1\".",
        "backend-fail-notexists": "Berkas $1 euweuh.",
        "uploadstash-errclear": "Mersihan berkas nu garagal.",
        "uploadstash-refresh": "Nyegerken deui daptar berkas",
        "uploadstash-thumbnail": "tempo miniatur",
+       "invalid-chunk-offset": "Opsét potongan teu valid",
        "img-auth-accessdenied": "Aksés ditolak",
        "img-auth-nofile": "Berkas \"$1\" henteu aya.",
        "img-auth-streaming": "Palidan \"$1\".",
        "img-auth-noread": "Pamaké teu boga kawenangan maca \"$1\".",
        "http-invalid-url": "URL teu bener: $1",
        "http-invalid-scheme": "URL kalawan skéma \"$1\" teu dirojong.",
+       "http-request-error": "Pundutan HTTP gagal alatan kasalahan nu teu dipikanyaho.",
        "http-read-error": "Kasalahan maca HTTP.",
        "http-timed-out": "Pamundutan HTTP béakeun waktu.",
        "http-curl-error": "Kasalahan keur nyokot URL: $1",
        "filehist-nothumb": "Taya miniatur",
        "filehist-user": "Kontributor",
        "filehist-dimensions": "Ukuran",
-       "filehist-filesize": "Ukuran koropak",
+       "filehist-filesize": "Ukuran berkas",
        "filehist-comment": "Kamandang",
        "imagelinks": "Pamakéan berkas",
        "linkstoimage": "Kaca ieu  {{PLURAL:$1|numbu|$1 numbu}} ka gambar ieu :",
        "nolinkstoimage": "Teu aya kaca anu nutumbu ka ieu berkas.",
        "linkstoimage-redirect": "$1 (pangalihan berkas) $2",
-       "sharedupload": "Ieu koropak téh ti $1 nu bisa jadi dipaké ku proyék-proyék lianna.",
+       "sharedupload": "Ieu berkas téh ti $1 jeung meureun dipaké ku proyék-proyék séjén.",
        "sharedupload-desc-here": "Ieu berkas asalna ti $1 anu bisa jadi dipaké ku proyék séjén. \nPedaran ti [$2 kaca pedaranana] dipidangkeun di handap.",
        "filepage-nofile": "Taya berkas nu ngaranna kieu.",
        "filepage-nofile-link": "Taya berkan nu ngaranna kieu, tapi anjeun bisa [$1 ngunjalkeunna].",
        "watchlist-options": "Pilihan awaskeuneun",
        "watching": "Ngawaskeun...",
        "unwatching": "Eureun ngawaskeun...",
+       "watcherrortext": "Aya kasalahan mangsa ngarobah préférénsi daptar awaskeuneun anjeun pikeun \" $1 \".",
        "enotif_reset": "Tandaan sadaya kaca nu geus dilongok",
        "enotif_impersonal_salutation": "Pamaké {{SITENAME}}",
        "enotif_subject_deleted": "Kaca {{SITENAME}} $1 geus {{GENDER:$2|dihapus}} ku $2",
+       "enotif_subject_created": "Kaca {{SITENAME}} $1 geus {{GENDER:$2|dijieun}} ku $2",
+       "enotif_subject_moved": "Kaca {{SITENAME}} $1 geus {{GENDER:$2|dialihkeun}} ku $2",
+       "enotif_subject_restored": "Kaca {{SITENAME}} $1 geus {{GENDER:$2|dibalikkeun}} ku $2",
+       "enotif_subject_changed": "Kaca {{SITENAME}} $1 geus {{GENDER:$2|dirobah}} ku $2",
        "enotif_lastvisited": "Pikeun sakumna parobahan ti saprak jebulan panungtung, tempo $1",
        "enotif_lastdiff": "Pikeun nempo parobahan, ilikan $1",
        "enotif_anon_editor": "pamaké anonim $1",
        "protectedarticle": "ngonci $1",
        "modifiedarticleprotection": "hambalan koncian \"[[$1]]\" geus dirobah",
        "unprotectedarticle": "muka konci tina \"[[$1]]\"",
+       "movedarticleprotection": "ngalihkeun pangaturan protéksi ti \"[[$2]]\" ka \"[[$1]]\"",
        "protectedarticle-comment": "{{GENDER:$2|Nangtayungan}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Ngarobah tingkat panangtayungan}} pikeun \"[[$1]]\"",
        "protect-title": "Ngonci \"$1\"",
        "protect-title-notallowed": "Tempo undak panangtayungan ti \"$1\"",
        "prot_1movedto2": "mindahkeun [[$1]] ka [[$2]]",
        "protect-badnamespace-title": "Ngaranspasi nu teu bisa ditangtayungan",
+       "protect-badnamespace-text": "Kaca dina ieu ngaranspasi teu bisa diprotéksi.",
        "protect-norestrictiontypes-title": "Kaca nu teu karaksa",
        "protect-legend": "Konfirmasi ngonci",
        "protectcomment": "Alesan:",
        "year": "Ti taun (jeung saméméhna):",
        "sp-contributions-newbies": "Témbongkeun kontribusi ti akun anyar wungkul",
        "sp-contributions-newbies-sub": "Pikeun akun anyar",
+       "sp-contributions-newbies-title": "Kontribusi pamaké pikeun akun anyar",
        "sp-contributions-blocklog": "log peungpeuk",
        "sp-contributions-suppresslog": "kontribusi {{GENDER:$1|pamaké}} nu disamunikeun",
        "sp-contributions-deleted": "kontribusi {{GENDER:$1|pamaké}} nu dipupus",
        "ipboptions": "2 jam:2 hours,sapoé:1 day,3 poé:3 days,saminggu:1 week,2 minggu:2 weeks,sabulan:1 month,3 bulan:3 months,6 bulan:6 months,sataun:1 year,tanpa wates:infinite",
        "ipbhidename": "Sumputkeun ngaran pamaké tina éditan jeung daptar pamaké",
        "ipbwatchuser": "Awaskeun kaca pamaké jeung kaca obrolan pamaké ieu",
+       "ipb-change-block": "Peungpeuk deui pamaké kalawan sét konfigurasi ieu",
        "ipb-confirm": "Konfirmasi peungpeuk",
        "badipaddress": "Alamat IP teu sah",
        "blockipsuccesssub": "Meungpeuk geus hasil",
-       "blockipsuccesstext": "\"$1\" dipeungpeuk.\n<br />Tempo [[Special:BlockList|daptar peungpeuk IP]] pikeun nempoan deui peungpeuk.",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] geus dipeungpeuk.<br />\nTempo [[Special:BlockList|daptar peungpeukan]] pikeun niténan deui pameungpeukan.",
        "ipb-edit-dropdown": "Édit alesan meungpeuk",
        "ipb-unblock-addr": "Buka peungpeuk $1",
        "ipb-unblock": "Nyabut peungpeuk pamaké atawa alamat IP",
        "unlockdbsuccesstext": "pangkalan data geus teu dikonci.",
        "databaselocked": "Basis data geus kakonci.",
        "databasenotlocked": "Gudang data teu kakonci.",
+       "lockedbyandtime": "(ku $1 dina $2 $3)",
        "move-page": "Pindahkeun $1",
        "move-page-legend": "Pindahkeun kaca",
        "movepagetext": "Migunakeun formulir di handap bakal ngaganti ngaran hiji kaca, mindahkeun sadaya jujutanana ka ngaran anyar.\nJudul nu heubeul bakal jadi kaca alihan ka judul nu anyar.\nAnjeun bisa menerkeun alihan nu nujul ka judul asli sacara otomatis.\nMun henteu, pariksa bisi aya [[Special:DoubleRedirects|alihan ganda]] atawa [[Special:BrokenRedirects|buntu]]\nAnjeun tanggel waler pikeun mastikeun yén tumbu-tumbu tetep nujul ka tempat nu sakuduna dituju.\n\nCatet yén kacana '''moal''' pindah mun judul nu anyar geus aya eusian, kajaba mangrupa alihan sarta teu mibanda jujutan.\nIeu ngandung harti yén anjeun bisa ngaganti ngaran hiji kaca balik deui ka nu cikénéh diganti ngaranna mun anjeun nyieun kasalahan, sarta anjeun teu bisa nimpah kaca nu geus aya.\n\n'''AWAS!'''\nIeu parobahan bisa gedé pangaruhna mun dilarapkeun kana kaca anu payu;\nanjeun kudu bener-bener ngarti kana hal ieu.",
        "imported-log-entries": "Geus diimpor $1 {{PLURAL:$1|saéntri log|éntri log}}.",
        "importfailed": "Ngimpor gagal: $1",
        "importunknownsource": "Tipeu sumber impor teu dipikawanoh",
-       "importcantopen": "Teu bisa muka koropak impor",
+       "importcantopen": "Teu bisa muka berkas impor",
        "importbadinterwiki": "Tutumbu antarwiki awon",
        "importsuccess": "Ngimpor geus hasil!",
        "importnosources": "Taya wiki ti nu diimpor nu geus dijieun sarta pamuatan jujuta sacara langsung geus di non-aktifkeun.",
-       "importnofile": "Euweuh koropak impor nu dimuat.",
-       "importuploaderrorsize": "Koropak impor gagal dimuat. Ukuranana ngaleuwihan wates nu diwenangkeun.",
-       "importuploaderrorpartial": "Koropak impor gagal dimuat sagemblengna.",
-       "importuploaderrortemp": "Koropak impor gagal dimuat. Folder samentarana leungit.",
+       "importnofile": "Euweuh berkas impor nu diunjal.",
+       "importuploaderrorsize": "Unjalan berkas impor gagal. Ukuranna ngaleuwihan wates nu diwenangkeun.",
+       "importuploaderrorpartial": "Unjalan berkas impor gagal.\nNgan sawaréh berkas nu ngahasil diunjal.",
+       "importuploaderrortemp": "Unjalan berkas impor gagal. Folder témporérna leungit.",
        "import-parse-failure": "Prosés impor XML teu hasil",
        "import-noarticle": "Euweuh kaca imporeun!",
        "import-nonewrevisions": "Euweuh révisi nu diimpor (sakum révisi geus aya atawa diliwatan lantaran kasalahan).",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|sarévisi|révisi}} diimpor ti $2",
        "javascripttest": "Nguji JavaScript",
        "javascripttest-pagetext-unknownaction": "Tarékah \"$1\" teu dipikanyaho.",
+       "javascripttest-qunit-intro": "Tempo [$1 dokuméntasi pangujian] di mediawiki.org.",
        "tooltip-pt-userpage": "Kaca {{GENDER:|pamaké anjeun}}",
        "tooltip-pt-anonuserpage": "Kaca pamaké pikeun IP nu ku anjeun keur diédit",
        "tooltip-pt-mytalk": "Kaca obrolan {{GENDER:|anjeun}}",
        "spamprotectiontext": "Kaca anu rék disimpen dipeungpeuk ku saringan spam.\nSigana mah ieu téh alatan tutumbu ka loka luar anu dibléklis.",
        "spamprotectionmatch": "Teks di handap ieu mancing saringan spam kami: $1",
        "spambot_username": "Pamersihan spam MediaWiki",
+       "spam_reverting": "Ngabolaykeun ka vérsi panungtung nu teu mibanda tutumbu ka $1",
+       "spam_blanking": "Sakum révisi nu mibanda tutumbu ka $1, kosong",
+       "spam_deleting": "Sakum révisi nu mibanda tutumbu ka $1, pamupusan",
        "simpleantispam-label": "Pamariksaan anti-spam.\nAnu ieu <strong>ulah</strong> dieusian!",
        "pageinfo-title": "Émbaran pikeun \"$1\"",
+       "pageinfo-not-current": "Hampura, teu mumkin méré ieu informasi ka révisi heubeul.",
        "pageinfo-header-basic": "Émbaran dasar",
        "pageinfo-header-edits": "Jujutan édit",
        "pageinfo-header-restrictions": "Protéksi kaca",
        "pageinfo-edits": "Jumlah éditan",
        "pageinfo-authors": "Jumlah kontributor nu béda",
        "pageinfo-recent-edits": "Jumlah éditan kiwari (dina $1 panungtung)",
+       "pageinfo-recent-authors": "Jumlah panulis béda kiwari",
+       "pageinfo-magic-words": "{{PLURAL:$1|Sakecap|Kecap}} ajaib ($1)",
        "pageinfo-toolboxlink": "Émbaran kaca",
        "pageinfo-redirectsto": "Alihkeun ka",
        "pageinfo-redirectsto-info": "info",
        "pageinfo-contentpage": "Diitung minangka kaca eusi",
        "pageinfo-contentpage-yes": "Enya",
+       "pageinfo-protect-cascading": "Panangtayungan ngaruntuy ti dieu",
        "pageinfo-protect-cascading-yes": "Enya",
+       "pageinfo-protect-cascading-from": "Panangtayungan mapay ti",
        "pageinfo-category-info": "Info kategori",
        "pageinfo-category-total": "Jumlah anggahota",
        "pageinfo-category-pages": "Jumlah kaca",
        "pageinfo-user-id": "ID pamaké",
        "markaspatrolleddiff": "Tandaan salaku geus diriksa",
        "markaspatrolledtext": "Tandaan artikel ieu salaku geus diriksa",
+       "markaspatrolledtext-file": "Tandaan vérsi berkas minangka kaawas",
        "markedaspatrolled": "Tandaan salaku geus diriksa",
        "markedaspatrolledtext": "Révisi [[:$1]] nu dipilih geus ditandaan salaku geus diroris.",
        "rcpatroldisabled": "Ronda Nu Anyar Robah ditumpurkeun",
        "markedaspatrollederror": "Teu bisa nandaan geus dipatroli",
        "markedaspatrollederrortext": "Anjeun kudu milih révisi anu rék ditandaan geus diroris.",
        "markedaspatrollederror-noautopatrol": "Anjeung teu diwenangkeun nandaan pangriksa ka éditan sorangan.",
+       "markedaspatrollednotify": "Ieu parobahan pikeun $1 geus ditandaan kaawas.",
+       "markedaspatrollederrornotify": "Nandaan minangka kaawas gagal.",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Ieu minangka log pikeun révisi nu geus diroris.",
        "log-show-hide-patrol": "$1 log rorisan",
        "log-show-hide-tag": "log tag $1",
        "confirm-markpatrolled-button": "Heug",
+       "confirm-markpatrolled-top": "Tandaan révisi $3 ti $2 minangka kaawas?",
        "deletedrevision": "Révisi heubeul nu dihapus $1",
        "filedeleteerror-short": "Éror nalika ngahapus koropak $1",
        "filedeleteerror-long": "Aya kasalahan sawaktu ngahapus koropak:\n\n$1",
        "svg-long-error": "Berkas SVG teu sah: $1",
        "show-big-image": "Berkas asli",
        "show-big-image-preview": "Ukuran ieu pramidang: $1.",
+       "show-big-image-preview-differ": "Ukuran ieu pramidang $3 ti ieu berkas $2: $1",
        "show-big-image-other": "{{PLURAL:$2|Resolusi}} lianna: $1.",
        "show-big-image-size": "$1 × $2 pixel",
        "file-info-gif-looped": "nguriling",
        "yesterday-at": "Kamari jam $1",
        "bad_image_list": "Formatna kieu:\n\nNgan daptar butiran (baris anu dimimitian ku tanda *) anu diitung. \nTutumbu kahiji dina hiji baris dianggap numbu ka berkas anu goréng. \nTutumbu sanggeusna dina baris anu sarua dianggap bener, nyaéta artikel anu midangkeun éta berkas.",
        "metadata": "Métadata",
-       "metadata-help": "Ieu koropak ngandung émbaran tambahan, nu sigana asalna tina kaméra digital atawa paminday nu dipaké pikeun ngadigitalkeunana. Mun ieu koropak geus dirobah tina bentuk aslina, datana bisa jadi teu bener.",
+       "metadata-help": "Ieu berkas ngandung informasi panambah, mumkin ditambahkeun tina kaméra digital atawa pamindéy nu dipaké pikeun nyieun atawa ngadigitalkeun ieu berkas.\nMun ieu berkas geus diropéa tina wangun aslina, sawatara wincikan meureun baé teu sagemblengna ngarépléksikeun informasi ti ieu berkas nu diropéa téh.",
        "metadata-expand": "Témbongkeun wincikan panambah",
        "metadata-collapse": "Sumputkeun wincikan panambah",
        "metadata-fields": "Widang métadata gambar nu dibéréndélkeun di handap bakal dipidangkeun dina kaca gambar mun tabél métadata disumputkeun.\nNu séjénna bakal disumputkeun sakumaha asalna.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-fixtureidentifier": "Ngaran fikstur",
        "exif-locationdest": "Lokasi nu digambarkeun",
        "exif-locationdestcode": "Kodeu lokasi nu digambarkeun",
+       "exif-objectcycle": "Sésa waktu éta média dimaksudkeun pikeun",
        "exif-contact": "Informasi kontak",
        "exif-writer": "Nu nulis",
        "exif-languagecode": "Basa",
        "exif-originalimageheight": "Jangkung gambar saméméh diteukteuk",
        "exif-originalimagewidth": "Lébar gambar saméméh diteukteuk",
        "exif-compression-1": "Teu kakompres",
+       "exif-compression-2": "CCITT Group 3 1-Dimensional Modified Huffman RLE",
+       "exif-compression-3": "CCITT Group 3 fax encoding",
+       "exif-compression-4": "CCITT Group 4 fax encoding",
        "exif-copyrighted-true": "Mihak cipta",
        "exif-copyrighted-false": "Status hak cipta can diatur",
+       "exif-photometricinterpretation-1": "Hideung jeung bodas (Hideung mah 0)",
        "exif-unknowndate": "Titimangsa teu kanyahoan",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Dibalikkeun horizontal",
        "exif-subjectdistance-value": "$1 méter",
        "exif-meteringmode-0": "Duka",
        "exif-meteringmode-1": "Rata-rata",
+       "exif-meteringmode-2": "Rarata tengah bobot",
        "exif-meteringmode-3": "Spot",
        "exif-meteringmode-4": "MultiSpot",
        "exif-meteringmode-5": "Pola",
        "exif-lightsource-255": "Sumber cahya séjén",
        "exif-flash-fired-0": "Lampu kilat teu hurung",
        "exif-flash-fired-1": "Buricak hurung",
+       "exif-flash-return-0": "taya fungsi padétéksian strobo balik",
+       "exif-flash-return-2": "lampu strobo balik teu kadétéksi",
+       "exif-flash-return-3": "lampu strobo balik kadétéksi",
+       "exif-flash-mode-1": "lampu kilat diperlukeun",
+       "exif-flash-mode-2": "lampu kilat dipareuman",
        "exif-flash-mode-3": "modeu otomatis",
+       "exif-flash-function-1": "Taya fungsi lampu kilat",
+       "exif-flash-redeye-1": "mode réduksi pantulan panon-beureum",
        "exif-focalplaneresolutionunit-2": "inci",
        "exif-sensingmethod-1": "Teu kadéfinisi",
+       "exif-sensingmethod-2": "Sénsor aréa warna sasiki",
+       "exif-sensingmethod-3": "Sénsor aréa warna dua siki",
+       "exif-sensingmethod-4": "Sénsor aréa warna tilu siki",
+       "exif-sensingmethod-5": "Sénsor aréa warna mapay",
+       "exif-sensingmethod-7": "Sénsor trilinéar",
+       "exif-sensingmethod-8": "Sénsor linéar warna mapay",
+       "exif-filesource-3": "Kaméra digital cicing",
        "exif-scenetype-1": "Gambar poto langsung",
        "exif-customrendered-0": "Prosés normal",
        "exif-customrendered-1": "Prosés biasa",
        "exif-exposuremode-0": "Pajanan otomatis",
        "exif-exposuremode-1": "Pajanan manual",
+       "exif-exposuremode-2": "Brakét otomatis",
        "exif-whitebalance-0": "Kasaimbangan bodas otomatis",
        "exif-whitebalance-1": "Kasaimbangan bodas manual",
        "exif-scenecapturetype-0": "Baku",
        "exif-scenecapturetype-2": "Nangtung (portrait)",
        "exif-scenecapturetype-3": "Tetempoan peuting",
        "exif-gaincontrol-0": "Kosong",
+       "exif-gaincontrol-1": "Naikkeun fokus landeuh",
+       "exif-gaincontrol-2": "Naikkeun fokus luhur",
+       "exif-gaincontrol-3": "Turunkeun fokus landeuh",
+       "exif-gaincontrol-4": "Turunkeun fokus luhur",
        "exif-contrast-0": "Normal",
        "exif-contrast-1": "Leuleus",
        "exif-contrast-2": "Heuras",
        "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|méter|méter}} luhureun beungeut laut",
        "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|méter|méter}} handapeun beungeut laut",
        "exif-gpsstatus-a": "Keur ngukur",
+       "exif-gpsstatus-v": "Interoperabilitas pangukuran",
        "exif-gpsmeasuremode-2": "Ukuran 2-diménsi",
        "exif-gpsmeasuremode-3": "Ukuran 3-diménsi",
        "exif-gpsspeed-k": "Kilométer per jam",
        "exif-ycbcrpositioning-1": "Nengah",
        "exif-ycbcrpositioning-2": "Atas (co-sited)",
        "exif-dc-contributor": "Kontributor",
+       "exif-dc-coverage": "Lingkup témporal atawa spasial média",
        "exif-dc-date": "Titimangsa",
        "exif-dc-publisher": "Pamedal",
        "exif-dc-relation": "Média anu tumali",
        "exif-urgency-normal": "Normal ($1)",
        "exif-urgency-low": "Landeuh ($1)",
        "exif-urgency-high": "Luhur ($1)",
+       "exif-urgency-other": "Prioritas robahluyuan ($1)",
        "namespacesall": "kabéh",
        "monthsall": "kabéh",
        "confirmemail": "Konfirmasi alamat surélék",
        "confirmemail_body": "Aya, sigana mah anjeun, ti alamat IP $1,\ngeus ngadaptarkeun akun \"$2\" maké alamat surélék ieu di {{SITENAME}}.\n\nPikeun mastikeun yén ieu akun mémang kagungan, sarta ngaktipkeun fitur surélék di {{SITENAME}}, buka tutumbu di handap ieu dina panyungsi (''browser'') anjeun:\n\n$3\n\nLamun anjeun teu ngadaptarkeun ieu akun, turutkeun ieu tutumbu pikeun ngabolaykeun konfirmasi alamat surélék:\n\n$5\n\nSandi konfirmasi ieu bakal kadaluwarsa dina $4.",
        "confirmemail_invalidated": "Konfirmasi alamat surélék dibolaykeun",
        "invalidateemail": "Bolaykeun konfirmasi surélék",
+       "notificationemail_subject_changed": "Alamat surélék kadaptar {{SITENAME}} geus diganti",
+       "notificationemail_subject_removed": "Alamat surélék kadaptar {{SITENAME}} geus dipupus",
+       "notificationemail_body_changed": "Hiji jalma, meureun ajeun, ti alamat IP $1,\ngeus ngaganti alamat surélék akun \"$2\" jadi \"$3\" di {{SITENAME}}",
+       "notificationemail_body_removed": "Hiji jalma, meureun anjeun, ti alamat IP $1,\ngeus mupus alamat surélék akun \"$2\" di {{SITENAME}}.\n\nMun ieu lain anjeun, geuwat nepungan administrator situs.",
        "scarytranscludedisabled": "[Transklusi interwiki ditumpurkeun]",
        "scarytranscludefailed": "[Gagal nyokot citakan $1]",
+       "scarytranscludefailed-httpstatus": "[Nyokot citakan $1 gagal: HTTP $2]",
        "scarytranscludetoolong": "[URLna panjang teuing]",
        "deletedwhileediting": "'''Awas''': ieu kaca geus dihapus nalika anjeun mitembeyan ngédit!",
        "confirmrecreate": "Pamaké [[User:$1|$1]] ([[User talk:$1|ngobrol]]) geus ngahapus artikel ieu nalika anjeun ngédit kalawan alesan:\n: ''$2''\nmangga pastikeun yén anjeun rék nyieun deui artikel ieu.",
        "confirm-purge-title": "Hapus sindangan ieu",
        "confirm_purge_button": "Heug",
        "confirm-purge-top": "Hapus sindangan kaca ieu?",
+       "confirm-purge-bottom": "Mersihkeun kaca bakal sakaligus mupus sindangan jeung midangkeun vérsi kaca kiwari.",
        "confirm-watch-button": "Heug",
+       "confirm-watch-top": "Tambahkeun ieu kaca kana awaskeuneun anjeun?",
        "confirm-unwatch-button": "Heug",
        "confirm-unwatch-top": "Pupus ieu kaca tina aawaseun anjeun?",
        "confirm-rollback-button": "Heug",
+       "confirm-rollback-top": "Balikkeun éditan ka ieu kaca?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← kaca saacana",
        "imgmultipagenext": "kaca salajengna →",
        "imgmultigo": "Téang!",
        "imgmultigoto": "Jung ka kaca $1",
        "img-lang-default": "(basa default)",
+       "img-lang-info": "Jadikeun ieu gambar dina $1. $2",
        "img-lang-go": "Jung",
        "ascending_abbrev": "naék",
        "descending_abbrev": "turun",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 judul geus|$1 judul geus}} dikaluarkeun:",
        "watchlistedit-clear-title": "Bersihan aawaseun",
        "watchlistedit-clear-legend": "Bersihan aawaseun",
+       "watchlistedit-clear-explain": "Sakum judul bakal dipupus tina daptar awaskeuneun anjeun",
        "watchlistedit-clear-titles": "Judul:",
+       "watchlistedit-clear-submit": "Bersihkeun daptar awaskeuneun (Ieu mah permanén!)",
+       "watchlistedit-clear-done": "Daptar awaskeuneun geus bersihkeun.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 judul geus|$1 judul geus}} dipupus:",
+       "watchlistedit-too-many": "Loba teuing kaca nu dipidangkeun di dieu.",
+       "watchlisttools-clear": "Bersihan daptar awaskeuneun",
        "watchlisttools-view": "Témbongkeun parobahan nu patali",
        "watchlisttools-edit": "Témbongkeun sarta édit béréndélan awaskeuneun",
        "watchlisttools-raw": "Robah béréndélan awaskeuneun",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|obrolan]])",
        "timezone-local": "Lokal",
        "duplicate-defaultsort": "'''Awas''': Konci runtuyan asal \"$2\" ngalindih konci runtuyan asal \"$1\" anu saméméhna.",
+       "duplicate-displaytitle": "<strong>Mangkahadé:</strong> Midangkeun judul \"$2\" ngalandih judul pidangan \"$1\" saméméhna.",
        "version": "Vérsi",
        "version-extensions": "Éksténsi nu diinstal",
        "version-skins": "Kalakop nu diinstal",
        "version-ext-colheader-description": "Pedaran",
        "version-ext-colheader-credits": "Pangarang",
        "version-license-title": "Lisénsi pikeun $1",
+       "version-license-not-found": "Taya detil informasi lisénsi pikeun ieu éksténsi.",
        "version-credits-title": "Krédit pikeun $1",
+       "version-credits-not-found": "Taya detil informasi krédit pikeun ieu éksténsi.",
+       "version-poweredby-credits": "Ieu wiki dirojong ku '''[https://www.mediawiki.org/ MédiaWiki]''', hak cipta © 2001-$1 $2.",
        "version-poweredby-others": "séjénna",
        "version-poweredby-translators": "darmamurcaya translatewiki.net",
+       "version-credits-summary": "Kami baris ngangken jalma-jalma di handap kalawan kontribusina ka [[Special:Version|MédiaWiki]].",
        "version-software": "Sopwér nu geus diinstal",
        "version-software-product": "Produk",
        "version-software-version": "Vérsi",
        "version-libraries-license": "Lisénsi",
        "version-libraries-description": "Pedaran",
        "version-libraries-authors": "Pangarang",
+       "redirect": "Alihan dumasar ID berkas, pamaké, kaca, révisi, atawa log",
        "redirect-summary": "Ieu kaca husus mindahkeun ka berkas (kalawan ngaran berkasna), kaca (kalawan ID répisi atawa ID kaca), kaca pamaké (kalawan ID pamaké nomerik), atawa éntri log (kalawan ID logna). Pamakéan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], atawa [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Jung",
        "redirect-lookup": "Ilikan:",
        "redirect-logid": "ID log",
        "redirect-not-exists": "Ajén teu kapanggih",
        "fileduplicatesearch": "Paluruh gambar duplikat",
-       "fileduplicatesearch-filename": "Ngaran koropak:",
+       "fileduplicatesearch-summary": "Pamaluruhan duplikat berkas dumasar niléy hash-na.",
+       "fileduplicatesearch-filename": "Ngaran berkas:",
        "fileduplicatesearch-submit": "Paluruh",
        "fileduplicatesearch-info": "$1 × $2 piksel<br />Ukuran koropak: $3<br />Tipeu MIME: $4",
        "fileduplicatesearch-result-1": "Koropak \"$1\" teu boga duplikat idéntik.",
        "fileduplicatesearch-noresults": "Teu manggihan berkas nu ngaranna \"$1\".",
        "specialpages": "Kaca husus",
        "specialpages-note-top": "Kamandang",
+       "specialpages-note-restricted": "* Kaca husus normal.\n* <span class=\"mw-specialpagerestricted\">Kaca husus diwates.</span>",
        "specialpages-group-maintenance": "Laporan pigawéeun",
        "specialpages-group-other": "Kaca husus lainna",
        "specialpages-group-login": "Asup log / jieun akun",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
        "tag-mw-contentmodelchange": "parobahan modél kontén",
        "tags-title": "Tag",
+       "tags-intro": "Ieu kaca ngandung daptar tag nu bisa ditandaan ku pakakas lemes kana hiji éditan di handap hartina.",
        "tags-tag": "Ngaran tag",
+       "tags-display-header": "Pidangan di daptar parobahan",
+       "tags-description-header": "Déskripsi lengkep atawa harti",
        "tags-source-header": "Sumber",
        "tags-active-header": "Hurung?",
        "tags-hitcount-header": "Parobahan kalawan tag",
        "tags-active-yes": "Enya",
        "tags-active-no": "Teu",
        "tags-source-extension": "Ditangtukeun ku pakakas lemes",
+       "tags-source-manual": "Dipaké sacara manual ku pamaké jeung bot",
        "tags-source-none": "Teu dipaké deui",
        "tags-edit": "édit",
        "tags-delete": "pupus",
        "tags-activate": "hurungkeun",
        "tags-deactivate": "pareuman",
        "tags-hitcount": "$1 {{PLURAL:$1|parobahan|parobahan}}",
+       "tags-manage-no-permission": "Anjeun teu mibanda kawenangan pikeun ngatur parobahan tag.",
        "tags-create-heading": "Nyieun tag anyar",
        "tags-create-tag-name": "Ngaran tag:",
        "tags-create-reason": "Alesan:",
        "tags-create-already-exists": "Tag \"$1\" geus aya.",
        "tags-create-warnings-below": "Anjeun rék nuluykeun panyieunan ieu tag?",
        "tags-delete-title": "Pupus tag",
+       "tags-delete-explanation-initial": "Anjeun bakal mupus tag \"$1\" ti basisdata.",
        "tags-delete-reason": "Alesan:",
+       "tags-delete-submit": "Pupus ieu tag ogé",
+       "tags-delete-not-allowed": "Tag nu dibikeun ku éksténsi teu bisa dipupus iwal éta éksténsi ngidinan.",
+       "tags-delete-not-found": "Tag \"$1\" euweuh.",
+       "tags-delete-too-many-uses": "Tag \"$1\" dilarapkeun ka $2 atawa leuwih {{PLURAL:$2|sarévisi|révisi}} nu hartina éta téh teu bisa dipupus.",
+       "tags-delete-warnings-after-delete": "Tag \"$1\" dipupus, ngan bijil {{PLURAL:$2|saparingetan|paringetan}} di handap:",
+       "tags-delete-no-permission": "Anjeun teu mibanda kawenangan pikeun mupus parobahan tag.",
        "tags-activate-title": "Hurungkeun tag",
+       "tags-activate-question": "Anjeun bakal ngaktifkeun tag \"$1\".",
        "tags-activate-reason": "Alesan:",
+       "tags-activate-not-allowed": "Ieu tag \"$1\" teu mumkin bisa diaktifkeun.",
+       "tags-activate-not-found": "Tag \"$1\" euweuh.",
        "tags-activate-submit": "Hurungkeun",
        "tags-deactivate-title": "Pareuman tag",
+       "tags-deactivate-question": "Anjeun bakal nganonktifkeun tag \"$1\".",
        "tags-deactivate-reason": "Alesan:",
+       "tags-deactivate-not-allowed": "Ieu tag \"$1\" tidak mumkin bisa dinonaktifkeun.",
        "tags-deactivate-submit": "Pareuman",
+       "tags-apply-no-permission": "Anjeun teu boga idin pikeun ngalarapkeun parobahan tag babarengan jeung parobahan anjeun.",
+       "tags-apply-blocked": "Anjeun teu bisa ngalarapkeun tag jeung parobahan anjeun nalika {{GENDER:$1|anjeun}} keur dipeungpeuk.",
        "tags-edit-title": "Édit tag",
        "tags-edit-manage-link": "Kokola tag",
        "tags-edit-existing-tags": "Tag nu aya:",
        "tags-edit-reason": "Alesan:",
        "tags-edit-revision-submit": "Larapkeun parobahan kana {{PLURAL:$1|ieu révisi|$1 révisi}}",
        "tags-edit-success": "Parobahan dilarapkeun.",
+       "tags-edit-failure": "Perobahan di handap  bisa dilarapkeun:\n$1",
+       "tags-edit-nooldid-title": "Udagan révisi teu sah",
        "comparepages": "Bandinkeun kaca",
        "compare-page1": "Kaca 1",
        "compare-page2": "Kaca 2",
        "rightslogentry-temporary-group": "$1 (samentara, nika $2)",
        "feedback-adding": "Nambahkeun eupan balik kana kaca...",
        "feedback-back": "Balik deui",
+       "feedback-bugcheck": "Hadé! Ngan ngariksa yén éta téh lain hiji di antara [$1 bug nu geus dipiwanoh].",
+       "feedback-bugnew": "Kuring geus mariksa. Laporkeun bug anyar",
        "feedback-cancel": "Bolay",
        "feedback-close": "Anggeus",
+       "feedback-external-bug-report-button": "Kirim pancén téhnis",
+       "feedback-dialog-title": "Kirim saran jeung tanggepan",
        "feedback-error2": "Kasalahan: Édit gagal",
        "feedback-message": "Surat:",
        "feedback-subject": "Ngeunaan:",
        "searchsuggest-search": "Paluruh {{SITENAME}}",
        "searchsuggest-containing": "ngandung...",
        "api-error-badtoken": "Kasalahan internal: Token goréng.",
+       "api-error-emptypage": "Panyieunan kaca anyar nu kosong teu diidinan.",
+       "api-error-publishfailed": "Kasalahan internal: sérver gagal medal berkas saheulaanan.",
+       "api-error-stashfailed": "Kasalahan internal: sérver gagal nyimpen berkas saheulaanan.",
+       "api-error-unknown-warning": "Paringetan teu dipiwawuh: $1",
+       "api-error-unknownerror": "Kasalahan teu dipiwawuh: \"$1\"",
        "duration-seconds": "$1 {{PLURAL:$1|detik|detik}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam|jam}}",
        "duration-decades": "$1 {{PLURAL:$1|dékadeu|dékadeu}}",
        "duration-centuries": "$1 {{PLURAL:$1|abad|abad}}",
        "duration-millennia": "$1 {{PLURAL:$1|milénium|milénium}}",
+       "rotate-comment": "Gambar diputerkeun $1 {{PLURAL:$1|darajat}} saarah jarum jam",
+       "limitreport-title": "Parser profil data:",
+       "limitreport-cputime": "Waktu pamakéan CPU",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|sadetik|detik}}",
        "limitreport-walltime": "Pamakéan waktu nyaan",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|sadetik|detik}}",
+       "limitreport-ppvisitednodes": "Préprosésor nyorang itungan node",
+       "limitreport-ppgeneratednodes": "Préprosésor ngasilkeun itungan node",
+       "limitreport-postexpandincludesize": "Pasca ngalegakeun kaasup ukuran",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|sabita|bita}}",
+       "limitreport-templateargumentsize": "Ukuran argumén citakan",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|sabita|bita}}",
        "expandtemplates": "Mekarkeun citakan",
        "expand_templates_input": "Téks input:",
        "expand_templates_output": "Hasil:",
index b882534..4d864dc 100644 (file)
@@ -8,6 +8,9 @@
                        "Translatealcd"
                ]
        },
+       "tog-numberheadings": "Smi’ nanak sa banggo’ na spzyang kkayal",
+       "editfont-sansserif": "Ungat pintrang sa inrkyasan na biru’",
+       "editfont-serif": "Pintrang sa inrkyasan na biru’",
        "sunday": "Hngawan ryax",
        "monday": "’Ringan qutux hngawan",
        "tuesday": "Tay sazing ryax qutux hngawan",
@@ -77,6 +80,7 @@
        "subcategories": "Uzyuk na pintbcyan",
        "category-media-header": "Cyux niya’ ptbcyun na \"$1\" Meti’",
        "hidden-categories": "{{PLURAL:$1| Lnqing na pintbcyan }}",
+       "hidden-category-category": "Lnqing na pintbuci’",
        "category-subcat-count": "{{PLURAL:$2|pintbcyan qaniy ga nanak yaquw qutux uzyuk na pintbcyan quw spgluw niya’.| pintbcyan qaniy ga kwara’ kin na $1 uzyuk na pintbcyan sawn niya uziy, $2 kwara’.}}",
        "category-article-count": "{{PLURAL:$2| pintbcyan qaniy ga ginkwara’ zngazyan tay suruw. | pintbcyan qaniy ga kwara’ kin $1 pintbcyan tay suruw, $2 kwara’.}}",
        "category-file-count": "{{PLURAL:$2|Pintbcyan niya’ qaniy ga nanak yaquw nyux niya’ sbiru’ sa hugal qaniy|Pintbcyan niya’ qaniy ga kwara’ kin na biru’ ka $1, psqunun kwara\nga $2 .}}",
        "view": "Psbaybzih minblaq mita’",
        "view-foreign": "Psbzih mita’ squ$1",
        "edit": "Smr’zyut miru’smr’zyut miru’",
+       "edit-local": "Sr’zyut miru’ sa sinbbaq kmayal sa rhzyal sqaniy",
        "create": "Ps’rux",
        "create-local": "Tnwang sa kay’ na rhzyal qasa",
        "delete": "’muyut",
        "protect": "mlahang",
        "protect_change": "smbah",
+       "unprotect": "Sbah kinlahang",
        "newpage": "Giqas na zngayan",
        "talkpagelinktext": "mpkal",
        "specialpage": "Mnanak na bbrwan",
        "portal-url": "Project:kkzyup secyun",
        "privacy": "Gaga’ na zyuwaw nanak",
        "privacypage": "Project: Gaga’ na zyuwaw nanak",
+       "badaccess": "Min’uqu’ pcingan sinpngan na kiri’",
        "ok": "Wal balay",
        "retrievedfrom": "’Nagal sa \"$1\"",
        "editsection": "smr’zyut miru’",
        "editold": "Smr’zyut miru’",
+       "viewsourceold": "Kta quw llpgan aring sa cin’ringan",
        "editlink": "smr’zyut miru’",
        "viewsourcelink": "Kta quw llpgan aring sa cin’ringan",
        "editsectionhint": "Smr’zyut miru’ gnaygay binrwan:$1",
        "showtoc": "Pkaykita’",
        "hidetoc": "lqing",
        "collapsible-collapse": "Psqunun",
+       "collapsible-expand": "cankay",
        "confirmable-yes": "Aw’",
        "confirmable-no": "Iyat",
        "feedlinks": "Pcyumung kktan:",
        "site-atom-feed": "$1 na tkhulan Atom",
        "page-atom-feed": "inkhulan na Atom tay $1",
        "red-link-title": "$1 (ungat zzngayan)",
+       "sort-descending": "Pkkrawn mkuw tay bbawiq",
        "nstab-main": "Zzngayan",
        "nstab-user": "Pkt’aniy",
+       "nstab-media": "Zngazyan na meti’",
        "nstab-special": "Mnanak na bbrwan",
        "nstab-project": "Zngyan na Cwan’an",
        "nstab-image": "biru’ na zayzyuwaw",
        "nstab-mediawiki": "pintkaykay’",
        "nstab-template": "Mopan",
+       "nstab-help": "Minblaq pinqzyu’ sa zngazyan",
        "nstab-category": "Ps’anak sa mkgluw",
        "mainpage-nstab": "T’ringan na zzngayan",
+       "databaseerror": "Min’uqu’ quw cryawku’",
        "databaseerror-function": "Pptzyuwaw:$1",
+       "readonly": "Nyux niya’ sngusun quw sslyan biru’ qaniy",
        "missingarticle-diff": "(Kin’ini’ ptnaq:$1, $2)",
        "internalerror": "pin’qwan tay qsahuy",
        "badtitle": "Ungat zyuwaw na lalu’ na spzyang kkayal",
        "badtitletext": "Sni’ su’ lalu’ na spzyang kkayal su’ qasa ga ungat zyuwaw niya’, ungat ana nanu’ qsahuy niya’, ini’ ga ini’ su’ ’nblayqiy p’ubuy quw pin’ubuy su’ squw bzinah na kay’, ini’ ga ’mubuy sa sni’ naha’ lalu’ sa Wiki’. \nKuna kya wal su’ syun ka biru’ qasa ga kya’a cyux ’magan sa biru’ na ini’ baqiy mita’ hazi’.",
        "viewsource": "Kta quw llpgan aring sa cin’ringan",
+       "actionthrottled": "Wal shtuy quw ppzyuwi’an",
        "exception-nologin": "Ini’ su’ kzyup na’",
+       "cannotlogoutnow-title": "Ini’ baqiy mshriq misuw qaniy",
        "yourname": "Lalu’ na pptzyuwaw:",
        "userlogin-yourname": "Lalu’ na pptzyuwaw",
        "userlogin-yourname-ph": "Brwaniy lalu’ na pptzyuwaw su’",
        "yourpassword": "Mima’:",
        "userlogin-yourpassword": "Nanak kung baq sa llpgan qaniy",
        "userlogin-yourpassword-ph": "Brwaniy Mima’ su’",
+       "createacct-yourpassword-ph": "Brwaniy quw isu’ nanak musa’ baq na banggo’",
+       "createacct-yourpasswordagain-ph": "Brwaniy lawziy quw mima’",
        "userlogin-remembermypassword": "Laxiy zngiy kinzyup maku’",
+       "userlogin-signwithsecure": "Ptzyawganiy quw iyat qqzyaqih na ’ubuy",
+       "cannotloginnow-title": "Ini’ baqiy mzyup misuw qaniy",
+       "cannotcreateaccount-title": "Ini’ baqiy ps’rux Canghaw",
+       "yourdomainname": "Wangyu’ su’:",
        "login": "mzyup",
        "logout": "mshriq",
        "userlogout": "mshriq",
        "createacct-email-ph": "Brwaniy zyusyo na e-meyo’ su’",
        "createacct-another-email-ph": "Brwaniy zyusyo na e-meyo’ su’",
        "createacct-reason": "’ringan",
+       "createacct-submit": "Ps’rux lalu’ na Canghaw su’",
        "createacct-another-submit": "Ps’rux canghaw",
        "createacct-benefit-heading": "{{SITENAME}} hya’ ga ’nagal squw yan isu’ psr’zyut miru’ na squliq pins’rux.",
        "createacct-benefit-body1": "{{PLURAL:$1|smr’zyut miru’ }}",
        "createacct-benefit-body2": "{{PLURAL:$1|zzngayan}}",
        "createacct-benefit-body3": "misuw qaniy na{{PLURAL:$1| smnr’zyut miru’}}",
+       "createacct-error": "Min’uqu’ quw pins’rux su’ Canghaw",
+       "createaccounterror": "Ini’ baqiy ps’rux Canghaw:$1",
+       "mailmypassword": "T’aring lawziy smi’ mima’",
+       "accountcreated": "Wal ps’rux canghaw",
        "loginlanguagelabel": "Kay’:$1",
        "pt-login": "Mzyup",
        "pt-login-button": "mzyup",
+       "pt-login-continue-button": "Siy luhing mzyup",
        "pt-createaccount": "Ps’rux  canghaw",
        "pt-userlogout": "mshriq",
+       "changepassword": "Sbah mima’",
+       "oldpassword": "Mima’ sraral:",
+       "botpasswords": "Mima’ na squliq na kikay",
        "botpasswords-label-create": "Ps’rux",
        "botpasswords-label-update": "Sbahun giqas",
        "botpasswords-label-cancel": "laxan",
        "botpasswords-label-delete": "’muyut",
        "botpasswords-label-resetpassword": "T’aring lawziy smi’ mima’",
+       "resetpass_forbidden": "Ini’ baqiy snbah mima’",
+       "resetpass_forbidden-reason": "Ini’ baqiy snbah mima’: $1",
+       "resetpass-submit-loggedin": "Sbah mima’",
        "resetpass-submit-cancel": "laxan",
+       "resetpass-temp-password": "Pinbaybah smi’ na mima’:",
        "passwordreset": "T’aring lawziy smi’ mima’",
        "passwordreset-username": "Lalu’ na pptzyuwaw:",
+       "passwordreset-domain": "Lalu’ na wangyu’:",
        "passwordreset-email": "Zyusyo na e-meyo’:",
        "changeemail-none": "(ungat)",
        "resettokens-tokens": "Niwan sawsu’:",
+       "resettokens-done": "Wal t’aring kbalay lawziy niwan sawsu’ na mima’.",
        "bold_sample": "Qthuy na biru’",
        "bold_tip": "Qthuy na biru’",
        "italic_sample": "Mtkkiy na biru’",
        "minoredit": "Iyat spzyang balay ssr’tun miru’ balay qaniy hya’",
        "watchthis": "Kmyagal mita’ sa zngayan qaniy",
        "savearticle": "Cucun qu zngazyan",
+       "savechanges": "Cucun squw sinbah",
        "preview": "Pnaynama’ mita’",
        "showpreview": "Pnaynama’ pkita’ sa misa spkita’ na zayzyuwaw",
        "showdiff": "Pkaykita’ sinbah",
        "anoneditwarning": "<strong>Smrhuw kmal:</strong> Ini’ su’ kzyup na’. Maha iy wal su’ sbahun ana inu’ ga, nanu’ quw cyux ki’an na  IP su’ ga musa’ ktan kwara’ squliq. Maha iy <strong>[$1 wal mzyup]</strong> ini’ ga <strong>[$2 ps’rux Canghaw]</strong>,sinr’zyut su’ miru’ qaniy ga musa’ niya’ s’agal sa lalu’ su’ ka nyux mmiru’ qaniy smbbaq, ru musa’ magal sa kwara’ ka qqblayqan na hway naha’.",
+       "subject-preview": "Pnaynama’ mita’ sa spzyang na ptzyuwaw:",
+       "blockednoreason": "ini’ niya’ kaylaniy quw nanu’ quw ‘ringan",
+       "nosuchsectiontitle": "Ini’ ‘luwiy quw binkgan gnaygay na binrwan",
        "loginreqlink": "mzyup",
+       "accmailtitle": "Wayal ssatu’ mima",
        "noarticletext-nopermission": "Ungat ana cikuy knayal sa zyuwaw na qsahuy na lalu’ na kay’ squw nyux ktan sa zngayan qaniy.\nAna su’ s’usa’ sa zngayan tay bzinah \n[[Special:Search/{{PAGENAME}}|hmkangi’ sa puqing lalu’ na zngayan qaniy]], ini’ ga <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hmkangi’ sa m’ubuy sa zyuwaw na bbrwan qutux qutux ryax]</span>,ga ungat kinri’ su’ ms’rux sa zngayan qaniy.",
        "updated": "(Sinbahan)",
        "note": "<strong> pinkita’ niya’ sa pinzga’ :</strong>",
+       "continue-editing": "Usa’ squw hhalan smr’zyut miru’",
        "editing": "Nyuw smr’zyut miru’ $1",
        "editingsection": "smr’zyut miru’ $1 (gnaygay binrwan)",
+       "storedversion": "Wal cucun quw sinbah",
        "templatesused": "Zngayan qaniy ga cyux niya’ sptzyuwaw qu nyux sbiru’ hugal qaniy{{PLURAL:$1|mopan}}:",
        "template-protected": "(klhangan)",
        "template-semiprotected": "(ana walskun ga baqun smbah)",
        "hiddencategories": "zngayan qaniy hya’ ga gluw na {{PLURAL:$1|1 lnqing na pintbcyan|$1 lnqing pintbcyan}}na qutux bluw na squliq naha’:",
+       "permissionserrors": "Min’uqu’ pcingan sinpngan na kiri’",
        "moveddeleted-notice": "Wal pzyutan quw zngayan qaniy.\nNyux sbiru’ hugal quw wal pzyutan na zngazyan squw sinhzyuwan bniru’ sa qutux qutux ryax aki’ baqun sa ggalan pspngan mita’.",
+       "edit-conflict": "Ini’ ptnaq imi’ qsahuy na sinr’zyut miru’.",
+       "postedit-confirmation-created": "Wal ps’rux zngazyan.",
+       "postedit-confirmation-restored": "Wal pbaynahun sazngayan sraral",
+       "defaultmessagetext": "Pinnama’ smi’ pintkaykay’ na biru’",
+       "invalid-content-data": "Ungat zyuwaw nquw sinbbaq kay’ na qsahuy niya’",
        "content-model-wikitext": "Wikitext",
        "content-model-text": "biru’ mlmlux",
        "content-json-empty-object": "Ungat ana nanu’ quw nnanu’ niya’",
        "rev-delundel": "Smbah sa musa’ slwan mita’",
        "rev-showdeleted": "Pkaykita’",
        "revdelete-show-file-submit": "Aw’",
+       "revdelete-legend": "Syaniy qutux sa snqays sa spkaykita’",
+       "revdelete-hide-comment": "Sr’zyut miru’ gnaygay lalu’",
+       "revdelete-radio-same": "(laxiy sbahiy)",
        "revdelete-radio-set": "Lqing",
        "revdelete-radio-unset": "Pkaykita’",
        "revdelete-log": "’ringan:",
+       "revdel-restore": "sbah quw musa’ baqun mita’",
+       "deletedhist": "Wal pzyutan lquw pincyuwagan sraral",
+       "revdelete-edit-reasonlist": "Sr’zyut miru’ sa ’ringan na pinzyutan",
+       "revdelete-offender": "Smnbah sa binrwan na squliq:",
+       "mergehistory-from": "Inkhulan na zngazyan:",
+       "mergehistory-into": "Sngusan zngazyan:",
+       "mergehistory-fail-bad-timestamp": "Min’uqu’ bniru’ su’ zikang",
        "mergehistory-reason": "’ringan:",
        "history-title": "Tay \"$1\" na sinbah bniru’ sraral",
        "difference-title": "Kin ini’ ptnaq sinbahan squw \"$1\"",
        "lineno": "Tuqiy binkgan binrwan$1:",
        "editundo": "Psbzinah",
+       "diff-empty": "(ungat ini’ ptnaq)",
        "diff-multi-sameuser": "({{PLURAL:ini’ kta quw sinbahan tay kska’ nquw sinbahan  tay $1}})",
        "searchresults": "Babaw na hinkangi",
        "searchresults-title": "$1 na babaw hinkangi",
+       "titlematches": "Mtnaq quw lalu’ kkayal sa zngazyan",
+       "textmatches": "Mtnaq balay binrwan qsahuy na zngazyan",
        "prevn": "tay glaing {{PLURAL:$1|$1}}",
        "nextn": "tay suruw {{PLURAL:$1|$1}}",
        "prev-page": "llpgan tay glaing",
        "searchall": "kwara’",
        "search-showingresults": "{{PLURAL:$4|tay <strong>$1</strong>pucing niya’, psqunun lga <strong>$3</strong> |tay <strong>$1 - $2</strong> pucing nya’, psqunun lga <strong>$3</strong> pucing nya’}}",
        "search-nonefound": "Ktan qu bniru’ niya’ ga ungat quw musa’ mtnaq sa tthuzyay sa awsa’ hmkangi’.",
+       "powersearch-togglelabel": "Wazyaw:",
        "powersearch-toggleall": "Kwara’",
        "powersearch-togglenone": "Ungat",
        "mypreferences": "Sni’ maku’",
+       "prefs-edits": "Kinpira’ na sinr’zyut:",
        "prefs-skin": "Ktan na rawziq",
        "skin-preview": "Pnaynama’ mita’",
+       "prefs-labs": "Tthuzyay na tmrang psiking",
+       "prefs-user-pages": "Zngazyan na pptzyuwaw",
        "prefs-rc": "Sbahun misuw qaniy",
+       "prefs-editwatchlist": "Sr’zyut miru’ sa kkita’ binkgan sa kktan",
        "prefs-misc": "Mzinah",
        "prefs-email": "bbzagan sa e-meyo’",
        "prefs-rendering": "Ktan na rawziq",
        "prefs-editing": "Smr’zyut miru’",
        "searchresultshead": "Hhkangi’",
        "timezonelegend": "Zikang na ini’ ptanaq rhzyal",
+       "localtime": "Zikang na rhzyal sqasa:",
+       "servertime": "Zikang na pklahang sa Wangcan:",
        "timezoneregion-africa": "Xweco",
        "timezoneregion-america": "Meco",
        "timezoneregion-antarctica": "Nancicow",
        "prefs-custom-css": "Sinpung nanak CSS",
        "youremail": "e-meyo’:",
        "username": "{{GENDER:$1|Lalu’ na pptzyuwaw}}:",
+       "prefs-registration": "Pbiru’ zikang:",
        "yourlanguage": "Kay’:",
+       "yournick": "Giqas na bniru’ lalu’:",
        "email": "e-meyo’",
        "prefs-i18n": "Koksayka",
        "prefs-dateformat": "Ksu’ na ryax",
        "prefs-timeoffset": "Kinini’ ptnaq na zikang",
        "prefs-advancedediting": "Kwara’ hya’ g a syensyang",
        "prefs-preview": "Pnaynama’ mita’",
+       "prefs-displayrc": "Pkt’aniy bbzyagan",
        "prefs-tokenwatchlist": "Niwan sawsu’",
        "prefs-diffs": "Kin’ini’ ptnaq",
+       "userrights": "Pcingan sinpngan na pptzyuwaw",
+       "userrights-lookup-user": "Wazyaw quw pptzyuwaw",
+       "userrights-groupsmember": "Ubuy gluw na chyuncu:",
        "userrights-reason": "’ringan:",
        "userrights-expiry-current": "Sinpngan ryax $1",
        "userrights-expiry": "Sinpngan ryax:",
+       "userrights-expiry-othertime": "Zikang tay bzinah:",
        "group-user": "kwara’ ka cyux mbing ka qutux qutux ngasal",
        "group-bot": "Squliq na kikay",
        "group-sysop": "Pklahang",
        "grouppage-bot": "{{ns:project}}:Squliq na kikay",
        "grouppage-sysop": "{{ns:project}}:Pklahang",
        "grouppage-bureaucrat": "{{ns:project}}:Gyose’ning",
+       "right-read": "Lpgun zngazyan",
+       "right-createtalk": "Ps’rux na zngazyan na ppkyalan",
+       "right-move-categorypages": "Shzyaniy quw pintbuci’ na zngazyan",
        "right-writeapi": "Sptzyuwaw squw API",
+       "right-undelete": "Laxiy quw aki’ llaxan na zngazyan",
+       "right-unblockself": "Laxiy quw qnhut isu’ nanak",
+       "right-mergehistory": "Psqunun zngazyan pincyuwagan sraral",
+       "grant-group-page-interaction": "Usa’ mpkayal squw zngazyan",
+       "grant-group-file-interaction": "Usa’ mpkayal squw meti’",
+       "grant-group-email": "Stwaniy e-meyo’",
+       "grant-group-high-volume": "Pzyux iytal wayal sptzyuwaw",
+       "grant-group-administration": "Ptzyuwaw squw pptzyuwaw sa kklahang",
        "grant-createaccount": "Ps’rux canghaw",
+       "grant-privateinfo": "Agal ruw ssi’ sa lnqing na sinbbaq na cryaw",
+       "grant-uploadfile": "Pawsa’ sa kktan quw giqas Tang’an qaniy",
        "newuserlogpage": "Ps’rux sa bbiru’ krayryax na pbing nasquliq",
+       "action-read": "lpuw zngazyan qaniy",
        "action-edit": "sr’zyut squw zzngayan tay sqaniy",
+       "action-createpage": "Ps’rux quw zngazyan qaniy",
+       "action-move": "hz’aniy quw zngazyan qaniy",
+       "action-move-categorypages": "shzyaniy quw pintbuci’ na zngazyan",
+       "action-movefile": "hz’aniy quw Tang’an qaniy",
+       "action-delete": "’zyuciy quw zngazyan qaniy",
+       "action-deletelogentry": "pzyuciy quw bniru’ sa binkgan lmlamu’",
+       "action-sendemail": "Stwaniy e-meyo’",
+       "action-purge": "kwagiy quw zngazyan qaniy",
+       "nchanges": "min$1 {{PLURAL:$1|smbah}}",
        "enhancedrc-history": "kwara’ binrwan sraral",
        "recentchanges": "Sinbahan misuw qaniy",
        "recentchanges-legend": "Misan sinbahan wwazyaw misuw",
        "recentchanges-legend-heading": "<strong> pinkita’ niya’ sa pinzga’ :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (aniy mita’ sa[[Special:NewPages|giqas na zzngayan]])",
        "recentchanges-submit": "Pkaykita’",
+       "rcfilters-quickfilters": "Cucun squw kkay na pt’iruw",
+       "rcfilters-savedqueries-defaultlabel": "Cucun squw kkay na pt’iruw",
        "rcfilters-filterlist-title": "Hhkangi’",
+       "rcfilters-highlightbutton-title": "Baqun balay pcingan balay smbbaq nquw bniru’ niya’",
+       "rcfilters-highlightmenu-title": "Wazyaw biru’ knita’ rawziq",
+       "rcfilters-filterlist-noresults": "Ktan ga ungat ana qutux cin’rgan na sinpngan sa musa’ tthuzyay",
+       "rcfilters-filtergroup-authorship": "Mintzyuwaw sa wal miq sa pincyuwagan",
+       "rcfilters-filter-editsbyother-label": "Sinbah na squliq tay bzinah",
        "rcfilters-filter-user-experience-level-registered-label": "Pinbiru’",
        "rcfilters-filter-user-experience-level-unregistered-label": "Iyat pinbiru’ na’",
        "rcfilters-filter-user-experience-level-learner-label": "Misan mqbaq",
+       "rcfilters-filtergroup-automated": "Mutuw niya’ sr’tun miru’ nanak",
        "rcfilters-filter-bots-label": "squliq na kikay",
        "rcfilters-filter-unpatrolled-label": "Iyat gnawzyagan mita’ na’",
        "rcfilters-filtergroup-significance": "Spzyang krhun na zyuwaw",
+       "rcfilters-filter-major-label": "Iyat mszik sa spzyang sr’tun miru’",
+       "rcfilters-filter-watchlist-watched-label": "Kta quw babaw na p’insat",
+       "rcfilters-filtergroup-changetype": "Sbah gluw na mmntnaq",
        "rcfilters-filter-categorization-label": "Pintbcyan na sinbahan",
        "rclistfrom": "Inkahul misan sinbahan sa $2, $3",
        "rcshowhideminor": "$1 mszik sa ssr’tun",
        "minoreditletter": "cipuq",
        "newpageletter": "Giqas",
        "boteditletter": "squliq na kikay",
+       "rc_categories_any": "Ana nanu’ binzyagan na",
        "rc-change-size-new": "sin-nbah$1 {{PLURAL:bzyaqan kkayal na llpgan}}",
        "recentchangeslinked": "M’ubuy quw zyuwaw na sinbahan",
        "recentchangeslinked-feed": "M’ubuy quw zyuwaw na sinbahan",
        "filename": "Lalu’ na tang’an",
        "filedesc": "Lalu’ na spzyang bbiru’ su’",
        "fileuploadsummary": "Lalu’ na spzyang bbiru’ su’:",
+       "filereuploadsummary": "Sbah quw Tang’an",
        "filesource": "Tkhulan:",
+       "ignorewarnings": "Siy laxiy kya kwara’ quw sinngungu’ niya’",
+       "savefile": "Cucun Tang’an",
+       "uploaddisabled": "Wal phngagun quw pptzyuwaw na ppawsa.",
+       "upload-description": "Pinqzyuwan Tang’an",
+       "watchthisupload": "Kta quw Tang’an qaniy",
        "upload-file-error": "pin’qwan tay qsahuy",
        "upload-dialog-button-back": "’bzinah",
        "upload-dialog-button-done": "Tmasuq",
        "upload-dialog-button-save": "Cucun",
        "upload-form-label-infoform-description": "Miblaq pnqzyu’ sa zyuwaw",
        "upload-form-label-usage-title": "Pptzyuwaw",
+       "upload-form-label-usage-filename": "Lalu’ na Tang’an",
+       "upload-form-label-own-work": "Qaniy ga kinbalay maku’",
        "upload-form-label-infoform-date": "Ryax",
+       "uploadstash": "Pawsa’ sa kktan quw llqingan",
+       "uploadstash-refresh": "Psqgiqas smbah quw binzyagan sa kktan na Tang’an",
+       "uploadstash-thumbnail": "inblaq mita’ swotu’",
+       "invalid-chunk-offset": "Ungat zyuwaw na Chyak offset",
        "license": "Biru’ na gaga’ nqu snwayal hmriq sa kinri’:",
        "license-header": "Biru’ na gaga’ nqu snwayal hmriq sa kinri’",
+       "license-nopreview": "(Ini’ aniy pnaynama’ pkita’)",
        "listfiles-delete": "’muyut",
        "imgfile": "biru’ na zayzyuwaw",
+       "listfiles": "Binkgan sa kktan na Tang’an",
        "listfiles_date": "Ryax",
        "listfiles_user": "kwara’ ka cyux mbing ka qutux qutux ngasal",
        "listfiles_size": "Sspngan kinkrahu’",
        "filehist-thumbtext": "Pinkcikuy kbalay na syasing squ kinblayan $1",
        "filehist-user": "kwara’ ka cyux mbing ka qutux qutux ngasal.",
        "filehist-dimensions": "Sspngan kinkrahu’",
+       "filehist-filesize": "Kinkrahu’ na Tang’an",
        "filehist-comment": "Tnwang smbbaq miru’",
        "imagelinks": "Pptzyuwaw na sinr’zyut biru’",
        "linkstoimage": "Nyux sbiru’ tay hugal ka {{PLURAL:$1| qutux zngazyan |$1 qutux zngazyan}}sp’ubuy sa biru’ qaniy.",
        "nolinkstoimage": "Ungat ana qutux wal ’mubuy sa biru’ na ana nanu’ zyuwaw qaniy.",
        "sharedupload-desc-here": "Tang’an qaniy hya’ ga  kahul squw$1 ruw hazi’ ana wal sptzyuwaw na cwan’an bbzinah. \nTay kyahu’ cyux spkita’ sa Tang’an qaniy hya’ ga cyux squw [$2 Tang’an pinqzyu’ zngayan ] na qsahuy pinqzyuwan.",
+       "shared-repo-from": "minkahul sa $1",
+       "shared-repo": "pglgan mita’ ruw pglgan mtzyuwaw na ssliyan Tang’an",
        "upload-disallowed-here": "Iyat su’ bauqn ’mumuk quw biru’ na zayzyuwaw qaniy.",
        "filerevert": "Psbzih $1",
+       "filerevert-legend": "Psbzinah qu Tang’an",
        "filerevert-comment": "’ringan:",
+       "filedelete": "’zyuciy $1",
        "filedelete-comment": "’ringan:",
        "filedelete-submit": "’muyut",
+       "filedelete-edit-reasonlist": "Sr’zyut miru’ sa ’ringan na pinzyutan",
+       "filedelete-maintenance-title": "Ini’ baqiy ’muzyut Taang’an",
        "download": "syacay",
+       "unwatchedpages": "Ini’ klhangiy mita’ na zngazyan",
+       "listredirects": "T’ringun pglaing lawziy binzyagan sa kktan",
+       "listduplicatedfiles": "T’ringiy lawziy Tang’an na ktan binkgan",
+       "unusedtemplates": "Iyat pintzyuwaw na’ na mopan",
        "randompage": "Random page",
        "randomincategory-submit": "Musa’",
        "statistics": "Sinqunan plpuw",
+       "statistics-header-edits": "Sr’zyut miru’ sinqunan plpuw",
+       "statistics-files": "Wal pawsun sa kktan quw Tang’an",
+       "statistics-users-active": "Ini’ hngaw mtzyuwaw na pptyuwaw",
+       "pageswithprop-prop": "Lalu’ na ubuy mkgluw:",
        "pageswithprop-submit": "Musa’",
        "brokenredirects-edit": "Smr’zyut miru’",
        "brokenredirects-delete": "’muyut",
        "withoutinterwiki-legend": "T’ringan na biru’",
        "withoutinterwiki-submit": "Pkaykita’",
        "nbytes": "$1 {{PLURAL:$1|qutux llpgan na bzyaqan kkayal}}",
+       "ncategories": "$1 {{PLURAL:$1|pintbcyan}}",
+       "nlinks": "$1{{PLURAL:$1|’ubuy}}",
        "nmembers": "$1 {{PLURAL:$1|pinglgan}}",
+       "nrevisions": "min$1 {{PLURAL:$1|smbah}}",
+       "uncategorizedpages": "Zngazyan na iyat pintbuci’",
+       "uncategorizedcategories": "Iyat pintbuci’ na pptbcyun",
+       "uncategorizedimages": "Tang’an na iyat pintbuci’",
+       "uncategorizedtemplates": "Musa’ ptbcyun sa kkbalay nn nanu’",
+       "unusedcategories": "Ini’ ptzyawganiy na’na pintbuci’",
+       "unusedimages": "Ini’ aniy mtzyuwaw na’ na Tang’an",
+       "wantedcategories": "Musa’ sawyan magal ka ptbuci’",
+       "wantedpages": "Musa’ sawyan magal ka zngazyan",
+       "wantedfiles": "Musa’ sawyan magal ka Tang’an",
+       "wantedtemplates": "Musa’ sawyan magal ka mopan",
        "prefixindex-submit": "Pkaykita’",
+       "shortpages": "R’tung iyal na zngazyan",
+       "longpages": "Hmzinas iyal na zngazyan",
+       "protectedpages": "Klhangan na zngazyan",
        "protectedpages-timestamp": "Ryax zikang",
        "protectedpages-page": "Zzngayan",
        "protectedpages-expiry": "Sinpngan ryax",
+       "protectedpages-performer": "Klhangiy quw pptzyuwaw",
        "protectedpages-reason": "’ringan",
+       "protectedpages-submit": "Pkt’aniy",
        "protectedpages-unknown-timestamp": "Ini’ bqbaqiy ginlaylwan",
+       "protectedpages-unknown-performer": "Ini’ bqbaqiy ginlaylwan na pptzyuwaw",
+       "protectedtitles": "Klhangan na lalu’ na kkayal",
+       "protectedtitles-submit": "Pkt’aniy lalu’ na kkayal",
+       "listusers": "Binkgan sa zzngazyan na pptzyuwaw",
+       "listusers-desc": "Aring tay krahu’ mkuw ruw mucing cikuy",
        "usereditcount": "$1 {{PLURAL:$1|smr’zyut miru’}}",
        "newpages": "Giqas na zzngzyan",
        "newpages-submit": "Pkaykita’",
        "newpages-username": "Lalu’ na pptzyuwaw:",
        "move": "Smhzi’",
+       "movethispage": "Hz’aniy quw zngazyan qaniy",
        "notargettitle": "Ungat sinngusan niya’",
        "pager-older-n": "{{PLURAL:$1|smural hazi’ quw $1}}",
        "suppress": "Shtuy",
+       "apihelp": "minblaq kmal na API",
+       "apisandbox": "saho API",
+       "apisandbox-unfullscreen": "Pkt’aniy",
        "apisandbox-retry": "Talam lawziy",
+       "apisandbox-deprecated-parameters": "Wal phngagun na chansu’",
+       "apisandbox-fetch-token": "Mutuw siy biru’ nanak banggo’ na mima’",
+       "apisandbox-submit-invalid-fields-title": "Ungat zyuwaw bbrwan sa kruma’",
        "apisandbox-results": "Pcingan balay",
        "apisandbox-continue": "Siy lhingiy",
        "booksources": "Brbiru’ na inkhulan na pila’",
        "booksources-search": "Hkangi’",
        "log": "Pinhknyan sraral",
        "logeventslist-submit": "Pkaykita’",
+       "all-logs-page": "Kwara’ ka wal niya’ skayal kwara’ squliq ka bnrwan",
        "checkbox-all": "Kwara’",
        "checkbox-none": "Ungat",
        "checkbox-invert": "Pssyuk mwazyaw",
        "allpagessubmit": "Mtzyuwaw",
        "categories": "Pintbcyan",
        "categories-submit": "Pkaykita’",
+       "linksearch": "Hhkangi’’ubuy taylnglingay",
+       "linksearch-pat": "Hhkangi’:",
        "linksearch-ns": "Kungcyen na sslalu’:",
        "linksearch-ok": "Hhkangi’",
        "listusers-submit": "Pkaykita’",
+       "listusers-noresult": "Ktan ga ungat qutux pptzyuwaw.",
+       "listusers-blocked": "(wal sqhut)",
+       "activeusers-noresult": "Ktan ga ungat qutux pptzyuwaw",
        "listgrouprights-rights": "Pcingan na sinpngan",
+       "listgrouprights-members": "(binzyagan sa kktan gluw na qutux pinglgan)",
+       "listgrouprights-addgroup-all": "Tawnganiy kwara’ quw cyucu’",
+       "listgrouprights-removegroup-all": "Laxan kwara’ cyuncu’",
+       "listgrouprights-removegroup-self-all": "Laxan kwara’ cyuncu’",
+       "listgrouprights-namespaceprotection-header": "Klhangan sa iyat niya’ kkhmut na sslalu’ sa kung cyen:",
        "listgrants-rights": "Pcingan na sinpngan",
+       "trackingcategories-desc": "Galan pspngan na snli’ sa snli’ niya’kwara’ ka pintbuci’",
+       "trackingcategories-disabled": "Wal phngagun quw pintbcyan",
+       "mailnologin": "Ungat sstwan lalu’ na rhzyal",
        "emailusername": "Lalu’ na pptzyuwaw:",
        "emailusernamesubmit": "Pawsun",
        "emailto": "Sginbang a:",
        "mywatchlist": "Kta quw binkgan biru’",
        "watchnologin": "Ini’ su’ kzyup na’",
        "watch": "Kita’",
+       "watchthispage": "Kta quw zngazyan qaniy",
+       "notanarticle": "Zngazyan na iyat kay’ balay na binrwan",
        "watchlist-hide": "Lqing",
        "watchlist-submit": "Pkaykita’",
        "wlshowhidebots": "squliq na kikay",
+       "wlshowhideliu": "wal pbiru’quwpptzyuwaw",
        "wlshowhideanons": "inqing lalu’ nqu squliq cyux mbing",
+       "wlshowhidepatr": "wal ktan bniru’ na sinr’zyut",
+       "watchlist-options": "Wwazyaw sa’ kkita’ sa binkgan sa kktan",
        "enotif_impersonal_salutation": "{{SITENAME}} kwara’ ka cyux mbing ka qutux qutux ngasal",
        "enotif_anon_editor": "inqing lalu’ nqu squliq cyux mbing $1",
+       "enotif_minoredit": "Qaniy hya’ ga mszik na musa’ sr’tun miru’",
        "delete-confirm": "’muyut \"$1\"",
        "historyaction-submit": "Pkaykita’",
+       "actioncomplete": "Tmasuq mtzyuwaw",
+       "actionfailed": "Wal yaqih pintzyuwaw",
        "dellogpage": "Wayal pzyutan ka bniru’ qasa",
        "deletecomment": "’ringan:",
+       "delete-edit-reasonlist": "Sr’zyut miru’ sa ’ringan na pinzyutan",
        "rollbacklink": "psbnahun",
        "rollbacklinkcount": "psbzinah squw  {{PLURAL:sinr’zyut miru’ sa|$1}}",
+       "rollbackfailed": "Psbzinah sa wal yaqih",
+       "sessionfailure-title": "Wayal yaqih squw p’ubuy",
+       "changecontentmodel-model-label": "Giqas na pinsulung sa inrkyasan na bnrwan tay qsahuy",
        "changecontentmodel-reason-label": "’ringan:",
        "changecontentmodel-submit": "Smbah",
        "logentry-contentmodel-change-revertlink": "psbzih",
        "protectlogpage": "Kklahang sa bniru’",
        "protectcomment": "’ringan:",
        "protectexpiry": "Sinpngan ryax:",
+       "protect_expiry_invalid": "Ini’ baqiy snbah mima’.",
+       "protect_expiry_old": "Wal tmasuq quw sinpngan na ryax",
+       "protect-level-sysop": "Nanak yaquw pklahang swalan",
        "protect-expiring": "Sinpngan ryax $1 (UTC)",
+       "protect-expiring-local": "sinpngan ryax squw $1",
+       "protect-othertime": "Zikang tay bzinah:",
+       "protect-edit-reasonlist": "Sr’zyut miru’ quw ’ringan na kklahang",
        "restriction-type": "Pcingan na sinpngan:",
+       "restriction-level": "Pssyukun aring sa wagiq paybkuw ruw mucing sa cikuy",
+       "maximum-size": "Sspngan kinkrahu na sinpngan:",
        "pagesize": "(bzyaqan kkayal na llpgan)",
        "restriction-edit": "Smr’zyut miru’",
        "restriction-move": "Smhzi’",
        "restriction-create": "Ps’rux",
+       "undelete-fieldset-title": "Psbzinah sa wal sbahun",
        "undeletebtn": "Psbzih",
        "undeleteinvert": "Pssyuk mwazyaw",
        "undeletecomment": "’ringan:",
        "anoncontribs": "Snli’ sa binrwan",
        "month": "Pcingan na sniyan naha’ ryax na byacing:",
        "year": "Pcingan na sniyan naha’ ryax na kawas",
+       "sp-contributions-newbies-sub": "Pptzyuwaw sa kkbalay sa giqas na Canghaw",
        "sp-contributions-logs": "pinhknyan sraral",
        "sp-contributions-talk": "mpkal",
        "sp-contributions-submit": "Hhkangi’",
        "whatlinkshere-hidelinks": "$1 p’ubuy",
        "whatlinkshere-filters": "Hmkangi’",
        "whatlinkshere-submit": "Musa’",
+       "block": "Htzyaniy quw pptzyuwaw",
+       "blockip-legend": "Htzyaniy quw pptzyuwaw",
        "ipbreason": "’ringan:",
+       "ipbsubmit": "Qhtaniy quw pptzyuwaw qaniy",
+       "ipbother": "Zikang tay bzinah:",
+       "ipb-edit-dropdown": "Sr’zyut miru’ quw ’ringan na qnhut",
+       "ipb-blocklist-duration-left": "msthay $1",
+       "ipusubmit": "Laxiy quw qnihut qaniy",
        "autoblocklist-submit": "Hhkangi’",
        "blocklist-timestamp": "Ryax zikang",
        "blocklist-target": "Sinpngan na sinngusan",
        "blocklist-expiry": "Sinpngan ryax",
+       "blocklist-by": "Qnhtan na pklahang",
        "blocklist-reason": "’ringan",
        "ipblocklist-submit": "Hhkangi’",
+       "noautoblockblock": "phngaw quw pinzroo na qnhut",
+       "emailblock": "phngaw quw e-meyo’",
        "blocklink": "qmhut",
+       "change-blocklink": "Snbah qnhut",
        "contribslink": "wal miq sa pincyuwagan",
+       "emaillink": "Stwaniy e-meyo’",
+       "block-log-flags-noautoblock": "phngaw quw pinzroo na qnhut",
+       "block-log-flags-noemail": "phngaw quw e-meyo’",
+       "lockdb": "Sngusiy cryawku’",
+       "lockbtn": "Sngusiy cryawku’",
        "move-page": "Smhzi’ $1",
+       "pagemovedsub": "Wal thuzyay smhzi’",
        "movelogpage": "Sinhzyan sa bniru’",
        "movereason": "’ringan:",
        "revertmove": "psbzih",
        "export": "Pawsa’ sa bzinah quwzngayan",
+       "exportall": "Stwaniy kwara’ quw zngazyan",
        "export-submit": "Pawsa’",
+       "export-download": "Cucun ruw aki’ mgTang’an",
+       "allmessagesdefault": "Pinnama’ smi’ pintkaykay’ na biru’",
        "allmessages-filter-legend": "Hhkangi’",
        "allmessages-filter-unmodified": "Iyat sinbah",
        "allmessages-filter-all": "Kwara’ biru’ na zngyan",
+       "allmessages-prefix": "Khlaniy sa puqing biru’ hmkangi’:",
        "allmessages-language": "Kay’:",
        "allmessages-filter-submit": "Mtzyuwaw",
        "allmessages-filter-translate": "Gmbang miru’",
        "thumbnail-more": "Pkrahu’",
+       "filemissing": "Wal mgzyuwaw Tang’an",
+       "import-interwiki-sourcepage": "Inkhulan na zngazyan:",
+       "import-interwiki-templates": "Kwara’ kin na kwara’ yaya’ na kkbalay nnanu’",
        "import-upload-filename": "Lalu’ na tang’an:",
        "import-comment": "Tnwang smbbaq miru’",
+       "import-revision-count": "min$1 {{PLURAL:$1|smbah}}",
+       "importsuccess": "Wal tmasuq pawsa’ sa qsahuy na...la!",
        "tooltip-pt-userpage": "{{GENDER:|Lalu’ su’ sa pptzyuwaw}}sinr’zyut miru’",
        "tooltip-pt-mytalk": "{{GENDER:|Rwa su’}} zngayan sa spkayal",
        "tooltip-pt-preferences": "{{GENDER:|Rwa su’}}sni’ maku’ ktan krayryax",
        "tooltip-ca-edit": "Sr’zyut squw zzngayan tay sqaniy",
        "tooltip-ca-viewsource": "Ana wayal skun quw zngazyan qaniy ga, musa’ su’ baqun musa’ msbaybzih mita’ na’ quw puqing balay lalu’ na binkgan niya’.",
        "tooltip-ca-history": "Zzngayan qaniy hya’ ga sinbahan sa wayal qasa",
+       "tooltip-ca-protect": "Klhangiy quw zngazyan qaniy",
+       "tooltip-ca-delete": "’zyuciy quw zngazyan qaniy",
+       "tooltip-ca-move": "Hz’aniy quw zngazyan qaniy",
        "tooltip-ca-watch": "Aniy tmwang sa baqun du’ mita’ na biru’ binkgan ka ggyahan llpgan qaniy",
        "tooltip-search": "Hmkangi’ sa {{SITENAME}}",
        "tooltip-search-go": "Maha maki’ balay mtnaq lalu’ sa zzngayan qaniy ga, hala ta’ sa zzngayan qasa.",
        "tooltip-ca-nstab-template": "Kta quw mopan",
        "tooltip-ca-nstab-category": "psbzih mita’ sa pintbcyan na zngazyan",
        "tooltip-save": "Sku’ qu wayal su’ sbahun",
+       "tooltip-publish": "Kaylaniy kwara’ squliq quw sinbah su’",
        "tooltip-preview": "Zik na sskun su’ quw sinbahan su’ ga, sbnahiy mita’ quw sinbah su’.",
        "tooltip-diff": "Aniy pkita’ quw wayal su’ sbahun tay qsahuy niya’",
+       "tooltip-watchlistedit-raw-submit": "Psqgiqas smbah kkita’ sa bnkuw na kktan",
        "tooltip-rollback": "ssbu’ sa ’ubuy squ “Psbznahan” lga musa’ baq mbzinah squw sinr’ztan binrwan na misan mniru’ sa wayal qasa",
        "tooltip-undo": "\"Psbzinah\"hya’ ga mutuw niya’ baqun psbzinah quw sinr’zyut miru’, ruw kahul sa yuran mosu’ gmyah sa pcyuawag na smr’zyut miru’, ana su’ twangan miru’ sa nanu’ quw stwang squw sslalu’ na kkayal qaniy.",
        "tooltip-summary": "Brwaniy quw lalu’ na spzyang bbiru’ su’",
        "others": "bzinah",
+       "creditspage": "Kinbalay sa zngazyan na qutux gluw qasa",
        "simpleantispam-label": "Kmyagal sa kana ptayqihiy na niwan saysyup na kay’ na nnanu.\n<strong>Laxiy</strong> brwaniy sa bbrwan qaniy!",
+       "pageinfo-header-edits": "Sr’zyut miru’ pincyuwagan sraral",
+       "pageinfo-display-title": "Pkt’aniy lalu’ na kkayal",
+       "pageinfo-article-id": "Zngazyan na ID",
+       "pageinfo-language": "Kay’ qsahuy na zngazyan",
        "pageinfo-language-change": "smbah",
+       "pageinfo-content-model": "Inrkyasan pinsulung sa qsahuy na zngazyan",
        "pageinfo-content-model-change": "smbah",
        "pageinfo-robot-index": "Snwalan",
        "pageinfo-watchers": "Number of page watchers",
+       "pageinfo-firstuser": "Kinbalay sa zngazyang",
+       "pageinfo-firsttime": "Zikang na pins’rux sa zngazyan",
+       "pageinfo-lastuser": "Senmung psr’zyut miru’ sa misuw qaniy",
+       "pageinfo-lasttime": "Ryax sinr’zyut miru’ misuw qaniy",
+       "pageinfo-edits": "Sinqunan plpuw na pinsr’zyut miru’",
+       "pageinfo-recent-authors": "Senmung pbiru’ sa misuw qaniy",
        "pageinfo-toolboxlink": "Zzngayan na ggalan qqbaqan",
+       "pageinfo-redirectsto": "T’ringun pglaing maras sa:",
        "pageinfo-contentpage-yes": "Aw’",
+       "pageinfo-protect-cascading": "Kklahang tkhulan sakwara’ ka m’ubuy na ana nanu’",
        "pageinfo-protect-cascading-yes": "Aw’",
+       "pageinfo-protect-cascading-from": "Kklahang tkhulan sakwara’ ka m’ubuy na ana nanu’",
+       "pageinfo-category-subcats": "Kinpzyux llpgan na uzyuk na pintbcyan",
+       "pageinfo-category-files": "Kinpzyux na Tang’an",
        "pageinfo-user-id": "Mning ID",
+       "markaspatrolleddiff": "Sinbbaq sa wayal gawzyagan mita’",
+       "markedaspatrolled": "Sinbbaq sa wayal gawzyagan mita’",
        "confirm-markpatrolled-button": "Wal balay",
+       "previousdiff": "← Smural sinr’zyut miru’",
        "nextdiff": "Giqas hazi’ sinr’zyut→",
+       "thumbsize": "Sspngan kinkrahu’ na swotu’:",
        "file-info-size": "$1 × $2 qqblayqan zzyangay, zayzyuwaw biru’ na sspngan kinkrahu’: $3, gluw na mmntnaq MIME: $4",
        "file-nohires": "Ungat qbaqan miq qutux sa musa’ tthuzyay iyal pkaykita’ sa kinslwan iyal na qayqaya’.",
        "svg-long-desc": "SVG biru’ na cyux slyan ana nanu’ zayzyuwaw,kinkrahu’ ktan tay babaw\n$1 × $2 tay babaw na Syangsu’,\nsspngan kinkrahu’ kkita’ syasing:$3",
        "show-big-image-other": "Kwara’ tay bbzinah na {{PLURAL:$2|kinbaqun iyal mita’ na}}:$1",
        "show-big-image-size": "$1 × $2 qqblayqan zzyangay",
        "file-info-gif-looped": "syunxwan",
+       "file-info-gif-frames": "tay$1 {{PLURAL:$1|gnaygay pinzyuwi’an}}",
        "file-info-png-looped": "syunxwan",
+       "file-info-png-frames": "tay$1 {{PLURAL:$1|gnaygay pinzyuwi’an}}",
        "newimages-legend": "Hhkangi’",
+       "noimages": "Ungat ana nanu’ pinzga’",
        "gallery-slideshow-toggle": "Sbah mita' sa syasing bzinah",
        "ilsubmit": "Hhkangi’",
        "bydate": "skahul sa ryax",
+       "monday-at": "Ryax tay qutux sa qutux rihay squw $1",
+       "tuesday-at": "Ryax tay sazing sa qutux rihay squw $1",
+       "wednesday-at": "Rryax tay cyugalx sa qutux rihay squw $1",
+       "thursday-at": "Ryax tay spayat sa qutux rihay squw $1",
+       "friday-at": "Ryax tay zmagal sa qutux rihay squw $1",
+       "saturday-at": "Ryax tay mtzyu’ sa qutux rihay squw $1",
+       "sunday-at": "Ryax hngawan sa qutux rihay squw $1",
+       "yesterday-at": "$1 tay shira’",
        "metadata": "Cyuens’cryaw",
        "metadata-help": "Taki’ sa biru’ na kwara’ zayzyuwaw qaniy ga kwara’ kin na zayzyuwaw bbzinah, kwara’ quw zyuwaw sqaniy ga hazi’ na kahul sa pins’rux na Suwe syangciy ini’ ga tmrang squw cyux ps’rux squw Sken ini’ ga cyux tmrang smr’zyut sa Suwe . \nMaha iy wal sbahun squw puqing balay na biru’ cyux syan squw ana nanu’ zyuwaw lga, iyat hazi’ baqun minblaq ppwah kruma’ quw wal minblayqun miru’ na wayal sbahun na zyuwaw hya’ la.",
        "metadata-fields": "maki’ squw bnaykgan na pintkaykay’ ka qsahuy na Cyens’cryaw EXIF ga, syun niya’ sa zzngazyan kwara’ kin na Syasing, nanu’ iy mhiriq quw binrwan niya’ Cyens’cryaw lga nanak yaquw nyux sbiru’ hugal ka pintkaykay’ qaniy msthay.\ncyuens’ cryaw bzinah hya’ lga skun niya’ sa llqingun qasa hya’. \n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Kinglabang",
+       "exif-bitspersample": "Weyuen na qutux qutux syangsu’",
+       "exif-compression": "Ppkcikuy",
        "exif-orientation": "Ppiray sa iyat ptkkiy ktan quw syasing",
        "exif-xresolution": "Sweping Cyesitu’",
        "exif-yresolution": "Cwec’ Cyesitu’",
+       "exif-stripoffsets": "Cyux ki’an na ggalan sinbbaq ana nanu’",
        "exif-primarychromaticities": "Spzyang balay na iro’",
        "exif-datetime": "Ryax na sinbah Tang’an squw zikang na sinbahan Tang’an",
        "exif-make": "Squliq ka pkbalay squw Syasinki’",
        "exif-model": "Lalu’ na kinblayan Syasingki’",
        "exif-software": "Ggalan pptzyuwaw sa zyuwaw na Tennaw",
+       "exif-copyright": "Cinpancyuen",
        "exif-exifversion": "ktan sa kinblayan na Exif",
        "exif-colorspace": "Hhalan mwazyaw sa qqlah sa ini’ ptnaq  kktan na bbiru’",
+       "exif-componentsconfiguration": "Qutux qutux imi’ na syngsu’",
+       "exif-compressedbitsperpixel": "Pptzyuwaw sa ppkcikuy sa syasing",
+       "exif-usercomment": "Knayal kay’ na pptzyuwaw",
        "exif-datetimeoriginal": "Ryax na sni’ sa Craw squw zikang na sni’ sa Craw",
        "exif-datetimedigitized": "Ryax na minsuwexwa’ squw zikang na minsuwexwa’",
+       "exif-exposuretime": "Zikang na pinsyaxan",
        "exif-fnumber": "Kinsmyaxan na syasingki’",
+       "exif-exposureprogram": "Kkbalay niya’ sa pisyaxan na syasingki’",
+       "exif-isospeedratings": "pspngan kinhaylaw na ISO",
+       "exif-maxaperturevalue": "Pzyang krahu’ sspngan kinsmyax na syasingki’",
        "exif-subjectdistance": "Kintwahiq zyuwaw na sinngusan ppsingan",
        "exif-lightsource": "Puqing na syax",
        "exif-flash": "Pnilaw na pyax pyax",
        "exif-subjectarea": "Rhzyal cyux ki'an na spzyang kkayal",
+       "exif-flashenergy": "Rngu’ kinlawkahan na pnilaw na pyax pyax",
        "exif-subjectlocation": "Cyux ki'an na spzyang kkayal",
+       "exif-exposureindex": "Miru’ kinsnyaxan pinspngan na pspngan pinsyax na syasingki’",
+       "exif-filesource": "Tkhulan na Tang’an",
+       "exif-customrendered": "Sinpung niya’ nanak kkbalay niya’ sa syasing",
+       "exif-exposuremode": "Kin’ini’ ptnaq pinsyaxan na syax sa syasinki’",
        "exif-whitebalance": "Wayt belns",
+       "exif-scenecapturetype": "Kinini’ ptnaq ppsyasing na rhzyal",
        "exif-sharpness": "Srp nes",
+       "exif-devicesettingdescription": "Pinqzyuwan sa sni’ niya’ sa kinblayan",
+       "exif-subjectdistancerange": "Lnglingay na kintwahiq zyuwaw na spzyang ppsingan squw ppsyasing",
+       "exif-gpslatituderef": "Pewe’ ini’ ga zanwe’",
+       "exif-gpslongituderef": "Tngcin ini’ ga sicin",
+       "exif-gpsaltituderef": "Kkita’ sapspngan sa kinwagiq na kaybat",
+       "exif-gpssatellites": "Pptzyuwaw sa spsukuryuw na wesing",
+       "exif-gpsstatus": "Zyuwaw na GPS su’",
+       "exif-gpsdatestamp": "ryax na GPS",
        "exif-keywords": "Biru’ na Galan sa hhkangi qsahuy na tenaw",
+       "exif-worldregioncreated": "Rhzyal na pinsyasing",
+       "exif-countrycreated": "Syasing pinsyasing na kokka’",
+       "exif-provinceorstatecreated": "Syasing pinsyasing qalang na syo krahu’",
+       "exif-citycreated": "Syasing pinsyasing qalang hugal",
+       "exif-countrydest": "Pkt’aniy quw kokka’",
+       "exif-provinceorstatedest": "Pkt’aniy quw Syo ini’ ga Syuw",
+       "exif-citydest": "Pinkaykita’ ka qalang hugal",
        "exif-headline": "Lalu’",
+       "exif-credit": "Ppkbalay/Pbiq sa pincyuwagan",
        "exif-source": "Tkhulan",
+       "exif-locationdestcode": "Aniy pinqzyu’ quw ’niwan  na banggo’ nquw cyux niya’ ki’an",
+       "exif-objectcycle": "Hintgan zikang na meti’",
+       "exif-contact": "Prinrak sa ggalan kinbaq zayzyuwaw",
        "exif-writer": "Sinmung miru’",
        "exif-languagecode": "Kay’:",
+       "exif-iimversion": "ubuy gluw bniru’ na IIM",
        "exif-iimcategory": "Ps’anak sa mkgluw",
        "exif-identifier": "Biru’ na sinbbaq sa cyux naha’ ptcyuwagun",
+       "exif-cameraownername": "Cinsyasingki’",
        "exif-label": "Qinlah lalu’",
+       "exif-rightscertificate": "Cinkhulan sinhuzyay sa pklahang sa kinri’ na pinhtuw biru’",
+       "exif-copyrightowner": "Cinpancyuen",
+       "exif-webstatement": "Sinbbaq sa kiri’ na pincyuwagan sa wangcalu’",
+       "exif-licenseurl": "’ubuy sa sswayal miq sa kinri’ na pinhtuw biru’",
+       "exif-morepermissionsurl": "’niwan sa bbiq kinri’ na ggalan qinbaq",
+       "exif-originalimageheight": "Kinwagiq na ini’ qtabiy na’",
+       "exif-originalimagewidth": "Kinglabang na ini’ qtabiy na’",
        "exif-compression-1": "Ini’ aniy pkcikuy na’",
+       "exif-copyrighted-true": "Klhangan na Panchyen",
+       "exif-copyrighted-false": "Ini’ bqbaqiy ginllwan zyuwaw na cinkinri’ sa pinhtuw biru’",
        "exif-unknowndate": "Ini’ bqbaqiy ginlaylwan na ryax",
        "exif-orientation-1": "Mutuw galan sa puqing pspngan kwara’ na squliq",
        "exif-orientation-2": "Ptbangun pssyuk",
+       "exif-colorspace-65535": "Ini’’nblayqiy mita’ quw biru’ knita’ rawziq",
        "exif-exposureprogram-0": "Ini’ syaniy kay’ na’",
        "exif-exposureprogram-1": "Szyuwi’ na qba’",
        "exif-meteringmode-0": "Ini’ bqbaqiy ginlaylwan",
        "exif-meteringmode-1": "Pinqsugan",
+       "exif-meteringmode-2": "Syun tay kska na ppsingan quw sqtuxan spzyang ssyan iro’ na syasing ’ musa’ cyose",
        "exif-meteringmode-4": "Multi-Spot",
        "exif-meteringmode-255": "Bzinah",
        "exif-lightsource-0": "Ini’ bqbaqiy ginlaylwan",
        "exif-lightsource-4": "Pnilaw na pyax pyax",
        "exif-lightsource-10": "Mzyulung",
        "exif-lightsource-11": "Tay minkum",
+       "exif-lightsource-17": "Galan pspngan pnilaw A",
+       "exif-lightsource-18": "Galan pspngan pnilaw B",
+       "exif-lightsource-19": "Galan pspngan pnilaw C",
+       "exif-flash-fired-0": "Ini’ gyahiy na’ quw pnilaw na pyax pyax",
+       "exif-flash-fired-1": "Wal gyahan quw pnilaw na pyax pyax",
+       "exif-flash-function-1": "Ungat btthuzyay na ppilaw na pyax pyax",
+       "exif-flash-redeye-1": "iyat kktalah rawziq na syasing",
        "exif-focalplaneresolutionunit-2": "incun",
        "exif-sensingmethod-1": "Ini’ syaniy kay’ na’",
+       "exif-sensingmethod-7": "Kikay na kkinsa’ sa san sengse",
+       "exif-scenetype-1": "Zga’ na pinsyasing",
        "exif-customrendered-0": "Kwara’ hya’ ga  cngsyu’",
        "exif-exposuremode-1": "Pinspsyax na squliq",
+       "exif-whitebalance-0": "Mutuw niya’ white balance nanak",
+       "exif-whitebalance-1": "Szyuwi’ na qba’ quw white balance",
        "exif-scenecapturetype-0": "Galan pspngan",
        "exif-scenecapturetype-2": "Syasing na squliq",
        "exif-scenecapturetype-3": "Knita’ sa mlhngan na qlqalang",
        "exif-gpslatitude-s": "Nanwe’",
        "exif-gpslongitude-e": "Ist longzicyut",
        "exif-gpslongitude-w": "Sicing",
+       "exif-gpsstatus-a": "Cyuw tmrang sukuryuw na’",
+       "exif-gpsstatus-v": "Sukuryuw squw musa’ m’ubuy",
+       "exif-gpsspeed-k": "Qutux spung ga pira’ kirometa’",
+       "exif-gpsspeed-m": "Qutux spung ga pira’ Mayru’",
        "exif-gpsdestdistance-k": "Kirometa’",
        "exif-gpsdestdistance-m": "Inri’",
        "exif-gpsdestdistance-n": "Hayri’",
+       "exif-gpsdop-fair": "Maykura’ tay kska’ ($1)",
+       "exif-objectcycle-b": "Sasan ruw babaw kryaxan",
        "exif-ycbcrpositioning-1": "Kska’",
        "exif-dc-contributor": "Minniq",
        "exif-dc-date": "Ryax",
        "exif-dc-rights": "Pcingan na sinpngan",
+       "exif-iimcategory-clj": "Magal qinzqihan squw Horit",
+       "exif-iimcategory-fin": "Kezay squw psyubay",
        "exif-iimcategory-hth": "Blaq hi’",
+       "exif-iimcategory-lif": "Qaynxan squw ’rngawan lmawsay",
+       "exif-iimcategory-rel": "Sinhyan gaga’ squw sinhyan",
+       "exif-iimcategory-sci": "Kagak squw gizit na kagak",
        "exif-iimcategory-spo": "Tayyok",
        "exif-iimcategory-wea": "Kayal",
        "exif-urgency-normal": "Galan pspngan ($1)",
+       "exif-urgency-low": "Rrawq ($1)",
+       "exif-urgency-high": "Kinwagiq ($1)",
        "namespacesall": "kwara’",
        "monthsall": "kwara’",
+       "confirm-purge-title": "Kwagiy quw zngazyan qaniy",
        "confirm_purge_button": "Wal balay",
        "confirm-watch-button": "Wal balay",
        "confirm-unwatch-button": "Wal balay",
        "imgmultipageprev": "←llpgan tay glaing",
        "imgmultipagenext": "llpgan tay suruw →",
        "imgmultigo": "Aw’!",
+       "img-lang-default": "(pinnama’ smi’ na kay’)",
        "img-lang-go": "Musa’",
        "ascending_abbrev": "pskkrawn paybkuw",
        "table_pager_next": "Llpgan tay suruw",
        "table_pager_prev": "Llpgan tay glaing",
        "table_pager_first": "T’ringan balay na llpgan",
        "table_pager_last": "Pucing balay llpgan",
+       "table_pager_limit_label": "Llpgan na kinpzyux na pezi’:",
        "table_pager_limit_submit": "Pawsun",
+       "autosumm-blank": "Pskawngaciy quw biru’ qsahuy na zngazyan",
+       "autosumm-newblank": "Ps’rux  ungat ana nanu’ na zngazyan",
+       "watchlistedit-normal-title": "Sr’zyut miru’ sa kkita’ binkgan sa kktan",
        "watchlistedit-raw-titles": "Lalu’:",
+       "watchlistedit-raw-submit": "Psqgiqas smbah kkita’ sa bnkuw na kktan",
        "watchlistedit-clear-titles": "Lalu’:",
+       "watchlisttools-clear": "Laxiy kwara’ quw kkita’ squw kktan binkgan",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|mpkal]])",
        "version": "Ubuy gluw bbiru’ ni",
+       "version-skins": "Ktan tay babaw ka wayal syun qsahuy na pptzyuwaw",
+       "version-specialpages": "Kin ini’ ptnaq na zngazyan",
+       "version-antispam": "Hntuy sa kana wahiy na giway ungat zyuwaw na saysyup",
        "version-other": "Bzinah",
+       "version-mediahandlers": "Hantora na meti’",
+       "version-no-ext-name": "[ini’ slluy ]",
        "version-skin-colheader-name": "Ktan na rawziq",
        "version-ext-colheader-version": "Ubuy gluw bbiru’ ni",
        "version-ext-colheader-license": "Biru’ na gaga’ nqu snwayal hmriq sa kinri’",
        "version-ext-colheader-description": "Miblaq pnqzyu’ sa zyuwaw",
        "version-poweredby-others": "bzinah",
+       "version-software": "Wayal syun qsahuy na pptzyuwaw",
        "version-software-version": "Ubuy gluw bbiru’ ni",
        "version-entrypoints": "Kkzyup URL",
        "version-entrypoints-header-url": "URL",
        "redirect-submit": "Mtzyuwaw",
        "redirect-lookup": "Hmkangi’:",
        "redirect-user": "Mning ID",
+       "redirect-page": "Zngazyan na ID",
        "redirect-file": "Lalu’ na tang’an",
+       "redirect-logid": "Bbiru’ krayryax ID",
        "redirect-not-exists": "Ini' ’luwiy biru’ na llpgan",
+       "fileduplicatesearch": "Hkangi’ mtpanga’ na Tang’an",
        "fileduplicatesearch-filename": "Lalu’ na tang’an:",
        "fileduplicatesearch-submit": "Hhkangi’",
        "specialpages": "Mnanak na zzngayan",
+       "specialpages-group-other": "Bzinah ka ini’ ptnaq na zngazyan",
+       "specialpages-group-users": "Pptzyuwawsquwkinri’ na ptzyuwagun",
+       "specialpages-group-wiki": "Snli’ kwara’ biru’ zyuwaw na ana nanu’ squw qayqaya’",
+       "tags": "Kya rngu’ na sinbah sa qnlah lalu’",
        "tag-filter": "[[Special:Tags|qinlah lalu’]]hhkangi’:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|qinlah lalu’}}]]: $2)",
+       "tag-mw-contentmodelchange": "sbah quw pinsulung sa inrkyasan bniru’ niya’ sa qsahuy",
        "tags-title": "Qinlah lalu’",
        "tags-source-header": "Tkhulan",
        "tags-active-header": "Gyahiy?",
+       "tags-hitcount-header": "Wal spyawci’na sinbah",
        "tags-active-yes": "Aw’",
        "tags-active-no": "Iyat",
+       "tags-source-extension": "Zwati’ quw smi’ kay’",
        "tags-edit": "Smr’zyut miru’",
        "tags-delete": "’muyut",
        "tags-deactivate": "phngagun",
+       "tags-hitcount": "min$1 {{PLURAL:$1|smbah}}",
+       "tags-create-heading": "Ps’rux quw giqas na lalu’ na qinlah",
+       "tags-create-tag-name": "Alu’ na qinlah biru’:",
        "tags-create-reason": "’ringan:",
        "tags-create-submit": "Ps’rux",
        "tags-delete-reason": "’ringan:",
        "tags-activate-reason": "’ringan:",
        "tags-deactivate-reason": "’ringan:",
+       "tags-edit-title": "Sr’zyut miru’ qinlah lalu’",
        "tags-edit-existing-tags-none": "<em>Ungat<em>",
        "tags-edit-reason": "’ringan:",
+       "tags-edit-success": "Wal siy glaniy kya quw sinbah.",
        "comparepages": "Pspung sa zzngazyan",
+       "compare-page1": "Tay 1 gnyahan llpgan",
        "compare-page2": "Zzngayan 2",
        "compare-submit": "Pspngun",
        "diff-form": "Kin’ini’ ptnaq",
        "permanentlink": "Mrayrhuw na pin’ubuy",
+       "htmlform-required": "Llpgan qaniy hya’ ga siy kiy brwan.",
        "htmlform-submit": "Pawsun",
+       "htmlform-reset": "Psbzinah quw walmsbah",
        "htmlform-selectorother-other": "Bzinah",
        "htmlform-no": "iyat",
        "htmlform-yes": "Aw’",
        "logentry-delete-delete": "$1 {{GENDER:$2|wal laxan}}zngayan $3",
+       "revdelete-content-hid": "wal lqingun quw binrwan tay qsahuy",
+       "revdelete-content-unhid": "lzxiy quw lnqing qsahuy na bnrwan",
        "logentry-move-move": "$1 {{GENDER:$2|wal shzyun}}zngyan $3 squw $4",
        "logentry-newusers-create": "Wayal tmasuq {{GENDER:$2|ps’rux sq }} quw cin canghaw $1",
        "logentry-upload-upload": "$1 {{GENDER:$2|wal pawsun }} $3",
+       "log-name-managetags": "Qmlah sa lalu’ na bniru’ kklahang",
        "rightsnone": "(ungat)",
        "feedback-back": "’bzinah",
        "feedback-close": "Tmasuq",
+       "feedback-external-bug-report-button": "Kaylaniy quw kya ’zzyuwaw na gizit",
+       "feedback-dialog-title": "Stwaniy quw bniq su’ kay’",
        "feedback-message": "Pintkaykay’:",
        "feedback-subject": "Spzyang na ptzyuwaw:",
        "feedback-submit": "Pawsun",
+       "feedback-useragent": "’myunaw sa pptzyuwaw:",
        "searchsuggest-search": "Hhkangi’ {{SITENAME}}",
        "searchsuggest-containing": "kwara’ kin na...",
+       "limitreport-walltime": "Spzyang balay pincyuwagan na zikang",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bzyaqan kkayal na llpgan}}",
+       "limitreport-templateargumentsize": "Pspngan kinkrahu’ na chansu’ na Mopan",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bzyaqan kkayal na llpgan}}",
+       "limitreport-expansiondepth": "Spzyang balay krahu’ kinzzik na gnyahan",
+       "expand_templates_input": "Brwaniy quw biru’:",
        "expand_templates_output": "Pcingan balay",
+       "expand_templates_xml_output": "pawsa’ quw XML",
        "expand_templates_ok": "Wal balay",
        "expand_templates_preview": "Pnaynama’ mita’",
        "pagelang-language": "Kay’:",
+       "pagelang-use-default": "Ptzyawganiy sa mnaynama’ sni’ na kay’",
+       "pagelang-select-lang": "Wazyaw kay’",
        "pagelang-reason": "’ringan",
        "pagelang-submit": "Pawsun",
+       "log-name-pagelang": "Bniru’ sa sinbah na kay’",
+       "mediastatistics": "Pinsqun plpuw sa ggalang sinbbaq na meti’",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bzyaqan kkayal na llpgan}} ($2; $3%)",
+       "mediastatistics-table-extensions": "Musa’ baqun sptzyuwaw na estensyong",
+       "mediastatistics-table-count": "Kinpzyux na Tang’an",
        "mediastatistics-header-unknown": "Ini’ bqbaqiy ginlaylwan",
+       "mediastatistics-header-multimedia": "Smppzyux squw zyuwaw na twometi’",
        "mediastatistics-header-text": "Biru’ mlmlux",
+       "mediastatistics-header-archive": "Wal pkcikuyun ksu’",
+       "headline-anchor-title": "’ubuy sa biru’ gnaygay sqaniy",
        "special-characters-group-latin": "Biru’ na lating",
+       "special-characters-group-latinextended": "Pinslabang na biru’ na Latin",
        "special-characters-group-symbols": "Sni’ naha’ sa gaga’ na bbiru’",
        "special-characters-group-greek": "Biru’ na Grisya’",
+       "special-characters-group-greekextended": "Pinsglabang biru’ na Girisya’",
+       "special-characters-group-arabicextended": "Pinsglabang biru’ na Arabiya’",
        "special-characters-group-persian": "Przn",
        "special-characters-group-bangla": "Biru’ na Bengr",
+       "special-characters-group-gujarati": "Biru’ na kucyarati",
        "special-characters-group-thai": "Biru’ na Taykok",
        "special-characters-group-khmer": "Biru' na Khmer",
+       "mw-widgets-dateinput-no-date": "Ini’ wazyaw ryax",
+       "mw-widgets-mediasearch-noresults": "Ktan ga ungat quw pcingan balay na zyuwaw.",
        "mw-widgets-titleinput-description-new-page": "ungat zzngayan",
        "mw-widgets-categoryselector-add-category-placeholder": "Twangiy sa pintbcyan...",
+       "mw-widgets-usersmultiselect-placeholder": "Twangiy pzyux na’...",
+       "randomrootpage": "Tay puqing balay zngazyan nquw mutuw siy pspung sa inlungan nanak phtuw angazyan",
+       "log-action-filter-block": "Htzyaniy quw gluw na mmntnaq:",
+       "log-action-filter-delete": "’zyutan quw gluw na mmntnaq:",
+       "log-action-filter-import": "Pawsa’ qsahuy quw gluw na mmntnaq:",
+       "log-action-filter-move": "Hz’aniy quw ubuy na mtntnaq:",
+       "log-action-filter-patrol": "Musa’ gmawzyaw sa gluw na mmntnaq:",
+       "log-action-filter-protect": "Kklhangiy sa ubuy na mtntnaq na...:",
+       "log-action-filter-upload": "Pawsa’ sa kktan quw gluw na mmntnaq:",
        "log-action-filter-all": "Kwara’ biru’ na zngyan",
        "log-action-filter-block-block": "Qmhut",
+       "log-action-filter-delete-delete_redir": "T’aring pawsa’ sa ’mumuk sa binrwan",
+       "log-action-filter-delete-restore": "Laxiy quw aki’ llaxan na zngazyan",
        "log-action-filter-delete-event": "Pzyutan binrwan",
+       "log-action-filter-managetags-deactivate": "Laxiy gyahiy quw ’uzyut na qnlah biru’",
        "log-action-filter-patrol-patrol": "hkangyun na qba’",
+       "log-action-filter-protect-move_prot": "Wal shzyun quw kklahang",
        "log-action-filter-rights-rights": "Sbah na qba’",
+       "log-action-filter-suppress-event": "Laxiy aniy pkita’ quw bniru’",
+       "log-action-filter-suppress-revision": "Sbah quw qnihut sa pkaykita’",
+       "log-action-filter-suppress-delete": "Laxiy pkt’aniy quw zngazyan",
+       "authmanager-authplugin-setpass-failed-title": "Wal yaqih quw sinbah sa mima’",
+       "authmanager-authplugin-setpass-bad-domain": "Ungat zyuwaw na wangyu’.",
        "authmanager-email-label": "e-meyo’",
-       "authmanager-email-help": "Zyusyo na e-meyo’"
+       "authmanager-email-help": "Zyusyo na e-meyo’",
+       "cannotauth-not-allowed-title": "Ini’ pintayhuk pcingan sinpngan na kiri’",
+       "changecredentials": "Sbah quw sinrhuw sinhuzyay",
+       "credentialsform-provider": "Minsinrhuw sinhuzyay gluw na mtntnaq:",
+       "credentialsform-account": "Lalu’ na canghaw",
+       "linkaccounts-success-text": "Wal p’ubuyquw canghaw.",
+       "unlinkaccounts": "Laxiy quw ’ubuy Canghaw",
+       "revid": "sinbah sa $1",
+       "pageid": "Zngazyan na ID $1"
 }
index c4ffd62..50244e3 100644 (file)
        "parser-template-loop-warning": "Виявлена петля у шаблонах: [[$1]]",
        "template-loop-category": "Сторінки з петлями шаблонів",
        "template-loop-category-desc": "Ця сторінка містить петлю шаблонів, тобто шаблон, який рекурсивно викликає сам себе.",
+       "template-loop-warning": "<strong>Попередження:</strong> Ця сторінка викликає[[:$1]], що спричиняє петлю в шаблоні (нескінченний рекурсивний виклик).",
        "parser-template-recursion-depth-warning": "Перевищене обмеження глибини рекурсії шаблону ($1)",
        "language-converter-depth-warning": "Перевищене обмеження глибини мовного конвертора ($1)",
        "node-count-exceeded-category": "Сторінки, на яких перевищено лічильник вузлів",
        "rcfilters-watchlist-markseen-button": "Позначити всі зміни як переглянуті",
        "rcfilters-watchlist-edit-watchlist-button": "Редагувати Ваш список сторінок, за якими Ви спостерігаєте",
        "rcfilters-watchlist-showupdated": "Зміни до сторінок, які Ви не відвідували з моменту здійснення змін, виділені <strong>жирним</strong>, із цілісними маркерами.",
+       "rcfilters-preference-label": "Приховати покращену версію Нових редагувань",
+       "rcfilters-preference-help": "Скасовує зміну дизайну 2017 року та всі інструменти, додані тоді й пізніше.",
        "rcnotefrom": "Нижче знаходяться {{PLURAL:$5|редагування}} з <strong>$3, $4</strong> (відображено до <strong>$1</strong>).",
        "rclistfromreset": "Скинути вибір дати",
        "rclistfrom": "Показати редагування починаючи з $3 $2.",
        "sp-contributions-newonly": "Показувати тільки редагування, які є створеннями сторінок",
        "sp-contributions-hideminor": "Приховати малі правки",
        "sp-contributions-submit": "Пошук",
+       "sp-contributions-outofrange": "Неможливо показати будь-які результати. Запитуваний діапазон IP-адрес є більшим, аніж CIDR-ліміт у /$1.",
        "whatlinkshere": "Посилання сюди",
        "whatlinkshere-title": "Сторінки, що посилаються на «$1»",
        "whatlinkshere-page": "Сторінка:",
index 77474e8..af62897 100644 (file)
        "parser-template-loop-warning": "检查到模板循环:[[$1]]",
        "template-loop-category": "有模板循环的页面",
        "template-loop-category-desc": "页面存在模板循环,就是递归进行自我调用的模板。",
+       "template-loop-warning": "<strong>警告:</strong>此页面调用[[:$1]],这导致了模板循环(无限递归调用)。",
        "parser-template-recursion-depth-warning": "模板递归深度越限($1)",
        "language-converter-depth-warning": "字词转换器深度越限($1)",
        "node-count-exceeded-category": "页面的节点数超出限制",
        "rcfilters-watchlist-markseen-button": "标记所有更改为已查看",
        "rcfilters-watchlist-edit-watchlist-button": "编辑您的监视页面的列表",
        "rcfilters-watchlist-showupdated": "自更改发生以来,对您尚未访问的页面做出的更改以<strong>粗体</strong>显示,并带有立体标记。",
+       "rcfilters-preference-label": "隐藏改进的最近更改版本",
+       "rcfilters-preference-help": "返回到2017年界面重新设计版,并重新添加这以后新增的工具。",
        "rcnotefrom": "下面{{PLURAL:$5|是}}<strong>$3 $4</strong>之后的更改(最多显示<strong>$1</strong>个)。",
        "rclistfromreset": "重置时间选择",
        "rclistfrom": "显示$3 $2之后的新更改",
index 6975e25..a63149e 100644 (file)
 行動電話   移动电话
 流動電話   移动电话
 數據機      调制解调器
+網域名稱   域名
 葉門 也门
 貝里斯      伯利兹
 維德角      佛得角
 馬爾地夫   马尔代夫
 馬爾他      马耳他
 馬利共和國        马里共和国
+汕埠 圣佩德罗苏拉
 笨豬跳      蹦极跳
 绑紧跳      蹦极跳
 狗隻 犬只
 賓拉登      本拉登
 賓·拉登    本·拉登
 歐巴馬      奥巴马
+唐納·川普 唐纳德·特朗普
+當勞·特朗普      唐纳德·特朗普
+當奴·特朗普      唐纳德·特朗普
 北韓 北朝鲜
 台北韓      台北韩
 寮人民民主共和國       老挝人民民主共和国
 百慕達      百慕大
 三藩市      旧金山
 荷里活      好莱坞
+荷里活道   荷里活道
+荷里活廣場        荷里活广场
 麻薩諸塞   马萨诸塞
 伊利諾      伊利诺伊
 伊利諾伊   伊利诺伊
 韌體 固件
 唯讀 只读
 作業系統   操作系统
+行動作業系統     移动操作系统
+流動作業系統     移动操作系统
 外掛程式   插件
 電晶體      晶体管
 顯示卡      显卡
@@ -2576,7 +2585,6 @@ A型肝炎        甲型肝炎
 芮氏規模   里氏震级
 芮氏地震規模     里氏地震规模
 黎克特制   里氏
-機率 概率
 行政總裁   首席执行官
 執行長,   首席执行官,
 執行長、   首席执行官、
@@ -2624,6 +2632,7 @@ A型肝炎        甲型肝炎
 數位技術   数字技术
 數位訊號   数字信号
 數碼訊號   数字信号
+數位音樂   数字音乐
 數位化      数字化
 行動網路   移动网络
 流動網絡   移动网络
@@ -2672,3 +2681,4 @@ A型肝炎        甲型肝炎
 行人路权   行人路权
 塑膠袋      塑料袋
 烏龍麵      乌冬面
+披索 比索
index 7a07259..b71764a 100644 (file)
@@ -14,7 +14,6 @@
 妆台 妝枱
 弹珠台      彈珠枱
 折台 摺枱
-台布 枱布
 台历 枱曆
 台灯 枱燈
 写字台      寫字枱
 機器人      機械人
 移动电话   流動電話
 行動電話   流動電話
+操作系统   作業系統
+移动操作系统     流動作業系統
+行動作業系統     流動作業系統
 數據機      調制解調器
 短信 短訊
 簡訊 短訊
 賓拉登      本拉登
 賓·拉登    本·拉登
 歐巴馬      奧巴馬
+唐納·川普 當勞·特朗普
+唐纳德·特朗普   當勞·特朗普
 戈登·布朗 白高敦
 狂牛症      瘋牛症
 A肝   甲肝
@@ -3007,6 +3011,8 @@ IP地址  IP位址
 數位技術   數碼技術
 数字信号   數碼訊號
 數碼訊號   數碼訊號
+数字音乐   數碼音樂
+數位音樂   數碼音樂
 数字化      數碼化
 數位化      數碼化
 行動網路   流動網絡
index 6f3304f..56400c3 100644 (file)
 崑腔 昆腔
 崑蘇 昆苏
 崑調 昆调
+崑島 昆岛
 諠譁 喧哗
 慫慂 怂恿
 陈元扞      陈元扞
index d983932..16e2751 100644 (file)
 馬利蘭      馬里蘭
 里士满      里奇蒙
 荷里活      好萊塢
-荷李活道   荷李活道
+荷里活道   荷里活道
+荷里活廣場        荷里活廣場
 维尔京群岛        維京群島
 維爾京群島        維京群島
 纽黑文      紐哈芬
 蒙特利爾   蒙特婁
 斯堪的纳维亚     斯堪地那維亞
 斯堪的納維亞     斯堪地那維亞
+圣佩德罗苏拉     汕埠
 麦克尔      麥可
 迈克尔      麥可
 魯賓斯·巴里切羅        魯本·巴瑞切羅
 肯尼迪      甘迺迪
 奥巴马      歐巴馬
 奧巴馬      歐巴馬
+特朗普      川普
+唐纳德·特朗普   唐納·川普
+當勞·特朗普      唐納·川普
+當奴·特朗普      唐納·川普
 概率 機率
 疯牛症      狂牛症
 甲肝 A肝
 智能卡      智慧卡
 數據庫      資料庫
 操作系统   作業系統
+移动操作系统     行動作業系統
+流動作業系統     行動作業系統
 人机交互   人機互動
 交互设计   互動設計
 互联网络   網際網路
index e5b05ff..1912bcf 100644 (file)
@@ -135,6 +135,7 @@ U+056D9囙|U+056E0因|
 U+05705圅|U+051FD函|
 U+0577F坿|U+09644附|
 U+0579C垜|U+0579B垛|
+U+057BB垻|U+0575D坝|
 U+0585A塚|U+051A2冢|
 U+0585F塟|U+0846C葬|
 U+05872塲|U+0573A场|
index 9b2e081..c5d5fd7 100644 (file)
 雪窗螢几
 燕几
 隱几
+几筵
 饑饉
 乾薑
 毛薑
 上簽發
 上簽約
 上簽了
+上簽證
 中簽名
 中簽字
 中簽收
 中簽發
 中簽約
 中簽了
+中簽證
 下簽名
 下簽字
 下簽收
 下簽發
 下簽約
 下簽了
+下簽證
 犖确
 磽确
 确瘠
 山谷 #分詞用
 溝谷
 曼谷
+星露谷物語
 于美人
 緊緻
 曰云
 可自制
 台子女
 台子孫
-台布景
 台州
 台風穩健
 穩健的台風
 尸鳩
 尸佼
 尸子
+尸羅
 尸羅精舍
 毗婆尸佛
 尸棄佛
 蛋白發
 發狀態
 發狀況
+染發生
 古人有云
 昔人有云
 云敞
 性別扭曲
 箇舊市
 雲南箇舊
+關系列
+關系統
+關系所
+關系科
index eb60f80..e086c5e 100644 (file)
@@ -67,12 +67,12 @@ TEXT
                $this->output( "Copying IP revisions to ip_changes, from rev_id $start to rev_id $end\n" );
 
                while ( $blockStart <= $end ) {
-                       $cond = "rev_id >= $blockStart AND rev_user = 0 ORDER BY rev_id ASC LIMIT " . $this->mBatchSize;
                        $rows = $dbw->select(
                                'revision',
                                [ 'rev_id', 'rev_timestamp', 'rev_user_text' ],
-                               $cond,
-                               __METHOD__
+                               [ "rev_id >= $blockStart", 'rev_user' => 0 ],
+                               __METHOD__,
+                               [ 'ORDER BY' => 'rev_id ASC', 'LIMIT' => $this->mBatchSize ]
                        );
 
                        if ( !$rows || $rows->numRows() === 0 ) {
index f0aa9ec..10786da 100644 (file)
@@ -1091,6 +1091,9 @@ return [
                'scripts' => [
                        'resources/src/mediawiki/htmlform/htmlform.Checker.js',
                ],
+               'dependencies' => [
+                       'jquery.throttle-debounce',
+               ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.htmlform.ooui' => [
@@ -1772,6 +1775,7 @@ return [
                        'resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js',
                ],
                'dependencies' => [
+                       'jquery.byteLength',
                        'oojs',
                        'mediawiki.api',
                        'mediawiki.api.options',
index 7fe25ee..222f14a 100644 (file)
@@ -11,7 +11,7 @@
  * @static
  * @inheritable
  * @param {string} str
- * @return {string}
+ * @return {number}
  */
 jQuery.byteLength = function ( str ) {
        // This basically figures out how many bytes a UTF-16 string (which is what js sees)
diff --git a/resources/src/mediawiki.action/images/close.png b/resources/src/mediawiki.action/images/close.png
new file mode 100644 (file)
index 0000000..80dde95
Binary files /dev/null and b/resources/src/mediawiki.action/images/close.png differ
diff --git a/resources/src/mediawiki.action/images/close.svg b/resources/src/mediawiki.action/images/close.svg
new file mode 100644 (file)
index 0000000..7f75511
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <path d="M3.636 2.222l14.142 14.142-1.414 1.414L2.222 3.636z"/>
+       <path d="M17.778 3.636L3.636 17.778l-1.414-1.414L16.364 2.222z"/>
+</svg>
index e1fa925..d19f098 100644 (file)
@@ -7,7 +7,7 @@
        height: 0;
        left: 50%;
        z-index: 1000;
-       font-size: 13px;
+       font-size: 14px;
        cursor: pointer;
 }
 
        opacity: 1;
        .transition( opacity 250ms );
 
+       &:after {
+               content: '';
+               background: no-repeat center center;
+               .background-image-svg( 'images/close.svg', 'images/close.png' );
+               background-size: 12px 12px;
+               position: absolute;
+               right: 0.4em;
+               top: 0;
+               bottom: 0;
+               min-width: 32px;
+               min-height: 32px;
+               opacity: 0.87;
+
+               &:hover {
+                       opacity: 1;
+               }
+       }
+
        &.mw-notification {
                padding-right: 3em;
        }
 }
 
 .postedit-icon {
-       padding-left: 41px; /* 25 + 8 + 8 */
+       padding-left: 25px;
        /* like min-height, but old IE compatible and keeps text vertically aligned, too */
        line-height: 25px;
        background-repeat: no-repeat;
-       background-position: 8px 50%;
 }
 
 .postedit-icon-checkmark {
        /* @embed */
        background-image: url( images/green-checkmark.png );
-       background-position: left;
-}
-
-.postedit:after {
-       content: '×';
-       position: absolute;
-       padding: 0 0.8em;
-       right: 0;
-       top: 0;
-       font-size: 1.25em;
-       font-weight: bold;
-       line-height: 2.3em;
-       text-shadow: 0 0.0625em 0 #fff;
-       opacity: 0.2;
-}
-
-.postedit:hover:after {
-       opacity: 0.4;
 }
index f37229f..ee74ac5 100644 (file)
                // Stringify state
                stringified = JSON.stringify( state );
 
-               if ( stringified.length > 65535 ) {
+               if ( $.byteLength( stringified ) > 65535 ) {
                        // Sanity check, since the preference can only hold that.
                        return;
                }
index 67edb4f..83e5796 100644 (file)
                                );
                                filtersWidget.setTopSection( wlTopSection.$element );
                        } // end Special:WL
+
+                       /**
+                        * Fired when initialization of the filtering interface for changes list is complete.
+                        *
+                        * @event structuredChangeFilters_ui_initialized
+                        * @member mw.hook
+                        */
+                       mw.hook( 'structuredChangeFilters.ui.initialized' ).fire();
                }
        };
 
index a291958..2064e03 100644 (file)
@@ -29305,7 +29305,7 @@ Decoding of HTML entities in headings and links for IDs and link fragments (T103
 [[#A&B&amp;C&amp;amp;D&amp;amp;amp;E]]
 !! html/php
 <h2><span class="mw-headline" id="A.26B.26C.26amp.3BD.26amp.3Bamp.3BE">A&amp;B&amp;C&amp;amp;D&amp;amp;amp;E</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A&amp;B&amp;C&amp;amp;D&amp;amp;amp;E">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<p><a href="#A.26B.26C.26D.26amp.3BE">#A&amp;B&amp;C&amp;amp;D&amp;amp;amp;E</a>
+<p><a href="#A.26B.26C.26amp.3BD.26amp.3Bamp.3BE">#A&amp;B&amp;C&amp;amp;D&amp;amp;amp;E</a>
 </p>
 !! end
 
diff --git a/tests/phpunit/data/templates/recurse.mustache b/tests/phpunit/data/templates/recurse.mustache
new file mode 100644 (file)
index 0000000..391f227
--- /dev/null
@@ -0,0 +1 @@
+r{{#r}}{{>recurse}}{{/r}}
\ No newline at end of file
index 7472fb9..7256694 100644 (file)
@@ -376,7 +376,7 @@ class SanitizerTest extends MediaWikiTestCase {
                        [ '\'', '.27' ],
                        [ '§', '.C2.A7' ],
                        [ 'Test:A & B/Here', 'Test:A_.26_B.2FHere' ],
-                       [ 'A&B&amp;C&amp;amp;D&amp;amp;amp;E', 'A.26B.26C.26amp.3BD.26amp.3Bamp.3BE' ],
+                       [ 'A&B&amp;C&amp;amp;D&amp;amp;amp;E', 'A.26B.26amp.3BC.26amp.3Bamp.3BD.26amp.3Bamp.3Bamp.3BE' ],
                ];
        }
 
@@ -432,7 +432,6 @@ class SanitizerTest extends MediaWikiTestCase {
         * @covers Sanitizer::escapeIdForLink()
         * @covers Sanitizer::escapeIdForExternalInterwiki()
         * @covers Sanitizer::escapeIdInternal()
-        * @covers Sanitizer::urlEscapeId()
         *
         * @param string $stuff
         * @param string[] $config
@@ -453,10 +452,11 @@ class SanitizerTest extends MediaWikiTestCase {
 
        public function provideEscapeIdForStuff() {
                // Test inputs and outputs
-               $text = 'foo тест_#%!\'()[]:<>';
-               $legacyEncoded = 'foo_.D1.82.D0.B5.D1.81.D1.82_.23.25.21.27.28.29.5B.5D:.3C.3E';
-               $html5Encoded = 'foo_тест_#%!\'()[]:<>';
-               $html5Experimental = 'foo_тест_!_()[]:<>';
+               $text = 'foo тест_#%!\'()[]:<>&&amp;&amp;amp;';
+               $legacyEncoded = 'foo_.D1.82.D0.B5.D1.81.D1.82_.23.25.21.27.28.29.5B.5D:.3C.3E' .
+                       '.26.26amp.3B.26amp.3Bamp.3B';
+               $html5Encoded = 'foo_тест_#%!\'()[]:<>&&amp;&amp;amp;';
+               $html5Experimental = 'foo_тест_!_()[]:<>_amp;_amp;amp;';
 
                // Settings: last element is $wgExternalInterwikiFragmentMode, the rest is $wgFragmentMode
                $legacy = [ 'legacy', 'legacy' ];
index 2bd9086..c161f85 100644 (file)
@@ -109,4 +109,17 @@ class TemplateParserTest extends MediaWikiTestCase {
                        ],
                ];
        }
+
+       public function testEnableRecursivePartials() {
+               $tp = new TemplateParser( $this->templateDir );
+               $data = [ 'r' => [ 'r' => [ 'r' => [] ] ] ];
+
+               $tp->enableRecursivePartials( true );
+               $this->assertEquals( 'rrr', $tp->processTemplate( 'recurse', $data ) );
+
+               $tp->enableRecursivePartials( false );
+               $this->setExpectedException( 'Exception' );
+               $tp->processTemplate( 'recurse', $data );
+       }
+
 }
index 6c059ec..25b754d 100644 (file)
@@ -403,12 +403,15 @@ class XmlTest extends MediaWikiTestCase {
         */
        public function testListDropDown() {
                $this->assertEquals(
-                       '<select id="test-name" name="test-name" class="test-css" tabindex="2">' . "\n" .
-                               '<option value="other">other reasons</option>' .
-                               '<optgroup label="Foo"><option value="Foo 1">Foo 1</option>' .
-                               '<option value="Example" selected="">Example</option>' .
-                               '</optgroup><optgroup label="Bar">' .
-                               '<option value="Bar 1">Bar 1</option></optgroup>' . "\n" .
+                       '<select name="test-name" id="test-name" class="test-css" tabindex="2">' .
+                               '<option value="other">other reasons</option>' . "\n" .
+                               '<optgroup label="Foo">' .
+                               '<option value="Foo 1">Foo 1</option>' . "\n" .
+                               '<option value="Example" selected="">Example</option>' . "\n" .
+                               '</optgroup>' . "\n" .
+                               '<optgroup label="Bar">' .
+                               '<option value="Bar 1">Bar 1</option>' . "\n" .
+                               '</optgroup>' .
                                '</select>',
                        Xml::listDropDown(
                                // name
@@ -426,4 +429,52 @@ class XmlTest extends MediaWikiTestCase {
                        )
                );
        }
+
+       /**
+        * @covers Xml::listDropDownOptions
+        */
+       public function testListDropDownOptions() {
+               $this->assertEquals(
+                       [
+                               'other reasons' => 'other',
+                               'Foo' => [
+                                       'Foo 1' => 'Foo 1',
+                                       'Example' => 'Example',
+                               ],
+                               'Bar' => [
+                                       'Bar 1' => 'Bar 1',
+                               ],
+                       ],
+                       Xml::listDropDownOptions(
+                               "* Foo\n** Foo 1\n** Example\n* Bar\n** Bar 1",
+                               [ 'other' => 'other reasons' ]
+                       )
+               );
+       }
+
+       /**
+        * @covers Xml::listDropDownOptionsOoui
+        */
+       public function testListDropDownOptionsOoui() {
+               $this->assertEquals(
+                       [
+                               [ 'data' => 'other', 'label' => 'other reasons' ],
+                               [ 'optgroup' => 'Foo' ],
+                               [ 'data' => 'Foo 1', 'label' => 'Foo 1' ],
+                               [ 'data' => 'Example', 'label' => 'Example' ],
+                               [ 'optgroup' => 'Bar' ],
+                               [ 'data' => 'Bar 1', 'label' => 'Bar 1' ],
+                       ],
+                       Xml::listDropDownOptionsOoui( [
+                               'other reasons' => 'other',
+                               'Foo' => [
+                                       'Foo 1' => 'Foo 1',
+                                       'Example' => 'Example',
+                               ],
+                               'Bar' => [
+                                       'Bar 1' => 'Bar 1',
+                               ],
+                       ] )
+               );
+       }
 }