Merge "maintenance: Add unit test for Benchmarker class"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 28 Dec 2017 09:22:01 +0000 (09:22 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 28 Dec 2017 09:22:01 +0000 (09:22 +0000)
243 files changed:
RELEASE-NOTES-1.31
autoload.php
docs/hooks.txt
includes/DefaultSettings.php
includes/HistoryBlob.php
includes/MediaWikiServices.php
includes/Message.php
includes/OutputPage.php
includes/Revision.php
includes/ServiceWiring.php
includes/Storage/BlobStoreFactory.php [new file with mode: 0644]
includes/Storage/RevisionStore.php
includes/Storage/RevisionStoreRecord.php
includes/Storage/SqlBlobStore.php
includes/api/ApiBlock.php
includes/api/ApiEmailUser.php
includes/api/ApiTag.php
includes/api/i18n/ar.json
includes/api/i18n/gl.json
includes/api/i18n/nb.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/ru.json
includes/cache/localisation/LCStoreStaticArray.php
includes/changetags/ChangeTags.php
includes/clientpool/SquidPurgeClient.php
includes/import/WikiImporter.php
includes/installer/i18n/ca.json
includes/installer/i18n/eu.json
includes/installer/i18n/nl.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/libs/JavaScriptMinifier.php
includes/libs/MWMessagePack.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/rdbms/database/Database.php
includes/media/Bitmap.php
includes/media/XCF.php
includes/page/PageArchive.php
includes/page/WikiPage.php
includes/parser/BlockLevelPass.php
includes/parser/Parser.php
includes/parser/Preprocessor_Hash.php
includes/search/SearchEngine.php
includes/search/SearchMySQL.php
includes/shell/Command.php
includes/shell/FirejailCommand.php
includes/shell/Shell.php
includes/skins/BaseTemplate.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialUncategorizedcategories.php
includes/specials/SpecialUserrights.php
includes/specials/pagers/UsersPager.php
includes/tidy/Balancer.php
includes/user/User.php
includes/user/UserGroupMembership.php
includes/utils/AutoloadGenerator.php
includes/utils/AvroValidator.php
languages/Language.php
languages/classes/LanguageGa.php
languages/classes/LanguageLa.php
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/az.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es-formal.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mk.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/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sd.json
languages/i18n/shn.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/zh-hans.json
maintenance/dumpIterator.php
maintenance/importDump.php
maintenance/oracle/archives/patch-auto_increment_triggers.sql
maintenance/oracle/archives/patch-externallinks-el_index_60.sql
maintenance/oracle/tables.sql
maintenance/oracle/user.sql
maintenance/renderDump.php
maintenance/storage/checkStorage.php
resources/Resources.php
resources/lib/jquery.chosen/LICENSE
resources/lib/jquery.chosen/README.md [new file with mode: 0644]
resources/lib/jquery.chosen/chosen-sprite.png
resources/lib/jquery.chosen/chosen-sprite@2x.png
resources/lib/jquery.chosen/chosen.css
resources/lib/jquery.chosen/chosen.jquery.js
resources/src/jquery/jquery.tablesorter.less
resources/src/mediawiki.action/mediawiki.action.edit.styles.less
resources/src/mediawiki.language/specialcharacters.json
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.MenuSelectWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.vector.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RclTargetPageWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RclToOrFromWidget.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MainWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTargetPageWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki/mediawiki.debug.less
resources/src/mediawiki/mediawiki.editfont.css
resources/src/mediawiki/mediawiki.feedback.js
tests/parser/ParserTestRunner.php
tests/parser/TestFileEditor.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/LinkFilterTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PageArchiveTest.php
tests/phpunit/includes/PagePropsTest.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/Storage/BlobStoreFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/Storage/RevisionRecordTest.php [deleted file]
tests/phpunit/includes/Storage/RevisionStoreDbTest.php
tests/phpunit/includes/Storage/RevisionStoreTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiComparePagesTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiQueryRecentChangesIntegrationTest.php [new file with mode: 0644]
tests/phpunit/includes/collation/CollationFaTest.php
tests/phpunit/includes/collation/CustomUppercaseCollationTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/FileContentHandlerTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/TextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextStructureTest.php
tests/phpunit/includes/db/LoadBalancerTest.php
tests/phpunit/includes/debug/logger/monolog/AvroFormatterTest.php
tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
tests/phpunit/includes/deferred/LinksUpdateTest.php
tests/phpunit/includes/editpage/TextboxBuilderTest.php [new file with mode: 0644]
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
tests/phpunit/includes/filerepo/RepoGroupTest.php
tests/phpunit/includes/filerepo/file/FileTest.php
tests/phpunit/includes/htmlform/HTMLFormTest.php
tests/phpunit/includes/http/HttpTest.php
tests/phpunit/includes/jobqueue/RefreshLinksPartitionTest.php
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
tests/phpunit/includes/logging/BlockLogFormatterTest.php
tests/phpunit/includes/logging/DeleteLogFormatterTest.php
tests/phpunit/includes/logging/ImportLogFormatterTest.php
tests/phpunit/includes/logging/MergeLogFormatterTest.php
tests/phpunit/includes/logging/MoveLogFormatterTest.php
tests/phpunit/includes/logging/NewUsersLogFormatterTest.php
tests/phpunit/includes/logging/PageLangLogFormatterTest.php
tests/phpunit/includes/logging/PatrolLogFormatterTest.php
tests/phpunit/includes/logging/ProtectLogFormatterTest.php
tests/phpunit/includes/logging/RightsLogFormatterTest.php
tests/phpunit/includes/logging/UploadLogFormatterTest.php
tests/phpunit/includes/media/GIFTest.php
tests/phpunit/includes/media/PNGTest.php
tests/phpunit/includes/media/WebPTest.php
tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php
tests/phpunit/includes/objectcache/RESTBagOStuffTest.php
tests/phpunit/includes/page/ImagePage404Test.php
tests/phpunit/includes/page/ImagePageTest.php
tests/phpunit/includes/parser/ParserOptionsTest.php
tests/phpunit/includes/parser/SanitizerTest.php
tests/phpunit/includes/poolcounter/PoolCounterTest.php
tests/phpunit/includes/shell/FirejailCommandTest.php
tests/phpunit/includes/specials/ContribsPagerTest.php
tests/phpunit/includes/specials/SpecialMIMESearchTest.php
tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/user/PasswordResetTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/utils/BatchRowUpdateTest.php
tests/phpunit/includes/utils/MWCryptHKDFTest.php
tests/phpunit/maintenance/categoriesRdfTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/selenium/wdio.conf.jenkins.js
tests/selenium/wdio.conf.js

index 67026f4..a496b02 100644 (file)
@@ -19,6 +19,8 @@ production.
   maintenance/cleanupUsersWithNoId.php.
 * $wgResourceLoaderMinifierStatementsOnOwnLine and $wgResourceLoaderMinifierMaxLineLength
   were removed (deprecated since 1.27).
+* (T180921) $wgReferrerPolicy now supports having fallbacks for browsers that are not
+  using the latest version of the Referrer Policy specification.
 
 === New features in 1.31 ===
 * Wikimedia\Rdbms\IDatabase->select() and similar methods now support
@@ -39,6 +41,7 @@ production.
 === External library changes in 1.31 ===
 
 ==== Upgraded external libraries ====
+* Updated jquery.chosen from v0.9.14 to v1.8.2.
 * …
 
 ==== New external libraries ====
@@ -71,6 +74,10 @@ changes to languages because of Phabricator reports.
 * (T180052) Mirandese (mwl) now supports gendered NS_USER/NS_USER_TALK namespaces.
 
 === Other changes in 1.31 ===
+* Introducing multi-content-revision capability into the storage layer. For details,
+  see <https://www.mediawiki.org/wiki/Requests_for_comment/Multi-Content_Revisions>.
+* The Revision class was deprecated in favor of RevisionStore, BlobStore, and
+  RevisionRecord and its subclasses.
 * MessageBlobStore::insertMessageBlob() (deprecated in 1.27) was removed.
 * The global function wfBCP47 was renamed to LanguageCode::bcp47.
 * The global function wfBCP47 is now deprecated.
@@ -149,6 +156,9 @@ changes to languages because of Phabricator reports.
   * WatchedItem::IGNORE_USER_RIGHTS
   * WatchedItem::CHECK_USER_RIGHTS
   * WatchedItem::DEPRECATED_USAGE_TIMESTAMP
+* The $statementsOnOwnLine parameter of JavaScriptMinifier::minify was removed.
+  The corresponding configuration variable ($wgResourceLoaderMinifierStatementsOnOwnLine)
+  has been deprecated since 1.27 and was removed as well.
 
 == Compatibility ==
 MediaWiki 1.31 requires PHP 5.5.9 or later. There is experimental support for
index 6b8387b..c37d9f7 100644 (file)
@@ -944,6 +944,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php',
        'MediaWiki\\Storage\\BlobAccessException' => __DIR__ . '/includes/Storage/BlobAccessException.php',
        'MediaWiki\\Storage\\BlobStore' => __DIR__ . '/includes/Storage/BlobStore.php',
+       'MediaWiki\\Storage\\BlobStoreFactory' => __DIR__ . '/includes/Storage/BlobStoreFactory.php',
        'MediaWiki\\Storage\\IncompleteRevisionException' => __DIR__ . '/includes/Storage/IncompleteRevisionException.php',
        'MediaWiki\\Storage\\MutableRevisionRecord' => __DIR__ . '/includes/Storage/MutableRevisionRecord.php',
        'MediaWiki\\Storage\\MutableRevisionSlots' => __DIR__ . '/includes/Storage/MutableRevisionSlots.php',
index 1f4a5f4..45387a3 100644 (file)
@@ -951,7 +951,7 @@ $id: the page ID (original ID in case of page deletions)
 in a Category page. Gives extensions the opportunity to batch load any
 related data about the pages.
 $type: The category type. Either 'page', 'file' or 'subcat'
-$res: Query result from DatabaseBase::select()
+$res: Query result from Wikimedia\Rdbms\IDatabase::select()
 
 'CategoryViewer::generateLink': Before generating an output link allow
 extensions opportunity to generate a more specific or relevant link.
index e50b7a7..8091428 100644 (file)
@@ -316,10 +316,20 @@ $wgAppleTouchIcon = false;
 
 /**
  * Value for the referrer policy meta tag.
- * One of 'never', 'default', 'origin', 'always'. Setting it to false just
- * prevents the meta tag from being output.
- * See https://www.w3.org/TR/referrer-policy/ for details.
- *
+ * One or more of the values defined in the Referrer Policy specification:
+ * https://w3c.github.io/webappsec-referrer-policy/
+ * ('no-referrer', 'no-referrer-when-downgrade', 'same-origin',
+ * 'origin', 'strict-origin', 'origin-when-cross-origin',
+ * 'strict-origin-when-cross-origin', or 'unsafe-url')
+ * Setting it to false prevents the meta tag from being output
+ * (which results in falling back to the Referrer-Policy header,
+ * or 'no-referrer-when-downgrade' if that's not set either.)
+ * Setting it to an array (supported since 1.31) will create a meta tag for
+ * each value, in the reverse of the order (meaning that the first array element
+ * will be the default and the others used as fallbacks for browsers which do not
+ * understand it).
+ *
+ * @var array|string|bool
  * @since 1.25
  */
 $wgReferrerPolicy = false;
@@ -3763,7 +3773,7 @@ $wgResourceLoaderValidateStaticJS = false;
  * @code
  *   $wgResourceLoaderLESSVars = [
  *     'exampleFontSize'  => '1em',
- *     'exampleBlue' => '#eee',
+ *     'exampleBlue' => '#36c',
  *   ];
  * @endcode
  * @since 1.22
@@ -6953,6 +6963,7 @@ $wgUseTagFilter = true;
  * - 'mw-blank': Edit completely blanks the page
  * - 'mw-replace': Edit removes more than 90% of the content
  * - 'mw-rollback': Edit is a rollback, made through the rollback link or rollback API
+ * - 'mw-undo': Edit made through an undo link
  *
  * @var array
  * @since 1.31
@@ -6964,7 +6975,8 @@ $wgSoftwareTags = [
        'mw-changed-redirect-target' => true,
        'mw-blank' => true,
        'mw-replace' => true,
-       'mw-rollback' => true
+       'mw-rollback' => true,
+       'mw-undo' => true,
 ];
 
 /**
index 14d22ec..5193168 100644 (file)
@@ -560,26 +560,26 @@ class DiffHistoryBlob implements HistoryBlob {
                        $op = $x['op'];
                        ++$p;
                        switch ( $op ) {
-                       case self::XDL_BDOP_INS:
-                               $x = unpack( 'Csize', substr( $diff, $p, 1 ) );
-                               $p++;
-                               $out .= substr( $diff, $p, $x['size'] );
-                               $p += $x['size'];
-                               break;
-                       case self::XDL_BDOP_INSB:
-                               $x = unpack( 'Vcsize', substr( $diff, $p, 4 ) );
-                               $p += 4;
-                               $out .= substr( $diff, $p, $x['csize'] );
-                               $p += $x['csize'];
-                               break;
-                       case self::XDL_BDOP_CPY:
-                               $x = unpack( 'Voff/Vcsize', substr( $diff, $p, 8 ) );
-                               $p += 8;
-                               $out .= substr( $base, $x['off'], $x['csize'] );
-                               break;
-                       default:
-                               wfDebug( __METHOD__ . ": invalid op\n" );
-                               return false;
+                               case self::XDL_BDOP_INS:
+                                       $x = unpack( 'Csize', substr( $diff, $p, 1 ) );
+                                       $p++;
+                                       $out .= substr( $diff, $p, $x['size'] );
+                                       $p += $x['size'];
+                                       break;
+                               case self::XDL_BDOP_INSB:
+                                       $x = unpack( 'Vcsize', substr( $diff, $p, 4 ) );
+                                       $p += 4;
+                                       $out .= substr( $diff, $p, $x['csize'] );
+                                       $p += $x['csize'];
+                                       break;
+                               case self::XDL_BDOP_CPY:
+                                       $x = unpack( 'Voff/Vcsize', substr( $diff, $p, 8 ) );
+                                       $p += 8;
+                                       $out .= substr( $base, $x['off'], $x['csize'] );
+                                       break;
+                               default:
+                                       wfDebug( __METHOD__ . ": invalid op\n" );
+                                       return false;
                        }
                }
                return $out;
index 33d0fd4..04c67fb 100644 (file)
@@ -12,6 +12,7 @@ use Hooks;
 use IBufferingStatsdDataFactory;
 use MediaWiki\Shell\CommandFactory;
 use MediaWiki\Storage\BlobStore;
+use MediaWiki\Storage\BlobStoreFactory;
 use MediaWiki\Storage\RevisionStore;
 use Wikimedia\Rdbms\LBFactory;
 use LinkCache;
@@ -700,12 +701,20 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'ExternalStoreFactory' );
        }
 
+       /**
+        * @since 1.31
+        * @return BlobStoreFactory
+        */
+       public function getBlobStoreFactory() {
+               return $this->getService( 'BlobStoreFactory' );
+       }
+
        /**
         * @since 1.31
         * @return BlobStore
         */
        public function getBlobStore() {
-               return $this->getService( 'BlobStore' );
+               return $this->getService( '_SqlBlobStore' );
        }
 
        /**
index 16ae839..e55eaaf 100644 (file)
@@ -1308,16 +1308,15 @@ class Message implements MessageSpecifier, Serializable {
         */
        protected function formatPlaintext( $plaintext, $format ) {
                switch ( $format ) {
-               case self::FORMAT_TEXT:
-               case self::FORMAT_PLAIN:
-                       return $plaintext;
-
-               case self::FORMAT_PARSE:
-               case self::FORMAT_BLOCK_PARSE:
-               case self::FORMAT_ESCAPED:
-               default:
-                       return htmlspecialchars( $plaintext, ENT_QUOTES );
-
+                       case self::FORMAT_TEXT:
+                       case self::FORMAT_PLAIN:
+                               return $plaintext;
+
+                       case self::FORMAT_PARSE:
+                       case self::FORMAT_BLOCK_PARSE:
+                       case self::FORMAT_ESCAPED:
+                       default:
+                               return htmlspecialchars( $plaintext, ENT_QUOTES );
                }
        }
 
index 92963fd..1c2c29d 100644 (file)
@@ -3243,6 +3243,8 @@ class OutputPage extends ContextSource {
                        && ( $relevantTitle->exists() || $relevantTitle->quickUserCan( 'create', $user ) );
 
                foreach ( $title->getRestrictionTypes() as $type ) {
+                       // Following keys are set in $vars:
+                       // wgRestrictionCreate, wgRestrictionEdit, wgRestrictionMove, wgRestrictionUpload
                        $vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
                }
 
@@ -3331,10 +3333,14 @@ class OutputPage extends ContextSource {
                ] );
 
                if ( $config->get( 'ReferrerPolicy' ) !== false ) {
-                       $tags['meta-referrer'] = Html::element( 'meta', [
-                               'name' => 'referrer',
-                               'content' => $config->get( 'ReferrerPolicy' )
-                       ] );
+                       // Per https://w3c.github.io/webappsec-referrer-policy/#unknown-policy-values
+                       // fallbacks should come before the primary value so we need to reverse the array.
+                       foreach ( array_reverse( (array)$config->get( 'ReferrerPolicy' ) ) as $i => $policy ) {
+                               $tags["meta-referrer-$i"] = Html::element( 'meta', [
+                                       'name' => 'referrer',
+                                       'content' => $policy,
+                               ] );
+                       }
                }
 
                $p = "{$this->mIndexPolicy},{$this->mFollowPolicy}";
index ea73a61..8f36e88 100644 (file)
@@ -65,10 +65,14 @@ class Revision implements IDBAccessObject {
        }
 
        /**
+        * @param bool|string $wikiId The ID of the target wiki database. Use false for the local wiki.
+        *
         * @return SqlBlobStore
         */
-       protected static function getBlobStore() {
-               $store = MediaWikiServices::getInstance()->getBlobStore();
+       protected static function getBlobStore( $wiki = false ) {
+               $store = MediaWikiServices::getInstance()
+                       ->getBlobStoreFactory()
+                       ->newSqlBlobStore( $wiki );
 
                if ( !$store instanceof SqlBlobStore ) {
                        throw new RuntimeException(
@@ -90,11 +94,54 @@ class Revision implements IDBAccessObject {
         *
         * @param int $id
         * @param int $flags (optional)
+        * @param Title $title (optional) If known you can pass the Title in here.
+        *  Passing no Title may result in another DB query if there are recent writes.
         * @return Revision|null
         */
-       public static function newFromId( $id, $flags = 0 ) {
-               $rec = self::getRevisionStore()->getRevisionById( $id, $flags );
-               return $rec === null ? null : new Revision( $rec, $flags );
+       public static function newFromId( $id, $flags = 0, Title $title = null ) {
+               /**
+                * MCR RevisionStore Compat
+                *
+                * If the title is not passed in as a param (already known) then select it here.
+                *
+                * Do the selection with MASTER if $flags includes READ_LATEST or recent changes
+                * have happened on our load balancer.
+                *
+                * If we select the title here and pass it down it will results in fewer queries
+                * further down the stack.
+                */
+               if ( !$title ) {
+                       if (
+                               $flags & self::READ_LATEST ||
+                               wfGetLB()->hasOrMadeRecentMasterChanges()
+                       ) {
+                               $dbr = wfGetDB( DB_MASTER );
+                       } else {
+                               $dbr = wfGetDB( DB_REPLICA );
+                       }
+                       $row = $dbr->selectRow(
+                               [ 'revision', 'page' ],
+                               [
+                                       'page_namespace',
+                                       'page_title',
+                                       'page_id',
+                                       'page_latest',
+                                       'page_is_redirect',
+                                       'page_len',
+                               ],
+                               [ 'rev_id' => $id ],
+                               __METHOD__,
+                               [],
+                               [ 'page' => [ 'JOIN', 'page_id=rev_page' ] ]
+                       );
+                       if ( $row ) {
+                               $title = Title::newFromRow( $row );
+                       }
+                       wfGetLB()->reuseConnection( $dbr );
+               }
+
+               $rec = self::getRevisionStore()->getRevisionById( $id, $flags, $title );
+               return $rec === null ? null : new Revision( $rec, $flags, $title );
        }
 
        /**
@@ -141,13 +188,25 @@ class Revision implements IDBAccessObject {
         *
         * @param object $row
         * @param array $overrides
+        * @param Title $title (optional)
         *
         * @throws MWException
         * @return Revision
         */
-       public static function newFromArchiveRow( $row, $overrides = [] ) {
-               $rec = self::getRevisionStore()->newRevisionFromArchiveRow( $row, 0, null, $overrides );
-               return new Revision( $rec );
+       public static function newFromArchiveRow( $row, $overrides = [], Title $title = null ) {
+               /**
+                * MCR Migration: https://phabricator.wikimedia.org/T183564
+                * This method used to overwrite attributes, then passed to Revision::__construct
+                * RevisionStore::newRevisionFromArchiveRow instead overrides row field names
+                * So do a conversion here.
+                */
+               if ( array_key_exists( 'page', $overrides ) ) {
+                       $overrides['page_id'] = $overrides['page'];
+                       unset( $overrides['page'] );
+               }
+
+               $rec = self::getRevisionStore()->newRevisionFromArchiveRow( $row, 0, $title, $overrides );
+               return new Revision( $rec, self::READ_NORMAL, $title );
        }
 
        /**
@@ -879,8 +938,10 @@ class Revision implements IDBAccessObject {
         * @return Revision|null
         */
        public function getPrevious() {
-               $rec = self::getRevisionStore()->getPreviousRevision( $this->mRecord );
-               return $rec === null ? null : new Revision( $rec );
+               $rec = self::getRevisionStore()->getPreviousRevision( $this->mRecord, $this->getTitle() );
+               return $rec === null
+                       ? null
+                       : new Revision( $rec, self::READ_NORMAL, $this->getTitle() );
        }
 
        /**
@@ -889,8 +950,10 @@ class Revision implements IDBAccessObject {
         * @return Revision|null
         */
        public function getNext() {
-               $rec = self::getRevisionStore()->getNextRevision( $this->mRecord );
-               return $rec === null ? null : new Revision( $rec );
+               $rec = self::getRevisionStore()->getNextRevision( $this->mRecord, $this->getTitle() );
+               return $rec === null
+                       ? null
+                       : new Revision( $rec, self::READ_NORMAL, $this->getTitle() );
        }
 
        /**
@@ -925,7 +988,7 @@ class Revision implements IDBAccessObject {
 
                $cacheKey = isset( $row->old_id ) ? ( 'tt:' . $row->old_id ) : null;
 
-               return self::getBlobStore()->expandBlob( $text, $flags, $cacheKey );
+               return self::getBlobStore( $wiki )->expandBlob( $text, $flags, $cacheKey );
        }
 
        /**
@@ -979,8 +1042,10 @@ class Revision implements IDBAccessObject {
 
                $this->mRecord = $rec;
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $revision = $this;
                // TODO: hard-deprecate in 1.32 (or even 1.31?)
-               Hooks::run( 'RevisionInsertComplete', [ $this, null, null ] );
+               Hooks::run( 'RevisionInsertComplete', [ &$revision, null, null ] );
 
                return $rec->getId();
        }
index 575970d..0d266fb 100644 (file)
@@ -42,6 +42,7 @@ use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Shell\CommandFactory;
+use MediaWiki\Storage\BlobStoreFactory;
 use MediaWiki\Storage\RevisionStore;
 use MediaWiki\Storage\SqlBlobStore;
 
@@ -450,46 +451,6 @@ return [
                return $factory;
        },
 
-       'RevisionStore' => function ( MediaWikiServices $services ) {
-               /** @var SqlBlobStore $blobStore */
-               $blobStore = $services->getService( '_SqlBlobStore' );
-
-               $store = new RevisionStore(
-                       $services->getDBLoadBalancer(),
-                       $blobStore,
-                       $services->getMainWANObjectCache()
-               );
-
-               $config = $services->getMainConfig();
-               $store->setContentHandlerUseDB( $config->get( 'ContentHandlerUseDB' ) );
-
-               return $store;
-       },
-
-       'BlobStore' => function ( MediaWikiServices $services ) {
-               return $services->getService( '_SqlBlobStore' );
-       },
-
-       '_SqlBlobStore' => function ( MediaWikiServices $services ) {
-               global $wgContLang; // TODO: manage $wgContLang as a service
-
-               $store = new SqlBlobStore(
-                       $services->getDBLoadBalancer(),
-                       $services->getMainWANObjectCache()
-               );
-
-               $config = $services->getMainConfig();
-               $store->setCompressRevisions( $config->get( 'CompressRevisions' ) );
-               $store->setCacheExpiry( $config->get( 'RevisionCacheExpiry' ) );
-               $store->setUseExternalStore( $config->get( 'DefaultExternalStore' ) !== false );
-
-               if ( $config->get( 'LegacyEncoding' ) ) {
-                       $store->setLegacyEncoding( $config->get( 'LegacyEncoding' ), $wgContLang );
-               }
-
-               return $store;
-       },
-
        'ExternalStoreFactory' => function ( MediaWikiServices $services ) {
                $config = $services->getMainConfig();
 
@@ -514,28 +475,22 @@ return [
                return $store;
        },
 
+       'BlobStoreFactory' => function ( MediaWikiServices $services ) {
+               global $wgContLang;
+               return new BlobStoreFactory(
+                       $services->getDBLoadBalancer(),
+                       $services->getMainWANObjectCache(),
+                       $services->getMainConfig(),
+                       $wgContLang
+               );
+       },
+
        'BlobStore' => function ( MediaWikiServices $services ) {
                return $services->getService( '_SqlBlobStore' );
        },
 
        '_SqlBlobStore' => function ( MediaWikiServices $services ) {
-               global $wgContLang; // TODO: manage $wgContLang as a service
-
-               $store = new SqlBlobStore(
-                       $services->getDBLoadBalancer(),
-                       $services->getMainWANObjectCache()
-               );
-
-               $config = $services->getMainConfig();
-               $store->setCompressBlobs( $config->get( 'CompressRevisions' ) );
-               $store->setCacheExpiry( $config->get( 'RevisionCacheExpiry' ) );
-               $store->setUseExternalStore( $config->get( 'DefaultExternalStore' ) !== false );
-
-               if ( $config->get( 'LegacyEncoding' ) ) {
-                       $store->setLegacyEncoding( $config->get( 'LegacyEncoding' ), $wgContLang );
-               }
-
-               return $store;
+               return $services->getBlobStoreFactory()->newSqlBlobStore();
        },
 
        ///////////////////////////////////////////////////////////////////////////
diff --git a/includes/Storage/BlobStoreFactory.php b/includes/Storage/BlobStoreFactory.php
new file mode 100644 (file)
index 0000000..63ca74d
--- /dev/null
@@ -0,0 +1,105 @@
+<?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
+ */
+
+namespace MediaWiki\Storage;
+
+use Config;
+use Language;
+use WANObjectCache;
+use Wikimedia\Rdbms\LoadBalancer;
+
+/**
+ * Service for instantiating BlobStores
+ *
+ * This can be used to create BlobStore objects for other wikis.
+ *
+ * @since 1.31
+ */
+class BlobStoreFactory {
+
+       /**
+        * @var LoadBalancer
+        */
+       private $loadBalancer;
+
+       /**
+        * @var WANObjectCache
+        */
+       private $cache;
+
+       /**
+        * @var Config
+        */
+       private $config;
+
+       /**
+        * @var Language
+        */
+       private $contLang;
+
+       public function __construct(
+               LoadBalancer $loadBalancer,
+               WANObjectCache $cache,
+               Config $mainConfig,
+               Language $contLang
+       ) {
+               $this->loadBalancer = $loadBalancer;
+               $this->cache = $cache;
+               $this->config = $mainConfig;
+               $this->contLang = $contLang;
+       }
+
+       /**
+        * @since 1.31
+        *
+        * @param bool|string $wikiId The ID of the target wiki database. Use false for the local wiki.
+        *
+        * @return BlobStore
+        */
+       public function newBlobStore( $wikiId = false ) {
+               return $this->newSqlBlobStore( $wikiId );
+       }
+
+       /**
+        * @internal Please call newBlobStore and use the BlobStore interface.
+        *
+        * @param bool|string $wikiId The ID of the target wiki database. Use false for the local wiki.
+        *
+        * @return SqlBlobStore
+        */
+       public function newSqlBlobStore( $wikiId = false ) {
+               $store = new SqlBlobStore(
+                       $this->loadBalancer,
+                       $this->cache,
+                       $wikiId
+               );
+
+               $store->setCompressBlobs( $this->config->get( 'CompressRevisions' ) );
+               $store->setCacheExpiry( $this->config->get( 'RevisionCacheExpiry' ) );
+               $store->setUseExternalStore( $this->config->get( 'DefaultExternalStore' ) !== false );
+
+               if ( $this->config->get( 'LegacyEncoding' ) ) {
+                       $store->setLegacyEncoding( $this->config->get( 'LegacyEncoding' ), $this->contLang );
+               }
+
+               return $store;
+       }
+
+}
index b8debb8..44dab13 100644 (file)
@@ -848,10 +848,11 @@ class RevisionStore implements IDBAccessObject, RevisionFactory, RevisionLookup
         *
         * @param int $id
         * @param int $flags (optional)
+        * @param Title $title (optional)
         * @return RevisionRecord|null
         */
-       public function getRevisionById( $id, $flags = 0 ) {
-               return $this->newRevisionFromConds( [ 'rev_id' => intval( $id ) ], $flags );
+       public function getRevisionById( $id, $flags = 0, Title $title = null ) {
+               return $this->newRevisionFromConds( [ 'rev_id' => intval( $id ) ], $flags, $title );
        }
 
        /**
@@ -1678,11 +1679,14 @@ class RevisionStore implements IDBAccessObject, RevisionFactory, RevisionLookup
         * MCR migration note: this replaces Revision::getPrevious
         *
         * @param RevisionRecord $rev
+        * @param Title $title if known (optional)
         *
         * @return RevisionRecord|null
         */
-       public function getPreviousRevision( RevisionRecord $rev ) {
-               $title = $this->getTitle( $rev->getPageId(), $rev->getId() );
+       public function getPreviousRevision( RevisionRecord $rev, Title $title = null ) {
+               if ( $title === null ) {
+                       $title = $this->getTitle( $rev->getPageId(), $rev->getId() );
+               }
                $prev = $title->getPreviousRevisionID( $rev->getId() );
                if ( $prev ) {
                        return $this->getRevisionByTitle( $title, $prev );
@@ -1696,10 +1700,14 @@ class RevisionStore implements IDBAccessObject, RevisionFactory, RevisionLookup
         * MCR migration note: this replaces Revision::getNext
         *
         * @param RevisionRecord $rev
+        * @param Title $title if known (optional)
         *
         * @return RevisionRecord|null
         */
-       public function getNextRevision( RevisionRecord $rev ) {
+       public function getNextRevision( RevisionRecord $rev, Title $title = null ) {
+               if ( $title === null ) {
+                       $title = $this->getTitle( $rev->getPageId(), $rev->getId() );
+               }
                $title = $this->getTitle( $rev->getPageId(), $rev->getId() );
                $next = $title->getNextRevisionID( $rev->getId() );
                if ( $next ) {
index 50ae8d5..341855d 100644 (file)
@@ -97,7 +97,8 @@ class RevisionStoreRecord extends RevisionRecord {
                        && $this->mPageId !== $this->mTitle->getArticleID()
                ) {
                        throw new InvalidArgumentException(
-                               'The given Title does not belong to page ID ' . $this->mPageId
+                               'The given Title does not belong to page ID ' . $this->mPageId .
+                               ' but actually belongs to ' . $this->mTitle->getArticleID()
                        );
                }
        }
index 0714633..69e1539 100644 (file)
@@ -228,7 +228,7 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
                                // used. We'll need to assess expected fallout before doing that.
                        }
 
-                       $dbw = $this->getDBConnection( DB_REPLICA );
+                       $dbw = $this->getDBConnection( DB_MASTER );
 
                        $old_id = $dbw->nextSequenceValue( 'text_old_id_seq' );
                        $dbw->insert(
@@ -382,7 +382,7 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
                                return false;
                        }
 
-                       if ( $cacheKey ) {
+                       if ( $cacheKey && $this->wikiId === false ) {
                                // Make use of the wiki-local revision text cache.
                                // The cached value should be decompressed, so handle that and return here.
                                // NOTE: we rely on $this->cache being the right cache for $this->wikiId!
index 4d37af3..366a6df 100644 (file)
@@ -67,12 +67,12 @@ class ApiBlock extends ApiBase {
                                $params['user'] = $username;
                        }
                } else {
-                       $target = User::newFromName( $params['user'] );
+                       list( $target, $type ) = SpecialBlock::getTargetAndType( $params['user'] );
 
                        // T40633 - if the target is a user (not an IP address), but it
                        // doesn't exist or is unusable, error.
-                       if ( $target instanceof User &&
-                               ( $target->isAnon() /* doesn't exist */ || !User::isUsableName( $target->getName() ) )
+                       if ( $type === Block::TYPE_USER &&
+                               ( $target->isAnon() /* doesn't exist */ || !User::isUsableName( $params['user'] ) )
                        ) {
                                $this->dieWithError( [ 'nosuchusershort', $params['user'] ], 'nosuchuser' );
                        }
index edea266..84ea266 100644 (file)
@@ -71,7 +71,7 @@ class ApiEmailUser extends ApiBase {
                }
 
                $result = array_filter( [
-                       'result' => $retval->isGood() ? 'Success' : ( $retval->isOk() ? 'Warnings' : 'Failure' ),
+                       'result' => $retval->isGood() ? 'Success' : ( $retval->isOK() ? 'Warnings' : 'Failure' ),
                        'warnings' => $this->getErrorFormatter()->arrayFromStatus( $retval, 'warning' ),
                        'errors' => $this->getErrorFormatter()->arrayFromStatus( $retval, 'error' ),
                ] );
index 9304c2b..c9f6db3 100644 (file)
@@ -39,7 +39,7 @@ class ApiTag extends ApiBase {
                // Check if user can add tags
                if ( $params['tags'] ) {
                        $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
-                       if ( !$ableToTag->isOk() ) {
+                       if ( !$ableToTag->isOK() ) {
                                $this->dieStatus( $ableToTag );
                        }
                }
index 6d7fea2..44be546 100644 (file)
@@ -9,7 +9,8 @@
                        "Maroen1990",
                        "محمد أحمد عبد الفتاح",
                        "ديفيد",
-                       "ASHmed"
+                       "ASHmed",
+                       "Yasser Yousssef"
                ]
        },
        "apihelp-main-param-action": "أي فعل للعمل.",
@@ -30,7 +31,9 @@
        "apihelp-block-param-noemail": "منع المستخدم من إرسال البريد الإلكتروني من خلال الويكي. (يتطلب صلاحية <code>blockemail</code>).",
        "apihelp-block-param-hidename": "إخفاء اسم المستخدم من سجل المنع. (يتطلب صلاحية <code>hideuser</code>).",
        "apihelp-block-param-allowusertalk": "تسمح للمستخدم بتحرير صفحة النقاش الخاصة (يعتمد على <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-reblock": "إذا كان المستخدم محظوراً بالفعل، يستبدل الحظر القائم.",
        "apihelp-block-param-watchuser": "مشاهدة صفحة المستخدم ونقاش IP.",
+       "apihelp-block-param-tags": "تغيير الوسوم للتطبيق على الإدخال في سجل الحظر.",
        "apihelp-block-example-ip-simple": "منع عنوان IP <kbd>192.0.2.5</kbd> لمدة ثلاثة أيام بسبب >المخالفة الأولى</kbd>.",
        "apihelp-block-example-user-complex": "منع المستخدم <kbd>المخرب</kbd> لأجل غير مسمى بسبب <kbd>التخريب</kbd>، ومنع إنشاء حساب جديد وإرسال بريد إلكتروني.",
        "apihelp-changeauthenticationdata-summary": "تغيير بيانات المصادقة للمستخدم الحالي.",
index fb36923..6b01875 100644 (file)
@@ -12,7 +12,8 @@
                        "Macofe",
                        "Hamilton Abreu",
                        "Umherirrender",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Athena in Wonderland"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentación]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionando, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Erros e avisos]].\n\n<strong>Test:</strong> Para facilitar as probas das peticións da API, consulte [[Special:ApiSandbox]].",
        "api-help-param-upload": "Debe ser enviado como un ficheiro importado usando multipart/form-data.",
        "api-help-param-multi-separate": "Separe os valores con <kbd>|</kbd> ou [[Special:ApiHelp/main#main/datatypes|outros]].",
        "api-help-param-multi-max": "O número máximo de valores é {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para os bots).",
-       "api-help-param-multi-max-simple": "O número máximo de valores é {{PLURAL:1$|1$}}.",
+       "api-help-param-multi-max-simple": "O número máximo de valores é {{PLURAL:$1|$1}}.",
        "api-help-param-multi-all": "Para especificar tódolos valores use <kbd>$1</kbd>.",
        "api-help-param-default": "Por defecto: $1",
        "api-help-param-default-empty": "Por defecto: <span class=\"apihelp-empty\">(baleiro)</span>",
index 2a3bb6b..dc9fb11 100644 (file)
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Hent filas MIME-type og medietype.",
        "apihelp-query+mystashedfiles-param-limit": "Hvor mange filer som skal hentes.",
        "apihelp-query+alltransclusions-param-prop": "Hvilken informasjon som skal inkluderes:",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "Legger til tittelen på transklusjonen.",
        "apihelp-query+allusers-param-prop": "Hvilken informasjon som skal inkluderes:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Legger til informasjon om en gjeldende blokkering av brukeren.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "Lister opp grupper brukeren er i. Dette bruker flere tjenerressurser og kan returnere færre resultater enn grensa.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Lister opp alle grupper brukeren automatisk er med i.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Lister opp rettigheter brukeren har.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Legger til redigeringstelleren til brukeren.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "Legger til tidsstempelet for når brukeren ble registrert, om tilgjengelig (kan være blank).",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "Legger til sentrale ID-er og tilkoblingsstatus for brukeren.",
+       "apihelp-query+allusers-param-limit": "Hvor mange brukernavn som skal returneres.",
+       "apihelp-query+allusers-param-witheditsonly": "List bare opp brukere som har gjort redigeringer.",
+       "apihelp-query+allusers-param-activeusers": "List bare opp brukere som har vært aktiv {{PLURAL:$1|den siste dagene|de siste $1 dagene}}.",
+       "apihelp-query+allusers-param-attachedwiki": "Med <kbd>$1prop</kbd>, indiker også hvorvidt brukeren er tilkoblet med wikien som identifiseres av denne ID-en.",
+       "apihelp-query+allusers-example-Y": "List opp brukere fra og med <kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-summary": "Hent informasjon om den gjeldende autentiseringsstatusen.",
+       "apihelp-query+backlinks-summary": "Finn alle sider som lenker til den gitte siden.",
+       "apihelp-query+backlinks-param-title": "Tittel det skal søkes etter. Kan ikke brukes sammen med <var>$1pageid</var>.",
+       "apihelp-query+backlinks-param-pageid": "Side-ID det skal søkes etter. Kan ikke brukes sammen med <var>$1title</var>.",
+       "apihelp-query+backlinks-param-dir": "Retningen det skal listes opp i.",
        "apihelp-query+categorymembers-param-prop": "Hvilken informasjon som skal inkluderes:",
+       "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modus|Moduser}}: $2",
        "apihelp-query+exturlusage-param-prop": "Hvilken informasjon som skal inkluderes:",
+       "apihelp-query+iwbacklinks-param-limit": "Hvor mange sider som skal returneres totalt.",
+       "apihelp-query+iwbacklinks-param-prop": "Hvilke egenskaper som skal hentes:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Legger til prefikset til interwikien.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Legger til tittelen til interwikien.",
+       "apihelp-query+iwbacklinks-param-dir": "Retningen det skal listes opp i.",
+       "apihelp-query+iwbacklinks-example-simple": "Hent sider som lenker til [[wikibooks:Test]].",
+       "apihelp-query+iwbacklinks-example-generator": "Hent informasjon om sider som lenker til [[wikibooks:Test]].",
+       "apihelp-query+iwlinks-summary": "Returnerer alle interwikilenker fra de gitte sidene.",
+       "apihelp-query+iwlinks-param-url": "Hvorvidt den fulle URL-en skal hentes (kan ikke brukes med $1prop).",
+       "apihelp-query+iwlinks-param-prop": "Hvilke ekstra egenskaper som skal hentes for hver språklenke:",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Legger til den fulle URL-en.",
+       "apihelp-query+iwlinks-param-limit": "Hvor mange interikilenker som skal returneres.",
+       "apihelp-query+iwlinks-param-prefix": "Returner bare interwikilenker med dette prefikset.",
+       "apihelp-query+iwlinks-param-title": "Interwikilenker det skal søkes etter. Må brukes med <var>$1prefix</var>.",
+       "apihelp-query+iwlinks-param-dir": "Retningen det skal listes opp i.",
+       "apihelp-query+iwlinks-example-simple": "Hent interwikilenker fra sida <kbd>Main Page</kbd>.",
+       "apihelp-query+langbacklinks-summary": "Finn alle sider som lenker til den gitte språklenka.",
+       "apihelp-query+langbacklinks-param-lang": "Språket for språklenka.",
+       "apihelp-query+langbacklinks-param-title": "Språklenke det skal søkes etter. Må brukes med $1lang.",
+       "apihelp-query+langbacklinks-param-limit": "Hvor mange sider som skal returneres totalt.",
+       "apihelp-query+langbacklinks-param-prop": "Hvilke egenskaper som skal hentes:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Legger til språkkoden til språklenka.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Legger til tittelen til språklenka.",
+       "apihelp-query+langbacklinks-param-dir": "Retningen det skal listes opp i.",
+       "apihelp-query+langbacklinks-example-simple": "Hent sider som lenker til [[:fr:Test]].",
+       "apihelp-query+langbacklinks-example-generator": "Hent informasjon om sider som lenker til [[:fr:Test]].",
+       "apihelp-query+langlinks-summary": "Returnerer alle språklenker fra de gitte sidene.",
+       "apihelp-query+langlinks-param-limit": "Hvor mange språklenker som skal returneres.",
+       "apihelp-query+langlinks-param-url": "Hvorvidt den fulle URL-en skal hentes (kan ikke brukes med <var>$1prop</var>).",
+       "apihelp-query+langlinks-param-prop": "Hvilke ekstra egenskaper som skal hentes for hver språklenke:",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Legger til den fulle URL-en.",
+       "apihelp-query+langlinks-param-lang": "Returner bare språklenker med denne språkkoden.",
+       "apihelp-query+langlinks-param-title": "Lenke det skal søkes etter. Må brukes med <var>$1lang</var>.",
+       "apihelp-query+langlinks-param-dir": "Retningen det skal listes opp i.",
+       "apihelp-query+langlinks-param-inlanguagecode": "Språkkode for oversatte språknavn.",
+       "apihelp-query+langlinks-example-simple": "Hent språklenker fra siden <kbd>Main Page</kbd>.",
+       "apihelp-query+links-summary": "Returnerer alle lenker fra de gitte sidene.",
+       "apihelp-query+links-param-namespace": "Viser lenker kun i disse navnerommene.",
+       "apihelp-query+links-param-limit": "Hvor mange lenker som skal returneres.",
+       "apihelp-query+links-param-titles": "List bare opp lenker til disse titlene. Nyttig for å sjekke om en viss side lenker til en annen viss side.",
+       "apihelp-query+links-param-dir": "Retningen det skal listes opp i.",
+       "apihelp-query+links-example-simple": "Hent lenker fra sida <kbd>Main Page</kbd>",
+       "apihelp-query+links-example-generator": "Hent informasjon om lenkesidene på sida <kbd>Main Page</kbd>.",
+       "apihelp-query+links-example-namespaces": "Hent lenker fra sida <kbd>Main Page</kbd> i navnerommene {{ns:user}} og {{ns:template}}.",
+       "apihelp-query+linkshere-summary": "Finn alle sider som lenker til de gitte sidene.",
+       "apihelp-query+linkshere-param-prop": "Hvilke egenskaper som skal hentes:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "Side-ID for hver side.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Tittelen til hver side.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Marker om siden er omdirigering.",
+       "apihelp-query+linkshere-param-namespace": "Inkluder bare sider i disse navnerommene.",
+       "apihelp-query+linkshere-param-limit": "Hvor mange som skal returneres.",
+       "apihelp-query+linkshere-param-show": "Vis bare elementer som møter disse kriteriene:\n;redirect:Vis bare omdirigeringer.\n;!redirect:Vis bare ikke-omdirigeringer.",
+       "apihelp-query+linkshere-example-simple": "Hent ei liste over sider som lenker til [[Main Page]].",
+       "apihelp-query+linkshere-example-generator": "Hent informasjon om sider som lenker til [[Main Page]].",
+       "apihelp-query+logevents-summary": "Hent oppføringer fra logger.",
+       "apihelp-query+logevents-param-prop": "Hvilke egenskaper som skal hentes:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "Legger til ID-en til loggoppføringen.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Legger til tittelen på siden i loggoppføringen.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Legger til typen loggoppføring.",
+       "apihelp-query+logevents-paramvalue-prop-user": "Legger til brukeren som er ansvarlig for loggoppføringen.",
+       "apihelp-query+logevents-paramvalue-prop-userid": "Legger til bruker-ID-en som var ansvarlig for loggoppføringen.",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "Legger til tidsstempelet for loggoppføringen.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Legger til kommentaren til loggoppføringen.",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Legger til den parsede kommentaren til loggoppføringen.",
+       "apihelp-query+logevents-paramvalue-prop-details": "Lister opp ekstra detaljer om loggoppføringen.",
+       "apihelp-query+logevents-param-type": "Filtrer loggoppføringer til kun denne typen.",
+       "apihelp-query+logevents-param-action": "Filtrer logghandlinger til kun denne handlingen. Overstyrer <var>$1type</var>. I listen over mulige verdier kan verdier med jokertegnet stjerne, som <kbd>action/*</kbd> ha forskjellige strenger etter skråstreken.",
+       "apihelp-query+logevents-param-user": "Filtrer oppføringer til de som er gjort av den gitte brukeren.",
+       "apihelp-query+logevents-param-title": "Filtrer oppføringer til de som er relatert til ei side.",
+       "apihelp-query+logevents-param-namespace": "Filtrer oppføringer til de i det gitte navnerommet.",
+       "apihelp-query+logevents-param-prefix": "Filtrer oppføringer som starter med dette prefikset.",
+       "apihelp-query+logevents-param-tag": "List bare opp oppføringer som er tagget med denne taggen.",
+       "apihelp-query+logevents-param-limit": "Hvor mange oppføringer som skal returneres.",
+       "apihelp-query+logevents-example-simple": "List opp nylige loggoppføringer.",
+       "apihelp-query+pagepropnames-summary": "List opp alle sideegenskapsnavn i bruk på wikien.",
+       "apihelp-query+pagepropnames-param-limit": "Maksimalt antall navn som skal returneres.",
+       "apihelp-query+pagepropnames-example-simple": "Hent de 10 første egenskapsnavnene.",
+       "apihelp-query+pageprops-summary": "Hent diverse sideegenskaper definert i sideinnholdet.",
+       "apihelp-query+pageprops-param-prop": "List kun opp disse sideegenskapene (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> returnerer sideegenskapsnavn i bruk). Nyttig for å sjekke om sider bruker en viss sideegenskap.",
+       "apihelp-query+pageprops-example-simple": "Hent egenskaper for sidene <kbd>Main Page</kbd> og <kbd>MediaWiki</kbd>.",
+       "apihelp-query+pageswithprop-summary": "Lister opp alle sider med en gitt sideegenskap.",
        "apihelp-query+pageswithprop-param-prop": "Hvilken informasjon som skal inkluderes:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Legger til side-ID-en.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Legger til tittel- og navneroms-ID-en til sida.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Legger til verdien til sideegenskapen.",
+       "apihelp-query+pageswithprop-param-limit": "Maksimalt antall sider som skal returneres.",
+       "apihelp-query+pageswithprop-param-dir": "Hvilken retning det skal sorteres i.",
+       "apihelp-query+pageswithprop-example-simple": "List opp de første 10 sidene som bruker <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "Hent ekstra informasjon om de 10 første sidene som bruker <code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+prefixsearch-summary": "Utfør et prefikssøk for sidetitler.",
+       "apihelp-query+prefixsearch-param-search": "Søkestreng.",
+       "apihelp-query+prefixsearch-param-namespace": "Navnerom det skal søkes i.",
+       "apihelp-query+prefixsearch-param-limit": "Maksimalt antall resultater som skal returneres.",
+       "apihelp-query+prefixsearch-param-offset": "Antall resultater som skal hoppes over.",
+       "apihelp-query+prefixsearch-example-simple": "Søk etter sidetitler som begynner med <kbd>meaning</kbd>.",
+       "apihelp-query+prefixsearch-param-profile": "Søkeprofil som skal brukes.",
+       "apihelp-query+protectedtitles-summary": "List opp alle titler som er beskyttet fra opprettelse.",
+       "apihelp-query+protectedtitles-param-namespace": "List kun opp titler i disse navnerommene.",
+       "apihelp-query+protectedtitles-param-level": "List kun opp titler med disse beskyttelsesnivåene.",
+       "apihelp-query+protectedtitles-param-limit": "Hvor mange sider som skal returneres totalt.",
+       "apihelp-query+protectedtitles-param-prop": "Hvilke egenskaper som skal hentes:",
+       "apihelp-query+querypage-param-limit": "Antall resultater som skal returneres.",
+       "apihelp-query+querypage-example-ancientpages": "Returner resultater fra [[Special:Ancientpages]].",
+       "apihelp-query+random-summary": "Hent et sett av tilfeldige sider.",
        "apihelp-query+userinfo-param-prop": "Hvilken informasjon som skal inkluderes:",
        "apihelp-query+users-param-prop": "Hvilken informasjon som skal inkluderes:",
+       "apihelp-query+watchlist-param-type": "Hvilke typer endringer som skal vises:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Vanlige sideredigeringer.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Eksterne endringer.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Sideopprettelser",
+       "apihelp-query+watchlist-paramvalue-type-log": "Loggoppføringer.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Endringer i kategorimedlemskap.",
+       "apihelp-query+watchlist-param-owner": "Brukes sammen med $1token for å få tilgang til en annen brukers overvåkningsliste.",
+       "apihelp-query+watchlist-param-token": "En sikkerhetsnøkkel (tilgjengelig i brukerens [[Special:Preferences#mw-prefsection-watchlist|innstillinger]]) for å tillate tilgang til en annen brukers overvåkningsliste.",
+       "apihelp-query+watchlistraw-param-namespace": "List kun opp sider i de gitte navnerommene.",
+       "apihelp-query+watchlistraw-param-limit": "Hvor mange resultater som skal returneres totalt per forespørsel.",
+       "apihelp-query+watchlistraw-param-prop": "Hvilke ekstra egenskaper som skal hentes:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "Legger til tidsstempel for når brukeren sist ble varslet om redigeringen.",
+       "apihelp-query+watchlistraw-param-show": "List kun opp elementer som tilfredsstiller disse kriteriene.",
+       "apihelp-query+watchlistraw-param-owner": "Brukes sammen med $1token for å få tilgang til en annen brukers overvåkningsliste.",
+       "apihelp-query+watchlistraw-param-token": "En sikkerhetsnøkkel (tilgjengelig i brukerens [[Special:Preferences#mw-prefsection-watchlist|innstillinger]]) for å tillate tilgang til en annen brukers overvåkningsliste.",
+       "apihelp-query+watchlistraw-param-dir": "Retningen det skal listes opp i.",
+       "apihelp-query+watchlistraw-example-simple": "List opp sider på den gjeldende brukerens overvåkningsliste.",
+       "apihelp-query+watchlistraw-example-generator": "Hent sideinfo for sider på den gjeldende brukerens overvåkningsliste.",
+       "apihelp-removeauthenticationdata-summary": "Fjern autentiseringsdata for den gjeldende brukeren.",
+       "apihelp-removeauthenticationdata-example-simple": "Forsøk å fjerne den gjeldende brukerens data for <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-summary": "Send en epost for nullstilling av passord til en bruker.",
+       "apihelp-revisiondelete-summary": "Slett og gjenopprett revisjoner.",
+       "apihelp-revisiondelete-param-type": "Type revisjonssletting som utføres.",
+       "apihelp-revisiondelete-param-target": "Sidetittelen for revisjonssletting, om det kreves for typen.",
+       "apihelp-revisiondelete-param-ids": "Identifikatorer for revisjonene som skal slettes.",
+       "apihelp-revisiondelete-param-hide": "Hva som skal skjules for hver revisjon.",
+       "apihelp-revisiondelete-param-show": "Hva som skal vises for hver revisjon.",
+       "apihelp-revisiondelete-param-suppress": "Hvorvidt data skal skjules for administratorer i tillegg til andre.",
+       "apihelp-revisiondelete-param-reason": "Årsak for slettingen eller gjenopprettingen.",
+       "apihelp-revisiondelete-param-tags": "Tagger som skal brukes på oppføringen i sletteloggen.",
+       "apihelp-revisiondelete-example-revision": "Skjul innhold for revisjon <kbd>12345</kbd> på siden <kbd>Main Page</kbd>.",
+       "apihelp-revisiondelete-example-log": "Skjul alle data om loggoppføringen <kbd>67890</kbd> med årsak <kbd>BLP violation</kbd>.",
+       "apihelp-rollback-summary": "Omgjør den siste redigeringen på siden.",
+       "apihelp-rollback-extended-description": "Om den siste brukeren som redigerte siden gjorde flere redigeringer på rad, vil alle disse redigeringene fjernes.",
+       "apihelp-rollback-param-title": "Tittelen på siden som skal tilbakestilles. Kan ikke brukes sammen med <var>$1pageid</var>.",
+       "apihelp-rollback-param-pageid": "Side-ID for siden som skal tilbakestilles. Kan ikke brukes sammen med <var>$1title</var>.",
+       "apihelp-rollback-param-tags": "Tagger som skal påføres tilbakestillingen.",
+       "apihelp-rollback-param-user": "Navnet til brukeren hvis redigeringer skal tilbakestilles.",
+       "apihelp-rollback-param-summary": "Egendefinert redigeringssammendrag. Om denne er tom vil standardsammendraget brukes.",
+       "apihelp-rollback-param-markbot": "Merk de tilbakestilte redigeringene og tilbakestillingen som botredigeringer.",
+       "apihelp-rollback-example-simple": "Tilbakestill de siste redigeringene på siden <kbd>Main Page</kbd> av brukeren <kbd>Example</kbd>.",
+       "apihelp-rollback-example-summary": "Tilbakestill de siste redigeringene på siden <kbd>Main Page</kbd> av IP-adressen <kbd>192.0.2.5</kbd> med sammendraget <kbd>Reverting vandalism</kbd>, og merk disse redigeringene samt tilbakestillingen som botredigeringer.",
+       "apihelp-setnotificationtimestamp-summary": "Oppdater varselstidsstempelet for overvåkede sider.",
+       "apihelp-setpagelanguage-summary": "Endre språket til en side.",
+       "apihelp-setpagelanguage-extended-description-disabled": "Endring av språket til en side tillates ikke på denne wikien.\n\nSlå på <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> for å bruke denne handlingen.",
+       "apihelp-setpagelanguage-param-title": "Tittelen på siden som skal endre språk. Kan ikke brukes sammen med <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "Side-ID til siden du ønsker å endre språk på. Kan ikke brukes sammen med <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "Språkkoden for språket du ønsker å endre siden til. Bruk <kbd>default</kbd> for å tilbakestille siden til wikiens standardspråk.",
+       "apihelp-setpagelanguage-param-reason": "Årsak for endringen.",
+       "apihelp-setpagelanguage-param-tags": "Endringstagger som skal påføres loggoppføringen som oppstår på grunn av denne handlingen.",
+       "apihelp-setpagelanguage-example-language": "Endre språket til <kbd>Main Page</kbd> til baskisk.",
+       "apihelp-setpagelanguage-example-default": "Endre språket til siden med ID 123 til wikiens standardspråk.",
+       "apihelp-stashedit-param-title": "Tittelen på siden som redigeres.",
+       "apihelp-stashedit-param-section": "Seksjonsnummer. <kbd>0</kbd> for toppseksjonen, <kbd>new</kbd> for en ny seksjon.",
+       "apihelp-stashedit-param-sectiontitle": "Tittelen til en ny seksjon.",
+       "apihelp-stashedit-param-text": "Sideinnhold.",
+       "apihelp-stashedit-param-contentmodel": "Innholdsmodellen til det nye innholdet.",
+       "apihelp-stashedit-param-baserevid": "Revisjons-ID-en til grunnrevisjonen.",
+       "apihelp-stashedit-param-summary": "Endringssammendrag.",
+       "apihelp-tag-summary": "Legg til eller fjern endringstagger fra individuelle revisjoner eller loggoppføringer.",
+       "apihelp-tag-param-revid": "Én eller flere revisjons-ID-er taggen skal legges til på eller fjernes fra.",
+       "apihelp-tag-param-logid": "Én eller flere loggoppførings-ID-er taggen skal legges til på eller fjernes fra.",
+       "apihelp-tag-param-add": "Tagger som skal legges til. Kun manuelt definerte tagger kan legges til.",
+       "apihelp-tag-param-remove": "Tagger som skal fjernes. Kun tagger som er enten manuelt definert eller helt udefinerte kan fjernes.",
+       "apihelp-tag-param-reason": "Årsak for endringen.",
+       "apihelp-tag-param-tags": "Tagger som skal påføres loggoppføringen som vil oppstå på grunn av denne handlingen.",
+       "apihelp-tag-example-rev": "Legg til taggen <kbd>vandalism</kbd> til revisjons-ID-en 123 uten å oppgi årsak",
+       "apihelp-tag-example-log": "Fjern taggen <kbd>spam</kbd> fra loggoppførings-ID-en 123 med årsaken <kbd>Wrongly applied</kbd>",
+       "apihelp-tokens-extended-description": "Denne modulen er foreldet til fordel for [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-tokens-example-edit": "Hent en redigeringsnøkkel (standard).",
+       "apihelp-tokens-example-emailmove": "Hent en epostnøkkel og en flyttingsnøkkel.",
+       "apihelp-unblock-summary": "Avblokker en bruker.",
+       "apihelp-userrights-param-user": "Brukernavn.",
+       "apihelp-userrights-param-userid": "Bruker-ID.",
+       "apihelp-userrights-param-remove": "Fjern brukeren fra disse gruppene.",
+       "apihelp-userrights-param-reason": "Årsak for endringen.",
+       "apihelp-userrights-param-tags": "Endringstagger som skal påføres oppføringen i brukerettighetsloggen.",
+       "apihelp-userrights-example-user": "Legg til brukeren <kbd>FooBot</kbd> i gruppa <kbd>bot</kbd>, og fjern den fra gruppene <kbd>sysop</kbd> og <kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-userid": "Legg til brukeren med ID <kbd>123</kbd> til gruppa <kbd>bot</kbd>, og fjern den fra gruppene <kbd>sysop</kbd> og <kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-expiry": "Legg til brukeren <kbd>SometimeSysop</kbd> til gruppa <kbd>sysop</kbd> midlertidig i én måned.",
+       "apihelp-validatepassword-summary": "Valider et passord mot wikiens passordkrav.",
+       "apihelp-validatepassword-param-password": "Passord som skal valideres.",
+       "apihelp-watch-example-watch": "Overvåk siden <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-unwatch": "Avslutt overvåking av siden <kbd>Main Page</kbd>.",
+       "apihelp-format-example-generic": "Returner spørringsresultatet i formatet $1.",
        "apihelp-json-summary": "Resultatdata i JSON-format.",
        "apihelp-none-summary": "Ingen resultat.",
+       "api-help-main-header": "Hovedmodul",
+       "api-help-undocumented-module": "Ingen dokumentasjon for modulen $1.",
+       "api-help-flag-deprecated": "Modulen er foreldet.",
+       "api-help-flag-internal": "<strong>Denne modulen er intern eller ustabel.</strong> Hvordan den fungerer kan forandre seg uten forvarsel.",
        "api-help-flag-readrights": "Denne modulen krever lesetilgang.",
        "api-help-flag-writerights": "Denne modulen krever skrivetilgang.",
        "api-help-flag-mustbeposted": "Denne modulen aksepterer bare POST forespørsler.",
        "api-help-flag-generator": "Denne modulen kan brukes som en generator.",
+       "api-help-source": "Kilde: $1",
+       "api-help-source-unknown": "Kilde: <span class=\"apihelp-unknown\">ukjent</span>",
+       "api-help-license": "Lisens: [[$1|$2]]",
+       "api-help-license-noname": "Lisens: [[$1|Se lenke]]",
+       "api-help-license-unknown": "Lisens: <span class=\"apihelp-unknown\">ukjent</span>",
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parametre}}:",
        "api-help-param-deprecated": "Utgått.",
        "api-help-param-required": "Denne parameteren er påkrevd.",
+       "api-help-datatypes-header": "Datatyper",
+       "api-help-param-type-limit": "Type: heltall eller <kbd>max</kbd>",
+       "api-help-param-type-integer": "Type: {{PLURAL:$1|1=heltall|2=liste over heltall}}",
+       "api-help-param-type-boolean": "Type: boolsk verdi ([[Special:ApiHelp/main#main/datatypes|detaljer]])",
+       "api-help-param-type-timestamp": "Type: {{PLURAL:$1|1=tidsstempel|2=liste over tidsstempler}} ([[Special:ApiHelp/main#main/datatypes|tillatte formater]])",
+       "api-help-param-type-user": "Type: {{PLURAL:$1|1=brukernavn|2=liste over brukernavn}}",
+       "api-help-param-list": "{{PLURAL:$1|1=Én av følgende verdier|2=Verdier (separer med <kbd>{{!}}</kbd> eller [[Special:ApiHelp/main#main/datatypes|alternativ]])}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Må være tom|Kan være tom, eller $2}}",
+       "api-help-param-limit": "Ikke mer enn $1 er tillatt.",
+       "api-help-param-limit2": "Ikke mer enn $1 ($2 for botter) er tillatt.",
+       "api-help-param-integer-min": "{{PLURAL:$1|Verdien|Verdiene}} må ikke være mindre enn $2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|Verdien|Verdiene}} må ikke være større enn $3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|Verdien|Verdiene}} må være mellom $2 og $3.",
+       "api-help-param-multi-separate": "Separer verdier med <kbd>|</kbd> eller [[Special:ApiHelp/main#main/datatypes|alternativ]].",
+       "api-help-param-multi-max": "Maksimalt antall verdier er {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} for botter)",
+       "api-help-param-multi-max-simple": "Maksimalt antall verdier er {{PLURAL:$1|$1}}.",
+       "api-help-param-multi-all": "For å angi alle verdier, bruk <kbd>$1</kbd>.",
+       "api-help-param-default": "Standard: $1",
+       "api-help-param-default-empty": "Standard: <span class=\"apihelp-empty\">(tom)</span>",
+       "api-help-param-continue": "Når flere resultater er tilgjengelige, bruk denne for å fortsette.",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(ingen beskrivelse)</span>",
+       "api-help-param-maxbytes": "Kan ikke være lengre enn $1 {{PLURAL:$1|byte}}.",
+       "api-help-param-maxchars": "Kan ikke være lengre enn $1 {{PLURAL:$1|tegn}}.",
+       "api-help-examples": "{{PLURAL:$1|Eksempel|Eksempler}}:",
+       "api-help-permissions": "{{PLURAL:$1|Tillatelse|Tillatelser}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Gitt til}}: $2",
+       "api-help-open-in-apisandbox": "<small>[åpne i sandkasse]</small>",
+       "apierror-changeauth-norequest": "Kunne ikke opprette endringsforespørsel.",
+       "apierror-contentserializationexception": "Innholdsserialisering feliet: $1",
+       "apierror-contenttoobig": "Innholdet du oppga overskrider artikkelstørrelsesgrensen på $1 {{PLURAL:$1|kilobyte}}.",
+       "apierror-copyuploadbaddomain": "Opplasting via URL tillates ikke fra dette domenet.",
+       "apierror-copyuploadbadurl": "Opplasting tillates ikke fra denne URL-en.",
+       "apierror-create-titleexists": "Eksisterende titler kan ikke beskyttes med <kbd>create</kbd>.",
+       "apierror-csp-report": "Feil under prosessering av CSP-rapport: $1.",
+       "apierror-databaseerror": "[$1] Databasespørringsfeil.",
+       "apierror-deletedrevs-param-not-1-2": "Parameteren <var>$1</var> kan ikke brukes i modus 1 eller 2.",
+       "apierror-deletedrevs-param-not-3": "Parameteren <var>$1</var> kan ikke brukes i modus 3.",
+       "apierror-emptynewsection": "Oppretting av tomme nye seksjoner er ikke mulig.",
+       "apierror-emptypage": "Oppretting av nye, tomme sider tillates ikke.",
+       "apierror-exceptioncaught": "[$1] Unntak fanget: $2",
+       "apierror-filedoesnotexist": "Fila fins ikke.",
+       "apierror-fileexists-sharedrepo-perm": "Målfila fins på et delt fillager. Bruk parameteren <var>ignorewarnings</var> for å overstyre den.",
+       "apierror-filenopath": "Kan ikke hente lokal filsti.",
+       "apierror-filetypecannotberotated": "Filtypen kan ikke roteres.",
+       "apierror-formatphp": "Denne responsen kan ikke representeres med <kbd>format=php</kbd>. Se https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "Tittelen for <kbd>$1</kbd> må være ei fil.",
+       "apierror-import-unknownerror": "Ukjent feil under importering: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> kan ikke være over $2 (satt til $3) for botter eller administratorer.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> kan ikke være over $2 (satt til $3) for brukere.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> kan ikke være mindre enn $2 (satt til $3).",
+       "apierror-invalidcategory": "Kategorinavnet du skrev inn er ikke gyldig.",
+       "apierror-invalidexpiry": "Ugyldig utløpstid «$1».",
+       "apierror-invalid-file-key": "Ikke en gyldig filnøkkel.",
+       "apierror-invalidlang": "Ugyldig språkkode for parameteren <var>$1</var>.",
+       "apierror-invalidoldimage": "Parameteren <var>oldimage</var> har et ugyldig format.",
+       "apierror-invalidparammix-cannotusewith": "Parameteren <kbd>$1</kbd> kan ikke brukes med <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "Parameteren <kbd>$1</kbd> kan ikke brukes med <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> kan ikke kombineres med parameterne <var>oldid</var>, <var>pageid</var> eller <var>page</var>. Bruk <var>title</var> og <var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Parameterne}} $1 kan ikke brukes sammen.",
+       "apierror-invalidsection": "Parameteren <var>section</var> må være en gyldig seksjons-ID eller <kbd>new</kbd>.",
+       "apierror-invalidtitle": "Ugyldig tittel «$1».",
+       "apierror-invalidurlparam": "Ugyldig verdi for <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Ugyldig brukernavn «$1».",
+       "apierror-invaliduserid": "Bruker-ID-en <var>$1</var> er ikke gyldig.",
+       "apierror-maxbytes": "Parameteren <var>$1</var> kan ikke være lengre enn $2 {{PLURAL:$2|byte}}",
+       "apierror-maxchars": "Parameteren <var>$1</var> kan ikke være lengre enn $2 {{PLURAL:$2|tegn}}",
+       "apierror-maxlag-generic": "Venter på en databasetjener: Henger etter med {{PLURAL:$1|ett sekund|$1 sekunder}}.",
+       "apierror-maxlag": "Venter på $2: Henger etter med {{PLURAL:$1|ett sekund|$1 sekunder}}.",
+       "apierror-mimesearchdisabled": "MIME-søk er slått av i Miser-modus.",
+       "apierror-missingcontent-pageid": "Manglende innhold for side-ID $1.",
+       "apierror-missingcontent-revid": "Manglende innhold for revisjons-ID $1.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$1|Parameteren|Minst én av parameterne}} $1 er påkrevd.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|Parameteren|Én av parameterne}} $1 er påkrevd.",
+       "apierror-missingparam": "Parameteren <var>$1</var> må være satt.",
+       "apierror-missingrev-pageid": "Ingen gjeldende revisjon av side-ID $1.",
+       "apierror-missingrev-title": "Ingen gjeldende revisjon av tittelen $1.",
+       "apierror-missingtitle-createonly": "Manglende titler kan bare beskyttes med <kbd>create</kbd>.",
+       "apierror-missingtitle": "Siden du oppga fins ikke.",
+       "apierror-missingtitle-byname": "Siden $1 fins ikke.",
+       "apierror-moduledisabled": "Modulen <kbd>$1</kbd> har blitt slått av.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|Kun|Kun én av} $2 tillates for parameteren <var>$3</var>.",
        "apierror-multival-only-one": "Bare én verdi er tillatt for parameteret <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> kan kun brukes med én enkel side.",
+       "apierror-mustbeloggedin-changeauth": "Du må være logget inn for å endre autentiseringsdata.",
+       "apierror-mustbeloggedin-generic": "Du må være logget inn.",
+       "apierror-mustbeloggedin-linkaccounts": "Du må være logget inn for å lenke kontoer.",
+       "apierror-mustbeloggedin-removeauth": "Du må være logget inn for å fjerne autentiseringsdata.",
        "apierror-mustbeloggedin": "Du må være logget inn for å $1.",
+       "apierror-mustbeposted": "Modulen <kbd>$1</kbd> krever en POST-forespørsel.",
+       "apierror-mustpostparams": "Følgende {{PLURAL:$2|parameter|parametre}} ble funnet i spørringsstrengen, men må være i POST-innholdet: $1.",
+       "apierror-noapiwrite": "Redigering av denne wikien via API er slått av. Sjekk at utsagnet <code>$wgEnableWriteAPI=true;</code> inkluderes i wikiens <code>LocalSettings.php</code>-fil.",
+       "apierror-nochanges": "Ingen endringer ble forespurt.",
+       "apierror-no-direct-editing": "Direkte redigering via API-et støttes ikke for innholdsmodellen $1 som brukes av $2.",
+       "apierror-noedit-anon": "Anonyme brukere kan ikke redigere sider.",
+       "apierror-noedit": "Du har ikke tillatelse til å redigere sider.",
+       "apierror-noimageredirect-anon": "Anonyme brukere kan ikke opprette bildeomdirigeringer.",
+       "apierror-noimageredirect": "Du har ikke tillatelse til å opprette bildeomdirigeringer.",
+       "apierror-nosuchlogid": "Det er ingen loggoppføring med ID $1.",
+       "apierror-nosuchpageid": "Det er ingen side med ID $1.",
+       "apierror-nosuchrcid": "Det er ingen nylig endring med ID $1.",
+       "apierror-nosuchrevid": "Det er ingen revisjon med ID $1.",
+       "apierror-nosuchsection": "Det er ingen seksjon $1.",
+       "apierror-nosuchsection-what": "Det er ingen seksjon $1 i $2.",
+       "apierror-nosuchuserid": "Det er ingen bruker med ID $1.",
+       "apierror-notarget": "Du har ikke angitt et gyldig mål for denne handlingen.",
+       "apierror-notpatrollable": "Revisjonen r$1 kan ikke patruljeres fordi den er for gammel.",
+       "apierror-nouploadmodule": "Ingen opplastingsmodul satt.",
        "apierror-offline": "Kunne ikke fortsette på grunn av tilkoblingsproblemer. Sjekk at internettforbindelsen din virker og prøv igjen.",
+       "apierror-opensearch-json-warnings": "Advarsel kan ikke representeres OpenSearch JSON-format.",
+       "apierror-pagecannotexist": "Navnerommet tillater ikke faktiske sider.",
+       "apierror-pagedeleted": "Siden har blitt slettet siden du hentet tidsstempelet dens.",
+       "apierror-pagelang-disabled": "Endring av sidespråk tillates ikke på denne wikien.",
+       "apierror-paramempty": "Parameteren <var>$1</var> kan ikke være tom.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> støttes kut for wikitekstinnhold.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> støttes  kun for wikitekstinnhold. $1 bruker innholdsmodellen $2.",
+       "apierror-pastexpiry": "Utløpstiden «$1» er i fortiden.",
+       "apierror-permissiondenied": "Du har ikke tillatelse til å $1.",
        "apierror-permissiondenied-generic": "Tilgang nektet.",
+       "apierror-permissiondenied-patrolflag": "Du trenger rettigheten <code>patrol</code> eller <code>patrolmarks</code> for å be om patruljert-flagget.",
+       "apierror-permissiondenied-unblock": "Du har ikke tillatelse til å avblokkere brukere.",
+       "apierror-prefixsearchdisabled": "Prefikssøk er slått av i Miser-modus.",
+       "apierror-protect-invalidaction": "Ugyldig beskyttelsestype «$1».",
+       "apierror-protect-invalidlevel": "Ugyldig beskyttelsesnivå «$1».",
+       "apierror-readapidenied": "Du må ha lesetilgang for å bruke denne modulen.",
+       "apierror-readonly": "Wikien er for tiden skrivebeskyttet.",
+       "apierror-revwrongpage": "r$1 er ikke en revisjon av $2.",
+       "apierror-searchdisabled": "<var>$1</var>-søk er slått av.",
+       "apierror-sectionreplacefailed": "Kunne ikke flette oppdatert seksjon.",
+       "apierror-sectionsnotsupported": "Seksjoner støttes ikke for innholdsmodellen $1.",
+       "apierror-sectionsnotsupported-what": "Seksjoner støttes ikke av $1.",
+       "apierror-siteinfo-includealldenied": "Kan ikke vise alle tjenernes info med mindre </var>$wgShowHostNames</var> er sann.",
+       "apierror-sizediffdisabled": "Størrelsesforskjell er slått av i Miser-modus.",
        "apierror-timeout": "Tjeneren svarte ikke innenfor forventet tid.",
        "apiwarn-validationfailed": "Bekreftelsesfeil <kbd>$1</kbd>: $2"
 }
index db03a3a..5c8a83c 100644 (file)
@@ -13,7 +13,8 @@
                        "Eduardo Addad de Oliveira",
                        "Warley Felipe C.",
                        "TheEduGobi",
-                       "Felipe L. Ewald"
+                       "Felipe L. Ewald",
+                       "Hamilton Abreu"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentação]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & solicitações]\n</div>\n<strong>Status:</strong> Todos os recursos exibidos nesta página devem estar funcionando, mas a API ainda está em desenvolvimento ativo e pode mudar a qualquer momento. Inscrever-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para aviso de atualizações.\n\n<strong>Requisições incorretas:</strong> Quando requisições erradas são enviadas para a API, um cabeçalho HTTP será enviado com a chave \"MediaWiki-API-Error\" e então o valor do cabeçalho e o código de erro enviados de volta serão definidos para o mesmo valor. Para mais informações, veja [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Erros e avisos]].\n\n<strong>Testando:</strong> Para facilitar o teste das requisições da API, consulte [[Special:ApiSandbox]].",
index bbc83c0..47e5cd6 100644 (file)
@@ -14,8 +14,8 @@
        "apihelp-main-param-action": "A operação a ser realizada.",
        "apihelp-main-param-format": "O formato do resultado.",
        "apihelp-main-param-maxlag": "O atraso máximo pode ser usado quando o MediaWiki é instalado num ''cluster'' de bases de dados replicadas. Para impedir que as operações causem ainda mais atrasos de replicação do ''site'', este parâmetro pode fazer o cliente aguardar até que o atraso de replicação seja inferior ao valor especificado. Caso o atraso atual exceda esse valor, o código de erro <samp>maxlag</samp> é devolvido com uma mensagem como <samp>À espera do servidor $host: $lag segundos de atraso</samp>.<br />Consulte [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Parâmetro maxlag]] para mais informações.",
-       "apihelp-main-param-smaxage": "Definir no cabeçalho HTTP <code>s-maxage</code> de controlo da ''cache'' este número de segundos. Os erros nunca são armazenados na ''cache''.",
-       "apihelp-main-param-maxage": "Definir no cabeçalho HTTP <code>max-age</code> de controlo da ''cache'' este número de segundos. Os erros nunca são armazenados na ''cache''.",
+       "apihelp-main-param-smaxage": "Definir no cabeçalho HTTP <code>s-maxage</code> de controlo da cache este número de segundos. Os erros nunca são armazenados na cache.",
+       "apihelp-main-param-maxage": "Definir no cabeçalho HTTP <code>max-age</code> de controlo da cache este número de segundos. Os erros nunca são armazenados na cache.",
        "apihelp-main-param-assert": "Se definido com o valor <kbd>user</kbd>, verificar que o utilizador está autenticado. Se definido com o valor <kbd>bot</kbd>, verificar que o utilizador tem o privilégio de conta robô.",
        "apihelp-main-param-assertuser": "Verificar que o utilizador atual é o utilizador nomeado.",
        "apihelp-main-param-requestid": "Qualquer valor fornecido aqui será incluído na resposta. Pode ser usado para distinguir pedidos.",
        "apihelp-expandtemplates-paramvalue-prop-categories": "Quaisquer categorias existentes na entrada que não estão representadas no texto em notação wiki de saída.",
        "apihelp-expandtemplates-paramvalue-prop-properties": "Propriedades da página, definidas por palavras mágicas expandidas, no texto em notação wiki.",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "Indica se o resultado é volátil e não deve ser reutilizado noutra parte da página.",
-       "apihelp-expandtemplates-paramvalue-prop-ttl": "O período máximo a partir do qual os armazenamentos do resultado na ''cache'' devem ser invalidados.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "O período máximo a partir do qual os armazenamentos do resultado na cache devem ser invalidados.",
        "apihelp-expandtemplates-paramvalue-prop-modules": "Quaisquer módulos ResourceLoader que as funções do analisador sintático solicitaram que fossem adicionados ao resultado de saída. Um dos valores <kbd>jsconfigvars</kbd> ou <kbd>encodedjsconfigvars</kbd> tem de ser solicitado em conjunto com o valor <kbd>modules</kbd>.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Devolve as variáveis de configuração JavaScript específicas desta página.",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Devolve as variáveis de configuração JavaScript específicas da página, no formato de uma ''string'' JSON.",
        "apihelp-feedrecentchanges-param-hidecategorization": "Ocultar mudanças de pertença a categorias.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.",
        "apihelp-feedrecentchanges-param-target": "Mostrar apenas mudanças em páginas afluentes a esta.",
-       "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar mudanças em páginas com ligações para a página selecionada.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar mudanças em páginas com hiperligações para a página selecionada.",
        "apihelp-feedrecentchanges-param-categories": "Mostrar apenas mudanças nas páginas que estão em todas estas categorias.",
        "apihelp-feedrecentchanges-param-categories_any": "Mostrar apenas mudanças nas páginas que estão em qualquer uma das categorias.",
        "apihelp-feedrecentchanges-example-simple": "Mostrar mudanças recentes.",
        "apihelp-parse-param-oldid": "Analisar o conteúdo desta revisão. Tem precedência sobre <var>$1page</var> e <var>$1pageid</var>.",
        "apihelp-parse-param-prop": "As informações que devem ser obtidas:",
        "apihelp-parse-paramvalue-prop-text": "Fornece o texto analisado, de um texto com notação wiki.",
-       "apihelp-parse-paramvalue-prop-langlinks": "Fornece os links interlínguas do texto analisado.",
-       "apihelp-parse-paramvalue-prop-categories": "Fornece as categorias do texto analisado.",
+       "apihelp-parse-paramvalue-prop-langlinks": "Fornece as hiperligações interlínguas do texto wiki analisado.",
+       "apihelp-parse-paramvalue-prop-categories": "Fornece as categorias do texto wiki analisado.",
        "apihelp-parse-paramvalue-prop-categorieshtml": "Fornece a versão HTML das categorias.",
-       "apihelp-parse-paramvalue-prop-links": "Fornece os links internos do texto analisado.",
-       "apihelp-parse-paramvalue-prop-templates": "Fornece as predefinições do texto analisado.",
-       "apihelp-parse-paramvalue-prop-images": "Fornece as imagens do texto analisado.",
-       "apihelp-parse-paramvalue-prop-externallinks": "Fornece os links externos do texto analisado.",
-       "apihelp-parse-paramvalue-prop-sections": "Fornece as secções do texto analisado.",
+       "apihelp-parse-paramvalue-prop-links": "Fornece as hiperligações internas do texto wiki analisado.",
+       "apihelp-parse-paramvalue-prop-templates": "Fornece as predefinições do texto wiki analisado.",
+       "apihelp-parse-paramvalue-prop-images": "Fornece as imagens do texto wiki analisado.",
+       "apihelp-parse-paramvalue-prop-externallinks": "Fornece as hiperligações externas do texto wiki analisado.",
+       "apihelp-parse-paramvalue-prop-sections": "Fornece as secções do texto wiki analisado.",
        "apihelp-parse-paramvalue-prop-revid": "Adiciona o identificador de revisão da página analisada.",
-       "apihelp-parse-paramvalue-prop-displaytitle": "Adiciona o título do texto analisado.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "Adiciona o título do texto wiki analisado.",
        "apihelp-parse-paramvalue-prop-headitems": "Fornece os elementos a colocar no <code>&lt;head&gt;</code> da página.",
        "apihelp-parse-paramvalue-prop-headhtml": "Fornece o <code>&lt;head&gt;</code> analisado da página.",
        "apihelp-parse-paramvalue-prop-modules": "Fornece os módulos ResourceLoader usados na página. Para carregá-los, usar <code>mw.loader.using()</code>. Uma das variáveis <kbd>jsconfigvars</kbd> ou <kbd>encodedjsconfigvars</kbd> tem de ser pedida em conjunto com <kbd>modules</kbd>.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página. Para aplicá-las, usar <code>mw.config.set()</code>.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página, no formato de uma ''string'' JSON.",
        "apihelp-parse-paramvalue-prop-indicators": "Fornece o HTML dos indicadores de estado de página que são usados na página.",
-       "apihelp-parse-paramvalue-prop-iwlinks": "Fornece os links interwikis do texto analisado.",
+       "apihelp-parse-paramvalue-prop-iwlinks": "Fornece as hiperligações interwikis do texto wiki analisado.",
        "apihelp-parse-paramvalue-prop-wikitext": "Fornece o texto original com notação wiki que foi analisado.",
        "apihelp-parse-paramvalue-prop-properties": "Fornece várias propriedades definidas no texto analisado.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório de limites de forma estruturada. Não fornece dados quando <var>$1disablelimitreport</var> está definido.",
        "apihelp-parse-param-wrapoutputclass": "A classe CSS a utilizar para envolver o resultado do analisador sintático.",
        "apihelp-parse-param-pst": "Fazer uma transformação anterior à gravação do texto de entrada, antes de analisá-lo. Só é válido quando usado com texto.",
        "apihelp-parse-param-onlypst": "Fazer uma transformação anterior à gravação (PST, ''pre-save transform'') do texto de entrada, mas não o analisar. Devolve o mesmo texto após aplicação da PST. Só é válido quando usado com <var>$1text</var>.",
-       "apihelp-parse-param-effectivelanglinks": "Inclui links interlínguas fornecidos por extensões (para ser usado com <kbd>$1prop=langlinks</kbd>).",
+       "apihelp-parse-param-effectivelanglinks": "Inclui hiperligações interlínguas fornecidas por extensões (para ser usado com <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Analisar apenas o conteúdo desta secção.\n\nQuando tiver o valor <kbd>new</kbd>, analisar <var>$1text</var> e <var>$1sectiontitle</var> como se fosse adicionar uma nova secção à página.\n\n<kbd>new</kbd> só é permitido quando se especifica <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "O novo título da secção quando <var>section</var> tem o valor <kbd>new</kbd>.\n\nAo contrário da edição de páginas, este não toma o valor de <var>summary</var> se for omitido ou estiver vazio.",
        "apihelp-parse-param-disablelimitreport": "Omitir o relatório de limites (\"NewPP limit report\") do resultado de saída do analisador sintático.",
        "apihelp-parse-param-disablepp": "Em vez deste, usar <var>$1disablelimitreport</var>.",
-       "apihelp-parse-param-disableeditsection": "Omitir links para edição da secção no resultado da análise sintática.",
+       "apihelp-parse-param-disableeditsection": "Omitir as hiperligações para edição da secção no resultado da análise sintática.",
        "apihelp-parse-param-disabletidy": "Não fazer a limpeza do HTML (isto é, o ''tidy'') no resultado da análise sintática.",
        "apihelp-parse-param-generatexml": "Gerar a árvore de análise XML (requer o modelo de conteúdo <code>$1</code>; substituído por <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Executar a análise em modo de antevisão.",
        "apihelp-protect-example-protect": "Proteger uma página.",
        "apihelp-protect-example-unprotect": "Desproteger uma página definindo a restrição <kbd>all</kbd> (isto é, todos podem executar a operação).",
        "apihelp-protect-example-unprotect2": "Desproteger uma página definindo que não há restrições.",
-       "apihelp-purge-summary": "Limpar a ''cache'' para os títulos especificados.",
-       "apihelp-purge-param-forcelinkupdate": "Atualizar as tabelas de ligações.",
-       "apihelp-purge-param-forcerecursivelinkupdate": "Atualizar a tabela de ligações, e atualizar as tabelas de ligações de qualquer página que usa esta página como modelo.",
+       "apihelp-purge-summary": "Limpar a cache para os títulos especificados.",
+       "apihelp-purge-param-forcelinkupdate": "Atualizar as tabelas de hiperligações.",
+       "apihelp-purge-param-forcerecursivelinkupdate": "Atualizar a tabela de hiperligações, e atualizar as tabelas de hiperligações de qualquer página que usa esta página como modelo.",
        "apihelp-purge-example-simple": "Purgar as páginas <kbd>Main Page</kbd> e <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purgar as primeiras 10 páginas no espaço nominal principal.",
        "apihelp-query-summary": "Obter dados de, e sobre, o MediaWiki.",
        "apihelp-query-param-indexpageids": "Incluir uma secção adicional de identificadores de página que lista todos os identificadores de página devolvidos.",
        "apihelp-query-param-export": "Exportar as revisões atuais de todas as páginas fornecidas ou geradas.",
        "apihelp-query-param-exportnowrap": "Devolver o XML de exportação sem envolvê-lo num resultado XML (o mesmo formato que [[Special:Export]]). Só pode ser usado com $1export.",
-       "apihelp-query-param-iwurl": "Indica se deve ser obtido o URL completo quando o título é um ''link'' interwikis.",
+       "apihelp-query-param-iwurl": "Indica se deve ser obtido o URL completo quando o título é uma hiperligação interwikis.",
        "apihelp-query-param-rawcontinue": "Devolver os dados em bruto de <samp>query-continue</samp> para continuar.",
        "apihelp-query-example-revisions": "Obter [[Special:ApiHelp/query+siteinfo|informação do ''site'']] e as [[Special:ApiHelp/query+revisions|revisões]] da página <kbd>Main Page</kbd>.",
        "apihelp-query-example-allpages": "Obter as revisões das páginas que começam por <kbd>API/</kbd>.",
        "apihelp-query+allimages-example-recent": "Mostrar uma lista dos ficheiros carregados recentemente, semelhante a [[Special:NewFiles]].",
        "apihelp-query+allimages-example-mimetypes": "Mostrar uma lista dos ficheiros com os tipos MIME <kbd>image/png</kbd> ou <kbd>image/gif</kbd>.",
        "apihelp-query+allimages-example-generator": "Mostrar informação sobre 4 ficheiros, começando pela letra <kbd>T</kbd>.",
-       "apihelp-query+alllinks-summary": "Enumerar todos os ''links'' que apontam para um determinado espaço nominal.",
-       "apihelp-query+alllinks-param-from": "O título do ''link'' a partir do qual será começada a enumeração.",
-       "apihelp-query+alllinks-param-to": "O título do ''link'' no qual será terminada a enumeração.",
+       "apihelp-query+alllinks-summary": "Enumerar todas as hiperligações que apontam para um determinado espaço nominal.",
+       "apihelp-query+alllinks-param-from": "O título da hiperligação a partir da qual será começada a enumeração.",
+       "apihelp-query+alllinks-param-to": "O título da hiperligação na qual será terminada a enumeração.",
        "apihelp-query+alllinks-param-prefix": "Procurar todos os títulos ligados que começam por este valor.",
        "apihelp-query+alllinks-param-unique": "Mostrar só títulos ligados únicos. Não pode ser usado com <kbd>$1prop=ids</kbd>.\nAo ser usado como gerador, produz páginas de destino em vez de páginas de origem.",
        "apihelp-query+alllinks-param-prop": "As informações que devem ser incluídas:",
-       "apihelp-query+alllinks-paramvalue-prop-ids": "Adiciona o identificador da página que contém a ligação (não pode ser usado com <var>$1unique</var>).",
-       "apihelp-query+alllinks-paramvalue-prop-title": "Adiciona o título do ''link''.",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "Adiciona o identificador da página que contém a hiperligação (não pode ser usado com <var>$1unique</var>).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Adiciona o título da hiperligação.",
        "apihelp-query+alllinks-param-namespace": "O espaço nominal a ser enumerado.",
        "apihelp-query+alllinks-param-limit": "O número total de entradas a serem devolvidas.",
        "apihelp-query+alllinks-param-dir": "A direção de listagem.",
        "apihelp-query+alllinks-example-B": "Listar os títulos para os quais existem ligações, incluindo títulos em falta, com os identificadores das páginas que contêm as respetivas ligações, começando pela letra <kbd>B</kbd>.",
-       "apihelp-query+alllinks-example-unique": "Listar os títulos únicos para os quais existem ligações.",
-       "apihelp-query+alllinks-example-unique-generator": "Obtém todos os títulos para os quais existem ligações, marcando aqueles em falta.",
+       "apihelp-query+alllinks-example-unique": "Listar os títulos únicos para os quais existem hiperligações.",
+       "apihelp-query+alllinks-example-unique-generator": "Obtém todos os títulos para os quais existem hiperligações, marcando aqueles em falta.",
        "apihelp-query+alllinks-example-generator": "Obtém as páginas que contêm as ligações.",
        "apihelp-query+allmessages-summary": "Devolver as mensagens deste ''site''.",
        "apihelp-query+allmessages-param-messages": "Mensagens a serem produzidas no resultado. <kbd>*</kbd> (o valor por omissão) significa todas as mensagens.",
        "apihelp-query+allpages-param-prfiltercascade": "Filtrar as proteções com base na proteção em cascata (ignorado se $1prtype não estiver presente).",
        "apihelp-query+allpages-param-limit": "O número total de páginas a serem devolvidas.",
        "apihelp-query+allpages-param-dir": "A direção de listagem.",
-       "apihelp-query+allpages-param-filterlanglinks": "Filtrar dependo de uma página ter ''links'' interlínguas. Note que isto pode não tomar em consideração ''links'' interlínguas adicionados por extensões.",
+       "apihelp-query+allpages-param-filterlanglinks": "Filtrar dependo de uma página conter hiperligações interlínguas. Note que isto pode não ter em consideração hiperligações interlínguas adicionadas por extensões.",
        "apihelp-query+allpages-param-prexpiry": "O tipo de expiração pelo qual as páginas serão filtradas:\n;indefinite:Obter só páginas com um período de expiração indefinido.\n;definite:Obter só páginas com um período de expiração definido (específico).\n;all:Obter páginas com qualquer período de expiração.",
        "apihelp-query+allpages-example-B": "Mostrar uma lista de páginas, começando na letra <kbd>B</kbd>.",
        "apihelp-query+allpages-example-generator": "Mostrar informação sobre 4 páginas, começando na letra <kbd>T</kbd>.",
        "apihelp-query+authmanagerinfo-example-login": "Obter os pedidos que podem ser usados ao iniciar uma sessão.",
        "apihelp-query+authmanagerinfo-example-login-merged": "Obter os pedidos que podem ser usados ao iniciar uma sessão, com os campos combinados.",
        "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Testar se a autenticação é suficiente para a operação <kbd>foo</kbd>.",
-       "apihelp-query+backlinks-summary": "Encontrar todas as páginas que contêm ligações para a página indicada.",
+       "apihelp-query+backlinks-summary": "Encontrar todas as páginas que contêm hiperligações para a página indicada.",
        "apihelp-query+backlinks-param-title": "O título a ser procurado. Não pode ser usado em conjunto com <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-pageid": "O identificador do título a ser procurado. Não pode ser usado em conjunto com <var>$1title</var>.",
        "apihelp-query+backlinks-param-namespace": "O espaço nominal a ser enumerado.",
        "apihelp-query+backlinks-param-dir": "A direção de listagem.",
        "apihelp-query+backlinks-param-filterredir": "Como filtrar os redirecionamentos. Se definido como <kbd>nonredirects</kbd> quando <var>$1redirect</var> está ativado, isto só é aplicado ao segundo nível.",
        "apihelp-query+backlinks-param-limit": "O número total de páginas a serem devolvidas. Se <var>$1redirect</var> estiver ativado, o limite aplica-se a cada nível em separado (o que significa que até 2 * <var>$1limit</var> resultados podem ser devolvidos).",
-       "apihelp-query+backlinks-param-redirect": "Se a página que contém a ligação é um redirecionamento, procurar também todas as páginas que contêm ligações para esse redirecionamento. O limite máximo é reduzido para metade.",
-       "apihelp-query+backlinks-example-simple": "Mostrar as ligações para <kbd>Main page</kbd>.",
-       "apihelp-query+backlinks-example-generator": "Obter informações sobre as páginas com ligações para <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-param-redirect": "Se a página que contém a hiperligação é um redirecionamento, procurar também todas as páginas que contêm hiperligações para esse redirecionamento. O limite máximo é reduzido para metade.",
+       "apihelp-query+backlinks-example-simple": "Mostrar as hiperligações para <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Obter informações sobre as páginas com hiperligações para <kbd>Main page</kbd>.",
        "apihelp-query+blocks-summary": "Listar todos os utilizadores e endereços IP bloqueados.",
        "apihelp-query+blocks-param-start": "A data e hora a partir da qual será começada a enumeração.",
        "apihelp-query+blocks-param-end": "A data e hora na qual será terminada a enumeração.",
        "apihelp-query+embeddedin-example-generator": "Obter informação sobre as páginas que transcluem <kbd>Template:Stub</kbd>.",
        "apihelp-query+extlinks-summary": "Devolve todos os URL externos (que não sejam interwikis) das páginas especificadas.",
        "apihelp-query+extlinks-param-limit": "O número de ''links'' a serem devolvidos.",
-       "apihelp-query+extlinks-param-protocol": "Protocolo do URL. Se vazio e <var>$1query</var> está definido, o protocolo é <kbd>http</kbd>. Deixe isto e  <var>$1query</var> vazios para listar todos os ''links'' externos.",
+       "apihelp-query+extlinks-param-protocol": "Protocolo do URL. Se vazio e <var>$1query</var> está definido, o protocolo é <kbd>http</kbd>. Deixe este parâmetro e <var>$1query</var> vazios para listar todas as hiperligações externas.",
        "apihelp-query+extlinks-param-query": "Texto de pesquisa sem protocolo. Útil para verificar se uma determinada página contém um determinado URL externo.",
        "apihelp-query+extlinks-param-expandurl": "Expandir os URL relativos a protocolo com o protocolo canónico.",
-       "apihelp-query+extlinks-example-simple": "Obter uma lista das ligações externas na <kbd>Main Page</kbd>.",
+       "apihelp-query+extlinks-example-simple": "Obter uma lista das hiperligações externas da <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-summary": "Enumerar as páginas que contêm um determinado URL.",
        "apihelp-query+exturlusage-param-prop": "As informações que devem ser incluídas:",
        "apihelp-query+exturlusage-paramvalue-prop-ids": "Adiciona o identificador da página.",
        "apihelp-query+exturlusage-paramvalue-prop-title": "Adiciona o título e o identificador do espaço nominal da página.",
        "apihelp-query+exturlusage-paramvalue-prop-url": "Adiciona o URL usado na página.",
-       "apihelp-query+exturlusage-param-protocol": "Protocolo do URL. Se vazio e <var>$1query</var> está definido, o protocolo é <kbd>http</kbd>. Deixe isto e  <var>$1query</var> vazios para listar todos os ''links'' externos.",
-       "apihelp-query+exturlusage-param-query": "Texto da pesquisa sem um protocolo. Ver [[Special:LinkSearch]]. Deixar vazio para listar todos os ''links'' externos.",
+       "apihelp-query+exturlusage-param-protocol": "Protocolo do URL. Se vazio e <var>$1query</var> está definido, o protocolo é <kbd>http</kbd>. Deixe este parâmetro e <var>$1query</var> vazios para listar todas as hiperligações externas.",
+       "apihelp-query+exturlusage-param-query": "Texto da pesquisa sem um protocolo. Ver [[Special:LinkSearch]]. Deixar vazio para listar todas as hiperligações externas.",
        "apihelp-query+exturlusage-param-namespace": "Os espaços nominais a serem enumerados.",
        "apihelp-query+exturlusage-param-limit": "O número de páginas a serem devolvidas.",
        "apihelp-query+exturlusage-param-expandurl": "Expandir os URL relativos a protocolo com o protocolo canónico.",
-       "apihelp-query+exturlusage-example-simple": "Mostrar as páginas com ligações para <kbd>http://www.mediawiki.org</kbd>.",
+       "apihelp-query+exturlusage-example-simple": "Mostrar as páginas com hiperligações para <kbd>http://www.mediawiki.org</kbd>.",
        "apihelp-query+filearchive-summary": "Enumerar todos os ficheiros eliminados sequencialmente.",
        "apihelp-query+filearchive-param-from": "O título da imagem a partir do qual será começada a enumeração.",
        "apihelp-query+filearchive-param-to": "O título da imagem no qual será terminada a enumeração.",
        "apihelp-query+info-example-simple": "Obter informações sobre a página <kbd>Main Page</kbd>.",
        "apihelp-query+info-example-protection": "Obter informação geral e de proteção sobre a página <kbd>Main Page</kbd>.",
        "apihelp-query+iwbacklinks-summary": "Encontrar todas as páginas que contêm ''links'' para as páginas indicadas.",
-       "apihelp-query+iwbacklinks-extended-description": "Pode ser usado para encontrar todos os ''links'' com um prefixo, ou todos os ''links'' para um título (com um prefixo especificado). Se nenhum parâmetro for usado, isso efetivamente significa \"todos os ''links'' interwikis\".",
+       "apihelp-query+iwbacklinks-extended-description": "Pode ser usado para encontrar todas as hiperligações com um prefixo, ou todas as hiperligações para um título (com um prefixo especificado). Se nenhum dos parâmetros for usado, isso efetivamente significa \"todas as hiperligações interwikis\".",
        "apihelp-query+iwbacklinks-param-prefix": "O prefixo interwikis.",
-       "apihelp-query+iwbacklinks-param-title": "O ''link'' interwikis a ser procurado. Tem de ser usado em conjunto com <var>$1blprefix</var>.",
+       "apihelp-query+iwbacklinks-param-title": "A hiperligação interwikis a ser procurada. Tem de ser usado em conjunto com <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "O número total de páginas a serem devolvidas.",
        "apihelp-query+iwbacklinks-param-prop": "As propriedades a serem obtidas:",
-       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Adiciona o prefixo do ''link'' interwikis.",
-       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Adiciona o título do ''link'' interwikis.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Adiciona o prefixo da hiperligação interwikis.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Adiciona o título da hiperligação interwikis.",
        "apihelp-query+iwbacklinks-param-dir": "A direção de listagem.",
-       "apihelp-query+iwbacklinks-example-simple": "Obter as páginas que contêm ligações para [[wikibooks:Test]].",
-       "apihelp-query+iwbacklinks-example-generator": "Obter informação sobre as páginas que contêm ligações para [[wikibooks:Test]].",
-       "apihelp-query+iwlinks-summary": "Devolve todos os ''links'' interwikis das páginas indicadas.",
+       "apihelp-query+iwbacklinks-example-simple": "Obter as páginas que contêm hiperligações para [[wikibooks:Test]].",
+       "apihelp-query+iwbacklinks-example-generator": "Obter informação sobre as páginas que contêm hiperligações para [[wikibooks:Test]].",
+       "apihelp-query+iwlinks-summary": "Devolve todas as hiperligações interwikis das páginas indicadas.",
        "apihelp-query+iwlinks-param-url": "Indica se deve ser obtido o URL completo (não pode ser usado com $1prop).",
-       "apihelp-query+iwlinks-param-prop": "As propriedades adicionais que devem ser obtidas para cada ''link'' interlínguas:",
+       "apihelp-query+iwlinks-param-prop": "As propriedades adicionais que devem ser obtidas para cada hiperligação interlínguas:",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Adiciona o URL completo.",
-       "apihelp-query+iwlinks-param-limit": "O número de ''links'' interwikis a serem devolvidos.",
-       "apihelp-query+iwlinks-param-prefix": "Devolver só os ''links'' interwikis com este prefixo.",
-       "apihelp-query+iwlinks-param-title": "Link interwikis a ser procurado. Tem de ser usado em conjunto com <var>$1prefix</var>.",
+       "apihelp-query+iwlinks-param-limit": "O número de hiperligações interwikis a serem devolvidas.",
+       "apihelp-query+iwlinks-param-prefix": "Devolver só as hiperligações interwikis com este prefixo.",
+       "apihelp-query+iwlinks-param-title": "Hiperligação interwikis a ser procurada. Tem de ser usado em conjunto com <var>$1prefix</var>.",
        "apihelp-query+iwlinks-param-dir": "A direção de listagem.",
-       "apihelp-query+iwlinks-example-simple": "Obter os ''links'' interwikis da página <kbd>Main Page</kbd>.",
-       "apihelp-query+langbacklinks-summary": "Encontrar todas as páginas que contêm ''links'' para o ''link'' interlínguas indicado.",
-       "apihelp-query+langbacklinks-extended-description": "Pode ser usado para encontrar todos os ''links'' para um determinado código de língua, ou todos os ''links'' para um determinado título (de uma língua). Se nenhum for usado, isso efetivamente significa \"todos os ''links'' interlínguas\".\n\nNote que os ''links'' interlínguas adicionados por extensões podem não ser considerados.",
-       "apihelp-query+langbacklinks-param-lang": "A língua do ''link'' interlínguas.",
-       "apihelp-query+langbacklinks-param-title": "Link interlínguas a ser procurado. Tem de ser usado com $1lang.",
+       "apihelp-query+iwlinks-example-simple": "Obter as hiperligações interwikis da página <kbd>Main Page</kbd>.",
+       "apihelp-query+langbacklinks-summary": "Encontrar todas as páginas que contêm hiperligações para a hiperligação interlínguas indicada.",
+       "apihelp-query+langbacklinks-extended-description": "Pode ser usado para encontrar todas as hiperligações para um determinado código de língua, ou todas as hiperligações para um determinado título (de uma língua). Se nenhum dos parâmetros for usado, isso efetivamente significa \"todas as hiperligações interlínguas\".\n\nNote que as hiperligações interlínguas adicionadas por extensões podem não ser consideradas.",
+       "apihelp-query+langbacklinks-param-lang": "A língua da hiperligação da língua.",
+       "apihelp-query+langbacklinks-param-title": "Hiperligação interlínguas a ser procurada. Tem de ser usado com $1lang.",
        "apihelp-query+langbacklinks-param-limit": "O número total de páginas a serem devolvidas.",
        "apihelp-query+langbacklinks-param-prop": "As propriedades a serem obtidas:",
-       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Adiciona o código de língua da ligação interlínguas.",
-       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Adiciona o título do ''link'' interlínguas.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Adiciona o código de língua da hiperligação interlínguas.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Adiciona o título da hiperligação interlínguas.",
        "apihelp-query+langbacklinks-param-dir": "A direção de listagem.",
-       "apihelp-query+langbacklinks-example-simple": "Obter as páginas que contêm ligações para [[:fr:Test]].",
-       "apihelp-query+langbacklinks-example-generator": "Obter informações sobre as páginas que contêm ligações para [[:fr:Test]].",
-       "apihelp-query+langlinks-summary": "Devolve todos os ''links'' interlínguas das páginas indicadas.",
-       "apihelp-query+langlinks-param-limit": "O número de ''links'' interlínguas a serem devolvidos.",
+       "apihelp-query+langbacklinks-example-simple": "Obter as páginas que contêm hiperligações para [[:fr:Test]].",
+       "apihelp-query+langbacklinks-example-generator": "Obter informações sobre as páginas que contêm hiperligações para [[:fr:Test]].",
+       "apihelp-query+langlinks-summary": "Devolve todas as hiperligações interlínguas das páginas indicadas.",
+       "apihelp-query+langlinks-param-limit": "O número de hiperligações interlínguas a serem devolvidas.",
        "apihelp-query+langlinks-param-url": "Indica se deve ser obtido o URL completo (não pode ser usado com $1prop).",
-       "apihelp-query+langlinks-param-prop": "As propriedades adicionais que devem ser obtidas para cada ''link'' interlínguas:",
+       "apihelp-query+langlinks-param-prop": "As propriedades adicionais que devem ser obtidas para cada hiperligação interlínguas:",
        "apihelp-query+langlinks-paramvalue-prop-url": "Adiciona o URL completo.",
        "apihelp-query+langlinks-paramvalue-prop-langname": "Adiciona o nome da língua localizado (melhor esforço). Usar <var>$1inlanguagecode</var> para controlar a língua.",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "Adiciona o nome nativo da língua.",
-       "apihelp-query+langlinks-param-lang": "Devolver só os ''links'' interlínguas com este código de língua.",
-       "apihelp-query+langlinks-param-title": "''Link'' a ser procurado. Tem de ser usado com <var>$1lang</var>.",
+       "apihelp-query+langlinks-param-lang": "Devolver só as hiperligações interlínguas com este código de língua.",
+       "apihelp-query+langlinks-param-title": "A hiperligação a ser procurada. Tem de ser usado com <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "A direção de listagem.",
        "apihelp-query+langlinks-param-inlanguagecode": "O código de língua para os nomes de língua localizados.",
-       "apihelp-query+langlinks-example-simple": "Obter os ''links'' interlínguas da página <kbd>Main Page</kbd>.",
-       "apihelp-query+links-summary": "Devolve todos os ''links'' das páginas indicadas.",
-       "apihelp-query+links-param-namespace": "Mostrar apenas os ''links'' destes espaços nominais.",
+       "apihelp-query+langlinks-example-simple": "Obter as hiperligações interlínguas da página <kbd>Main Page</kbd>.",
+       "apihelp-query+links-summary": "Devolve todas as hiperligações das páginas indicadas.",
+       "apihelp-query+links-param-namespace": "Mostrar apenas as hiperligações destes espaços nominais.",
        "apihelp-query+links-param-limit": "O número de ''links'' a serem devolvidos.",
-       "apihelp-query+links-param-titles": "Listar só as ligações para estes títulos. Útil para verificar se uma determinada página contém ligações para um determinado título.",
+       "apihelp-query+links-param-titles": "Listar só as hiperligações para estes títulos. Útil para verificar se uma determinada página contém hiperligações para um determinado título.",
        "apihelp-query+links-param-dir": "A direção de listagem.",
        "apihelp-query+links-example-simple": "Obter os ''links'' da página <kbd>Main Page</kbd>.",
        "apihelp-query+links-example-generator": "Obter informação sobre as páginas ligadas na página <kbd>Main Page</kbd>.",
-       "apihelp-query+links-example-namespaces": "Obter os ''links'' da página <kbd>Main Page</kbd> nos espaços nominais {{ns:user}} e {{ns:template}}.",
-       "apihelp-query+linkshere-summary": "Encontrar todas as páginas que contêm ''links'' para as páginas indicadas.",
+       "apihelp-query+links-example-namespaces": "Obter as hiperligações da página <kbd>Main Page</kbd> nos espaços nominais {{ns:user}} e {{ns:template}}.",
+       "apihelp-query+linkshere-summary": "Encontrar todas as páginas que contêm hiperligações para as páginas indicadas.",
        "apihelp-query+linkshere-param-prop": "As propriedades a serem obtidas:",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "O identificador de cada página.",
        "apihelp-query+linkshere-paramvalue-prop-title": "O título de cada página.",
        "apihelp-query+linkshere-param-namespace": "Incluir só as páginas nestes espaços nominais.",
        "apihelp-query+linkshere-param-limit": "O número de páginas a serem devolvidas.",
        "apihelp-query+linkshere-param-show": "Mostrar só as páginas que correspondem a estes critérios:\n;redirect:Mostrar só os redirecionamentos.\n;!redirect:Mostrar só os não redirecionamentos.",
-       "apihelp-query+linkshere-example-simple": "Obter uma lista das páginas com ligações para a página [[Main Page]].",
-       "apihelp-query+linkshere-example-generator": "Obter informação sobre as páginas com ligações para a página [[Main Page]].",
+       "apihelp-query+linkshere-example-simple": "Obter uma lista das páginas com hiperligações para a página [[Main Page]].",
+       "apihelp-query+linkshere-example-generator": "Obter informação sobre as páginas com hiperligações para a página [[Main Page]].",
        "apihelp-query+logevents-summary": "Obter eventos dos registos.",
        "apihelp-query+logevents-param-prop": "As propriedades a serem obtidas:",
        "apihelp-query+logevents-paramvalue-prop-ids": "Adiciona o identificador do evento do registo.",
        "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Adiciona a data e hora a que a proteção será removida.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Adiciona o nível de proteção.",
        "apihelp-query+protectedtitles-example-simple": "Lista os títulos protegidos.",
-       "apihelp-query+protectedtitles-example-generator": "Encontrar as ligações para os títulos protegidos que pertencem ao espaço nominal principal.",
+       "apihelp-query+protectedtitles-example-generator": "Encontrar as hiperligações para os títulos protegidos que pertencem ao espaço nominal principal.",
        "apihelp-query+querypage-summary": "Obter uma lista fornecida por uma página especial baseada em consultas (''QueryPage'').",
        "apihelp-query+querypage-param-page": "O nome da página especial. Note que este é sensível a maiúsculas e minúsculas.",
        "apihelp-query+querypage-param-limit": "O número de resultados a serem devolvidos.",
        "api-help-source": "Fonte: $1",
        "api-help-source-unknown": "Fonte: <span class=\"apihelp-unknown\">desconhecida</span>",
        "api-help-license": "Licença: [[$1|$2]]",
-       "api-help-license-noname": "Licença: [[$1|Ver ligação]]",
+       "api-help-license-noname": "Licença: [[$1|Ver hiperligação]]",
        "api-help-license-unknown": "Licença: <span class=\"apihelp-unknown\">desconhecida</span>",
        "api-help-parameters": "{{PLURAL:$1|Parâmetro|Parâmetros}}:",
        "api-help-param-deprecated": "Obsoleto.",
index e60ce87..e825170 100644 (file)
        "apihelp-imagerotate-param-tags": "Изменить метки записи в журнале загрузок.",
        "apihelp-imagerotate-example-simple": "Повернуть <kbd>File:Example.png</kbd> на <kbd>90</kbd> градусов.",
        "apihelp-imagerotate-example-generator": "Повернуть все изображения в <kbd>Category:Flip</kbd> на <kbd>180</kbd> градусов.",
-       "apihelp-import-summary": "Импорт страницы из другой вики, или из XML-файла.",
+       "apihelp-import-summary": "Импорт страницы из другой вики или XML-файла.",
        "apihelp-import-extended-description": "Обратите внимание, что HTTP POST-запрос должен быть осуществлён как загрузка файла (то есть, с использованием многотомных данных) при отправки файла через параметр <var>xml</var>.",
        "apihelp-import-param-summary": "Описание записи журнала импорта.",
        "apihelp-import-param-xml": "Загруженный XML-файл.",
+       "apihelp-import-param-interwikiprefix": "Для загруженных импортов: префикс интервики для неизвестных имён участников (а также известных, если задан <var>$1assignknownusers</var>).",
+       "apihelp-import-param-assignknownusers": "Связать правки с локальными участниками, когда участники с такими именами существуют.",
        "apihelp-import-param-interwikisource": "Для импорта из других вики: импортируемая вики.",
        "apihelp-import-param-interwikipage": "Для импорта из других вики: импортируемая страница.",
        "apihelp-import-param-fullhistory": "Для импорта из других вики: импортировать полную историю, а не только текущую страницу.",
        "apihelp-linkaccount-summary": "Связать аккаунт третьей стороны с текущим участником.",
        "apihelp-linkaccount-example-link": "Начать связывание аккаунта с <kbd>Example</kdb>.",
        "apihelp-login-summary": "Вход и получение аутентификационных cookie.",
-       "apihelp-login-extended-description": "Это действие должно быть использовано только в комбинации со [[Special:BotPasswords]]; использование этого модуля для входа в основной аккаунт не поддерживается и может сбиться без предупреждения. Для безопасного входа в основной аккаунт, используйте <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-extended-description": "Это действие должно быть использовано только в комбинации со [[Special:BotPasswords]]; использование этого модуля для входа в основной аккаунт устарело и может сбиться без предупреждения. Для безопасного входа в основной аккаунт, используйте <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-extended-description-nobotpasswords": "Это действие не поддерживается и может сбиться без предупреждения. Для безопасного входа, используйте <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "Имя участника.",
        "apihelp-login-param-password": "Пароль.",
        "apihelp-query+allrevisions-param-generatetitles": "При использовании в качестве генератора, генерирует названия страниц вместо идентификаторов версий.",
        "apihelp-query+allrevisions-example-user": "Перечислить последние 50 правок участника <kbd>Example</kbd>.",
        "apihelp-query+allrevisions-example-ns-main": "Перечислить первые 50 правок в основном пространстве.",
-       "apihelp-query+mystashedfiles-summary": "Получить список файлов в тайнике (upload stash) текущего участника.",
+       "apihelp-query+mystashedfiles-summary": "Получить список файлов во временном хранилище текущего участника.",
        "apihelp-query+mystashedfiles-param-prop": "Какие свойства файлов запрашивать.",
        "apihelp-query+mystashedfiles-paramvalue-prop-size": "Запросить размер и разрешение изображения.",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Запросить MIME- и медиа-тип файла.",
        "apihelp-query+mystashedfiles-param-limit": "Сколько файлов получить.",
-       "apihelp-query+mystashedfiles-example-simple": "Получить ключ, размер и разрешение файлов в тайнике текущего участника.",
+       "apihelp-query+mystashedfiles-example-simple": "Получить ключ, размер и разрешение файлов во временном хранилище текущего участника.",
        "apihelp-query+alltransclusions-summary": "Перечисление всех включений (страниц, вставленных с помощью &#123;&#123;x&#125;&#125;), включая несуществующие.",
        "apihelp-query+alltransclusions-param-from": "Название включения, с которого начать перечисление.",
        "apihelp-query+alltransclusions-param-to": "Название включения, на котором закончить перечисление.",
        "apihelp-query+deletedrevs-param-excludeuser": "Не перечислять правки данного участника.",
        "apihelp-query+deletedrevs-param-namespace": "Перечислять только страницы этого пространства имён.",
        "apihelp-query+deletedrevs-param-limit": "Максимальное количество правок в списке.",
-       "apihelp-query+deletedrevs-param-prop": "Ð\9aакие Ñ\81войÑ\81Ñ\82ва Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аÑ\82Ñ\8c:\n;revid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ñ\83далÑ\91нной Ð¿Ñ\80авки.\n;parentid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ð¿Ñ\80едÑ\8bдÑ\83Ñ\89ей Ð²ÐµÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.\n;user: Ð\94обавлÑ\8fеÑ\82 Ð½Ð¸Ðº Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его Ð¿Ñ\80авкÑ\83.\n;userid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его Ð¿Ñ\80авкÑ\83.\n;comment: Ð\94обавлÑ\8fеÑ\82 Ð¾Ð¿Ð¸Ñ\81ание Ð¿Ñ\80авки.\n;parsedcomment: Ð\94обавлÑ\8fеÑ\82 Ñ\80аÑ\81паÑ\80Ñ\81енное Ð¾Ð¿Ð¸Ñ\81ание Ð¿Ñ\80авки.\n;minor: Ð\9eÑ\82меÑ\87аеÑ\82, Ð±Ñ\8bла Ð»Ð¸ Ð¿Ñ\80авка Ð¼Ð°Ð»Ñ\8bм.\n;len: Ð\94обавлÑ\8fеÑ\82 Ð´Ð»Ð¸Ð½Ñ\83 (в Ð±Ð°Ð¹Ñ\82аÑ\85) Ð¿Ñ\80авки.\n;sha1: Ð\94обавлÑ\8fеÑ\82 Ñ\85Ñ\8dÑ\88 SHA-1 (base 16) Ð¿Ñ\80авки.\n;content: Ð\94обавлÑ\8fеÑ\82 Ñ\81одеÑ\80жимое Ð¿Ñ\80авки.\n;token: <span class=\"apihelp-deprecated\">Ð\9dе Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82Ñ\81Ñ\8f.</span> Возвращает токен редактирования.\n;tags: Теги правки.",
+       "apihelp-query+deletedrevs-param-prop": "Ð\9aакие Ñ\81войÑ\81Ñ\82ва Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аÑ\82Ñ\8c:\n;revid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ñ\83далÑ\91нной Ð¿Ñ\80авки.\n;parentid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ð¿Ñ\80едÑ\8bдÑ\83Ñ\89ей Ð²ÐµÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.\n;user: Ð\94обавлÑ\8fеÑ\82 Ð½Ð¸Ðº Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его Ð¿Ñ\80авкÑ\83.\n;userid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его Ð¿Ñ\80авкÑ\83.\n;comment: Ð\94обавлÑ\8fеÑ\82 Ð¾Ð¿Ð¸Ñ\81ание Ð¿Ñ\80авки.\n;parsedcomment: Ð\94обавлÑ\8fеÑ\82 Ñ\80аÑ\81паÑ\80Ñ\81енное Ð¾Ð¿Ð¸Ñ\81ание Ð¿Ñ\80авки.\n;minor: Ð\9eÑ\82меÑ\87аеÑ\82, Ð±Ñ\8bла Ð»Ð¸ Ð¿Ñ\80авка Ð¼Ð°Ð»Ñ\8bм.\n;len: Ð\94обавлÑ\8fеÑ\82 Ð´Ð»Ð¸Ð½Ñ\83 (в Ð±Ð°Ð¹Ñ\82аÑ\85) Ð¿Ñ\80авки.\n;sha1: Ð\94обавлÑ\8fеÑ\82 Ñ\85Ñ\8dÑ\88 SHA-1 (base 16) Ð¿Ñ\80авки.\n;content: Ð\94обавлÑ\8fеÑ\82 Ñ\81одеÑ\80жимое Ð¿Ñ\80авки.\n;token: <span class=\"apihelp-deprecated\">УÑ\81Ñ\82аÑ\80ело.</span> Возвращает токен редактирования.\n;tags: Теги правки.",
        "apihelp-query+deletedrevs-example-mode1": "Список последних удалённых правок страниц <kbd>Main Page</kbd> и <kbd>Talk:Main Page</kbd> с содержимым (режим 1).",
        "apihelp-query+deletedrevs-example-mode2": "Список последних 50 удалённых правок участника <kbd>Bob</kbd> (режим 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "Список последних 50 удалённых правок в основном пространстве имён (режим 3)",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Распарсенное описание правки.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Текст версии.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Метки версии.",
-       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "<span class=\"apihelp-deprecated\">Ð\9dе Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82Ñ\81Ñ\8f.</span> Вместо этого используйте <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> или <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>. Дерево парсинга XML содержимого версии (требуется модель содержимого <code>$1</code>).",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "<span class=\"apihelp-deprecated\">УÑ\81Ñ\82аÑ\80ело.</span> Вместо этого используйте <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> или <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>. Дерево парсинга XML содержимого версии (требуется модель содержимого <code>$1</code>).",
        "apihelp-query+revisions+base-param-limit": "Сколько версий вернуть.",
        "apihelp-query+revisions+base-param-expandtemplates": "Вместо этого используйте <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd>. Раскрыть шаблоны в содержимом версии (требуется $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Вместо этого используйте <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> или <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>. Сгенерировать дерево парсинга XML содержимого версии (требуется $1prop=content).",
        "apihelp-query+search-paramvalue-prop-sectiontitle": "Добавляет заголовок найденного раздела.",
        "apihelp-query+search-paramvalue-prop-categorysnippet": "Добавляет распарсенный фрагмент найденной категории.",
        "apihelp-query+search-paramvalue-prop-isfilematch": "Добавляет логическое значение, обозначающее, удовлетворяет ли поисковому запросу содержимое файла.",
+       "apihelp-query+search-paramvalue-prop-extensiondata": "Добавляет дополнительные данные, сгенерированные расширениями.",
        "apihelp-query+search-paramvalue-prop-score": "Игнорируется.",
        "apihelp-query+search-paramvalue-prop-hasrelated": "Игнорируется.",
        "apihelp-query+search-param-limit": "Сколько страниц вернуть.",
        "apihelp-query+siteinfo-example-simple": "Запросить информацию о сайте.",
        "apihelp-query+siteinfo-example-interwiki": "Запросить список локальных префиксов интервик.",
        "apihelp-query+siteinfo-example-replag": "Проверить текущее отставание репликации.",
-       "apihelp-query+stashimageinfo-summary": "Возвращает информацию о файлах в тайнике (upload stash).",
+       "apihelp-query+stashimageinfo-summary": "Возвращает информацию о файлах во временном хранилище.",
        "apihelp-query+stashimageinfo-param-filekey": "Ключ, идентифицирующий предыдущую временную загрузку.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Синоним $1filekey для обратной совместимости.",
-       "apihelp-query+stashimageinfo-example-simple": "Вернуть информацию о файле в тайнике.",
+       "apihelp-query+stashimageinfo-example-simple": "Вернуть информацию о файле во временном хранилище.",
        "apihelp-query+stashimageinfo-example-params": "Вернуть эскизы двух файлов в тайнике.",
        "apihelp-query+tags-summary": "Список меток правок.",
        "apihelp-query+tags-param-limit": "Максимальное количество меток в списке.",
        "apihelp-tag-example-rev": "Добавить метку <kbd>vandalism</kbd> к версии с идентификатором 123 без указания причины.",
        "apihelp-tag-example-log": "Удаление метки <kbd>spam</kbd> из записи журнала с идентификатором 123 с причиной <kbd>Wrongly applied</kbd>.",
        "apihelp-tokens-summary": "Получение токенов для действий, связанных с редактированием данных.",
-       "apihelp-tokens-extended-description": "Этот модуль не поддерживается в пользу [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-tokens-extended-description": "Этот модуль устарел в пользу [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-param-type": "Типы запрашиваемых токенов.",
        "apihelp-tokens-example-edit": "Получить токен редактирования (по умолчанию).",
        "apihelp-tokens-example-emailmove": "Получить токен электронной почты и переименования.",
        "apihelp-upload-param-url": "Ссылка на запрашиваемый файл.",
        "apihelp-upload-param-filekey": "Ключ, идентифицирующий предыдущую временную загрузку.",
        "apihelp-upload-param-sessionkey": "Синоним $1filekey, обслуживаемый для обратной совместимости.",
-       "apihelp-upload-param-stash": "Ð\95Ñ\81ли Ð·Ð°Ð´Ð°Ð½Ð¾, Ñ\81еÑ\80веÑ\80 Ð²Ñ\80еменно Ð¿Ð¾Ð¼ÐµÑ\81Ñ\82иÑ\82 Ñ\84айл Ð² Ñ\82айник Ð²Ð¼ÐµÑ\81Ñ\82о Ð·Ð°Ð³Ñ\80Ñ\83зки ÐµÐ³Ð¾ Ð² Ñ\85Ñ\80анилиÑ\89е.",
+       "apihelp-upload-param-stash": "Ð\95Ñ\81ли Ð·Ð°Ð´Ð°Ð½Ð¾, Ñ\81еÑ\80веÑ\80 Ð¿Ð¾Ð¼ÐµÑ\81Ñ\82иÑ\82 Ñ\84айл Ð²Ð¾ Ð²Ñ\80еменное Ñ\85Ñ\80анилиÑ\89е, Ð½Ðµ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð² Ð² Ð¿Ð¾Ñ\81Ñ\82оÑ\8fнное.",
        "apihelp-upload-param-filesize": "Полны размер файла.",
        "apihelp-upload-param-offset": "Смещение блока в байтах.",
        "apihelp-upload-param-chunk": "Содержимое кусочка.",
        "api-help-lead": "Это автоматически сгенерированная страница документации MediaWiki API.\n\nДокументация и примеры: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Главный модуль",
        "api-help-undocumented-module": "Нет документации для модуля $1.",
-       "api-help-flag-deprecated": "Этот модуль не поддерживается.",
+       "api-help-flag-deprecated": "Этот модуль устарел.",
        "api-help-flag-internal": "<strong>Этот модуль внутренний или нестабильный.</strong> Его операции могут измениться без предупреждения.",
        "api-help-flag-readrights": "Этот модуль требует прав на чтение.",
        "api-help-flag-writerights": "Этот модуль требует прав на запись.",
        "api-help-license-noname": "Лицензия: [[$1|см. ссылку]]",
        "api-help-license-unknown": "Лицензия: <span class=\"apihelp-unknown\">unknown</span>",
        "api-help-parameters": "Параметр{{PLURAL:$1||ы}}:",
-       "api-help-param-deprecated": "Ð\9dе Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82Ñ\81Ñ\8f.",
+       "api-help-param-deprecated": "УÑ\81Ñ\82аÑ\80ело.",
        "api-help-param-required": "Это обязательный параметр.",
        "api-help-datatypes-header": "Типы данных",
        "api-help-datatypes": "Ввод в MediaWiki должен быть NFC-нормализованным UTF-8. MediaWiki может попытаться преобразовать другой ввод, но это приведёт к провалу некоторых операций (таких, как [[Special:ApiHelp/edit|редактирование]] со сверкой MD5).\n\nНекоторые типы параметров в запросах API требуют дополнительных пояснений:\n;логический\n:Логические параметры работают как флажки (checkboxes) в HTML: если параметр задан, независимо от его значения, он воспринимается за истину. Для передачи ложного значения просто опустите параметр.\n;временные метки\n:Временные метки могут быть заданы в нескольких форматах. Рекомендуемым является дата и время ISO 8601. Всё время считается в UTC, любые включённые часовые пояса игнорируются.\n:* Дата и время ISO 8601: <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (знаки препинания и <kbd>Z</kbd> необязательны)\n:* Дата и время ISO 8601 с (игнорируемой) дробной частью секунд: <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (дефисы, двоеточия и <kbd>Z</kbd> необязательны)\n:* Формат MediaWiki: <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Общий числовой формат: <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (необязательный часовой пояс <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd> или <kbd>-<var>##</var></kbd> игнорируется)\n:* Формат EXIF: <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Формат RFC 2822 (часовой пояс может быть опущен): <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Формат RFC 850 (часовой пояс может быть опущен): <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Формат ctime языка программирования C: <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Количество секунд, прошедших с 1970-01-01T00:00:00Z, в виде челого числа с от 1 до 13 знаками (исключая <kbd>0</kbd>)\n:* Строка <kbd>now</kbd>\n;альтернативный разделитель значений\n:Параметры, принимающие несколько значений, обычно отправляются со значениями, разделёнными с помощью символа пайпа, например, <kbd>param=value1|value2</kbd> или <kbd>param=value1%7Cvalue2</kbd>. Если значение должно содержать символ пайпа, используйте U+001F (Unit Separator) в качестве разделителя ''и'' добавьте в начало значения U+001F, например, <kbd>param=%1Fvalue1%1Fvalue2</kbd>.",
        "api-help-param-direction": "В каком порядке перечислять:\n;newer: Начать с самых старых. Обратите внимание: $1start должно быть раньше $1end.\n;older: Начать с самых новых (по умолчанию). Обратите внимание: $1start должно быть позже $1end.",
        "api-help-param-continue": "Когда доступно больше результатов, используйте это для продолжения.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(описание отсутствует)</span>",
+       "api-help-param-maxbytes": "Не может быть длиннее $1 {{PLURAL:$1|байта|байтов}}.",
+       "api-help-param-maxchars": "Не может быть длиннее $1 {{PLURAL:$1|символа|символов}}.",
        "api-help-examples": "Пример{{PLURAL:$1||ы}}:",
        "api-help-permissions": "{{PLURAL:$1|Разрешение|Разрешения}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Гарантируется}}: $2",
        "apierror-blockedfrommail": "Отправка электронной почты была для вас заблокирована.",
        "apierror-blocked": "Редактирование было для вас заблокировано.",
        "apierror-botsnotsupported": "Этот интерфейс не поддерживается для ботов.",
-       "apierror-cannot-async-upload-file": "Параметры <var>async</var> и <var>file</var> не могут применяться вместе. Если вы хотите ассинхронно обработать загруженный файл, сначала загрузите его в тайник (используя параметр <var>stash</var>), а затем опубликуйте этот файл ассинхронно (используя параметры <var>filekey</var> и <var>async</var>).",
+       "apierror-cannot-async-upload-file": "Параметры <var>async</var> и <var>file</var> не могут применяться вместе. Если вы хотите ассинхронно обработать загруженный файл, сначала загрузите его во временное хранилище (используя параметр <var>stash</var>), а затем опубликуйте этот файл ассинхронно (используя параметры <var>filekey</var> и <var>async</var>).",
        "apierror-cannotreauthenticate": "Это действие недоступно, так как ваша личность не может быть подтверждена.",
        "apierror-cannotviewtitle": "У вас нет прав на просмотр $1.",
        "apierror-cantblock-email": "У вас нет прав блокировать участникам отправку электронной почты через интерфейс вики.",
        "apierror-invalidurlparam": "Некорректное значение <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
        "apierror-invaliduser": "Некорректное имя участника «$1».",
        "apierror-invaliduserid": "Некорректный идентификатор участника <var>$1</var>.",
+       "apierror-maxbytes": "Параметр <var>$1</var> не может быть длиннее $2 {{PLURAL:$2|байта|байтов}}",
+       "apierror-maxchars": "Параметр <var>$1</var> не может быть длиннее $2 {{PLURAL:$2|символа|символов}}",
        "apierror-maxlag-generic": "Ожидание сервера базы данных: $1 {{PLURAL:$1|секунда|секунды|секунд}} задержки.",
        "apierror-maxlag": "Ожидание $2: $1 {{PLURAL:$1|секунда|секунды|секунд}} задержки.",
        "apierror-mimesearchdisabled": "Поиск по MIME отключен в жадном режиме.",
        "apierror-mustbeloggedin-generic": "Вы должны быть авторизованы.",
        "apierror-mustbeloggedin-linkaccounts": "Вы должны быть авторизованы для привязывания аккаунтов.",
        "apierror-mustbeloggedin-removeauth": "Вы должны быть авторизованы для удаления аутентификационных данных.",
-       "apierror-mustbeloggedin-uploadstash": "Тайник Ð·Ð°Ð³Ñ\80Ñ\83зки (upload stash) Ð´Ð¾Ñ\81Ñ\82Ñ\83пен только для авторизованных участников.",
+       "apierror-mustbeloggedin-uploadstash": "Ð\92Ñ\80еменное Ñ\85Ñ\80анилиÑ\89е Ð´Ð¾Ñ\81Ñ\82Ñ\83пно только для авторизованных участников.",
        "apierror-mustbeloggedin": "Вы должны быть авторизованы в $1.",
        "apierror-mustbeposted": "Модуль <kbd>$1</kbd> требует запроса POST.",
        "apierror-mustpostparams": "{{PLURAL:$2|Следующий параметр был найден|Следующие параметры были найдены}} в строке запроса, но {{PLURAL:$2|должен|должны}} находиться в теле POST: $1.",
        "apierror-sizediffdisabled": "Подсчёт разницы размеров отключён в жадном режиме.",
        "apierror-spamdetected": "Ваша правка была отклонена, так как содержит спам: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "У вас нет прав, чтобы просматривать результаты этой служебной страницы.",
-       "apierror-stashedfilenotfound": "Невозможно найти файл в тайнике: $1.",
+       "apierror-stashedfilenotfound": "Невозможно найти файл во временном хранилище: $1.",
        "apierror-stashedit-missingtext": "Не найдено содержимого тайника для данного хэша.",
        "apierror-stashfailed-complete": "Загрузка по кусочкам уже завершена, проверьте статус для получения подробной информации.",
        "apierror-stashfailed-nosession": "Не найдено сессии загрузки по кусочкам с заданным ключом.",
-       "apierror-stashfilestorage": "Невозможно сохранить загрузку в тайник: $1",
+       "apierror-stashfilestorage": "Невозможно сохранить файл во временном хранилище: $1",
        "apierror-stashinvalidfile": "Некорректный файл в тайнике.",
        "apierror-stashnosuchfilekey": "Нет такого ключа файла: $1.",
        "apierror-stashpathinvalid": "Ключ файла относится к некорректному формату или сам некорректен: $1.",
        "apierror-stashwrongowner": "Некорректный владелец: $1",
-       "apierror-stashzerolength": "Файл имеет нулевую длину и не может быть сохранён в тайник: $1",
+       "apierror-stashzerolength": "Файл имеет нулевую длину и не может быть сохранён во временное хранилище: $1",
        "apierror-systemblocked": "Вы были заблокированы автоматически MediaWiki.",
        "apierror-templateexpansion-notwikitext": "Раскрытие шаблонов разрешено только для вики-текстового содержимого. $1 использует модель содержимого $2.",
        "apierror-timeout": "Сервер не ответил за ожидаемое время.",
        "apierror-unsupportedrepo": "Локальное хранилище файлов не поддерживает запрос всех изображений.",
        "apierror-upload-filekeyneeded": "Необходимо задать <var>filekey</var>, если <var>offset</var> не ноль.",
        "apierror-upload-filekeynotallowed": "Невозможно обработать <var>filekey</var>, если <var>offset</var> равен 0.",
-       "apierror-upload-inprogress": "Процесс загрузки из тайника уже запущен.",
+       "apierror-upload-inprogress": "Процесс загрузки из временного хранилища уже запущен.",
        "apierror-upload-missingresult": "Нет результатов данных статуса.",
        "apierror-urlparamnormal": "Невозможно нормализовать параметры изображения для $1.",
        "apierror-writeapidenied": "У вас нет прав на редактирование этой вики через API.",
        "apiwarn-badutf8": "Значение, переданное <var>$1</var>, содержит некорректные или ненормализованные данные. Текстовые данные должны быть корректным NFC-нормализованным Юникодом без символов управления C0, кроме HT (\\t), LF (\\n) и CR (\\r).",
        "apiwarn-checktoken-percentencoding": "Проверьте, что символы вроде «+» в токене корректно закодированы %-последовательностями в ссылке.",
        "apiwarn-compare-nocontentmodel": "Модель содержимого не может быть определена, предполагается $1.",
-       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> не поддерживается. Пожалуйста, вместо него используйте <kbd>prop=deletedrevisions</kbd> или <kbd>list=alldeletedrevisions</kbd>.",
+       "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.",
-       "apiwarn-deprecation-login-botpw": "Вход в основной аккаунт через <kbd>action=login</kbd> не поддерживается и может быть отключен без предупреждения. Для продолжения авторизации с <kbd>action=login</kbd>, см.\n[[Special:BotPasswords]]. Для безопасного продолжения использования входа в основной аккаунт, см. <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-botpw": "Вход в основной аккаунт через <kbd>action=login</kbd> устарел и может быть отключен без предупреждения. Для продолжения авторизации с <kbd>action=login</kbd>, см.\n[[Special:BotPasswords]]. Для безопасного продолжения использования входа в основной аккаунт, см. <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "Вход в основной аккаунт через <kbd>action=login</kbd> не поддерживается и может быть отключен без предупреждения. Для безопасной авторизации, см. <kbd>action=clientlogin</kbd>.",
-       "apiwarn-deprecation-login-token": "Запрос токена через <kbd>action=login</kbd> не поддерживается. Вместо этого, см. <kbd>action=query&meta=tokens&type=login</kbd>.",
+       "apiwarn-deprecation-login-token": "Запрос токена через <kbd>action=login</kbd> устарел. Используйте <kbd>action=query&meta=tokens&type=login</kbd>.",
        "apiwarn-deprecation-parameter": "Параметр <var>$1</var> не поддерживается.",
-       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> не поддерживается с MediaWiki 1.28. Используйте <kbd>prop=headhtml</kbd> при создании новых HTML документов, или <kbd>prop=modules|jsconfigvars</kbd> при обновлении документов на стороне клиента.",
-       "apiwarn-deprecation-purge-get": "Использование <kbd>action=purge</kbd> посредством GET не поддерживается. Используйте POST.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> устарело с MediaWiki 1.28. Используйте <kbd>prop=headhtml</kbd> при создании новых HTML документов или <kbd>prop=modules|jsconfigvars</kbd> при обновлении документов на стороне клиента.",
+       "apiwarn-deprecation-purge-get": "Использование <kbd>action=purge</kbd> посредством GET устарело. Используйте POST.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> не поддерживается. Пожалуйста, используйте <kbd>$2</kbd>.",
        "apiwarn-difftohidden": "Невозможно сравнить с r$1: содержимое скрыто.",
        "apiwarn-errorprinterfailed": "Сборщик ошибок упал. Будет совершена повторная попытка без параметров.",
        "apiwarn-tokens-origin": "Токены не могут быть получены, пока не применено правило ограничения домена.",
        "apiwarn-toomanyvalues": "Слишком много значений передано параметру <var>$1</var>. Максимальное число — $2.",
        "apiwarn-truncatedresult": "Результат был усечён, поскольку в противном случае он был бы больше лимита в $1 {{PLURAL:$1|байт|байта|байт}}.",
-       "apiwarn-unclearnowtimestamp": "Передача «$2» в качестве параметра временной метки <var>$1</var> не поддерживается. Если по какой-то причине вы хотите прямо указать текущее время без вычисления его на стороне клиента, используйте <kbd>now</kbd>.",
+       "apiwarn-unclearnowtimestamp": "Передача «$2» в качестве параметра временной метки <var>$1</var> устарело. Если по какой-то причине вы хотите прямо указать текущее время без вычисления его на стороне клиента, используйте <kbd>now</kbd>.",
        "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Нераспознанное значение|Нераспознанные значения}} параметра <var>$1</var>: $2.",
        "apiwarn-unsupportedarray": "Параметр <var>$1</var> использует неподдерживаемый синтаксис массивов PHP.",
        "apiwarn-urlparamwidth": "Значение ширины ($2), переданное в <var>$1urlparam</var>, было проигнорировано в пользу значения ($3), полученного из параметров <var>$1urlwidth</var>/<var>$1urlheight</var>.",
index 1e20082..602c0ac 100644 (file)
@@ -97,17 +97,17 @@ class LCStoreStaticArray implements LCStore {
                $data = $encoded[1];
 
                switch ( $type ) {
-               case 'v':
-                       return $data;
-               case 's':
-                       return unserialize( $data );
-               case 'a':
-                       return array_map( function ( $v ) {
-                               return LCStoreStaticArray::decode( $v );
-                       }, $data );
-               default:
-                       throw new RuntimeException(
-                               'Unable to decode ' . var_export( $encoded, true ) );
+                       case 'v':
+                               return $data;
+                       case 's':
+                               return unserialize( $data );
+                       case 'a':
+                               return array_map( function ( $v ) {
+                                       return LCStoreStaticArray::decode( $v );
+                               }, $data );
+                       default:
+                               throw new RuntimeException(
+                                       'Unable to decode ' . var_export( $encoded, true ) );
                }
        }
 
index b4a8ca8..db1f599 100644 (file)
@@ -39,7 +39,8 @@ class ChangeTags {
                'mw-changed-redirect-target',
                'mw-blank',
                'mw-replace',
-               'mw-rollback'
+               'mw-rollback',
+               'mw-undo',
        ];
 
        /**
index f454bd4..be802f9 100644 (file)
@@ -304,40 +304,40 @@ class SquidPurgeClient {
         */
        protected function processReadBuffer() {
                switch ( $this->readState ) {
-               case 'idle':
-                       return 'done';
-               case 'status':
-               case 'header':
-                       $lines = explode( "\r\n", $this->readBuffer, 2 );
-                       if ( count( $lines ) < 2 ) {
+                       case 'idle':
                                return 'done';
-                       }
-                       if ( $this->readState == 'status' ) {
-                               $this->processStatusLine( $lines[0] );
-                       } else { // header
-                               $this->processHeaderLine( $lines[0] );
-                       }
-                       $this->readBuffer = $lines[1];
-                       return 'continue';
-               case 'body':
-                       if ( $this->bodyRemaining !== null ) {
-                               if ( $this->bodyRemaining > strlen( $this->readBuffer ) ) {
-                                       $this->bodyRemaining -= strlen( $this->readBuffer );
-                                       $this->readBuffer = '';
+                       case 'status':
+                       case 'header':
+                               $lines = explode( "\r\n", $this->readBuffer, 2 );
+                               if ( count( $lines ) < 2 ) {
                                        return 'done';
+                               }
+                               if ( $this->readState == 'status' ) {
+                                       $this->processStatusLine( $lines[0] );
+                               } else { // header
+                                       $this->processHeaderLine( $lines[0] );
+                               }
+                               $this->readBuffer = $lines[1];
+                               return 'continue';
+                       case 'body':
+                               if ( $this->bodyRemaining !== null ) {
+                                       if ( $this->bodyRemaining > strlen( $this->readBuffer ) ) {
+                                               $this->bodyRemaining -= strlen( $this->readBuffer );
+                                               $this->readBuffer = '';
+                                               return 'done';
+                                       } else {
+                                               $this->readBuffer = substr( $this->readBuffer, $this->bodyRemaining );
+                                               $this->bodyRemaining = 0;
+                                               $this->nextRequest();
+                                               return 'continue';
+                                       }
                                } else {
-                                       $this->readBuffer = substr( $this->readBuffer, $this->bodyRemaining );
-                                       $this->bodyRemaining = 0;
-                                       $this->nextRequest();
-                                       return 'continue';
+                                       // No content length, read all data to EOF
+                                       $this->readBuffer = '';
+                                       return 'done';
                                }
-                       } else {
-                               // No content length, read all data to EOF
-                               $this->readBuffer = '';
-                               return 'done';
-                       }
-               default:
-                       throw new MWException( __METHOD__ . ': unexpected state' );
+                       default:
+                               throw new MWException( __METHOD__ . ': unexpected state' );
                }
        }
 
index 1424f33..ed5ec1a 100644 (file)
@@ -125,7 +125,9 @@ class WikiImporter {
                if ( is_callable( $this->mNoticeCallback ) ) {
                        call_user_func( $this->mNoticeCallback, $msg, $params );
                } else { # No ImportReporter -> CLI
-                       echo wfMessage( $msg, $params )->text() . "\n";
+                       // T177997: the command line importers should call setNoticeCallback()
+                       // for their own custom callback to echo the notice
+                       wfDebug( wfMessage( $msg, $params )->text() . "\n" );
                }
        }
 
@@ -543,13 +545,13 @@ class WikiImporter {
                $buffer = "";
                while ( $this->reader->read() ) {
                        switch ( $this->reader->nodeType ) {
-                       case XMLReader::TEXT:
-                       case XMLReader::CDATA:
-                       case XMLReader::SIGNIFICANT_WHITESPACE:
-                               $buffer .= $this->reader->value;
-                               break;
-                       case XMLReader::END_ELEMENT:
-                               return $buffer;
+                               case XMLReader::TEXT:
+                               case XMLReader::CDATA:
+                               case XMLReader::SIGNIFICANT_WHITESPACE:
+                                       $buffer .= $this->reader->value;
+                                       break;
+                               case XMLReader::END_ELEMENT:
+                                       return $buffer;
                        }
                }
 
index c86b824..54a7de8 100644 (file)
        "config-help-tooltip": "feu clic per ampliar",
        "config-nofile": "No s'ha pogut trobar el fitxer «$1». S'ha suprimit?",
        "config-extension-link": "Sabíeu que el vostre wiki permet l'ús d'[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nPodeu navegar les [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions per categoria] o la [https://www.mediawiki.org/wiki/Extension_Matrix matriu d'extensions] per a veure'n una llista sencera.",
+       "config-skins-screenshots": "$1 (captures de pantalla: $2)",
+       "config-screenshot": "captura de pantalla",
        "mainpagetext": "<strong>MediaWiki s'ha instal·lat.</strong>",
        "mainpagedocfooter": "Consulteu la [https://meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar aquest programari wiki.\n\n== Primers passos ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de paràmetres configurables]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ PMF del MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu per a anuncis del MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducció de MediaWiki en la vostra llengua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprengueu com combatre la brossa que pot atacar el vostre wiki]"
 }
index 53abf4b..87d3be3 100644 (file)
@@ -86,6 +86,7 @@
        "config-db-host": "Datu-basearen zerbitzaria:",
        "config-db-host-help": "Zure datu-basearen zerbitzaria beste zerbitzari batean badago, sartu ostalariaren izena edo IP helbidea hemen.\n\nPartekatutako web-ostatua erabiltzen ari bazara, zure ostalaritza-hornitzaileak dokumentazio-ostalariaren izen egokia eman beharko lizuke.\n\nWindows zerbitzari batean instalatzen bazara eta MySQL erabiliz, \"localhost\" agian ez du zerbitzariaren izenerako funtzionatuko. Ez badago, saiatu \"127.0.0.1\" tokiko IP helbideetarako.\n\nPostgreSQL erabiltzen ari bazara, utzi eremu hau hutsik Unix socket bidez konektatzeko.",
        "config-db-host-oracle": "Datu-baseko TNS:",
+       "config-db-host-oracle-help": "Sartu baliozko [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Konekzio izan lokala]; instalazio honetarako tnsnames.ora fitxategia ikusgai egon behar da. <br/> Bezeroen 10g liburutegiak edo berriagoak erabiltzen ari bazara, [http://download.oracle.com/docs/cd/E11882_01/network.112 ere erabil dezakezu. /e10836/naming.htm Konektatzeko erraza] izendatzeko metodoa.",
        "config-db-wiki-settings": "Wiki hau identifikatu",
        "config-db-name": "Datu-base izena:",
        "config-db-name-help": "Aukeratu zure Wikia identifikatzen duen izena.\nEzin dira espazioak eabili.\n\nErabiltzen ari bazara web hosting partekatua, hostin-eko hornitzaileak emango dizu datu-basearen izen espezifikoa edo kontrol panel baten bitzrtez zure datu-basea sortzea utziko dizu.",
        "config-db-schema-help": "Patroi hau normalean egokia da. Bakarrik aldatu beharrezkoa bada.",
        "config-pg-test-error": "Ezin da datu-basearekin konektatu <strong>$1</strong>: $2",
        "config-sqlite-dir": "SQLite -eko informazioaren direktorioa:",
+       "config-sqlite-dir-help": "SQLite-k datu guztiak fitxategi bakarrean gordetzen ditu.\n\nHornitu duzun direktorioa web zerbitzariaren bidez idatzia izateko aukera eman beharko duu instalazioan zehar.\n\n<Strong>Ez</strong> da webgunearen bidez eskuragarri egon behar; horregatik zure PHP fitxategiak non dauden ez dugu erakutsi.\n\nInstalatzaileak <code>.htaccess</code> fitxategi bat idatziko du bertan, baina horrek huts egiten badu zure datu base gordinera norbait sar daiteke.\nErabiltzaileen datu gordinak (helbide elektronikoak, pasahitzak), ezabatutako berrikusketa eta gainontzeko datu mugatuak ere barnean hartuz.\n\nDatu-basea beste nonbait jartzearen inguruan hausnartu, adibidez, <code>/var/lib/mediawiki/yourwiki</code>-n.",
        "config-oracle-def-ts": "Taula-toki lehenetsia:",
        "config-oracle-temp-ts": "Aldi baterako taula:",
        "config-type-mysql": "MySQL (edo bateragarria)",
        "config-postgres-old": "PostgreSQL $1 edo berriagoa behar da. Zuk $2 badaukazu.",
        "config-mssql-old": "Microsoft SQL Server $1 edo berriagoa behar da. Zuk $2 badaukazu.",
        "config-sqlite-name-help": "Aukeratu zure wikia identifikatzen duen izen bat.\nEz erabili zuriunerik edo gidoirik.\nHau erabiliko da SQLite datuen artxiborako.",
+       "config-sqlite-parent-unwritable-group": "Ezin da datu-direktorioa sortu <code><nowiki>$1</nowiki></code>, web zerbitzariak ezin baitu <code><nowiki>$2</nowiki></code> guraso direktorioan idatzi.\n\nInstalatzaileak webgunea exekutatzen ari den bitartean zure erabiltzailea zehaztu du.\nEgin <code><nowiki>$3</nowiki></code> direktorioan idazteko gai izatea jarraitzeko.\nUnix/Linux sistema batean:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "Ezin da datu-direktorioa sortu <code><nowiki>$1</nowiki></code>, web zerbitzariak ezin baitu <code><nowiki>$2</nowiki></code> guraso direktorioan idatzi.\n\nInstalatzaileak webgunea exekutatzen ari den bitartean zure erabiltzailea zehaztu dezake.\nEgin <code><nowiki>$3</nowiki></code> direktorioa globalean idazteko gai izatea (horretarako eta besteentzako!) jarraitzeko.\nUnix/Linux sistema batean:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-sqlite-mkdir-error": "Arazo bat sortu da datuen direktorioa sortzerakoan \"$1\".\nLokalizazio egiaztatu eta berriro saiatu.",
        "config-sqlite-dir-unwritable": "Ezin izan da \"$1\" direktoriora idatzi.\nAldatu baimenak web-serbidoreak idatzi ahal izateko, eta berriro saiatu.",
        "config-sqlite-connection-error": "$1.\n\nDatu direktorioa eta datu-basea egiaztatu eta berriro saiatu.",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "<strong>Oharra:</strong> MyISAM MySQL biltegiratze-motor gisa aukeratu duzu, MediaWikirekin erabiltzeko gomendagarria ez dena honengatik:\n*taula blokeoak direla-eta gauza gutxi onartu ohi du\n*beste motore batzuek baino ustelkeria gehiago izateko aukerak ditu\n*MediaWiki-ren kode baseak ez du beti kudeatzen MyISAM behar bezala\n\nZure MySQL instalazioa InnoDB onartzen badu, hori aukeratzeko gomendatzen da.\nZure MySQL instalazioa InnoDB ez badu onartzen, baliteke bertsioa berritzeko ordua izatea.",
        "config-mysql-only-myisam-dep": "<strong> Oharra: </strong> MyISAM makinaren MySQL biltegiratze motarako bakarra da, eta hau ez da MediaWiki-rekin erabiltzeko gomendatzen, honengatik:\n* maiztasunez taula blokeoek konkurrentzia ez dute onartzen \n* Beste motore batzuek baino ustelkeria gehiago izaten dute\n* MediaWiki-ren kodekak ez du beti kudeatzen MyISAM behar bezala\n\nZure MySQL instalazioak ez du InnoDB onartzen, agian bertsio berritzeko ordua da.",
+       "config-mysql-engine-help": "<strong>InnoDB</strong> ia beti aukerarik onena da, konkurrentzia-laguntza ona duelako.\n\n<strong>MyISAM</strong> erabiltzaile bakarreko edo irakurketa bakarreko instalazioetan azkarragoa izan daiteke.\nMyISAM datu-basea gehiagokotan hondatuta ageri da InnoDB datu-baseareakin baino.",
        "config-mysql-charset": "Datu-basearen karaktere multzoa:",
        "config-mysql-binary": "Bitarra",
        "config-mysql-utf8": "UTF-8",
+       "config-mysql-charset-help": "<strong>Modu bitarrean</strong>, MediaWiki-k UTF-8 testua datu-baseko eremu bitarretan gordetzen du.\nHau MySQL-en UTF-8 modua baino eraginkorragoa da eta Unicode karaktereen barruti osoa erabiltzea ahalbidetzen du.\n\n<Strong>UTF-8 moduan</strong>, MySQL-k jakingo du zer karakterean zure datuak konfiguratzen dituen, aurkeztu eta behar bezala bihurtzeko, baina ez dizkizu karaktereak [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Oinarrizko Eleaniztasun Plana]-ren gainetik gordetzen utziko.",
        "config-mssql-auth": "Autentifikazio mota:",
        "config-mssql-install-auth": "Aukeratu instalazio prozesuan zehar datu-basera konektatzeko erabiliko den autentifikazio mota.\n\"{{Int: config-mssql-windowsauth}}\" hautatzen baduzu, web zerbitzariak duen edozein erabiltzailek erabiliko duen kredentziala erabiliko da.",
        "config-mssql-web-auth": "Aukeratu instalazio prozesuan zehar datu-base zerbitzariari konektatzeko erabiliko den autentifikazio mota.\n\"{{Int: config-mssql-windowsauth}}\" hautatzen baduzu, web zerbitzariak duen edozein erabiltzailek erabiliko duen kredentziala erabiliko da.",
        "config-subscribe-help": "Hau bolumen baxuko oharren iragarkietarako erabiltzen den zerrenda da, segurtasun iragarki garrantzitsuak barne.\nHarpidetu horretara eta zure MediaWiki instalazioa eguneratu bertsio berriak ateratzean.",
        "config-subscribe-noemail": "Ohar iragarkien posta elektroniko zerrendara harpidetzen saiatu zara, helbide elektroniko bat eman gabe.\nEman ezazu helbide elektronikoa posta zerrendan harpidetzea nahi baduzu.",
        "config-pingback": "Elkarbanatu informazioa instalazio prozesuari buruz MediaWiki-ko sustatzaileekin.",
+       "config-pingback-help": "Aukera hau hautatzen baduzu, MediaWiki-k https://www.mediawiki.org guneari periodikoki ping egingo dio MediaWiki-ren instantzia honi buruzko oinarrizko datuekin. Datu horietan, adibidez, sistema mota, PHP bertsioa eta hautatutako datu-base motorra agertzen dira. Wikimedia Fundazioak datu hauek partekatzen dituu MediaWiki garatzaileekin etorkizuneko garapen-ahaleginak gidatzeko. Ondorengo datuak zure sistemara bidaliko dira:\n<pre>$1</pre>",
        "config-almost-done": "Ia amaitu duzu!\nFalta den konfigurazioa saltatu ahal duzu eta zuzenean wikia instalatu.",
        "config-optional-continue": "Galdera gehiago egin.",
        "config-optional-skip": "Aspertuta nago, wikia instalatu bakarrik.",
        "config-profile-no-anon": "Kontua sortzea beharrezkoa da",
        "config-profile-fishbowl": "Baimendutako editoreak bakarrik",
        "config-profile-private": "Wiki pribatua",
+       "config-profile-help": "Wikiak hobeto funtzionatzen dute ahalik eta jende gehiagok editatzeko aukera duenean.\nMediaWikian, erraza da azken aldaketak berrikustea eta erabiltzaile desegokiek egindako kalteak konpontzea.\n\nHala eta guztiz ere, askok MediaWiki rol ezberdinetarako baliagarri ikusi dute, nahiz eta batzuetan erraza ez izan wikiaren onureen inguruan konbentzitzea.\nBeraz, aukera zuk egiten duzu.\n\n<Strong>{{int:config-profile-wiki}}</strong> ereduak edonork edita dezake, nahiz eta saioa hasi.\n<Strong>{{int:config-profile-no-anon}}</strong> -ko wiki batek aparteko erantzukizuna ematen du, baina aldi baterako laguntzaileak alda ditzake.\n\n<Strong>{{int:config-profile-fishbowl}}</strong> planteamenduak aukera ematen du baimendutako erabiltzaileek editatzeko, baina publikoak orrialdeak ikusi ditzake, historiak barne.\n<Strong>{{int:config-profile-private}}</strong> bat soilik onartutako erabiltzaileei orriak ikusteko aukera ematen die, talde berak editatu ahal izateko.\n\nErabiltzaileen eskubideen ezarpen konplexuagoak eskuragarri daude instalazioa egin ondoren, ikus ezazu [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights eskuzko sarrera garrantzitsua].",
        "config-license": "Copyright eta lizentzia:",
        "config-license-none": "Ez jarri lizentzia orriaren baimenik",
        "config-license-cc-by-sa": "Creative Commons-eko esleipen-lizentzia",
        "config-license-cc-by": "Creative Commons Aitorpena",
+       "config-license-cc-by-nc-sa": "Creative Commons Attribution-NonCommercial-ShareAlike",
        "config-license-cc-0": "Creative Commons Zero (Jabari Publikoa)",
        "config-license-gfdl": "\nGNU Free Documentation License 1.3 edo berriagoa",
        "config-license-pd": "Domeinu Askea",
        "config-license-cc-choose": "Aukeratu Creative Commons lizentzia pertsonalizatua",
+       "config-license-help": "Wikilari publiko askok ekarpen guztiak jartzen dituzte [http://freedomdefined.org/Definition lizentzia aske] azpian.\nHonek komunitatearen jabetza zentzuaren kontzeptua sortzen laguntzen du eta epe luzerako ekarpena bultzatzen du.\nEz da, oro har, wiki pribatu edo korporatiborik behar.\n\nWikipediatik testua erabiltzeko aukera izan nahi baduzu eta Wikipediak zure wikietatik kopiatutako testua onartzeko gai izatea nahi baduzu,  <strong>{{int:config-license-cc-by-sa}}</strong> aukeratu beharko zenuke.\n\nWikipedia lehenago erabili izan du GNU Dokumentazio Librearen Lizentzia.\nGFDL baliozko lizentzia da, baina ulertzeko zaila da.\nGFDLren baimenarekin lotutako edukiak berrerabiltzea ere zaila da.",
        "config-email-settings": "E-posta hobespenak",
        "config-enable-email": "Aktibatu irteerako emaila.",
+       "config-enable-email-help": "Lan egiteko email-a nahi baduzu, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] ondo konfiguratu egin behar da. Email ezaugarririk ez baduzu nahi, hemen kendu ditzakezu.",
        "config-email-user": "Aktibatu erabiltzaileen arteko emaila.",
        "config-email-user-help": "Baimena eman erabiltzaileei beraien artean emailak bidaltzeko, lehentasunetan aukera aktibatuta badaukate.",
        "config-email-usertalk": "Aktibatu erabiltzaileen eztabaida orrien jakinarazpena",
        "config-email-auth": "Aktibatu emailaren autentifikazioa.",
        "config-email-auth-help": "Aukera hau aktibatuta badago, erabiltzaileak konfirmatu behar du bere emaila, sortzerakoen edota aldetzerakoan bidali zaion linka erabiltzen.\n\nBakarrik kautotaku emailak gai izango dira beste erabiltzaileen emailak jasotzeko edota jakinarazpen emailak aldatzeko.\n\nAukera hau hautatzea <strong>gomendagarria</strong> da Wiki publikoentzat, emaileen erramintien abusua dela eta.",
        "config-email-sender": "Itzuli helbide elektronikoa:",
+       "config-email-sender-help": "Idatzi helbide elektronikoa bueltan mezuak jasotzeko helbide elektroniko gisa.\nErreboteak bidaliko dira horra.\nPosta-zerbitzari askok gutxienez domeinu izenaren zati bat behar dute baliozkoa izan dadin.",
        "config-upload-settings": "Irudi eta fitxategi igoerak",
        "config-upload-enable": "Fitxategi igoera gaitu",
        "config-upload-help": "Fitxategiak kargatzeak zure zerbitzaria segurtasun arriskuei eragin diezaioke.\nInformazio gehiagorako, irakurri [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security security section] eskuliburuan.\n\nFitxategiak igotzea aktibatzeko, aldatu <code> images </ code> subdirektorio modua MediaWiki-ren erroko direktorioaren azpian, web zerbitzariak honela idatz dezake.\nOndoren, gaitu aukera hau.",
        "config-skins-must-enable-some": "Gutxienez aukeratu behar duzu ikusizko estilo bat aktibatzeko.",
        "config-skins-must-enable-default": "Lehenetsia bezala aukeratu duzun ikusizko estilo aktibatuta egon behar da.",
        "config-install-alreadydone": "<strong>Oharra:</strong>Badirudi MediaWikia instalatu daukazula eta berriz instalatzen saiatzen ari zarela.\n\nMesedez, hurrengo orrian jarraitu",
+       "config-install-begin": "\"{{int:config-continue}}\" sakatuz, MediaWiki instalazioa hasiko duzu.\nAldaketak oraindik egin nahi badituzu, sakatu \"{{int:config-back}}\".",
        "config-install-step-done": "egina",
        "config-install-step-failed": "Huts egin du",
        "config-install-extensions": "Luzapenak barne",
        "config-install-interwiki-exists": "<strong>Oharra:</strong> Interwikiko taula badirudi sarrerak dituela. \nTaula estandarra saltatzen.",
        "config-install-stats": "Estatistikak hasten",
        "config-install-keys": "Gako sekretuak sortzen",
+       "config-insecure-keys": "<strong>Oharra:</strong> ($1) instalazioan zehar sortu {{PLURAL:$2|den|diren}} {{PLURAL:$2|gako segurua|gako seguruak}}ez d(ir)a guztiz segurua(k). Kontuan hartu {{PLURAL:$2|hau|hauek}} eskuz aldatzeko aukera.",
        "config-install-updates": "Saihestu egikaratzen behar ez diren aktualizazioak",
        "config-install-updates-failed": "<strong>Errore</strong> Sartzea eguneratze-gakoak taulen barruan huts egin du hurrengo errorearekin: $1",
        "config-install-sysop": "Administratzaile kontua sortzen",
        "config-install-mainpage-failed": "Orri nagusia ezin izan da txertatu: $1",
        "config-install-done": "<strong>Zorionak!</strong>\nMediaWiki instalatu duzu.\n\nInstalatzaileak <code>LocalSettings.php</code> fitxategia sortu egin du. \nZure konfigurazio guztia darama.\n\nDeskargatu egin beharko duzu eta zure wiki instalazio oinarrian jarri (index.php-rako direktorio berean). Deskarga automakikoki hasi behar izan da.\n\nDeskargatzeko aukerarik ez bazaizu eskaini, edo kantzelatu egin baduzu, hurrengo linkean klikatu berrabiarazteko deskarga:\n\n$3\n\n<strong>Oharra:</strong> Orain ez baduzu egiten, sortutako konfigurazio fitxategi hau ez da erabilgarri egongo geroago instalazioa bertan behera uzten baduzu deskargatu gabe.\n\nBehin hori eginda, <strong>[$2 zure wikia sartu]</strong> ahal duzu.",
        "config-install-done-path": "<strong>Zorionak!</strong>\nMediaWiki instalatu duzu.\n\nInstalatzaileak sortu egin du <code>LocalSettings.php</code>\nZure konfigurazio guztia dauka.\n\nDeskargatu egin behar duzu eta jarri <code>$4</code> -ean . Deskarga automakikoki hasiko da.\n\nEz badizu deskargatzeko aukerarik eman, edo kantzalatu egin baduzu, hurrengo linkean klikatu berrabiatzeko:\n\n$3\n\n<strong>Oharra:</strong> Instalazio prozesuatik ateratzen bazara konfigurazio artxikoa deskargatu barik, gero ez da egongo eskuragarri.\n\nBehin hori eginda, <strong>[$2 enter your wiki]</strong> ahal duzu.",
+       "config-install-success": "MediaWiki arrakastaz instalatu da. Orain <$1$2> bisitatu dezakezu zure wikia ikusteko.\nGalderarik izanez gero, begiratu gure maiztasunez egiten diren galderen zerrenda:\n<https://www.mediawiki.org/wiki/Manual:FAQ> edo erabili orrialde honi lotuta dauden laguntza foroetako bat.",
        "config-download-localsettings": "Jaitsi <code>LocalSettings.php</code>",
        "config-help": "Laguntza",
        "config-help-tooltip": "sakatu zabaltzeko",
index 6185ef4..66c86b8 100644 (file)
        "config-install-mainpage-failed": "Het was niet mogelijk de hoofdpagina in te voegen: $1",
        "config-install-done": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsen, in dezelfde map als index.php.\nDe download zou automatisch moeten zijn gestart.\n\nAls de download niet is gestart of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
        "config-install-done-path": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in <code>$4</code> plaatsen. De download zou automatisch moeten zijn gestart.\n\nAls de download niet is gestart of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> Als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
+       "config-install-success": "MediaWiki is geïnstalleerd. U kunt nu\n<$1$2> bezoeken om uw wiki te bekijken.\nAls u vragen heeft, bezoek dan onze lijst met veelgestelde vragen:\n<https://www.mediawiki.org/wiki/Manual:FAQ>, of gebruik een van de hulpforums vermeldt op die pagina.",
        "config-download-localsettings": "<code>LocalSettings.php</code> downloaden",
        "config-help": "hulp",
        "config-help-tooltip": "klik om uit te vouwen",
index a19dbc3..7d2ab8f 100644 (file)
        "config-install-mainpage-failed": "Nie udało się wstawić strony głównej: $1",
        "config-install-done": "<strong>'''Gratulacje!</strong>\nUdało Ci się zainstalować MediaWiki.\n\nInstalator wygenerował plik konfiguracyjny <code>LocalSettings.php</code>.\n\nMusisz go pobrać i umieścić w katalogu głównym Twojej instalacji wiki (tym samym katalogu co index.php). Pobieranie powinno zacząć się automatycznie.\n\nJeżeli pobieranie nie zostało zaproponowane lub jeśli użytkownik je anulował, można ponownie uruchomić pobranie klikając poniższe łącze:\n\n$3\n\n<strong>Uwaga</strong>: Jeśli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.\n\nPo załadowaniu pliku konfiguracyjnego możesz <strong>[$2 wejść na wiki]</strong>.",
        "config-install-done-path": "<strong>Gratulacje!</strong>\nZainstalowałeś właśnie MediaWiki.\n\nInstalator wygenerował plik <code>LocalSettings.php</code>.\nZawiera całą Twoją konfigurację.\n\nMusisz go pobrać i umieścić w <code>$4</code>. Pobieranie powinno rozpocząć się automatycznie.\n\nJeżeli nie pojawiła się informacja o pobieraniu lub jeżeli ja anulowałeś, kliknij poniższy link:\n\n$3\n\n<strong>Uwaga:</strong> Jeżeli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie potem dostępny, jeżeli wyjdziesz z instalacji bez jego pobrania.\n\nGdy to będzie zrobione, możesz <strong>[$2 wejść na swoją wiki]</strong>.",
+       "config-install-success": "MediaWiki została pomyślnie zainstalowana. Możesz teraz\nodwiedzić <$1$2>, aby zobaczyć swoją wiki.\nJeśli masz pytania, sprawdź naszą listę najczęściej zadawanych pytań:\n<https://www.mediawiki.org/wiki/Manual:FAQ> lub użyj jednej z\nform wsparcia odsyłanej z tej strony.",
        "config-download-localsettings": "Pobierz <code>LocalSettings.php</code>",
        "config-help": "pomoc",
        "config-help-tooltip": "kliknij, aby rozwinąć",
        "config-nofile": "Nie udało się odnaleźć pliku \"$1\". Czy nie został usunięty?",
        "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozszerzenia]?\n\nMożesz przejrzeć [https://www.mediawiki.org/wiki/Category:Extensions_by_category rozszerzenia według kategorii] lub [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix], aby zobaczyć pełną listę rozszerzeń.",
+       "config-skins-screenshots": "$1 (zrzut ekranu: $2)",
        "config-screenshot": "zrzut ekranu",
        "mainpagetext": "<strong>Instalacja MediaWiki powiodła się.</strong>",
        "mainpagedocfooter": "Zapoznaj się z [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Podręcznikiem użytkownika] zawierającym informacje o tym jak korzystać z oprogramowania wiki.\n\n== Na początek ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista ustawień konfiguracyjnych]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki (lista dyskusyjna)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Dowiedz się, jak walczyć ze spamem na swojej wiki]"
index 5f3db68..d455fe1 100644 (file)
@@ -19,7 +19,8 @@
                        "Diniscoelho",
                        "Ruila",
                        "Seb35",
-                       "MokaAkashiyaPT"
+                       "MokaAkashiyaPT",
+                       "Athena in Wonderland"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
@@ -71,7 +72,7 @@
        "config-no-db": "Não foi possível encontrar um controlador apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Aviso:</strong> Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso:</strong> O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
-       "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
+       "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO seu binário PHP foi linkado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
        "config-pcre-no-utf8": "'''Erro fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
        "config-memory-bad": "<strong>Aviso:</strong> A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
-       "config-support-info": "O MediaWiki suporta as seguintes plataformas de base de dados:\n\n$1\n\nSe a plataforma que pretende usar não está listada abaixo, siga as instruções nos links acima para ativar o suporte.",
+       "config-support-info": "O MediaWiki suporta as seguintes plataformas de base de dados:\n\n$1\n\nSe a plataforma que pretende usar não está listada abaixo, siga as instruções nas hiperligações acima para ativar o suporte.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] é a plataforma primária do MediaWiki e é a melhor suportada. O MediaWiki também trabalha com [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], que são compatíveis com MySQL. ([http://www.php.net/manual/en/mysql.installation.php Como compilar PHP com suporte a MySQL])",
        "config-dbsupport-postgres": "* O [{{int:version-db-postgres-url}} PostgreSQL] é uma plataforma popular de base de dados de código aberto, alternativa ao MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Como compilar o PHP com suporte PostgreSQL])",
        "config-dbsupport-sqlite": "* O [{{int:version-db-sqlite-url}} SQLite] é uma plataforma de base de dados ligeira muito bem suportada. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP com suporte SQLite], usa PDO)",
        "config-email-watchlist": "Ativar notificação de alterações às páginas vigiadas",
        "config-email-watchlist-help": "Permitir que os utilizadores recebam notificações de alterações às suas páginas vigiadas, se tiverem ativado esta funcionalidade nas suas preferências.",
        "config-email-auth": "Ativar autenticação do correio eletrónico",
-       "config-email-auth-help": "Se esta opção for ativada, os utilizadores têm de confirmar o seu endereço de correio eletrónico usando um link que lhes é enviado sempre que o definirem ou alterarem.\nSó os endereços de correio eletrónico autenticados podem receber mensagens eletrónicas dos outros utilizadores ou alterar as mensagens de notificação.\nÉ '''recomendado''' que esta opção seja ativada nas wikis de acesso público para impedir o uso abusivo das funcionalidades de correio eletrónico.",
+       "config-email-auth-help": "Se esta opção for ativada, os utilizadores têm de confirmar o seu endereço de correio eletrónico usando uma hiperligação que lhes é enviada sempre que o definirem ou alterarem.\nSó os endereços de correio eletrónico autenticados podem receber mensagens eletrónicas dos outros utilizadores ou alterar as mensagens de notificação.\nÉ '''recomendado''' que esta opção seja ativada nas wikis de acesso público para impedir o uso abusivo das funcionalidades de correio eletrónico.",
        "config-email-sender": "Endereço de correio eletrónico de retorno:",
        "config-email-sender-help": "Introduza o endereço de correio eletrónico que será usado como endereço de retorno nas mensagens eletrónicas de saída.\nÉ para este endereço que serão enviadas as mensagens que não podem ser entregues.\nMuitos servidores de correio eletrónico exigem que pelo menos a parte do nome do domínio seja válida. \\",
        "config-upload-settings": "Carregamento de imagens e ficheiros",
        "config-install-tables": "A criar as tabelas",
        "config-install-tables-exist": "<strong>Aviso:</strong> As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será saltada.",
        "config-install-tables-failed": "<strong>Erro:</strong> A criação das tabelas falhou com o seguinte erro: $1",
-       "config-install-interwiki": "A preencher a tabela padrão de links interwikis",
+       "config-install-interwiki": "A preencher a tabela padrão de hiperligações interwikis",
        "config-install-interwiki-list": "Não foi possível ler o ficheiro <code>interwiki.list</code>.",
        "config-install-interwiki-exists": "<strong>Aviso:</strong> A tabela de interwikis parece já conter entradas.\nO preenchimento padrão desta tabela será saltado.",
        "config-install-stats": "A inicializar as estatísticas",
        "config-install-mainpage-exists": "A página principal já existe; a saltar este passo",
        "config-install-extension-tables": "A criar as tabelas das extensões ativadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
-       "config-install-done": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de descarregar o ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Este descarregamento deverá ter sido iniciado automaticamente.\n\nSe o descarregamento não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não o descarregar agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
+       "config-install-done": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de descarregar o ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Este descarregamento deverá ter sido iniciado automaticamente.\n\nSe o descarregamento não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando na hiperligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não o descarregar agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
        "config-install-done-path": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de descarregar o ficheiro e colocá-lo no diretório <code>$4</code>. Este descarregamento deverá ter sido iniciado automaticamente.\n\nSe o descarregamento não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer o descarregamento agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
        "config-install-success": "O MediaWiki foi instalado com sucesso. Já pode consultar <$1$2> para visualizar a sua wiki.\nSe tiver dúvidas, veja a nossa lista de perguntas frequentes:\n<https://www.mediawiki.org/wiki/Manual:FAQ/pt> ou utilize um dos fóruns de suporte vinculados nessa página.",
        "config-download-localsettings": "Descarregar <code>LocalSettings.php</code>",
index 141a515..bbba33a 100644 (file)
@@ -74,11 +74,10 @@ class JavaScriptMinifier {
         *       or when required to guard against semicolon insertion.
         *
         * @param string $s JavaScript code to minify
-        * @param bool $statementsOnOwnLine Whether to put each statement on its own line
         * @param int $maxLineLength Maximum length of a single line, or -1 for no maximum.
         * @return String Minified code
         */
-       public static function minify( $s, $statementsOnOwnLine = false, $maxLineLength = 1000 ) {
+       public static function minify( $s, $maxLineLength = 1000 ) {
                // First we declare a few tables that contain our parsing rules
 
                // $opChars : characters, which can be combined without whitespace in between them
@@ -387,23 +386,6 @@ class JavaScriptMinifier {
                        )
                );
 
-               // Rules for when newlines should be inserted if
-               // $statementsOnOwnLine is enabled.
-               // $newlineBefore is checked before switching state,
-               // $newlineAfter is checked after
-               $newlineBefore = array(
-                       self::STATEMENT => array(
-                               self::TYPE_BRACE_CLOSE => true,
-                       ),
-               );
-               $newlineAfter = array(
-                       self::STATEMENT => array(
-                               self::TYPE_BRACE_OPEN => true,
-                               self::TYPE_PAREN_CLOSE => true,
-                               self::TYPE_SEMICOLON => true,
-                       ),
-               );
-
                // $divStates : Contains all states that can be followed by a division operator
                $divStates = array(
                        self::EXPRESSION_OP          => true,
@@ -467,18 +449,24 @@ class JavaScriptMinifier {
                        // We have to distinguish between regexp literals and division operators
                        // A division operator is only possible in certain states
                        } elseif( $ch === '/' && !isset( $divStates[$state] ) ) {
-                               // Regexp literal, search to the end, skipping over backslash escapes and
-                               // character classes
+                               // Regexp literal
                                for( ; ; ) {
                                        do{
+                                               // Skip until we find "/" (end of regexp), "\" (backslash escapes),
+                                               // or "[" (start of character classes).
                                                $end += strcspn( $s, '/[\\', $end ) + 2;
+                                               // If backslash escape, keep searching...
                                        } while( $end - 2 < $length && $s[$end - 2] === '\\' );
                                        $end--;
+                                       // If the end, stop here.
                                        if( $end - 1 >= $length || $s[$end - 1] === '/' ) {
                                                break;
                                        }
+                                       // (Implicit else), we must've found the start of a char class,
+                                       // skip until we find "]" (end of char class), or "\" (backslash escape)
                                        do{
                                                $end += strcspn( $s, ']\\', $end ) + 2;
+                                               // If backslash escape, keep searching...
                                        } while( $end - 2 < $length && $s[$end - 2] === '\\' );
                                        $end--;
                                };
@@ -580,15 +568,6 @@ class JavaScriptMinifier {
                        $pos = $end;
                        $newlineFound = false;
 
-                       // Output a newline after the token if required
-                       // This is checked before AND after switching state
-                       $newlineAdded = false;
-                       if ( $statementsOnOwnLine && !$newlineAdded && isset( $newlineBefore[$state][$type] ) ) {
-                               $out .= "\n";
-                               $lineLength = 0;
-                               $newlineAdded = true;
-                       }
-
                        // Now that we have output our token, transition into the new state.
                        if( isset( $push[$state][$type] ) && count( $stack ) < self::STACK_LIMIT ) {
                                $stack[] = $push[$state][$type];
@@ -598,12 +577,6 @@ class JavaScriptMinifier {
                        } elseif( isset( $goto[$state][$type] ) ) {
                                $state = $goto[$state][$type];
                        }
-
-                       // Check for newline insertion again
-                       if ( $statementsOnOwnLine && !$newlineAdded && isset( $newlineAfter[$state][$type] ) ) {
-                               $out .= "\n";
-                               $lineLength = 0;
-                       }
                }
                return $out;
        }
index a9da366..be7e93d 100644 (file)
@@ -53,137 +53,137 @@ class MWMessagePack {
                }
 
                switch ( gettype( $value ) ) {
-               case 'NULL':
-                       return "\xC0";
+                       case 'NULL':
+                               return "\xC0";
 
-               case 'boolean':
-                       return $value ? "\xC3" : "\xC2";
+                       case 'boolean':
+                               return $value ? "\xC3" : "\xC2";
 
-               case 'double':
-               case 'float':
-                       return self::$bigendian
-                               ? "\xCB" . pack( 'd', $value )
-                               : "\xCB" . strrev( pack( 'd', $value ) );
+                       case 'double':
+                       case 'float':
+                               return self::$bigendian
+                                       ? "\xCB" . pack( 'd', $value )
+                                       : "\xCB" . strrev( pack( 'd', $value ) );
 
-               case 'string':
-                       $length = strlen( $value );
-                       if ( $length < 32 ) {
-                               return pack( 'Ca*', 0xA0 | $length, $value );
-                       } elseif ( $length <= 0xFFFF ) {
-                               return pack( 'Cna*', 0xDA, $length, $value );
-                       } elseif ( $length <= 0xFFFFFFFF ) {
-                               return pack( 'CNa*', 0xDB, $length, $value );
-                       }
-                       throw new InvalidArgumentException( __METHOD__
-                               . ": string too long (length: $length; max: 4294967295)" );
-
-               case 'integer':
-                       if ( $value >= 0 ) {
-                               if ( $value <= 0x7F ) {
-                                       // positive fixnum
-                                       return chr( $value );
-                               }
-                               if ( $value <= 0xFF ) {
-                                       // uint8
-                                       return pack( 'CC', 0xCC, $value );
-                               }
-                               if ( $value <= 0xFFFF ) {
-                                       // uint16
-                                       return pack( 'Cn', 0xCD, $value );
-                               }
-                               if ( $value <= 0xFFFFFFFF ) {
-                                       // uint32
-                                       return pack( 'CN', 0xCE, $value );
-                               }
-                               if ( $value <= 0xFFFFFFFFFFFFFFFF ) {
-                                       // uint64
-                                       $hi = ( $value & 0xFFFFFFFF00000000 ) >> 32;
-                                       $lo = $value & 0xFFFFFFFF;
-                                       return self::$bigendian
-                                               ? pack( 'CNN', 0xCF, $lo, $hi )
-                                               : pack( 'CNN', 0xCF, $hi, $lo );
-                               }
-                       } else {
-                               if ( $value >= -32 ) {
-                                       // negative fixnum
-                                       return pack( 'c', $value );
-                               }
-                               if ( $value >= -0x80 ) {
-                                       // int8
-                                       return pack( 'Cc', 0xD0, $value );
-                               }
-                               if ( $value >= -0x8000 ) {
-                                       // int16
-                                       $p = pack( 's', $value );
-                                       return self::$bigendian
-                                               ? pack( 'Ca2', 0xD1, $p )
-                                               : pack( 'Ca2', 0xD1, strrev( $p ) );
-                               }
-                               if ( $value >= -0x80000000 ) {
-                                       // int32
-                                       $p = pack( 'l', $value );
-                                       return self::$bigendian
-                                               ? pack( 'Ca4', 0xD2, $p )
-                                               : pack( 'Ca4', 0xD2, strrev( $p ) );
-                               }
-                               if ( $value >= -0x8000000000000000 ) {
-                                       // int64
-                                       // pack() does not support 64-bit ints either so pack into two 32-bits
-                                       $p1 = pack( 'l', $value & 0xFFFFFFFF );
-                                       $p2 = pack( 'l', ( $value >> 32 ) & 0xFFFFFFFF );
-                                       return self::$bigendian
-                                               ? pack( 'Ca4a4', 0xD3, $p1, $p2 )
-                                               : pack( 'Ca4a4', 0xD3, strrev( $p2 ), strrev( $p1 ) );
+                       case 'string':
+                               $length = strlen( $value );
+                               if ( $length < 32 ) {
+                                       return pack( 'Ca*', 0xA0 | $length, $value );
+                               } elseif ( $length <= 0xFFFF ) {
+                                       return pack( 'Cna*', 0xDA, $length, $value );
+                               } elseif ( $length <= 0xFFFFFFFF ) {
+                                       return pack( 'CNa*', 0xDB, $length, $value );
                                }
-                       }
-                       throw new InvalidArgumentException( __METHOD__ . ": invalid integer '$value'" );
-
-               case 'array':
-                       $buffer = '';
-                       $length = count( $value );
-                       if ( $length > 0xFFFFFFFF ) {
                                throw new InvalidArgumentException( __METHOD__
-                                       . ": array too long (length: $length, max: 4294967295)" );
-                       }
+                                       . ": string too long (length: $length; max: 4294967295)" );
 
-                       $index = 0;
-                       foreach ( $value as $k => $v ) {
-                               if ( $index !== $k || $index === $length ) {
-                                       break;
+                       case 'integer':
+                               if ( $value >= 0 ) {
+                                       if ( $value <= 0x7F ) {
+                                               // positive fixnum
+                                               return chr( $value );
+                                       }
+                                       if ( $value <= 0xFF ) {
+                                               // uint8
+                                               return pack( 'CC', 0xCC, $value );
+                                       }
+                                       if ( $value <= 0xFFFF ) {
+                                               // uint16
+                                               return pack( 'Cn', 0xCD, $value );
+                                       }
+                                       if ( $value <= 0xFFFFFFFF ) {
+                                               // uint32
+                                               return pack( 'CN', 0xCE, $value );
+                                       }
+                                       if ( $value <= 0xFFFFFFFFFFFFFFFF ) {
+                                               // uint64
+                                               $hi = ( $value & 0xFFFFFFFF00000000 ) >> 32;
+                                               $lo = $value & 0xFFFFFFFF;
+                                               return self::$bigendian
+                                                       ? pack( 'CNN', 0xCF, $lo, $hi )
+                                                       : pack( 'CNN', 0xCF, $hi, $lo );
+                                       }
                                } else {
-                                       $index++;
+                                       if ( $value >= -32 ) {
+                                               // negative fixnum
+                                               return pack( 'c', $value );
+                                       }
+                                       if ( $value >= -0x80 ) {
+                                               // int8
+                                               return pack( 'Cc', 0xD0, $value );
+                                       }
+                                       if ( $value >= -0x8000 ) {
+                                               // int16
+                                               $p = pack( 's', $value );
+                                               return self::$bigendian
+                                                       ? pack( 'Ca2', 0xD1, $p )
+                                                       : pack( 'Ca2', 0xD1, strrev( $p ) );
+                                       }
+                                       if ( $value >= -0x80000000 ) {
+                                               // int32
+                                               $p = pack( 'l', $value );
+                                               return self::$bigendian
+                                                       ? pack( 'Ca4', 0xD2, $p )
+                                                       : pack( 'Ca4', 0xD2, strrev( $p ) );
+                                       }
+                                       if ( $value >= -0x8000000000000000 ) {
+                                               // int64
+                                               // pack() does not support 64-bit ints either so pack into two 32-bits
+                                               $p1 = pack( 'l', $value & 0xFFFFFFFF );
+                                               $p2 = pack( 'l', ( $value >> 32 ) & 0xFFFFFFFF );
+                                               return self::$bigendian
+                                                       ? pack( 'Ca4a4', 0xD3, $p1, $p2 )
+                                                       : pack( 'Ca4a4', 0xD3, strrev( $p2 ), strrev( $p1 ) );
+                                       }
                                }
-                       }
-                       $associative = $index !== $length;
+                               throw new InvalidArgumentException( __METHOD__ . ": invalid integer '$value'" );
 
-                       if ( $associative ) {
-                               if ( $length < 16 ) {
-                                       $buffer .= pack( 'C', 0x80 | $length );
-                               } elseif ( $length <= 0xFFFF ) {
-                                       $buffer .= pack( 'Cn', 0xDE, $length );
-                               } else {
-                                       $buffer .= pack( 'CN', 0xDF, $length );
+                       case 'array':
+                               $buffer = '';
+                               $length = count( $value );
+                               if ( $length > 0xFFFFFFFF ) {
+                                       throw new InvalidArgumentException( __METHOD__
+                                               . ": array too long (length: $length, max: 4294967295)" );
                                }
+
+                               $index = 0;
                                foreach ( $value as $k => $v ) {
-                                       $buffer .= self::pack( $k );
-                                       $buffer .= self::pack( $v );
+                                       if ( $index !== $k || $index === $length ) {
+                                               break;
+                                       } else {
+                                               $index++;
+                                       }
                                }
-                       } else {
-                               if ( $length < 16 ) {
-                                       $buffer .= pack( 'C', 0x90 | $length );
-                               } elseif ( $length <= 0xFFFF ) {
-                                       $buffer .= pack( 'Cn', 0xDC, $length );
+                               $associative = $index !== $length;
+
+                               if ( $associative ) {
+                                       if ( $length < 16 ) {
+                                               $buffer .= pack( 'C', 0x80 | $length );
+                                       } elseif ( $length <= 0xFFFF ) {
+                                               $buffer .= pack( 'Cn', 0xDE, $length );
+                                       } else {
+                                               $buffer .= pack( 'CN', 0xDF, $length );
+                                       }
+                                       foreach ( $value as $k => $v ) {
+                                               $buffer .= self::pack( $k );
+                                               $buffer .= self::pack( $v );
+                                       }
                                } else {
-                                       $buffer .= pack( 'CN', 0xDD, $length );
-                               }
-                               foreach ( $value as $v ) {
-                                       $buffer .= self::pack( $v );
+                                       if ( $length < 16 ) {
+                                               $buffer .= pack( 'C', 0x90 | $length );
+                                       } elseif ( $length <= 0xFFFF ) {
+                                               $buffer .= pack( 'Cn', 0xDC, $length );
+                                       } else {
+                                               $buffer .= pack( 'CN', 0xDD, $length );
+                                       }
+                                       foreach ( $value as $v ) {
+                                               $buffer .= self::pack( $v );
+                                       }
                                }
-                       }
-                       return $buffer;
+                               return $buffer;
 
-               default:
-                       throw new InvalidArgumentException( __METHOD__ . ': unsupported type ' . gettype( $value ) );
+                       default:
+                               throw new InvalidArgumentException( __METHOD__ . ': unsupported type ' . gettype( $value ) );
                }
        }
 }
index ea7f9a6..9761108 100644 (file)
@@ -479,23 +479,23 @@ class XmlTypeCheck {
                                continue;
                        }
                        switch ( $field ) {
-                       case 'typepublic':
-                       case 'typesystem':
-                               $parsed['type'] = $value;
-                               break;
-                       case 'pubquote':
-                       case 'pubapos':
-                               $parsed['publicid'] = $value;
-                               break;
-                       case 'pubsysquote':
-                       case 'pubsysapos':
-                       case 'sysquote':
-                       case 'sysapos':
-                               $parsed['systemid'] = $value;
-                               break;
-                       case 'internal':
-                               $parsed['internal'] = $value;
-                               break;
+                               case 'typepublic':
+                               case 'typesystem':
+                                       $parsed['type'] = $value;
+                                       break;
+                               case 'pubquote':
+                               case 'pubapos':
+                                       $parsed['publicid'] = $value;
+                                       break;
+                               case 'pubsysquote':
+                               case 'pubsysapos':
+                               case 'sysquote':
+                               case 'sysapos':
+                                       $parsed['systemid'] = $value;
+                                       break;
+                               case 'internal':
+                                       $parsed['internal'] = $value;
+                                       break;
                        }
                }
                return $parsed;
index ac28076..562819e 100644 (file)
@@ -900,6 +900,40 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *     );
         * @endcode
         *
+        * Example usage (key holding an LRU subkey:value map; this can avoid flooding cache with
+        * keys for an unlimited set of (constraint,situation) pairs, thereby avoiding elevated
+        * cache evictions and wasted memory):
+        * @code
+        *     $catSituationTolerabilityCache = $this->cache->getWithSetCallback(
+        *         // Group by constraint ID/hash, cat family ID/hash, or something else useful
+        *         $this->cache->makeKey( 'cat-situation-tolerablity-checks', $groupKey ),
+        *         WANObjectCache::TTL_DAY, // rarely used groups should fade away
+        *         // The $scenarioKey format is $constraintId:<ID/hash of $situation>
+        *         function ( $cacheMap ) use ( $scenarioKey, $constraintId, $situation ) {
+        *             $lruCache = MapCacheLRU::newFromArray( $cacheMap ?: [], self::CACHE_SIZE );
+        *             $result = $lruCache->get( $scenarioKey ); // triggers LRU bump if present
+        *             if ( $result === null || $this->isScenarioResultExpired( $result ) ) {
+        *                 $result = $this->checkScenarioTolerability( $constraintId, $situation );
+        *                 $lruCache->set( $scenarioKey, $result, 3 / 8 );
+        *             }
+        *             // Save the new LRU cache map and reset the map's TTL
+        *             return $lruCache->toArray();
+        *         },
+        *         [
+        *             // Once map is > 1 sec old, consider refreshing
+        *             'ageNew' => 1,
+        *             // Update within 5 seconds after "ageNew" given a 1hz cache check rate
+        *             'hotTTR' => 5,
+        *             // Avoid querying cache servers multiple times in a request; this also means
+        *             // that a request can only alter the value of any given constraint key once
+        *             'pcTTL' => WANObjectCache::TTL_PROC_LONG
+        *         ]
+        *     );
+        *     $tolerability = isset( $catSituationTolerabilityCache[$scenarioKey] )
+        *         ? $catSituationTolerabilityCache[$scenarioKey]
+        *         : $this->checkScenarioTolerability( $constraintId, $situation );
+        * @endcode
+        *
         * @see WANObjectCache::get()
         * @see WANObjectCache::set()
         *
@@ -1340,8 +1374,8 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * This works the same as getWithSetCallback() except:
         *   - a) The $keys argument expects the result of WANObjectCache::makeMultiKeys()
         *   - b) The $callback argument expects a callback returning a map of (ID => new value)
-        *        for all entity IDs in $regenById and it takes the following arguments:
-        *          - $ids: a list of entity IDs to regenerate
+        *        for all entity IDs in $ids and it takes the following arguments:
+        *          - $ids: a list of entity IDs that require cache regeneration
         *          - &$ttls: a reference to the (entity ID => new TTL) map
         *          - &$setOpts: a reference to options for set() which can be altered
         *   - c) The return value is a map of (cache key => value) in the order of $keyedIds
@@ -1678,7 +1712,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *                 $ttl = ( $newList === $oldValue )
         *                     // No change: cache for 150% of the age of $oldValue
         *                     ? $cache->adaptiveTTL( $oldAsOf, $maxTTL, $minTTL, 1.5 )
-        *                     // Changed: cache for %50 of the age of $oldValue
+        *                     // Changed: cache for 50% of the age of $oldValue
         *                     : $cache->adaptiveTTL( $oldAsOf, $maxTTL, $minTTL, .5 );
         *             }
         *
index 7f0718c..15e02ad 100644 (file)
@@ -908,6 +908,12 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                if ( $isWrite ) {
+                       if ( $this->getLBInfo( 'replica' ) === true ) {
+                               throw new DBError(
+                                       $this,
+                                       'Write operations are not allowed on replica database connections.'
+                               );
+                       }
                        # In theory, non-persistent writes are allowed in read-only mode, but due to things
                        # like https://bugs.mysql.com/bug.php?id=33669 that might not work anyway...
                        $reason = $this->getReadOnlyReason();
index ac39e6f..617a910 100644 (file)
@@ -112,14 +112,14 @@ class BitmapHandler extends TransformationalImageHandler {
         */
        protected function imageMagickSubsampling( $pixelFormat ) {
                switch ( $pixelFormat ) {
-               case 'yuv444':
-                       return [ '1x1', '1x1', '1x1' ];
-               case 'yuv422':
-                       return [ '2x1', '1x1', '1x1' ];
-               case 'yuv420':
-                       return [ '2x2', '1x1', '1x1' ];
-               default:
-                       throw new MWException( 'Invalid pixel format for JPEG output' );
+                       case 'yuv444':
+                               return [ '1x1', '1x1', '1x1' ];
+                       case 'yuv422':
+                               return [ '2x1', '1x1', '1x1' ];
+                       case 'yuv420':
+                               return [ '2x2', '1x1', '1x1' ];
+                       default:
+                               throw new MWException( 'Invalid pixel format for JPEG output' );
                }
        }
 
index c419524..3587eba 100644 (file)
@@ -162,18 +162,17 @@ class XCFHandler extends BitmapHandler {
                        // Unclear from base media type if it has an alpha layer,
                        // so just assume that it does since it "potentially" could.
                        switch ( $header['base_type'] ) {
-                       case 0:
-                               $metadata['colorType'] = 'truecolour-alpha';
-                               break;
-                       case 1:
-                               $metadata['colorType'] = 'greyscale-alpha';
-                               break;
-                       case 2:
-                               $metadata['colorType'] = 'index-coloured';
-                               break;
-                       default:
-                               $metadata['colorType'] = 'unknown';
-
+                               case 0:
+                                       $metadata['colorType'] = 'truecolour-alpha';
+                                       break;
+                               case 1:
+                                       $metadata['colorType'] = 'greyscale-alpha';
+                                       break;
+                               case 2:
+                                       $metadata['colorType'] = 'index-coloured';
+                                       break;
+                               default:
+                                       $metadata['colorType'] = 'unknown';
                        }
                } else {
                        // Marker to prevent repeated attempted extraction
index c03d6b2..0ef038f 100644 (file)
@@ -176,44 +176,32 @@ class PageArchive {
         * @return ResultWrapper
         */
        public function listRevisions() {
-               $dbr = wfGetDB( DB_REPLICA );
-               $commentQuery = CommentStore::newKey( 'ar_comment' )->getJoin();
-
-               $tables = [ 'archive' ] + $commentQuery['tables'];
-
-               $fields = [
-                       'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
-                       'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
-                       'ar_page_id'
-               ] + $commentQuery['fields'];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               $conds = [ 'ar_namespace' => $this->title->getNamespace(),
-                       'ar_title' => $this->title->getDBkey() ];
+               $revisionStore = MediaWikiServices::getInstance()->getRevisionStore();
+               $queryInfo = $revisionStore->getArchiveQueryInfo();
 
+               $conds = [
+                       'ar_namespace' => $this->title->getNamespace(),
+                       'ar_title' => $this->title->getDBkey(),
+               ];
                $options = [ 'ORDER BY' => 'ar_timestamp DESC' ];
 
-               $join_conds = [] + $commentQuery['joins'];
-
                ChangeTags::modifyDisplayQuery(
-                       $tables,
-                       $fields,
+                       $queryInfo['tables'],
+                       $queryInfo['fields'],
                        $conds,
-                       $join_conds,
+                       $queryInfo['joins'],
                        $options,
                        ''
                );
 
-               return $dbr->select( $tables,
-                       $fields,
+               $dbr = wfGetDB( DB_REPLICA );
+               return $dbr->select(
+                       $queryInfo['tables'],
+                       $queryInfo['fields'],
                        $conds,
                        __METHOD__,
                        $options,
-                       $join_conds
+                       $queryInfo['joins']
                );
        }
 
@@ -267,7 +255,11 @@ class PageArchive {
                );
 
                if ( $row ) {
-                       return Revision::newFromArchiveRow( $row, [ 'title' => $this->title ] );
+                       return Revision::newFromArchiveRow(
+                               $row,
+                               [ 'title' => $this->title ],
+                               $this->title
+                       );
                }
 
                return null;
@@ -542,47 +534,23 @@ class PageArchive {
                        $oldWhere['ar_timestamp'] = array_map( [ &$dbw, 'timestamp' ], $timestamps );
                }
 
-               $commentQuery = CommentStore::newKey( 'ar_comment' )->getJoin();
-
-               $tables = [ 'archive', 'revision' ] + $commentQuery['tables'];
-
-               $fields = [
-                       'ar_id',
-                       'ar_rev_id',
-                       'rev_id',
-                       'ar_text',
-                       'ar_user',
-                       'ar_user_text',
-                       'ar_timestamp',
-                       'ar_minor_edit',
-                       'ar_flags',
-                       'ar_text_id',
-                       'ar_deleted',
-                       'ar_page_id',
-                       'ar_len',
-                       'ar_sha1'
-               ] + $commentQuery['fields'];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               $join_conds = [
-                       'revision' => [ 'LEFT JOIN', 'ar_rev_id=rev_id' ],
-               ] + $commentQuery['joins'];
+               $revisionStore = MediaWikiServices::getInstance()->getRevisionStore();
+               $queryInfo = $revisionStore->getArchiveQueryInfo();
+               $queryInfo['tables'][] = 'revision';
+               $queryInfo['fields'][] = 'rev_id';
+               $queryInfo['joins']['revision'] = [ 'LEFT JOIN', 'ar_rev_id=rev_id' ];
 
                /**
                 * Select each archived revision...
                 */
                $result = $dbw->select(
-                       $tables,
-                       $fields,
+                       $queryInfo['tables'],
+                       $queryInfo['fields'],
                        $oldWhere,
                        __METHOD__,
                        /* options */
                        [ 'ORDER BY' => 'ar_timestamp' ],
-                       $join_conds
+                       $queryInfo['joins']
                );
 
                $rev_count = $result->numRows();
@@ -640,10 +608,12 @@ class PageArchive {
                        $oldPageId = (int)$latestRestorableRow->ar_page_id; // pass this to ArticleUndelete hook
 
                        // grab the content to check consistency with global state before restoring the page.
-                       $revision = Revision::newFromArchiveRow( $latestRestorableRow,
+                       $revision = Revision::newFromArchiveRow(
+                               $latestRestorableRow,
                                [
                                        'title' => $article->getTitle(), // used to derive default content model
-                               ]
+                               ],
+                               $article->getTitle()
                        );
                        $user = User::newFromName( $revision->getUserText( Revision::RAW ), false );
                        $content = $revision->getContent( Revision::RAW );
@@ -706,12 +676,15 @@ class PageArchive {
                                }
                                // Insert one revision at a time...maintaining deletion status
                                // unless we are specifically removing all restrictions...
-                               $revision = Revision::newFromArchiveRow( $row,
+                               $revision = Revision::newFromArchiveRow(
+                                       $row,
                                        [
                                                'page' => $pageId,
                                                'title' => $this->title,
                                                'deleted' => $unsuppress ? 0 : $row->ar_deleted
-                                       ] );
+                                       ],
+                                       $this->title
+                               );
 
                                // This will also copy the revision to ip_changes if it was an IP edit.
                                $revision->insertOn( $dbw );
index 7498ca5..6af7945 100644 (file)
@@ -195,15 +195,15 @@ class WikiPage implements Page, IDBAccessObject {
         */
        private static function convertSelectType( $type ) {
                switch ( $type ) {
-               case 'fromdb':
-                       return self::READ_NORMAL;
-               case 'fromdbmaster':
-                       return self::READ_LATEST;
-               case 'forupdate':
-                       return self::READ_LOCKING;
-               default:
-                       // It may already be an integer or whatever else
-                       return $type;
+                       case 'fromdb':
+                               return self::READ_NORMAL;
+                       case 'fromdbmaster':
+                               return self::READ_LATEST;
+                       case 'forupdate':
+                               return self::READ_LOCKING;
+                       default:
+                               // It may already be an integer or whatever else
+                               return $type;
                }
        }
 
@@ -1628,6 +1628,11 @@ class WikiPage implements Page, IDBAccessObject {
                        $tags[] = $tag;
                }
 
+               // Check for undo tag
+               if ( $undidRevId !== 0 && in_array( 'mw-undo', ChangeTags::getSoftwareTags() ) ) {
+                       $tags[] = 'mw-undo';
+               }
+
                // Provide autosummaries if summary is not provided and autosummaries are enabled
                if ( $wgUseAutomaticEditSummaries && ( $flags & EDIT_AUTOSUMMARY ) && $summary == '' ) {
                        $summary = $handler->getAutosummary( $old_content, $content, $flags );
index fab9ab7..761d5be 100644 (file)
@@ -417,130 +417,130 @@ class BlockLevelPass {
                        $c = $str[$i];
 
                        switch ( $state ) {
-                       case self::COLON_STATE_TEXT:
-                               switch ( $c ) {
-                               case "<":
-                                       # Could be either a <start> tag or an </end> tag
-                                       $state = self::COLON_STATE_TAGSTART;
-                                       break;
-                               case ":":
-                                       if ( $ltLevel === 0 ) {
-                                               # We found it!
-                                               $before = substr( $str, 0, $i );
-                                               $after = substr( $str, $i + 1 );
-                                               return $i;
+                               case self::COLON_STATE_TEXT:
+                                       switch ( $c ) {
+                                               case "<":
+                                                       # Could be either a <start> tag or an </end> tag
+                                                       $state = self::COLON_STATE_TAGSTART;
+                                                       break;
+                                               case ":":
+                                                       if ( $ltLevel === 0 ) {
+                                                               # We found it!
+                                                               $before = substr( $str, 0, $i );
+                                                               $after = substr( $str, $i + 1 );
+                                                               return $i;
+                                                       }
+                                                       # Embedded in a tag; don't break it.
+                                                       break;
+                                               default:
+                                                       # Skip ahead looking for something interesting
+                                                       if ( !preg_match( '/:|<|-\{/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) {
+                                                               # Nothing else interesting
+                                                               return false;
+                                                       }
+                                                       if ( $m[0][0] === '-{' ) {
+                                                               $state = self::COLON_STATE_LC;
+                                                               $lcLevel++;
+                                                               $i = $m[0][1] + 1;
+                                                       } else {
+                                                               # Skip ahead to next interesting character.
+                                                               $i = $m[0][1] - 1;
+                                                       }
+                                                       break;
                                        }
-                                       # Embedded in a tag; don't break it.
                                        break;
-                               default:
-                                       # Skip ahead looking for something interesting
-                                       if ( !preg_match( '/:|<|-\{/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) {
-                                               # Nothing else interesting
-                                               return false;
-                                       }
-                                       if ( $m[0][0] === '-{' ) {
-                                               $state = self::COLON_STATE_LC;
+                               case self::COLON_STATE_LC:
+                                       # In language converter markup -{ ... }-
+                                       if ( !preg_match( '/-\{|\}-/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) {
+                                               # Nothing else interesting to find; abort!
+                                               # We're nested in language converter markup, but there
+                                               # are no close tags left.  Abort!
+                                               break 2;
+                                       } elseif ( $m[0][0] === '-{' ) {
+                                               $i = $m[0][1] + 1;
                                                $lcLevel++;
+                                       } elseif ( $m[0][0] === '}-' ) {
                                                $i = $m[0][1] + 1;
-                                       } else {
-                                               # Skip ahead to next interesting character.
-                                               $i = $m[0][1] - 1;
+                                               $lcLevel--;
+                                               if ( $lcLevel === 0 ) {
+                                                       $state = self::COLON_STATE_TEXT;
+                                               }
                                        }
                                        break;
-                               }
-                               break;
-                       case self::COLON_STATE_LC:
-                               # In language converter markup -{ ... }-
-                               if ( !preg_match( '/-\{|\}-/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) {
-                                       # Nothing else interesting to find; abort!
-                                       # We're nested in language converter markup, but there
-                                       # are no close tags left.  Abort!
-                                       break 2;
-                               } elseif ( $m[0][0] === '-{' ) {
-                                       $i = $m[0][1] + 1;
-                                       $lcLevel++;
-                               } elseif ( $m[0][0] === '}-' ) {
-                                       $i = $m[0][1] + 1;
-                                       $lcLevel--;
-                                       if ( $lcLevel === 0 ) {
-                                               $state = self::COLON_STATE_TEXT;
+                               case self::COLON_STATE_TAG:
+                                       # In a <tag>
+                                       switch ( $c ) {
+                                               case ">":
+                                                       $ltLevel++;
+                                                       $state = self::COLON_STATE_TEXT;
+                                                       break;
+                                               case "/":
+                                                       # Slash may be followed by >?
+                                                       $state = self::COLON_STATE_TAGSLASH;
+                                                       break;
+                                               default:
+                                                       # ignore
                                        }
-                               }
-                               break;
-                       case self::COLON_STATE_TAG:
-                               # In a <tag>
-                               switch ( $c ) {
-                               case ">":
-                                       $ltLevel++;
-                                       $state = self::COLON_STATE_TEXT;
                                        break;
-                               case "/":
-                                       # Slash may be followed by >?
-                                       $state = self::COLON_STATE_TAGSLASH;
+                               case self::COLON_STATE_TAGSTART:
+                                       switch ( $c ) {
+                                               case "/":
+                                                       $state = self::COLON_STATE_CLOSETAG;
+                                                       break;
+                                               case "!":
+                                                       $state = self::COLON_STATE_COMMENT;
+                                                       break;
+                                               case ">":
+                                                       # Illegal early close? This shouldn't happen D:
+                                                       $state = self::COLON_STATE_TEXT;
+                                                       break;
+                                               default:
+                                                       $state = self::COLON_STATE_TAG;
+                                       }
                                        break;
-                               default:
-                                       # ignore
-                               }
-                               break;
-                       case self::COLON_STATE_TAGSTART:
-                               switch ( $c ) {
-                               case "/":
-                                       $state = self::COLON_STATE_CLOSETAG;
+                               case self::COLON_STATE_CLOSETAG:
+                                       # In a </tag>
+                                       if ( $c === ">" ) {
+                                               if ( $ltLevel > 0 ) {
+                                                       $ltLevel--;
+                                               } else {
+                                                       # ignore the excess close tag, but keep looking for
+                                                       # colons. (This matches Parsoid behavior.)
+                                                       wfDebug( __METHOD__ . ": Invalid input; too many close tags\n" );
+                                               }
+                                               $state = self::COLON_STATE_TEXT;
+                                       }
                                        break;
-                               case "!":
-                                       $state = self::COLON_STATE_COMMENT;
+                               case self::COLON_STATE_TAGSLASH:
+                                       if ( $c === ">" ) {
+                                               # Yes, a self-closed tag <blah/>
+                                               $state = self::COLON_STATE_TEXT;
+                                       } else {
+                                               # Probably we're jumping the gun, and this is an attribute
+                                               $state = self::COLON_STATE_TAG;
+                                       }
                                        break;
-                               case ">":
-                                       # Illegal early close? This shouldn't happen D:
-                                       $state = self::COLON_STATE_TEXT;
+                               case self::COLON_STATE_COMMENT:
+                                       if ( $c === "-" ) {
+                                               $state = self::COLON_STATE_COMMENTDASH;
+                                       }
                                        break;
-                               default:
-                                       $state = self::COLON_STATE_TAG;
-                               }
-                               break;
-                       case self::COLON_STATE_CLOSETAG:
-                               # In a </tag>
-                               if ( $c === ">" ) {
-                                       if ( $ltLevel > 0 ) {
-                                               $ltLevel--;
+                               case self::COLON_STATE_COMMENTDASH:
+                                       if ( $c === "-" ) {
+                                               $state = self::COLON_STATE_COMMENTDASHDASH;
                                        } else {
-                                               # ignore the excess close tag, but keep looking for
-                                               # colons. (This matches Parsoid behavior.)
-                                               wfDebug( __METHOD__ . ": Invalid input; too many close tags\n" );
+                                               $state = self::COLON_STATE_COMMENT;
                                        }
-                                       $state = self::COLON_STATE_TEXT;
-                               }
-                               break;
-                       case self::COLON_STATE_TAGSLASH:
-                               if ( $c === ">" ) {
-                                       # Yes, a self-closed tag <blah/>
-                                       $state = self::COLON_STATE_TEXT;
-                               } else {
-                                       # Probably we're jumping the gun, and this is an attribute
-                                       $state = self::COLON_STATE_TAG;
-                               }
-                               break;
-                       case self::COLON_STATE_COMMENT:
-                               if ( $c === "-" ) {
-                                       $state = self::COLON_STATE_COMMENTDASH;
-                               }
-                               break;
-                       case self::COLON_STATE_COMMENTDASH:
-                               if ( $c === "-" ) {
-                                       $state = self::COLON_STATE_COMMENTDASHDASH;
-                               } else {
-                                       $state = self::COLON_STATE_COMMENT;
-                               }
-                               break;
-                       case self::COLON_STATE_COMMENTDASHDASH:
-                               if ( $c === ">" ) {
-                                       $state = self::COLON_STATE_TEXT;
-                               } else {
-                                       $state = self::COLON_STATE_COMMENT;
-                               }
-                               break;
-                       default:
-                               throw new MWException( "State machine error in " . __METHOD__ );
+                                       break;
+                               case self::COLON_STATE_COMMENTDASHDASH:
+                                       if ( $c === ">" ) {
+                                               $state = self::COLON_STATE_TEXT;
+                                       } else {
+                                               $state = self::COLON_STATE_COMMENT;
+                                       }
+                                       break;
+                               default:
+                                       throw new MWException( "State machine error in " . __METHOD__ );
                        }
                }
                if ( $ltLevel > 0 || $lcLevel > 0 ) {
index 8986ddd..10a338e 100644 (file)
@@ -5022,40 +5022,40 @@ class Parser {
                                                $paramName = $paramMap[$magicName];
 
                                                switch ( $paramName ) {
-                                               case 'gallery-internal-alt':
-                                                       $alt = $this->stripAltText( $match, false );
-                                                       break;
-                                               case 'gallery-internal-link':
-                                                       $linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
-                                                       $chars = self::EXT_LINK_URL_CLASS;
-                                                       $addr = self::EXT_LINK_ADDR;
-                                                       $prots = $this->mUrlProtocols;
-                                                       // check to see if link matches an absolute url, if not then it must be a wiki link.
-                                                       if ( preg_match( '/^-{R|(.*)}-$/', $linkValue ) ) {
-                                                               // Result of LanguageConverter::markNoConversion
-                                                               // invoked on an external link.
-                                                               $linkValue = substr( $linkValue, 4, -2 );
-                                                       }
-                                                       if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) {
-                                                               $link = $linkValue;
-                                                               $this->mOutput->addExternalLink( $link );
-                                                       } else {
-                                                               $localLinkTitle = Title::newFromText( $linkValue );
-                                                               if ( $localLinkTitle !== null ) {
-                                                                       $this->mOutput->addLink( $localLinkTitle );
-                                                                       $link = $localLinkTitle->getLinkURL();
+                                                       case 'gallery-internal-alt':
+                                                               $alt = $this->stripAltText( $match, false );
+                                                               break;
+                                                       case 'gallery-internal-link':
+                                                               $linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
+                                                               $chars = self::EXT_LINK_URL_CLASS;
+                                                               $addr = self::EXT_LINK_ADDR;
+                                                               $prots = $this->mUrlProtocols;
+                                                               // check to see if link matches an absolute url, if not then it must be a wiki link.
+                                                               if ( preg_match( '/^-{R|(.*)}-$/', $linkValue ) ) {
+                                                                       // Result of LanguageConverter::markNoConversion
+                                                                       // invoked on an external link.
+                                                                       $linkValue = substr( $linkValue, 4, -2 );
+                                                               }
+                                                               if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) {
+                                                                       $link = $linkValue;
+                                                                       $this->mOutput->addExternalLink( $link );
+                                                               } else {
+                                                                       $localLinkTitle = Title::newFromText( $linkValue );
+                                                                       if ( $localLinkTitle !== null ) {
+                                                                               $this->mOutput->addLink( $localLinkTitle );
+                                                                               $link = $localLinkTitle->getLinkURL();
+                                                                       }
+                                                               }
+                                                               break;
+                                                       default:
+                                                               // Must be a handler specific parameter.
+                                                               if ( $handler->validateParam( $paramName, $match ) ) {
+                                                                       $handlerOptions[$paramName] = $match;
+                                                               } else {
+                                                                       // Guess not, consider it as caption.
+                                                                       wfDebug( "$parameterMatch failed parameter validation\n" );
+                                                                       $label = '|' . $parameterMatch;
                                                                }
-                                                       }
-                                                       break;
-                                               default:
-                                                       // Must be a handler specific parameter.
-                                                       if ( $handler->validateParam( $paramName, $match ) ) {
-                                                               $handlerOptions[$paramName] = $match;
-                                                       } else {
-                                                               // Guess not, consider it as caption.
-                                                               wfDebug( "$parameterMatch failed parameter validation\n" );
-                                                               $label = '|' . $parameterMatch;
-                                                       }
                                                }
 
                                        } else {
@@ -5217,52 +5217,52 @@ class Parser {
                                        } else {
                                                # Validate internal parameters
                                                switch ( $paramName ) {
-                                               case 'manualthumb':
-                                               case 'alt':
-                                               case 'class':
-                                                       # @todo FIXME: Possibly check validity here for
-                                                       # manualthumb? downstream behavior seems odd with
-                                                       # missing manual thumbs.
-                                                       $validated = true;
-                                                       $value = $this->stripAltText( $value, $holders );
-                                                       break;
-                                               case 'link':
-                                                       $chars = self::EXT_LINK_URL_CLASS;
-                                                       $addr = self::EXT_LINK_ADDR;
-                                                       $prots = $this->mUrlProtocols;
-                                                       if ( $value === '' ) {
-                                                               $paramName = 'no-link';
-                                                               $value = true;
+                                                       case 'manualthumb':
+                                                       case 'alt':
+                                                       case 'class':
+                                                               # @todo FIXME: Possibly check validity here for
+                                                               # manualthumb? downstream behavior seems odd with
+                                                               # missing manual thumbs.
                                                                $validated = true;
-                                                       } elseif ( preg_match( "/^((?i)$prots)/", $value ) ) {
-                                                               if ( preg_match( "/^((?i)$prots)$addr$chars*$/u", $value, $m ) ) {
-                                                                       $paramName = 'link-url';
-                                                                       $this->mOutput->addExternalLink( $value );
-                                                                       if ( $this->mOptions->getExternalLinkTarget() ) {
-                                                                               $params[$type]['link-target'] = $this->mOptions->getExternalLinkTarget();
-                                                                       }
-                                                                       $validated = true;
-                                                               }
-                                                       } else {
-                                                               $linkTitle = Title::newFromText( $value );
-                                                               if ( $linkTitle ) {
-                                                                       $paramName = 'link-title';
-                                                                       $value = $linkTitle;
-                                                                       $this->mOutput->addLink( $linkTitle );
+                                                               $value = $this->stripAltText( $value, $holders );
+                                                               break;
+                                                       case 'link':
+                                                               $chars = self::EXT_LINK_URL_CLASS;
+                                                               $addr = self::EXT_LINK_ADDR;
+                                                               $prots = $this->mUrlProtocols;
+                                                               if ( $value === '' ) {
+                                                                       $paramName = 'no-link';
+                                                                       $value = true;
                                                                        $validated = true;
+                                                               } elseif ( preg_match( "/^((?i)$prots)/", $value ) ) {
+                                                                       if ( preg_match( "/^((?i)$prots)$addr$chars*$/u", $value, $m ) ) {
+                                                                               $paramName = 'link-url';
+                                                                               $this->mOutput->addExternalLink( $value );
+                                                                               if ( $this->mOptions->getExternalLinkTarget() ) {
+                                                                                       $params[$type]['link-target'] = $this->mOptions->getExternalLinkTarget();
+                                                                               }
+                                                                               $validated = true;
+                                                                       }
+                                                               } else {
+                                                                       $linkTitle = Title::newFromText( $value );
+                                                                       if ( $linkTitle ) {
+                                                                               $paramName = 'link-title';
+                                                                               $value = $linkTitle;
+                                                                               $this->mOutput->addLink( $linkTitle );
+                                                                               $validated = true;
+                                                                       }
                                                                }
-                                                       }
-                                                       break;
-                                               case 'frameless':
-                                               case 'framed':
-                                               case 'thumbnail':
-                                                       // use first appearing option, discard others.
-                                                       $validated = !$seenformat;
-                                                       $seenformat = true;
-                                                       break;
-                                               default:
-                                                       # Most other things appear to be empty or numeric...
-                                                       $validated = ( $value === false || is_numeric( trim( $value ) ) );
+                                                               break;
+                                                       case 'frameless':
+                                                       case 'framed':
+                                                       case 'thumbnail':
+                                                               // use first appearing option, discard others.
+                                                               $validated = !$seenformat;
+                                                               $seenformat = true;
+                                                               break;
+                                                       default:
+                                                               # Most other things appear to be empty or numeric...
+                                                               $validated = ( $value === false || is_numeric( trim( $value ) ) );
                                                }
                                        }
 
index 332f8e9..735c33a 100644 (file)
@@ -1922,18 +1922,18 @@ class PPNode_Hash_Tree implements PPNode {
                                continue;
                        }
                        switch ( $child[self::NAME] ) {
-                       case 'name':
-                               $bits['name'] = new self( $children, $i );
-                               break;
-                       case 'attr':
-                               $bits['attr'] = new self( $children, $i );
-                               break;
-                       case 'inner':
-                               $bits['inner'] = new self( $children, $i );
-                               break;
-                       case 'close':
-                               $bits['close'] = new self( $children, $i );
-                               break;
+                               case 'name':
+                                       $bits['name'] = new self( $children, $i );
+                                       break;
+                               case 'attr':
+                                       $bits['attr'] = new self( $children, $i );
+                                       break;
+                               case 'inner':
+                                       $bits['inner'] = new self( $children, $i );
+                                       break;
+                               case 'close':
+                                       $bits['close'] = new self( $children, $i );
+                                       break;
                        }
                }
                if ( !isset( $bits['name'] ) ) {
@@ -2001,15 +2001,15 @@ class PPNode_Hash_Tree implements PPNode {
                                continue;
                        }
                        switch ( $child[self::NAME] ) {
-                       case 'title':
-                               $bits['title'] = new self( $children, $i );
-                               break;
-                       case 'part':
-                               $parts[] = new self( $children, $i );
-                               break;
-                       case '@lineStart':
-                               $bits['lineStart'] = '1';
-                               break;
+                               case 'title':
+                                       $bits['title'] = new self( $children, $i );
+                                       break;
+                               case 'part':
+                                       $parts[] = new self( $children, $i );
+                                       break;
+                               case '@lineStart':
+                                       $bits['lineStart'] = '1';
+                                       break;
                        }
                }
                if ( !isset( $bits['title'] ) ) {
index 3c8fe60..4253193 100644 (file)
@@ -112,11 +112,11 @@ abstract class SearchEngine {
         */
        public function supports( $feature ) {
                switch ( $feature ) {
-               case 'search-update':
-                       return true;
-               case 'title-suffix-filter':
-               default:
-                       return false;
+                       case 'search-update':
+                               return true;
+                       case 'title-suffix-filter':
+                       default:
+                               return false;
                }
        }
 
index 77dcfe9..2810bce 100644 (file)
@@ -209,10 +209,10 @@ class SearchMySQL extends SearchDatabase {
 
        public function supports( $feature ) {
                switch ( $feature ) {
-               case 'title-suffix-filter':
-                       return true;
-               default:
-                       return parent::supports( $feature );
+                       case 'title-suffix-filter':
+                               return true;
+                       default:
+                               return parent::supports( $feature );
                }
        }
 
index 998b3ed..2f0ea42 100644 (file)
@@ -36,7 +36,7 @@ class Command {
        use LoggerAwareTrait;
 
        /** @var string */
-       private $command = '';
+       protected $command = '';
 
        /** @var array */
        private $limits = [
@@ -269,9 +269,10 @@ class Command {
         * String together all the options and build the final command
         * to execute
         *
+        * @param string $command Already-escaped command to run
         * @return array [ command, whether to use log pipe ]
         */
-       protected function buildFinalCommand() {
+       protected function buildFinalCommand( $command ) {
                $envcmd = '';
                foreach ( $this->env as $k => $v ) {
                        if ( wfIsWindows() ) {
@@ -291,7 +292,7 @@ class Command {
                }
 
                $useLogPipe = false;
-               $cmd = $envcmd . trim( $this->command );
+               $cmd = $envcmd . trim( $command );
 
                if ( is_executable( '/bin/bash' ) ) {
                        $time = intval( $this->limits['time'] );
@@ -335,7 +336,7 @@ class Command {
 
                $profileMethod = $this->method ?: wfGetCaller();
 
-               list( $cmd, $useLogPipe ) = $this->buildFinalCommand();
+               list( $cmd, $useLogPipe ) = $this->buildFinalCommand( $this->command );
 
                $this->logger->debug( __METHOD__ . ": $cmd" );
 
index 79f679d..a71b376 100644 (file)
@@ -59,10 +59,15 @@ class FirejailCommand extends Command {
        /**
         * @inheritDoc
         */
-       protected function buildFinalCommand() {
+       protected function buildFinalCommand( $command ) {
                // If there are no restrictions, don't use firejail
                if ( $this->restrictions === 0 ) {
-                       return parent::buildFinalCommand();
+                       $splitCommand = explode( ' ', $command, 2 );
+                       $this->logger->debug(
+                               "firejail: Command {$splitCommand[0]} {params} has no restrictions",
+                               [ 'params' => isset( $splitCommand[1] ) ? $splitCommand[1] : '' ]
+                       );
+                       return parent::buildFinalCommand( $command );
                }
 
                if ( $this->firejail === false ) {
@@ -110,6 +115,10 @@ class FirejailCommand extends Command {
                        }
                }
 
+               if ( $this->hasRestriction( Shell::NO_LOCALSETTINGS ) ) {
+                       $cmd[] = '--blacklist=' . realpath( MW_CONFIG_FILE );
+               }
+
                if ( $this->hasRestriction( Shell::NO_ROOT ) ) {
                        $cmd[] = '--noroot';
                }
@@ -122,6 +131,10 @@ class FirejailCommand extends Command {
 
                if ( $this->hasRestriction( Shell::NO_EXECVE ) ) {
                        $seccomp[] = 'execve';
+                       // Normally firejail will run commands in a bash shell,
+                       // but that won't work if we ban the execve syscall, so
+                       // run the command without a shell.
+                       $cmd[] = '--shell=none';
                }
 
                if ( $seccomp ) {
@@ -136,11 +149,10 @@ class FirejailCommand extends Command {
                        $cmd[] = '--net=none';
                }
 
-               list( $fullCommand, $useLogPipe ) = parent::buildFinalCommand();
-
                $builtCmd = implode( ' ', $cmd );
 
-               return [ "$builtCmd -- $fullCommand", $useLogPipe ];
+               // Prefix the firejail command in front of the wanted command
+               return parent::buildFinalCommand( "$builtCmd -- {$command}" );
        }
 
 }
index 084e10e..05463db 100644 (file)
@@ -45,13 +45,13 @@ class Shell {
         * Apply a default set of restrictions for improved
         * security out of the box.
         *
-        * Equal to NO_ROOT | SECCOMP | PRIVATE_DEV
+        * Equal to NO_ROOT | SECCOMP | PRIVATE_DEV | NO_LOCALSETTINGS
         *
         * @note This value will change over time to provide increased security
         *       by default, and is not guaranteed to be backwards-compatible.
         * @since 1.31
         */
-       const RESTRICT_DEFAULT = 7;
+       const RESTRICT_DEFAULT = 39;
 
        /**
         * Disallow any root access. Any setuid binaries
@@ -92,6 +92,13 @@ class Shell {
         */
        const NO_EXECVE = 16;
 
+       /**
+        * Deny access to LocalSettings.php (MW_CONFIG_FILE)
+        *
+        * @since 1.31
+        */
+       const NO_LOCALSETTINGS = 32;
+
        /**
         * Returns a new instance of Command class
         *
index 8d5ce10..f0b336a 100644 (file)
@@ -182,44 +182,44 @@ abstract class BaseTemplate extends QuickTemplate {
                                continue;
                        }
                        switch ( $boxName ) {
-                       case 'SEARCH':
-                               // Search is a special case, skins should custom implement this
-                               $boxes[$boxName] = [
-                                       'id' => 'p-search',
-                                       'header' => $this->getMsg( 'search' )->text(),
-                                       'generated' => false,
-                                       'content' => true,
-                               ];
-                               break;
-                       case 'TOOLBOX':
-                               $msgObj = $this->getMsg( 'toolbox' );
-                               $boxes[$boxName] = [
-                                       'id' => 'p-tb',
-                                       'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox',
-                                       'generated' => false,
-                                       'content' => $this->getToolbox(),
-                               ];
-                               break;
-                       case 'LANGUAGES':
-                               if ( $this->data['language_urls'] !== false ) {
-                                       $msgObj = $this->getMsg( 'otherlanguages' );
+                               case 'SEARCH':
+                                       // Search is a special case, skins should custom implement this
                                        $boxes[$boxName] = [
-                                               'id' => 'p-lang',
-                                               'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
+                                               'id' => 'p-search',
+                                               'header' => $this->getMsg( 'search' )->text(),
                                                'generated' => false,
-                                               'content' => $this->data['language_urls'] ?: [],
+                                               'content' => true,
                                        ];
-                               }
-                               break;
-                       default:
-                               $msgObj = $this->getMsg( $boxName );
-                               $boxes[$boxName] = [
-                                       'id' => "p-$boxName",
-                                       'header' => $msgObj->exists() ? $msgObj->text() : $boxName,
-                                       'generated' => true,
-                                       'content' => $content,
-                               ];
-                               break;
+                                       break;
+                               case 'TOOLBOX':
+                                       $msgObj = $this->getMsg( 'toolbox' );
+                                       $boxes[$boxName] = [
+                                               'id' => 'p-tb',
+                                               'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox',
+                                               'generated' => false,
+                                               'content' => $this->getToolbox(),
+                                       ];
+                                       break;
+                               case 'LANGUAGES':
+                                       if ( $this->data['language_urls'] !== false ) {
+                                               $msgObj = $this->getMsg( 'otherlanguages' );
+                                               $boxes[$boxName] = [
+                                                       'id' => 'p-lang',
+                                                       'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
+                                                       'generated' => false,
+                                                       'content' => $this->data['language_urls'] ?: [],
+                                               ];
+                                       }
+                                       break;
+                               default:
+                                       $msgObj = $this->getMsg( $boxName );
+                                       $boxes[$boxName] = [
+                                               'id' => "p-$boxName",
+                                               'header' => $msgObj->exists() ? $msgObj->text() : $boxName,
+                                               'generated' => true,
+                                               'content' => $content,
+                                       ];
+                                       break;
                        }
                }
 
index eab5940..303184d 100644 (file)
@@ -553,7 +553,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        public function execute( $subpage ) {
                $this->rcSubpage = $subpage;
 
-               $this->considerActionsForDefaultSavedQuery();
+               $this->considerActionsForDefaultSavedQuery( $subpage );
 
                $opts = $this->getOptions();
                try {
@@ -629,9 +629,11 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * Check whether or not the page should load defaults, and if so, whether
         * a default saved query is relevant to be redirected to. If it is relevant,
         * redirect properly with all necessary query parameters.
+        *
+        * @param string $subpage
         */
-       protected function considerActionsForDefaultSavedQuery() {
-               if ( !$this->isStructuredFilterUiEnabled() ) {
+       protected function considerActionsForDefaultSavedQuery( $subpage ) {
+               if ( !$this->isStructuredFilterUiEnabled() || $this->including() ) {
                        return;
                }
 
@@ -677,7 +679,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                        // but are still valid and requested in the URL
                                        $query = array_merge( $this->getRequest()->getValues(), $query );
                                        unset( $query[ 'title' ] );
-                                       $this->getOutput()->redirect( $this->getPageTitle()->getCanonicalURL( $query ) );
+                                       $this->getOutput()->redirect( $this->getPageTitle( $subpage )->getCanonicalURL( $query ) );
                                } else {
                                        // There's a default, but the version is not 2, and the server can't
                                        // actually recognize the query itself. This happens if it is before
@@ -704,7 +706,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         */
        protected function includeRcFiltersApp() {
                $out = $this->getOutput();
-               if ( $this->isStructuredFilterUiEnabled() ) {
+               if ( $this->isStructuredFilterUiEnabled() && !$this->including() ) {
                        $jsData = $this->getStructuredFilterJsData();
 
                        $messages = [];
@@ -1649,7 +1651,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                ] );
                $out->addModules( 'mediawiki.special.changeslist.legend.js' );
 
-               if ( $this->isStructuredFilterUiEnabled() ) {
+               if ( $this->isStructuredFilterUiEnabled() && !$this->including() ) {
                        $out->addModules( 'mediawiki.rcfilters.filters.ui' );
                        $out->addModuleStyles( 'mediawiki.rcfilters.filters.base.styles' );
                }
index 8e20d88..987bcdd 100644 (file)
@@ -42,7 +42,7 @@ class SpecialProtectedpages extends SpecialPage {
                $request = $this->getRequest();
                $type = $request->getVal( $this->IdType );
                $level = $request->getVal( $this->IdLevel );
-               $sizetype = $request->getVal( 'sizetype' );
+               $sizetype = $request->getVal( 'size-mode' );
                $size = $request->getIntOrNull( 'size' );
                $ns = $request->getIntOrNull( 'namespace' );
                $indefOnly = $request->getBool( 'indefonly' ) ? 1 : 0;
@@ -95,24 +95,24 @@ class SpecialProtectedpages extends SpecialPage {
        protected function showOptions( $namespace, $type = 'edit', $level, $sizetype,
                $size, $indefOnly, $cascadeOnly, $noRedirect
        ) {
-               $title = $this->getPageTitle();
+               $formDescriptor = [
+                       'namespace' => $this->getNamespaceMenu( $namespace ),
+                       'typemenu' => $this->getTypeMenu( $type ),
+                       'levelmenu' => $this->getLevelMenu( $level ),
 
-               return Xml::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] ) .
-                       Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', [], $this->msg( 'protectedpages' )->text() ) .
-                       Html::hidden( 'title', $title->getPrefixedDBkey() ) . "\n" .
-                       $this->getNamespaceMenu( $namespace ) . "\n" .
-                       $this->getTypeMenu( $type ) . "\n" .
-                       $this->getLevelMenu( $level ) . "\n" .
-                       "<br />\n" .
-                       $this->getExpiryCheck( $indefOnly ) . "\n" .
-                       $this->getCascadeCheck( $cascadeOnly ) . "\n" .
-                       $this->getRedirectCheck( $noRedirect ) . "\n" .
-                       "<br />\n" .
-                       $this->getSizeLimit( $sizetype, $size ) . "\n" .
-                       Xml::submitButton( $this->msg( 'protectedpages-submit' )->text() ) . "\n" .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' );
+                       'expirycheck' => $this->getExpiryCheck( $indefOnly ),
+                       'cascadecheck' => $this->getCascadeCheck( $cascadeOnly ),
+                       'redirectcheck' => $this->getRedirectCheck( $noRedirect ),
+
+                       'sizelimit' => $this->getSizeLimit( $sizetype, $size ),
+               ];
+               $htmlForm = new HTMLForm( $formDescriptor, $this->getContext() );
+               $htmlForm
+                       ->setMethod( 'get' )
+                       ->setWrapperLegendMsg( 'protectedpages' )
+                       ->setSubmitText( $this->msg( 'protectedpages-submit' )->text() );
+
+               return $htmlForm->prepareForm()->getHTML( false );
        }
 
        /**
@@ -120,96 +120,80 @@ class SpecialProtectedpages extends SpecialPage {
         * selector, sans the MediaWiki namespace
         *
         * @param string|null $namespace Pre-select namespace
-        * @return string
+        * @return array
         */
        protected function getNamespaceMenu( $namespace = null ) {
-               return Html::rawElement( 'span', [ 'class' => 'mw-input-with-label' ],
-                       Html::namespaceSelector(
-                               [
-                                       'selected' => $namespace,
-                                       'all' => '',
-                                       'label' => $this->msg( 'namespace' )->text()
-                               ], [
-                                       'name' => 'namespace',
-                                       'id' => 'namespace',
-                                       'class' => 'namespaceselector',
-                               ]
-                       )
-               );
+               return [
+                       'class' => 'HTMLSelectNamespace',
+                       'name' => 'namespace',
+                       'id' => 'namespace',
+                       'cssclass' => 'namespaceselector',
+                       'selected' => $namespace,
+                       'all' => '',
+                       'label' => $this->msg( 'namespace' )->text(),
+               ];
        }
 
        /**
         * @param bool $indefOnly
-        * @return string Formatted HTML
+        * @return array
         */
        protected function getExpiryCheck( $indefOnly ) {
-               return '<span class="mw-input-with-label">' . Xml::checkLabel(
-                       $this->msg( 'protectedpages-indef' )->text(),
-                       'indefonly',
-                       'indefonly',
-                       $indefOnly
-               ) . "</span>\n";
+               return [
+                       'type' => 'check',
+                       'label' => $this->msg( 'protectedpages-indef' )->text(),
+                       'name' => 'indefonly',
+                       'id' => 'indefonly',
+                       'value' => $indefOnly
+               ];
        }
 
        /**
         * @param bool $cascadeOnly
-        * @return string Formatted HTML
+        * @return array
         */
        protected function getCascadeCheck( $cascadeOnly ) {
-               return '<span class="mw-input-with-label">' . Xml::checkLabel(
-                       $this->msg( 'protectedpages-cascade' )->text(),
-                       'cascadeonly',
-                       'cascadeonly',
-                       $cascadeOnly
-               ) . "</span>\n";
+               return [
+                       'type' => 'check',
+                       'label' => $this->msg( 'protectedpages-cascade' )->text(),
+                       'name' => 'cascadeonly',
+                       'id' => 'cascadeonly',
+                       'value' => $cascadeOnly
+               ];
        }
 
        /**
         * @param bool $noRedirect
-        * @return string Formatted HTML
+        * @return array
         */
        protected function getRedirectCheck( $noRedirect ) {
-               return '<span class="mw-input-with-label">' . Xml::checkLabel(
-                       $this->msg( 'protectedpages-noredirect' )->text(),
-                       'noredirect',
-                       'noredirect',
-                       $noRedirect
-               ) . "</span>\n";
+               return [
+                       'type' => 'check',
+                       'label' => $this->msg( 'protectedpages-noredirect' )->text(),
+                       'name' => 'noredirect',
+                       'id' => 'noredirect',
+                       'value' => $noRedirect,
+               ];
        }
 
        /**
         * @param string $sizetype "min" or "max"
         * @param mixed $size
-        * @return string Formatted HTML
+        * @return array
         */
        protected function getSizeLimit( $sizetype, $size ) {
                $max = $sizetype === 'max';
 
-               return '<span class="mw-input-with-label">' . Xml::radioLabel(
-                       $this->msg( 'minimum-size' )->text(),
-                       'sizetype',
-                       'min',
-                       'wpmin',
-                       !$max
-               ) .
-                       ' ' .
-                       Xml::radioLabel(
-                               $this->msg( 'maximum-size' )->text(),
-                               'sizetype',
-                               'max',
-                               'wpmax',
-                               $max
-                       ) .
-                       ' ' .
-                       Xml::input( 'size', 9, $size, [ 'id' => 'wpsize' ] ) .
-                       ' ' .
-                       Xml::label( $this->msg( 'pagesize' )->text(), 'wpsize' ) . "</span>\n";
+               return [
+                       'class' => 'HTMLSizeFilterField',
+                       'name' => 'size',
+               ];
        }
 
        /**
         * Creates the input label of the restriction type
         * @param string $pr_type Protection type
-        * @return string Formatted HTML
+        * @return array
         */
        protected function getTypeMenu( $pr_type ) {
                $m = []; // Temporary array
@@ -224,21 +208,23 @@ class SpecialProtectedpages extends SpecialPage {
 
                // Third pass generates sorted XHTML content
                foreach ( $m as $text => $type ) {
-                       $selected = ( $type == $pr_type );
-                       $options[] = Xml::option( $text, $type, $selected ) . "\n";
+                       $options[$text] = $type;
                }
 
-               return '<span class="mw-input-with-label">' .
-                       Xml::label( $this->msg( 'restriction-type' )->text(), $this->IdType ) . ' ' .
-                       Xml::tags( 'select',
-                               [ 'id' => $this->IdType, 'name' => $this->IdType ],
-                               implode( "\n", $options ) ) . "</span>";
+               return [
+                       'type' => 'select',
+                       'options' => $options,
+                       'value' => $pr_type,
+                       'label' => $this->msg( 'restriction-type' )->text(),
+                       'name' => $this->IdType,
+                       'id' => $this->IdType,
+               ];
        }
 
        /**
         * Creates the input label of the restriction level
         * @param string $pr_level Protection level
-        * @return string Formatted HTML
+        * @return array
         */
        protected function getLevelMenu( $pr_level ) {
                // Temporary array
@@ -256,15 +242,17 @@ class SpecialProtectedpages extends SpecialPage {
 
                // Third pass generates sorted XHTML content
                foreach ( $m as $text => $type ) {
-                       $selected = ( $type == $pr_level );
-                       $options[] = Xml::option( $text, $type, $selected );
+                       $options[$text] = $type;
                }
 
-               return '<span class="mw-input-with-label">' .
-                       Xml::label( $this->msg( 'restriction-level' )->text(), $this->IdLevel ) . ' ' .
-                       Xml::tags( 'select',
-                               [ 'id' => $this->IdLevel, 'name' => $this->IdLevel ],
-                               implode( "\n", $options ) ) . "</span>";
+               return [
+                       'type' => 'select',
+                       'options' => $options,
+                       'value' => $pr_level,
+                       'label' => $this->msg( 'restriction-level' )->text(),
+                       'name' => $this->IdLevel,
+                       'id' => $this->IdLevel
+               ];
        }
 
        protected function getGroupName() {
index 9e0daf5..d4aef6c 100644 (file)
@@ -30,8 +30,6 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
        /** @var bool|Title */
        protected $rclTargetTitle;
 
-       protected $rclTarget;
-
        function __construct() {
                parent::__construct( 'Recentchangeslinked' );
        }
@@ -46,7 +44,6 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
 
        public function parseParameters( $par, FormOptions $opts ) {
                $opts['target'] = $par;
-               $this->rclTarget = $par;
        }
 
        /**
@@ -297,20 +294,6 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                return $this->prefixSearchString( $search, $limit, $offset );
        }
 
-       /**
-        * Get a self-referential title object
-        * with consideration to the given subpage.
-        *
-        * @param string|bool $subpage
-        * @return Title
-        * @since 1.23
-        */
-       public function getPageTitle( $subpage = false ) {
-               $subpage = $subpage ? $subpage : $this->rclTarget;
-
-               return parent::getPageTitle( $subpage );
-       }
-
        protected function outputNoResults() {
                if ( $this->getTargetTitle() === false ) {
                        $this->getOutput()->addHTML(
index 5ff9e04..2dcb77f 100644 (file)
@@ -60,7 +60,7 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage {
                                        $title = Title::makeTitleSafe( NS_CATEGORY, $titleStr );
                                }
                                if ( $title ) {
-                                       $this->exceptionList[] = $title->getDBKey();
+                                       $this->exceptionList[] = $title->getDBkey();
                                }
                        }
                }
index a5f9ab3..fd066ac 100644 (file)
@@ -761,7 +761,7 @@ class UserrightsPage extends SpecialPage {
        /**
         * Adds a table with checkboxes where you can select what groups to add/remove
         *
-        * @param array $usergroups Associative array of (group name as string =>
+        * @param UserGroupMembership[] $usergroups Associative array of (group name as string =>
         *   UserGroupMembership object) for groups the user belongs to
         * @param User $user
         * @return Array with 2 elements: the XHTML table element with checkxboes, and
index a68fe66..45d9a7f 100644 (file)
@@ -33,7 +33,7 @@
 class UsersPager extends AlphabeticPager {
 
        /**
-        * @var array A array with user ids as key and a array of groups as value
+        * @var array[] A array with user ids as key and a array of groups as value
         */
        protected $userGroupCache;
 
@@ -391,8 +391,8 @@ class UsersPager extends AlphabeticPager {
         * and the relevant UserGroupMembership objects
         *
         * @param int $uid User id
-        * @param array|null $cache
-        * @return array (group name => UserGroupMembership object)
+        * @param array[]|null $cache
+        * @return UserGroupMembership[] (group name => UserGroupMembership object)
         */
        protected static function getGroupMemberships( $uid, $cache = null ) {
                if ( $cache === null ) {
index 82c35bb..e570633 100644 (file)
@@ -2052,73 +2052,73 @@ class Balancer {
                        return true;
                } elseif ( $token === 'tag' ) {
                        switch ( $value ) {
-                       case 'font':
-                               if ( isset( $attribs['color'] )
-                                       || isset( $attribs['face'] )
-                                       || isset( $attribs['size'] )
-                               ) {
-                                       break;
-                               }
-                               // otherwise, fall through
-                       case 'b':
-                       case 'big':
-                       case 'blockquote':
-                       case 'body':
-                       case 'br':
-                       case 'center':
-                       case 'code':
-                       case 'dd':
-                       case 'div':
-                       case 'dl':
-                       case 'dt':
-                       case 'em':
-                       case 'embed':
-                       case 'h1':
-                       case 'h2':
-                       case 'h3':
-                       case 'h4':
-                       case 'h5':
-                       case 'h6':
-                       case 'head':
-                       case 'hr':
-                       case 'i':
-                       case 'img':
-                       case 'li':
-                       case 'listing':
-                       case 'menu':
-                       case 'meta':
-                       case 'nobr':
-                       case 'ol':
-                       case 'p':
-                       case 'pre':
-                       case 'ruby':
-                       case 's':
-                       case 'small':
-                       case 'span':
-                       case 'strong':
-                       case 'strike':
-                       case 'sub':
-                       case 'sup':
-                       case 'table':
-                       case 'tt':
-                       case 'u':
-                       case 'ul':
-                       case 'var':
-                               if ( $this->fragmentContext ) {
-                                       break;
-                               }
-                               while ( true ) {
-                                       $this->stack->pop();
-                                       $node = $this->stack->currentNode;
-                                       if (
-                                               $node->isMathmlTextIntegrationPoint() ||
-                                               $node->isHtmlIntegrationPoint() ||
-                                               $node->isHtml()
+                               case 'font':
+                                       if ( isset( $attribs['color'] )
+                                               || isset( $attribs['face'] )
+                                               || isset( $attribs['size'] )
                                        ) {
                                                break;
                                        }
-                               }
-                               return $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       // otherwise, fall through
+                               case 'b':
+                               case 'big':
+                               case 'blockquote':
+                               case 'body':
+                               case 'br':
+                               case 'center':
+                               case 'code':
+                               case 'dd':
+                               case 'div':
+                               case 'dl':
+                               case 'dt':
+                               case 'em':
+                               case 'embed':
+                               case 'h1':
+                               case 'h2':
+                               case 'h3':
+                               case 'h4':
+                               case 'h5':
+                               case 'h6':
+                               case 'head':
+                               case 'hr':
+                               case 'i':
+                               case 'img':
+                               case 'li':
+                               case 'listing':
+                               case 'menu':
+                               case 'meta':
+                               case 'nobr':
+                               case 'ol':
+                               case 'p':
+                               case 'pre':
+                               case 'ruby':
+                               case 's':
+                               case 'small':
+                               case 'span':
+                               case 'strong':
+                               case 'strike':
+                               case 'sub':
+                               case 'sup':
+                               case 'table':
+                               case 'tt':
+                               case 'u':
+                               case 'ul':
+                               case 'var':
+                                       if ( $this->fragmentContext ) {
+                                               break;
+                                       }
+                                       while ( true ) {
+                                               $this->stack->pop();
+                                               $node = $this->stack->currentNode;
+                                               if (
+                                                       $node->isMathmlTextIntegrationPoint() ||
+                                                       $node->isHtmlIntegrationPoint() ||
+                                                       $node->isHtml()
+                                               ) {
+                                                       break;
+                                               }
+                                       }
+                                       return $this->insertToken( $token, $value, $attribs, $selfClose );
                        }
                        // "Any other start tag"
                        $adjusted = ( $this->fragmentContext && $this->stack->length() === 1 ) ?
@@ -2270,56 +2270,56 @@ class Balancer {
                        }
                        if ( $node->isHtml() ) {
                                switch ( $node->localName ) {
-                               case 'select':
-                                       $stackLength = $this->stack->length();
-                                       for ( $j = $i + 1; $j < $stackLength - 1; $j++ ) {
-                                               $ancestor = $this->stack->node( $stackLength - $j - 1 );
-                                               if ( $ancestor->isHtmlNamed( 'template' ) ) {
-                                                       break;
+                                       case 'select':
+                                               $stackLength = $this->stack->length();
+                                               for ( $j = $i + 1; $j < $stackLength - 1; $j++ ) {
+                                                       $ancestor = $this->stack->node( $stackLength - $j - 1 );
+                                                       if ( $ancestor->isHtmlNamed( 'template' ) ) {
+                                                               break;
+                                                       }
+                                                       if ( $ancestor->isHtmlNamed( 'table' ) ) {
+                                                               $this->switchMode( 'inSelectInTableMode' );
+                                                               return;
+                                                       }
                                                }
-                                               if ( $ancestor->isHtmlNamed( 'table' ) ) {
-                                                       $this->switchMode( 'inSelectInTableMode' );
-                                                       return;
-                                               }
-                                       }
-                                       $this->switchMode( 'inSelectMode' );
-                                       return;
-                               case 'tr':
-                                       $this->switchMode( 'inRowMode' );
-                                       return;
-                               case 'tbody':
-                               case 'tfoot':
-                               case 'thead':
-                                       $this->switchMode( 'inTableBodyMode' );
-                                       return;
-                               case 'caption':
-                                       $this->switchMode( 'inCaptionMode' );
-                                       return;
-                               case 'colgroup':
-                                       $this->switchMode( 'inColumnGroupMode' );
-                                       return;
-                               case 'table':
-                                       $this->switchMode( 'inTableMode' );
-                                       return;
-                               case 'template':
-                                       $this->switchMode(
-                                               array_slice( $this->templateInsertionModes, -1 )[0]
-                                       );
-                                       return;
-                               case 'body':
-                                       $this->switchMode( 'inBodyMode' );
-                                       return;
-                               // OMITTED: <frameset>
-                               // OMITTED: <html>
-                               // OMITTED: <head>
-                               default:
-                                       if ( !$last ) {
-                                               // OMITTED: <head>
-                                               if ( $node->isA( BalanceSets::$tableCellSet ) ) {
-                                                       $this->switchMode( 'inCellMode' );
-                                                       return;
+                                               $this->switchMode( 'inSelectMode' );
+                                               return;
+                                       case 'tr':
+                                               $this->switchMode( 'inRowMode' );
+                                               return;
+                                       case 'tbody':
+                                       case 'tfoot':
+                                       case 'thead':
+                                               $this->switchMode( 'inTableBodyMode' );
+                                               return;
+                                       case 'caption':
+                                               $this->switchMode( 'inCaptionMode' );
+                                               return;
+                                       case 'colgroup':
+                                               $this->switchMode( 'inColumnGroupMode' );
+                                               return;
+                                       case 'table':
+                                               $this->switchMode( 'inTableMode' );
+                                               return;
+                                       case 'template':
+                                               $this->switchMode(
+                                                       array_slice( $this->templateInsertionModes, -1 )[0]
+                                               );
+                                               return;
+                                       case 'body':
+                                               $this->switchMode( 'inBodyMode' );
+                                               return;
+                                       // OMITTED: <frameset>
+                                       // OMITTED: <html>
+                                       // OMITTED: <head>
+                                       default:
+                                               if ( !$last ) {
+                                                       // OMITTED: <head>
+                                                       if ( $node->isA( BalanceSets::$tableCellSet ) ) {
+                                                               $this->switchMode( 'inCellMode' );
+                                                               return;
+                                                       }
                                                }
-                                       }
                                }
                        }
                        if ( $last ) {
@@ -2378,52 +2378,52 @@ class Balancer {
                        // Fall through to handle non-whitespace below.
                } elseif ( $token === 'tag' ) {
                        switch ( $value ) {
-                       case 'meta':
-                               // OMITTED: in a full HTML parser, this might change the encoding.
-                               // falls through
-                       // OMITTED: <html>
-                       case 'base':
-                       case 'basefont':
-                       case 'bgsound':
-                       case 'link':
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->stack->pop();
-                               return true;
-                       // OMITTED: <title>
-                       // OMITTED: <noscript>
-                       case 'noframes':
-                       case 'style':
-                               return $this->parseRawText( $value, $attribs );
-                       // OMITTED: <script>
-                       case 'template':
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->afe->insertMarker();
-                               // OMITTED: frameset_ok
-                               $this->switchMode( 'inTemplateMode' );
-                               $this->templateInsertionModes[] = $this->parseMode;
-                               return true;
-                       // OMITTED: <head>
+                               case 'meta':
+                                       // OMITTED: in a full HTML parser, this might change the encoding.
+                                       // falls through
+                               // OMITTED: <html>
+                               case 'base':
+                               case 'basefont':
+                               case 'bgsound':
+                               case 'link':
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->stack->pop();
+                                       return true;
+                               // OMITTED: <title>
+                               // OMITTED: <noscript>
+                               case 'noframes':
+                               case 'style':
+                                       return $this->parseRawText( $value, $attribs );
+                               // OMITTED: <script>
+                               case 'template':
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->afe->insertMarker();
+                                       // OMITTED: frameset_ok
+                                       $this->switchMode( 'inTemplateMode' );
+                                       $this->templateInsertionModes[] = $this->parseMode;
+                                       return true;
+                               // OMITTED: <head>
                        }
                } elseif ( $token === 'endtag' ) {
                        switch ( $value ) {
-                       // OMITTED: <head>
-                       // OMITTED: <body>
-                       // OMITTED: <html>
-                       case 'br':
-                               break; // handle at the bottom of the function
-                       case 'template':
-                               if ( $this->stack->indexOf( $value ) < 0 ) {
-                                       return true; // Ignore the token.
-                               }
-                               $this->stack->generateImpliedEndTags( null, true /* thorough */ );
-                               $this->stack->popTag( $value );
-                               $this->afe->clearToMarker();
-                               array_pop( $this->templateInsertionModes );
-                               $this->resetInsertionMode();
-                               return true;
-                       default:
-                               // ignore any other end tag
-                               return true;
+                               // OMITTED: <head>
+                               // OMITTED: <body>
+                               // OMITTED: <html>
+                               case 'br':
+                                       break; // handle at the bottom of the function
+                               case 'template':
+                                       if ( $this->stack->indexOf( $value ) < 0 ) {
+                                               return true; // Ignore the token.
+                                       }
+                                       $this->stack->generateImpliedEndTags( null, true /* thorough */ );
+                                       $this->stack->popTag( $value );
+                                       $this->afe->clearToMarker();
+                                       array_pop( $this->templateInsertionModes );
+                                       $this->resetInsertionMode();
+                                       return true;
+                               default:
+                                       // ignore any other end tag
+                                       return true;
                        }
                } elseif ( $token === 'comment' ) {
                        $this->stack->insertComment( $value );
@@ -2449,505 +2449,505 @@ class Balancer {
                        return true;
                } elseif ( $token === 'tag' ) {
                        switch ( $value ) {
-                       // OMITTED: <html>
-                       case 'base':
-                       case 'basefont':
-                       case 'bgsound':
-                       case 'link':
-                       case 'meta':
-                       case 'noframes':
-                       // OMITTED: <script>
-                       case 'style':
-                       case 'template':
-                       // OMITTED: <title>
-                               return $this->inHeadMode( $token, $value, $attribs, $selfClose );
-                       // OMITTED: <body>
-                       // OMITTED: <frameset>
-
-                       case 'address':
-                       case 'article':
-                       case 'aside':
-                       case 'blockquote':
-                       case 'center':
-                       case 'details':
-                       case 'dialog':
-                       case 'dir':
-                       case 'div':
-                       case 'dl':
-                       case 'fieldset':
-                       case 'figcaption':
-                       case 'figure':
-                       case 'footer':
-                       case 'header':
-                       case 'hgroup':
-                       case 'main':
-                       case 'nav':
-                       case 'ol':
-                       case 'p':
-                       case 'section':
-                       case 'summary':
-                       case 'ul':
-                               if ( $this->stack->inButtonScope( 'p' ) ) {
-                                       $this->inBodyMode( 'endtag', 'p' );
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
-
-                       case 'menu':
-                               if ( $this->stack->inButtonScope( "p" ) ) {
-                                       $this->inBodyMode( 'endtag', 'p' );
-                               }
-                               if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
-                                       $this->stack->pop();
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
+                               // OMITTED: <html>
+                               case 'base':
+                               case 'basefont':
+                               case 'bgsound':
+                               case 'link':
+                               case 'meta':
+                               case 'noframes':
+                               // OMITTED: <script>
+                               case 'style':
+                               case 'template':
+                               // OMITTED: <title>
+                                       return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+                               // OMITTED: <body>
+                               // OMITTED: <frameset>
 
-                       case 'h1':
-                       case 'h2':
-                       case 'h3':
-                       case 'h4':
-                       case 'h5':
-                       case 'h6':
-                               if ( $this->stack->inButtonScope( 'p' ) ) {
-                                       $this->inBodyMode( 'endtag', 'p' );
-                               }
-                               if ( $this->stack->currentNode->isA( BalanceSets::$headingSet ) ) {
-                                       $this->stack->pop();
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
+                               case 'address':
+                               case 'article':
+                               case 'aside':
+                               case 'blockquote':
+                               case 'center':
+                               case 'details':
+                               case 'dialog':
+                               case 'dir':
+                               case 'div':
+                               case 'dl':
+                               case 'fieldset':
+                               case 'figcaption':
+                               case 'figure':
+                               case 'footer':
+                               case 'header':
+                               case 'hgroup':
+                               case 'main':
+                               case 'nav':
+                               case 'ol':
+                               case 'p':
+                               case 'section':
+                               case 'summary':
+                               case 'ul':
+                                       if ( $this->stack->inButtonScope( 'p' ) ) {
+                                               $this->inBodyMode( 'endtag', 'p' );
+                                       }
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
 
-                       case 'pre':
-                       case 'listing':
-                               if ( $this->stack->inButtonScope( 'p' ) ) {
-                                       $this->inBodyMode( 'endtag', 'p' );
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->ignoreLinefeed = true;
-                               // OMITTED: frameset_ok
-                               return true;
+                               case 'menu':
+                                       if ( $this->stack->inButtonScope( "p" ) ) {
+                                               $this->inBodyMode( 'endtag', 'p' );
+                                       }
+                                       if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                                               $this->stack->pop();
+                                       }
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
 
-                       case 'form':
-                               if (
-                                       $this->formElementPointer &&
-                                       $this->stack->indexOf( 'template' ) < 0
-                               ) {
-                                       return true; // in a form, not in a template.
-                               }
-                               if ( $this->stack->inButtonScope( "p" ) ) {
-                                       $this->inBodyMode( 'endtag', 'p' );
-                               }
-                               $elt = $this->stack->insertHTMLElement( $value, $attribs );
-                               if ( $this->stack->indexOf( 'template' ) < 0 ) {
-                                       $this->formElementPointer = $elt;
-                               }
-                               return true;
+                               case 'h1':
+                               case 'h2':
+                               case 'h3':
+                               case 'h4':
+                               case 'h5':
+                               case 'h6':
+                                       if ( $this->stack->inButtonScope( 'p' ) ) {
+                                               $this->inBodyMode( 'endtag', 'p' );
+                                       }
+                                       if ( $this->stack->currentNode->isA( BalanceSets::$headingSet ) ) {
+                                               $this->stack->pop();
+                                       }
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
 
-                       case 'li':
-                               // OMITTED: frameset_ok
-                               foreach ( $this->stack as $node ) {
-                                       if ( $node->isHtmlNamed( 'li' ) ) {
-                                               $this->inBodyMode( 'endtag', 'li' );
-                                               break;
+                               case 'pre':
+                               case 'listing':
+                                       if ( $this->stack->inButtonScope( 'p' ) ) {
+                                               $this->inBodyMode( 'endtag', 'p' );
                                        }
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->ignoreLinefeed = true;
+                                       // OMITTED: frameset_ok
+                                       return true;
+
+                               case 'form':
                                        if (
-                                               $node->isA( BalanceSets::$specialSet ) &&
-                                               !$node->isA( BalanceSets::$addressDivPSet )
+                                               $this->formElementPointer &&
+                                               $this->stack->indexOf( 'template' ) < 0
                                        ) {
-                                               break;
+                                               return true; // in a form, not in a template.
                                        }
-                               }
-                               if ( $this->stack->inButtonScope( 'p' ) ) {
-                                       $this->inBodyMode( 'endtag', 'p' );
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
-
-                       case 'dd':
-                       case 'dt':
-                               // OMITTED: frameset_ok
-                               foreach ( $this->stack as $node ) {
-                                       if ( $node->isHtmlNamed( 'dd' ) ) {
-                                               $this->inBodyMode( 'endtag', 'dd' );
-                                               break;
+                                       if ( $this->stack->inButtonScope( "p" ) ) {
+                                               $this->inBodyMode( 'endtag', 'p' );
                                        }
-                                       if ( $node->isHtmlNamed( 'dt' ) ) {
-                                               $this->inBodyMode( 'endtag', 'dt' );
-                                               break;
+                                       $elt = $this->stack->insertHTMLElement( $value, $attribs );
+                                       if ( $this->stack->indexOf( 'template' ) < 0 ) {
+                                               $this->formElementPointer = $elt;
                                        }
-                                       if (
-                                               $node->isA( BalanceSets::$specialSet ) &&
-                                               !$node->isA( BalanceSets::$addressDivPSet )
-                                       ) {
-                                               break;
+                                       return true;
+
+                               case 'li':
+                                       // OMITTED: frameset_ok
+                                       foreach ( $this->stack as $node ) {
+                                               if ( $node->isHtmlNamed( 'li' ) ) {
+                                                       $this->inBodyMode( 'endtag', 'li' );
+                                                       break;
+                                               }
+                                               if (
+                                                       $node->isA( BalanceSets::$specialSet ) &&
+                                                       !$node->isA( BalanceSets::$addressDivPSet )
+                                               ) {
+                                                       break;
+                                               }
                                        }
-                               }
-                               if ( $this->stack->inButtonScope( 'p' ) ) {
-                                       $this->inBodyMode( 'endtag', 'p' );
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
+                                       if ( $this->stack->inButtonScope( 'p' ) ) {
+                                               $this->inBodyMode( 'endtag', 'p' );
+                                       }
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
 
-                       // OMITTED: <plaintext>
+                               case 'dd':
+                               case 'dt':
+                                       // OMITTED: frameset_ok
+                                       foreach ( $this->stack as $node ) {
+                                               if ( $node->isHtmlNamed( 'dd' ) ) {
+                                                       $this->inBodyMode( 'endtag', 'dd' );
+                                                       break;
+                                               }
+                                               if ( $node->isHtmlNamed( 'dt' ) ) {
+                                                       $this->inBodyMode( 'endtag', 'dt' );
+                                                       break;
+                                               }
+                                               if (
+                                                       $node->isA( BalanceSets::$specialSet ) &&
+                                                       !$node->isA( BalanceSets::$addressDivPSet )
+                                               ) {
+                                                       break;
+                                               }
+                                       }
+                                       if ( $this->stack->inButtonScope( 'p' ) ) {
+                                               $this->inBodyMode( 'endtag', 'p' );
+                                       }
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
 
-                       case 'button':
-                               if ( $this->stack->inScope( 'button' ) ) {
-                                       $this->inBodyMode( 'endtag', 'button' );
-                                       return $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               $this->afe->reconstruct( $this->stack );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
+                               // OMITTED: <plaintext>
 
-                       case 'a':
-                               $activeElement = $this->afe->findElementByTag( 'a' );
-                               if ( $activeElement ) {
-                                       $this->inBodyMode( 'endtag', 'a' );
-                                       if ( $this->afe->isInList( $activeElement ) ) {
-                                               $this->afe->remove( $activeElement );
-                                               // Don't flatten here, since when we fall
-                                               // through below we might foster parent
-                                               // the new <a> tag inside this one.
-                                               $this->stack->removeElement( $activeElement, false );
+                               case 'button':
+                                       if ( $this->stack->inScope( 'button' ) ) {
+                                               $this->inBodyMode( 'endtag', 'button' );
+                                               return $this->insertToken( $token, $value, $attribs, $selfClose );
                                        }
-                               }
-                               // Falls through
-                       case 'b':
-                       case 'big':
-                       case 'code':
-                       case 'em':
-                       case 'font':
-                       case 'i':
-                       case 's':
-                       case 'small':
-                       case 'strike':
-                       case 'strong':
-                       case 'tt':
-                       case 'u':
-                               $this->afe->reconstruct( $this->stack );
-                               $this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ) );
-                               return true;
-
-                       case 'nobr':
-                               $this->afe->reconstruct( $this->stack );
-                               if ( $this->stack->inScope( 'nobr' ) ) {
-                                       $this->inBodyMode( 'endtag', 'nobr' );
                                        $this->afe->reconstruct( $this->stack );
-                               }
-                               $this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ) );
-                               return true;
-
-                       case 'applet':
-                       case 'marquee':
-                       case 'object':
-                               $this->afe->reconstruct( $this->stack );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->afe->insertMarker();
-                               // OMITTED: frameset_ok
-                               return true;
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
 
-                       case 'table':
-                               // The document is never in "quirks mode"; see simplifications
-                               // above.
-                               if ( $this->stack->inButtonScope( 'p' ) ) {
-                                       $this->inBodyMode( 'endtag', 'p' );
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               // OMITTED: frameset_ok
-                               $this->switchMode( 'inTableMode' );
-                               return true;
+                               case 'a':
+                                       $activeElement = $this->afe->findElementByTag( 'a' );
+                                       if ( $activeElement ) {
+                                               $this->inBodyMode( 'endtag', 'a' );
+                                               if ( $this->afe->isInList( $activeElement ) ) {
+                                                       $this->afe->remove( $activeElement );
+                                                       // Don't flatten here, since when we fall
+                                                       // through below we might foster parent
+                                                       // the new <a> tag inside this one.
+                                                       $this->stack->removeElement( $activeElement, false );
+                                               }
+                                       }
+                                       // Falls through
+                               case 'b':
+                               case 'big':
+                               case 'code':
+                               case 'em':
+                               case 'font':
+                               case 'i':
+                               case 's':
+                               case 'small':
+                               case 'strike':
+                               case 'strong':
+                               case 'tt':
+                               case 'u':
+                                       $this->afe->reconstruct( $this->stack );
+                                       $this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ) );
+                                       return true;
 
-                       case 'area':
-                       case 'br':
-                       case 'embed':
-                       case 'img':
-                       case 'keygen':
-                       case 'wbr':
-                               $this->afe->reconstruct( $this->stack );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->stack->pop();
-                               // OMITTED: frameset_ok
-                               return true;
+                               case 'nobr':
+                                       $this->afe->reconstruct( $this->stack );
+                                       if ( $this->stack->inScope( 'nobr' ) ) {
+                                               $this->inBodyMode( 'endtag', 'nobr' );
+                                               $this->afe->reconstruct( $this->stack );
+                                       }
+                                       $this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ) );
+                                       return true;
 
-                       case 'input':
-                               $this->afe->reconstruct( $this->stack );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->stack->pop();
-                               // OMITTED: frameset_ok
-                               // (hence we don't need to examine the tag's "type" attribute)
-                               return true;
+                               case 'applet':
+                               case 'marquee':
+                               case 'object':
+                                       $this->afe->reconstruct( $this->stack );
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->afe->insertMarker();
+                                       // OMITTED: frameset_ok
+                                       return true;
 
-                       case 'param':
-                       case 'source':
-                       case 'track':
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->stack->pop();
-                               return true;
+                               case 'table':
+                                       // The document is never in "quirks mode"; see simplifications
+                                       // above.
+                                       if ( $this->stack->inButtonScope( 'p' ) ) {
+                                               $this->inBodyMode( 'endtag', 'p' );
+                                       }
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       // OMITTED: frameset_ok
+                                       $this->switchMode( 'inTableMode' );
+                                       return true;
 
-                       case 'hr':
-                               if ( $this->stack->inButtonScope( 'p' ) ) {
-                                       $this->inBodyMode( 'endtag', 'p' );
-                               }
-                               if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                               case 'area':
+                               case 'br':
+                               case 'embed':
+                               case 'img':
+                               case 'keygen':
+                               case 'wbr':
+                                       $this->afe->reconstruct( $this->stack );
+                                       $this->stack->insertHTMLElement( $value, $attribs );
                                        $this->stack->pop();
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->stack->pop();
-                               return true;
-
-                       case 'image':
-                               // warts!
-                               return $this->inBodyMode( $token, 'img', $attribs, $selfClose );
-
-                       case 'textarea':
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->ignoreLinefeed = true;
-                               $this->inRCDATA = $value; // emulate rcdata tokenizer mode
-                               // OMITTED: frameset_ok
-                               return true;
-
-                       // OMITTED: <xmp>
-                       // OMITTED: <iframe>
-                       // OMITTED: <noembed>
-                       // OMITTED: <noscript>
-
-                       case 'select':
-                               $this->afe->reconstruct( $this->stack );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               switch ( $this->parseMode ) {
-                               case 'inTableMode':
-                               case 'inCaptionMode':
-                               case 'inTableBodyMode':
-                               case 'inRowMode':
-                               case 'inCellMode':
-                                       $this->switchMode( 'inSelectInTableMode' );
+                                       // OMITTED: frameset_ok
                                        return true;
-                               default:
-                                       $this->switchMode( 'inSelectMode' );
+
+                               case 'input':
+                                       $this->afe->reconstruct( $this->stack );
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->stack->pop();
+                                       // OMITTED: frameset_ok
+                                       // (hence we don't need to examine the tag's "type" attribute)
                                        return true;
-                               }
 
-                       case 'optgroup':
-                       case 'option':
-                               if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
-                                       $this->inBodyMode( 'endtag', 'option' );
-                               }
-                               $this->afe->reconstruct( $this->stack );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
+                               case 'param':
+                               case 'source':
+                               case 'track':
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->stack->pop();
+                                       return true;
 
-                       case 'menuitem':
-                               if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                               case 'hr':
+                                       if ( $this->stack->inButtonScope( 'p' ) ) {
+                                               $this->inBodyMode( 'endtag', 'p' );
+                                       }
+                                       if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                                               $this->stack->pop();
+                                       }
+                                       $this->stack->insertHTMLElement( $value, $attribs );
                                        $this->stack->pop();
-                               }
-                               $this->afe->reconstruct( $this->stack );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
+                                       return true;
 
-                       case 'rb':
-                       case 'rtc':
-                               if ( $this->stack->inScope( 'ruby' ) ) {
-                                       $this->stack->generateImpliedEndTags();
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
+                               case 'image':
+                                       // warts!
+                                       return $this->inBodyMode( $token, 'img', $attribs, $selfClose );
 
-                       case 'rp':
-                       case 'rt':
-                               if ( $this->stack->inScope( 'ruby' ) ) {
-                                       $this->stack->generateImpliedEndTags( 'rtc' );
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
+                               case 'textarea':
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->ignoreLinefeed = true;
+                                       $this->inRCDATA = $value; // emulate rcdata tokenizer mode
+                                       // OMITTED: frameset_ok
+                                       return true;
 
-                       case 'math':
-                               $this->afe->reconstruct( $this->stack );
-                               // We skip the spec's "adjust MathML attributes" and
-                               // "adjust foreign attributes" steps, since the browser will
-                               // do this later when it parses the output and it doesn't affect
-                               // balancing.
-                               $this->stack->insertForeignElement(
-                                       BalanceSets::MATHML_NAMESPACE, $value, $attribs
-                               );
-                               if ( $selfClose ) {
-                                       // emit explicit </math> tag.
-                                       $this->stack->pop();
-                               }
-                               return true;
+                               // OMITTED: <xmp>
+                               // OMITTED: <iframe>
+                               // OMITTED: <noembed>
+                               // OMITTED: <noscript>
 
-                       case 'svg':
-                               $this->afe->reconstruct( $this->stack );
-                               // We skip the spec's "adjust SVG attributes" and
-                               // "adjust foreign attributes" steps, since the browser will
-                               // do this later when it parses the output and it doesn't affect
-                               // balancing.
-                               $this->stack->insertForeignElement(
-                                       BalanceSets::SVG_NAMESPACE, $value, $attribs
-                               );
-                               if ( $selfClose ) {
-                                       // emit explicit </svg> tag.
-                                       $this->stack->pop();
-                               }
-                               return true;
+                               case 'select':
+                                       $this->afe->reconstruct( $this->stack );
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       switch ( $this->parseMode ) {
+                                               case 'inTableMode':
+                                               case 'inCaptionMode':
+                                               case 'inTableBodyMode':
+                                               case 'inRowMode':
+                                               case 'inCellMode':
+                                                       $this->switchMode( 'inSelectInTableMode' );
+                                                       return true;
+                                               default:
+                                                       $this->switchMode( 'inSelectMode' );
+                                                       return true;
+                                       }
 
-                       case 'caption':
-                       case 'col':
-                       case 'colgroup':
-                       // OMITTED: <frame>
-                       case 'head':
-                       case 'tbody':
-                       case 'td':
-                       case 'tfoot':
-                       case 'th':
-                       case 'thead':
-                       case 'tr':
-                               // Ignore table tags if we're not inTableMode
-                               return true;
-                       }
+                               case 'optgroup':
+                               case 'option':
+                                       if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+                                               $this->inBodyMode( 'endtag', 'option' );
+                                       }
+                                       $this->afe->reconstruct( $this->stack );
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
 
-                       // Handle any other start tag here
-                       $this->afe->reconstruct( $this->stack );
-                       $this->stack->insertHTMLElement( $value, $attribs );
-                       return true;
-               } elseif ( $token === 'endtag' ) {
-                       switch ( $value ) {
-                       // </body>,</html> are unsupported.
-
-                       case 'template':
-                               return $this->inHeadMode( $token, $value, $attribs, $selfClose );
-
-                       case 'address':
-                       case 'article':
-                       case 'aside':
-                       case 'blockquote':
-                       case 'button':
-                       case 'center':
-                       case 'details':
-                       case 'dialog':
-                       case 'dir':
-                       case 'div':
-                       case 'dl':
-                       case 'fieldset':
-                       case 'figcaption':
-                       case 'figure':
-                       case 'footer':
-                       case 'header':
-                       case 'hgroup':
-                       case 'listing':
-                       case 'main':
-                       case 'menu':
-                       case 'nav':
-                       case 'ol':
-                       case 'pre':
-                       case 'section':
-                       case 'summary':
-                       case 'ul':
-                               // Ignore if there is not a matching open tag
-                               if ( !$this->stack->inScope( $value ) ) {
+                               case 'menuitem':
+                                       if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                                               $this->stack->pop();
+                                       }
+                                       $this->afe->reconstruct( $this->stack );
+                                       $this->stack->insertHTMLElement( $value, $attribs );
                                        return true;
-                               }
-                               $this->stack->generateImpliedEndTags();
-                               $this->stack->popTag( $value );
-                               return true;
 
-                       case 'form':
-                               if ( $this->stack->indexOf( 'template' ) < 0 ) {
-                                       $openform = $this->formElementPointer;
-                                       $this->formElementPointer = null;
-                                       if ( !$openform || !$this->stack->inScope( $openform ) ) {
-                                               return true;
+                               case 'rb':
+                               case 'rtc':
+                                       if ( $this->stack->inScope( 'ruby' ) ) {
+                                               $this->stack->generateImpliedEndTags();
                                        }
-                                       $this->stack->generateImpliedEndTags();
-                                       // Don't flatten yet if we're removing a <form> element
-                                       // out-of-order. (eg. `<form><div></form>`)
-                                       $flatten = ( $this->stack->currentNode === $openform );
-                                       $this->stack->removeElement( $openform, $flatten );
-                               } else {
-                                       if ( !$this->stack->inScope( 'form' ) ) {
-                                               return true;
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
+
+                               case 'rp':
+                               case 'rt':
+                                       if ( $this->stack->inScope( 'ruby' ) ) {
+                                               $this->stack->generateImpliedEndTags( 'rtc' );
                                        }
-                                       $this->stack->generateImpliedEndTags();
-                                       $this->stack->popTag( 'form' );
-                               }
-                               return true;
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
 
-                       case 'p':
-                               if ( !$this->stack->inButtonScope( 'p' ) ) {
-                                       $this->inBodyMode( 'tag', 'p', [] );
-                                       return $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               $this->stack->generateImpliedEndTags( $value );
-                               $this->stack->popTag( $value );
-                               return true;
+                               case 'math':
+                                       $this->afe->reconstruct( $this->stack );
+                                       // We skip the spec's "adjust MathML attributes" and
+                                       // "adjust foreign attributes" steps, since the browser will
+                                       // do this later when it parses the output and it doesn't affect
+                                       // balancing.
+                                       $this->stack->insertForeignElement(
+                                               BalanceSets::MATHML_NAMESPACE, $value, $attribs
+                                       );
+                                       if ( $selfClose ) {
+                                               // emit explicit </math> tag.
+                                               $this->stack->pop();
+                                       }
+                                       return true;
 
-                       case 'li':
-                               if ( !$this->stack->inListItemScope( $value ) ) {
-                                       return true; // ignore
-                               }
-                               $this->stack->generateImpliedEndTags( $value );
-                               $this->stack->popTag( $value );
-                               return true;
+                               case 'svg':
+                                       $this->afe->reconstruct( $this->stack );
+                                       // We skip the spec's "adjust SVG attributes" and
+                                       // "adjust foreign attributes" steps, since the browser will
+                                       // do this later when it parses the output and it doesn't affect
+                                       // balancing.
+                                       $this->stack->insertForeignElement(
+                                               BalanceSets::SVG_NAMESPACE, $value, $attribs
+                                       );
+                                       if ( $selfClose ) {
+                                               // emit explicit </svg> tag.
+                                               $this->stack->pop();
+                                       }
+                                       return true;
 
-                       case 'dd':
-                       case 'dt':
-                               if ( !$this->stack->inScope( $value ) ) {
-                                       return true; // ignore
-                               }
-                               $this->stack->generateImpliedEndTags( $value );
-                               $this->stack->popTag( $value );
-                               return true;
+                               case 'caption':
+                               case 'col':
+                               case 'colgroup':
+                               // OMITTED: <frame>
+                               case 'head':
+                               case 'tbody':
+                               case 'td':
+                               case 'tfoot':
+                               case 'th':
+                               case 'thead':
+                               case 'tr':
+                                       // Ignore table tags if we're not inTableMode
+                                       return true;
+                       }
 
-                       case 'h1':
-                       case 'h2':
-                       case 'h3':
-                       case 'h4':
-                       case 'h5':
-                       case 'h6':
-                               if ( !$this->stack->inScope( BalanceSets::$headingSet ) ) {
-                                       return true; // ignore
-                               }
-                               $this->stack->generateImpliedEndTags();
-                               $this->stack->popTag( BalanceSets::$headingSet );
-                               return true;
+                       // Handle any other start tag here
+                       $this->afe->reconstruct( $this->stack );
+                       $this->stack->insertHTMLElement( $value, $attribs );
+                       return true;
+               } elseif ( $token === 'endtag' ) {
+                       switch ( $value ) {
+                               // </body>,</html> are unsupported.
 
-                       case 'sarcasm':
-                               // Take a deep breath, then:
-                               break;
+                               case 'template':
+                                       return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+
+                               case 'address':
+                               case 'article':
+                               case 'aside':
+                               case 'blockquote':
+                               case 'button':
+                               case 'center':
+                               case 'details':
+                               case 'dialog':
+                               case 'dir':
+                               case 'div':
+                               case 'dl':
+                               case 'fieldset':
+                               case 'figcaption':
+                               case 'figure':
+                               case 'footer':
+                               case 'header':
+                               case 'hgroup':
+                               case 'listing':
+                               case 'main':
+                               case 'menu':
+                               case 'nav':
+                               case 'ol':
+                               case 'pre':
+                               case 'section':
+                               case 'summary':
+                               case 'ul':
+                                       // Ignore if there is not a matching open tag
+                                       if ( !$this->stack->inScope( $value ) ) {
+                                               return true;
+                                       }
+                                       $this->stack->generateImpliedEndTags();
+                                       $this->stack->popTag( $value );
+                                       return true;
 
-                       case 'a':
-                       case 'b':
-                       case 'big':
-                       case 'code':
-                       case 'em':
-                       case 'font':
-                       case 'i':
-                       case 'nobr':
-                       case 's':
-                       case 'small':
-                       case 'strike':
-                       case 'strong':
-                       case 'tt':
-                       case 'u':
-                               if ( $this->stack->adoptionAgency( $value, $this->afe ) ) {
-                                       return true; // If we did something, we're done.
-                               }
-                               break; // Go to the "any other end tag" case.
+                               case 'form':
+                                       if ( $this->stack->indexOf( 'template' ) < 0 ) {
+                                               $openform = $this->formElementPointer;
+                                               $this->formElementPointer = null;
+                                               if ( !$openform || !$this->stack->inScope( $openform ) ) {
+                                                       return true;
+                                               }
+                                               $this->stack->generateImpliedEndTags();
+                                               // Don't flatten yet if we're removing a <form> element
+                                               // out-of-order. (eg. `<form><div></form>`)
+                                               $flatten = ( $this->stack->currentNode === $openform );
+                                               $this->stack->removeElement( $openform, $flatten );
+                                       } else {
+                                               if ( !$this->stack->inScope( 'form' ) ) {
+                                                       return true;
+                                               }
+                                               $this->stack->generateImpliedEndTags();
+                                               $this->stack->popTag( 'form' );
+                                       }
+                                       return true;
 
-                       case 'applet':
-                       case 'marquee':
-                       case 'object':
-                               if ( !$this->stack->inScope( $value ) ) {
-                                       return true; // ignore
-                               }
-                               $this->stack->generateImpliedEndTags();
-                               $this->stack->popTag( $value );
-                               $this->afe->clearToMarker();
-                               return true;
+                               case 'p':
+                                       if ( !$this->stack->inButtonScope( 'p' ) ) {
+                                               $this->inBodyMode( 'tag', 'p', [] );
+                                               return $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       $this->stack->generateImpliedEndTags( $value );
+                                       $this->stack->popTag( $value );
+                                       return true;
 
-                       case 'br':
-                               // Turn </br> into <br>
-                               return $this->inBodyMode( 'tag', $value, [] );
+                               case 'li':
+                                       if ( !$this->stack->inListItemScope( $value ) ) {
+                                               return true; // ignore
+                                       }
+                                       $this->stack->generateImpliedEndTags( $value );
+                                       $this->stack->popTag( $value );
+                                       return true;
+
+                               case 'dd':
+                               case 'dt':
+                                       if ( !$this->stack->inScope( $value ) ) {
+                                               return true; // ignore
+                                       }
+                                       $this->stack->generateImpliedEndTags( $value );
+                                       $this->stack->popTag( $value );
+                                       return true;
+
+                               case 'h1':
+                               case 'h2':
+                               case 'h3':
+                               case 'h4':
+                               case 'h5':
+                               case 'h6':
+                                       if ( !$this->stack->inScope( BalanceSets::$headingSet ) ) {
+                                               return true; // ignore
+                                       }
+                                       $this->stack->generateImpliedEndTags();
+                                       $this->stack->popTag( BalanceSets::$headingSet );
+                                       return true;
+
+                               case 'sarcasm':
+                                       // Take a deep breath, then:
+                                       break;
+
+                               case 'a':
+                               case 'b':
+                               case 'big':
+                               case 'code':
+                               case 'em':
+                               case 'font':
+                               case 'i':
+                               case 'nobr':
+                               case 's':
+                               case 'small':
+                               case 'strike':
+                               case 'strong':
+                               case 'tt':
+                               case 'u':
+                                       if ( $this->stack->adoptionAgency( $value, $this->afe ) ) {
+                                               return true; // If we did something, we're done.
+                                       }
+                                       break; // Go to the "any other end tag" case.
+
+                               case 'applet':
+                               case 'marquee':
+                               case 'object':
+                                       if ( !$this->stack->inScope( $value ) ) {
+                                               return true; // ignore
+                                       }
+                                       $this->stack->generateImpliedEndTags();
+                                       $this->stack->popTag( $value );
+                                       $this->afe->clearToMarker();
+                                       return true;
+
+                               case 'br':
+                                       // Turn </br> into <br>
+                                       return $this->inBodyMode( 'tag', $value, [] );
                        }
 
                        // Any other end tag goes here
@@ -2985,87 +2985,87 @@ class Balancer {
                        return true;
                } elseif ( $token === 'tag' ) {
                        switch ( $value ) {
-                       case 'caption':
-                               $this->afe->insertMarker();
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->switchMode( 'inCaptionMode' );
-                               return true;
-                       case 'colgroup':
-                               $this->stack->clearToContext( BalanceSets::$tableContextSet );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->switchMode( 'inColumnGroupMode' );
-                               return true;
-                       case 'col':
-                               $this->inTableMode( 'tag', 'colgroup', [] );
-                               return $this->insertToken( $token, $value, $attribs, $selfClose );
-                       case 'tbody':
-                       case 'tfoot':
-                       case 'thead':
-                               $this->stack->clearToContext( BalanceSets::$tableContextSet );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->switchMode( 'inTableBodyMode' );
-                               return true;
-                       case 'td':
-                       case 'th':
-                       case 'tr':
-                               $this->inTableMode( 'tag', 'tbody', [] );
-                               return $this->insertToken( $token, $value, $attribs, $selfClose );
-                       case 'table':
-                               if ( !$this->stack->inTableScope( $value ) ) {
-                                       return true; // Ignore this tag.
-                               }
-                               $this->inTableMode( 'endtag', $value );
-                               return $this->insertToken( $token, $value, $attribs, $selfClose );
-
-                       case 'style':
-                       // OMITTED: <script>
-                       case 'template':
-                               return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+                               case 'caption':
+                                       $this->afe->insertMarker();
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->switchMode( 'inCaptionMode' );
+                                       return true;
+                               case 'colgroup':
+                                       $this->stack->clearToContext( BalanceSets::$tableContextSet );
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->switchMode( 'inColumnGroupMode' );
+                                       return true;
+                               case 'col':
+                                       $this->inTableMode( 'tag', 'colgroup', [] );
+                                       return $this->insertToken( $token, $value, $attribs, $selfClose );
+                               case 'tbody':
+                               case 'tfoot':
+                               case 'thead':
+                                       $this->stack->clearToContext( BalanceSets::$tableContextSet );
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->switchMode( 'inTableBodyMode' );
+                                       return true;
+                               case 'td':
+                               case 'th':
+                               case 'tr':
+                                       $this->inTableMode( 'tag', 'tbody', [] );
+                                       return $this->insertToken( $token, $value, $attribs, $selfClose );
+                               case 'table':
+                                       if ( !$this->stack->inTableScope( $value ) ) {
+                                               return true; // Ignore this tag.
+                                       }
+                                       $this->inTableMode( 'endtag', $value );
+                                       return $this->insertToken( $token, $value, $attribs, $selfClose );
 
-                       case 'input':
-                               if ( !isset( $attribs['type'] ) || strcasecmp( $attribs['type'], 'hidden' ) !== 0 ) {
-                                       break; // Handle this as "everything else"
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->stack->pop();
-                               return true;
+                               case 'style':
+                               // OMITTED: <script>
+                               case 'template':
+                                       return $this->inHeadMode( $token, $value, $attribs, $selfClose );
 
-                       case 'form':
-                               if (
-                                       $this->formElementPointer ||
-                                       $this->stack->indexOf( 'template' ) >= 0
-                               ) {
-                                       return true; // ignore this token
-                               }
-                               $this->formElementPointer =
+                               case 'input':
+                                       if ( !isset( $attribs['type'] ) || strcasecmp( $attribs['type'], 'hidden' ) !== 0 ) {
+                                               break; // Handle this as "everything else"
+                                       }
                                        $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->stack->popTag( $this->formElementPointer );
-                               return true;
+                                       $this->stack->pop();
+                                       return true;
+
+                               case 'form':
+                                       if (
+                                               $this->formElementPointer ||
+                                               $this->stack->indexOf( 'template' ) >= 0
+                                       ) {
+                                               return true; // ignore this token
+                                       }
+                                       $this->formElementPointer =
+                                               $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->stack->popTag( $this->formElementPointer );
+                                       return true;
                        }
                        // Fall through for "anything else" clause.
                } elseif ( $token === 'endtag' ) {
                        switch ( $value ) {
-                       case 'table':
-                               if ( !$this->stack->inTableScope( $value ) ) {
-                                       return true; // Ignore.
-                               }
-                               $this->stack->popTag( $value );
-                               $this->resetInsertionMode();
-                               return true;
-                       // OMITTED: <body>
-                       case 'caption':
-                       case 'col':
-                       case 'colgroup':
-                       // OMITTED: <html>
-                       case 'tbody':
-                       case 'td':
-                       case 'tfoot':
-                       case 'th':
-                       case 'thead':
-                       case 'tr':
-                               return true; // Ignore the token.
-                       case 'template':
-                               return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+                               case 'table':
+                                       if ( !$this->stack->inTableScope( $value ) ) {
+                                               return true; // Ignore.
+                                       }
+                                       $this->stack->popTag( $value );
+                                       $this->resetInsertionMode();
+                                       return true;
+                               // OMITTED: <body>
+                               case 'caption':
+                               case 'col':
+                               case 'colgroup':
+                               // OMITTED: <html>
+                               case 'tbody':
+                               case 'td':
+                               case 'tfoot':
+                               case 'th':
+                               case 'thead':
+                               case 'tr':
+                                       return true; // Ignore the token.
+                               case 'template':
+                                       return $this->inHeadMode( $token, $value, $attribs, $selfClose );
                        }
                        // Fall through for "anything else" clause.
                } elseif ( $token === 'comment' ) {
@@ -3116,43 +3116,43 @@ class Balancer {
        private function inCaptionMode( $token, $value, $attribs = null, $selfClose = false ) {
                if ( $token === 'tag' ) {
                        switch ( $value ) {
-                       case 'caption':
-                       case 'col':
-                       case 'colgroup':
-                       case 'tbody':
-                       case 'td':
-                       case 'tfoot':
-                       case 'th':
-                       case 'thead':
-                       case 'tr':
-                               if ( $this->endCaption() ) {
-                                       $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               return true;
+                               case 'caption':
+                               case 'col':
+                               case 'colgroup':
+                               case 'tbody':
+                               case 'td':
+                               case 'tfoot':
+                               case 'th':
+                               case 'thead':
+                               case 'tr':
+                                       if ( $this->endCaption() ) {
+                                               $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       return true;
                        }
                        // Fall through to "anything else" case.
                } elseif ( $token === 'endtag' ) {
                        switch ( $value ) {
-                       case 'caption':
-                               $this->endCaption();
-                               return true;
-                       case 'table':
-                               if ( $this->endCaption() ) {
-                                       $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               return true;
-                       case 'body':
-                       case 'col':
-                       case 'colgroup':
-                       // OMITTED: <html>
-                       case 'tbody':
-                       case 'td':
-                       case 'tfoot':
-                       case 'th':
-                       case 'thead':
-                       case 'tr':
-                               // Ignore the token
-                               return true;
+                               case 'caption':
+                                       $this->endCaption();
+                                       return true;
+                               case 'table':
+                                       if ( $this->endCaption() ) {
+                                               $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       return true;
+                               case 'body':
+                               case 'col':
+                               case 'colgroup':
+                               // OMITTED: <html>
+                               case 'tbody':
+                               case 'td':
+                               case 'tfoot':
+                               case 'th':
+                               case 'thead':
+                               case 'tr':
+                                       // Ignore the token
+                                       return true;
                        }
                        // Fall through to "anything else" case.
                }
@@ -3172,28 +3172,28 @@ class Balancer {
                        // Fall through to handle non-whitespace below.
                } elseif ( $token === 'tag' ) {
                        switch ( $value ) {
-                       // OMITTED: <html>
-                       case 'col':
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->stack->pop();
-                               return true;
-                       case 'template':
-                               return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+                               // OMITTED: <html>
+                               case 'col':
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->stack->pop();
+                                       return true;
+                               case 'template':
+                                       return $this->inHeadMode( $token, $value, $attribs, $selfClose );
                        }
                        // Fall through for "anything else".
                } elseif ( $token === 'endtag' ) {
                        switch ( $value ) {
-                       case 'colgroup':
-                               if ( !$this->stack->currentNode->isHtmlNamed( 'colgroup' ) ) {
+                               case 'colgroup':
+                                       if ( !$this->stack->currentNode->isHtmlNamed( 'colgroup' ) ) {
+                                               return true; // Ignore the token.
+                                       }
+                                       $this->stack->pop();
+                                       $this->switchMode( 'inTableMode' );
+                                       return true;
+                               case 'col':
                                        return true; // Ignore the token.
-                               }
-                               $this->stack->pop();
-                               $this->switchMode( 'inTableMode' );
-                               return true;
-                       case 'col':
-                               return true; // Ignore the token.
-                       case 'template':
-                               return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+                               case 'template':
+                                       return $this->inHeadMode( $token, $value, $attribs, $selfClose );
                        }
                        // Fall through for "anything else".
                } elseif ( $token === 'eof' ) {
@@ -3228,50 +3228,50 @@ class Balancer {
        private function inTableBodyMode( $token, $value, $attribs = null, $selfClose = false ) {
                if ( $token === 'tag' ) {
                        switch ( $value ) {
-                       case 'tr':
-                               $this->stack->clearToContext( BalanceSets::$tableBodyContextSet );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->switchMode( 'inRowMode' );
-                               return true;
-                       case 'th':
-                       case 'td':
-                               $this->inTableBodyMode( 'tag', 'tr', [] );
-                               $this->insertToken( $token, $value, $attribs, $selfClose );
-                               return true;
-                       case 'caption':
-                       case 'col':
-                       case 'colgroup':
-                       case 'tbody':
-                       case 'tfoot':
-                       case 'thead':
-                               if ( $this->endSection() ) {
+                               case 'tr':
+                                       $this->stack->clearToContext( BalanceSets::$tableBodyContextSet );
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->switchMode( 'inRowMode' );
+                                       return true;
+                               case 'th':
+                               case 'td':
+                                       $this->inTableBodyMode( 'tag', 'tr', [] );
                                        $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               return true;
+                                       return true;
+                               case 'caption':
+                               case 'col':
+                               case 'colgroup':
+                               case 'tbody':
+                               case 'tfoot':
+                               case 'thead':
+                                       if ( $this->endSection() ) {
+                                               $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       return true;
                        }
                } elseif ( $token === 'endtag' ) {
                        switch ( $value ) {
-                       case 'table':
-                               if ( $this->endSection() ) {
-                                       $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               return true;
-                       case 'tbody':
-                       case 'tfoot':
-                       case 'thead':
-                               if ( $this->stack->inTableScope( $value ) ) {
-                                       $this->endSection();
-                               }
-                               return true;
-                       // OMITTED: <body>
-                       case 'caption':
-                       case 'col':
-                       case 'colgroup':
-                       // OMITTED: <html>
-                       case 'td':
-                       case 'th':
-                       case 'tr':
-                               return true; // Ignore the token.
+                               case 'table':
+                                       if ( $this->endSection() ) {
+                                               $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       return true;
+                               case 'tbody':
+                               case 'tfoot':
+                               case 'thead':
+                                       if ( $this->stack->inTableScope( $value ) ) {
+                                               $this->endSection();
+                                       }
+                                       return true;
+                               // OMITTED: <body>
+                               case 'caption':
+                               case 'col':
+                               case 'colgroup':
+                               // OMITTED: <html>
+                               case 'td':
+                               case 'th':
+                               case 'tr':
+                                       return true; // Ignore the token.
                        }
                }
                // Anything else:
@@ -3291,53 +3291,53 @@ class Balancer {
        private function inRowMode( $token, $value, $attribs = null, $selfClose = false ) {
                if ( $token === 'tag' ) {
                        switch ( $value ) {
-                       case 'th':
-                       case 'td':
-                               $this->stack->clearToContext( BalanceSets::$tableRowContextSet );
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               $this->switchMode( 'inCellMode' );
-                               $this->afe->insertMarker();
-                               return true;
-                       case 'caption':
-                       case 'col':
-                       case 'colgroup':
-                       case 'tbody':
-                       case 'tfoot':
-                       case 'thead':
-                       case 'tr':
-                               if ( $this->endRow() ) {
-                                       $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               return true;
+                               case 'th':
+                               case 'td':
+                                       $this->stack->clearToContext( BalanceSets::$tableRowContextSet );
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       $this->switchMode( 'inCellMode' );
+                                       $this->afe->insertMarker();
+                                       return true;
+                               case 'caption':
+                               case 'col':
+                               case 'colgroup':
+                               case 'tbody':
+                               case 'tfoot':
+                               case 'thead':
+                               case 'tr':
+                                       if ( $this->endRow() ) {
+                                               $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       return true;
                        }
                } elseif ( $token === 'endtag' ) {
                        switch ( $value ) {
-                       case 'tr':
-                               $this->endRow();
-                               return true;
-                       case 'table':
-                               if ( $this->endRow() ) {
-                                       $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               return true;
-                       case 'tbody':
-                       case 'tfoot':
-                       case 'thead':
-                               if (
-                                       $this->stack->inTableScope( $value ) &&
-                                       $this->endRow()
-                               ) {
-                                       $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               return true;
-                       // OMITTED: <body>
-                       case 'caption':
-                       case 'col':
-                       case 'colgroup':
-                       // OMITTED: <html>
-                       case 'td':
-                       case 'th':
-                               return true; // Ignore the token.
+                               case 'tr':
+                                       $this->endRow();
+                                       return true;
+                               case 'table':
+                                       if ( $this->endRow() ) {
+                                               $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       return true;
+                               case 'tbody':
+                               case 'tfoot':
+                               case 'thead':
+                                       if (
+                                               $this->stack->inTableScope( $value ) &&
+                                               $this->endRow()
+                                       ) {
+                                               $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       return true;
+                               // OMITTED: <body>
+                               case 'caption':
+                               case 'col':
+                               case 'colgroup':
+                               // OMITTED: <html>
+                               case 'td':
+                               case 'th':
+                                       return true; // Ignore the token.
                        }
                }
                // Anything else:
@@ -3359,51 +3359,51 @@ class Balancer {
        private function inCellMode( $token, $value, $attribs = null, $selfClose = false ) {
                if ( $token === 'tag' ) {
                        switch ( $value ) {
-                       case 'caption':
-                       case 'col':
-                       case 'colgroup':
-                       case 'tbody':
-                       case 'td':
-                       case 'tfoot':
-                       case 'th':
-                       case 'thead':
-                       case 'tr':
-                               if ( $this->endCell() ) {
-                                       $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               return true;
+                               case 'caption':
+                               case 'col':
+                               case 'colgroup':
+                               case 'tbody':
+                               case 'td':
+                               case 'tfoot':
+                               case 'th':
+                               case 'thead':
+                               case 'tr':
+                                       if ( $this->endCell() ) {
+                                               $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       return true;
                        }
                } elseif ( $token === 'endtag' ) {
                        switch ( $value ) {
-                       case 'td':
-                       case 'th':
-                               if ( $this->stack->inTableScope( $value ) ) {
-                                       $this->stack->generateImpliedEndTags();
-                                       $this->stack->popTag( $value );
-                                       $this->afe->clearToMarker();
-                                       $this->switchMode( 'inRowMode' );
-                               }
-                               return true;
-                       // OMITTED: <body>
-                       case 'caption':
-                       case 'col':
-                       case 'colgroup':
-                       // OMITTED: <html>
-                               return true;
+                               case 'td':
+                               case 'th':
+                                       if ( $this->stack->inTableScope( $value ) ) {
+                                               $this->stack->generateImpliedEndTags();
+                                               $this->stack->popTag( $value );
+                                               $this->afe->clearToMarker();
+                                               $this->switchMode( 'inRowMode' );
+                                       }
+                                       return true;
+                               // OMITTED: <body>
+                               case 'caption':
+                               case 'col':
+                               case 'colgroup':
+                               // OMITTED: <html>
+                                       return true;
 
-                       case 'table':
-                       case 'tbody':
-                       case 'tfoot':
-                       case 'thead':
-                       case 'tr':
-                               if ( $this->stack->inTableScope( $value ) ) {
-                                       $this->stack->generateImpliedEndTags();
-                                       $this->stack->popTag( BalanceSets::$tableCellSet );
-                                       $this->afe->clearToMarker();
-                                       $this->switchMode( 'inRowMode' );
-                                       $this->insertToken( $token, $value, $attribs, $selfClose );
-                               }
-                               return true;
+                               case 'table':
+                               case 'tbody':
+                               case 'tfoot':
+                               case 'thead':
+                               case 'tr':
+                                       if ( $this->stack->inTableScope( $value ) ) {
+                                               $this->stack->generateImpliedEndTags();
+                                               $this->stack->popTag( BalanceSets::$tableCellSet );
+                                               $this->afe->clearToMarker();
+                                               $this->switchMode( 'inRowMode' );
+                                               $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       return true;
                        }
                }
                // Anything else:
@@ -3418,65 +3418,65 @@ class Balancer {
                        return $this->inBodyMode( $token, $value, $attribs, $selfClose );
                } elseif ( $token === 'tag' ) {
                        switch ( $value ) {
-                       // OMITTED: <html>
-                       case 'option':
-                               if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
-                                       $this->stack->pop();
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
-                       case 'optgroup':
-                               if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
-                                       $this->stack->pop();
-                               }
-                               if ( $this->stack->currentNode->isHtmlNamed( 'optgroup' ) ) {
-                                       $this->stack->pop();
-                               }
-                               $this->stack->insertHTMLElement( $value, $attribs );
-                               return true;
-                       case 'select':
-                               $this->inSelectMode( 'endtag', $value ); // treat it like endtag
-                               return true;
-                       case 'input':
-                       case 'keygen':
-                       case 'textarea':
-                               if ( !$this->stack->inSelectScope( 'select' ) ) {
-                                       return true; // ignore token (fragment case)
-                               }
-                               $this->inSelectMode( 'endtag', 'select' );
-                               return $this->insertToken( $token, $value, $attribs, $selfClose );
-                       case 'script':
-                       case 'template':
-                               return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+                               // OMITTED: <html>
+                               case 'option':
+                                       if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+                                               $this->stack->pop();
+                                       }
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
+                               case 'optgroup':
+                                       if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+                                               $this->stack->pop();
+                                       }
+                                       if ( $this->stack->currentNode->isHtmlNamed( 'optgroup' ) ) {
+                                               $this->stack->pop();
+                                       }
+                                       $this->stack->insertHTMLElement( $value, $attribs );
+                                       return true;
+                               case 'select':
+                                       $this->inSelectMode( 'endtag', $value ); // treat it like endtag
+                                       return true;
+                               case 'input':
+                               case 'keygen':
+                               case 'textarea':
+                                       if ( !$this->stack->inSelectScope( 'select' ) ) {
+                                               return true; // ignore token (fragment case)
+                                       }
+                                       $this->inSelectMode( 'endtag', 'select' );
+                                       return $this->insertToken( $token, $value, $attribs, $selfClose );
+                               case 'script':
+                               case 'template':
+                                       return $this->inHeadMode( $token, $value, $attribs, $selfClose );
                        }
                } elseif ( $token === 'endtag' ) {
                        switch ( $value ) {
-                       case 'optgroup':
-                               if (
-                                       $this->stack->currentNode->isHtmlNamed( 'option' ) &&
-                                       $this->stack->length() >= 2 &&
-                                       $this->stack->node( $this->stack->length() - 2 )->isHtmlNamed( 'optgroup' )
-                               ) {
-                                       $this->stack->pop();
-                               }
-                               if ( $this->stack->currentNode->isHtmlNamed( 'optgroup' ) ) {
-                                       $this->stack->pop();
-                               }
-                               return true;
-                       case 'option':
-                               if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
-                                       $this->stack->pop();
-                               }
-                               return true;
-                       case 'select':
-                               if ( !$this->stack->inSelectScope( $value ) ) {
-                                       return true; // fragment case
-                               }
-                               $this->stack->popTag( $value );
-                               $this->resetInsertionMode();
-                               return true;
-                       case 'template':
-                               return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+                               case 'optgroup':
+                                       if (
+                                               $this->stack->currentNode->isHtmlNamed( 'option' ) &&
+                                               $this->stack->length() >= 2 &&
+                                               $this->stack->node( $this->stack->length() - 2 )->isHtmlNamed( 'optgroup' )
+                                       ) {
+                                               $this->stack->pop();
+                                       }
+                                       if ( $this->stack->currentNode->isHtmlNamed( 'optgroup' ) ) {
+                                               $this->stack->pop();
+                                       }
+                                       return true;
+                               case 'option':
+                                       if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+                                               $this->stack->pop();
+                                       }
+                                       return true;
+                               case 'select':
+                                       if ( !$this->stack->inSelectScope( $value ) ) {
+                                               return true; // fragment case
+                                       }
+                                       $this->stack->popTag( $value );
+                                       $this->resetInsertionMode();
+                                       return true;
+                               case 'template':
+                                       return $this->inHeadMode( $token, $value, $attribs, $selfClose );
                        }
                } elseif ( $token === 'comment' ) {
                        $this->stack->insertComment( $value );
@@ -3488,24 +3488,24 @@ class Balancer {
 
        private function inSelectInTableMode( $token, $value, $attribs = null, $selfClose = false ) {
                switch ( $value ) {
-               case 'caption':
-               case 'table':
-               case 'tbody':
-               case 'tfoot':
-               case 'thead':
-               case 'tr':
-               case 'td':
-               case 'th':
-                       if ( $token === 'tag' ) {
-                               $this->inSelectInTableMode( 'endtag', 'select' );
-                               return $this->insertToken( $token, $value, $attribs, $selfClose );
-                       } elseif ( $token === 'endtag' ) {
-                               if ( $this->stack->inTableScope( $value ) ) {
+                       case 'caption':
+                       case 'table':
+                       case 'tbody':
+                       case 'tfoot':
+                       case 'thead':
+                       case 'tr':
+                       case 'td':
+                       case 'th':
+                               if ( $token === 'tag' ) {
                                        $this->inSelectInTableMode( 'endtag', 'select' );
                                        return $this->insertToken( $token, $value, $attribs, $selfClose );
+                               } elseif ( $token === 'endtag' ) {
+                                       if ( $this->stack->inTableScope( $value ) ) {
+                                               $this->inSelectInTableMode( 'endtag', 'select' );
+                                               return $this->insertToken( $token, $value, $attribs, $selfClose );
+                                       }
+                                       return true;
                                }
-                               return true;
-                       }
                }
                // anything else
                return $this->inSelectMode( $token, $value, $attribs, $selfClose );
@@ -3527,50 +3527,50 @@ class Balancer {
                        return true;
                } elseif ( $token === 'tag' ) {
                        switch ( $value ) {
-                       case 'base':
-                       case 'basefont':
-                       case 'bgsound':
-                       case 'link':
-                       case 'meta':
-                       case 'noframes':
-                       // OMITTED: <script>
-                       case 'style':
-                       case 'template':
-                       // OMITTED: <title>
-                               return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+                               case 'base':
+                               case 'basefont':
+                               case 'bgsound':
+                               case 'link':
+                               case 'meta':
+                               case 'noframes':
+                               // OMITTED: <script>
+                               case 'style':
+                               case 'template':
+                               // OMITTED: <title>
+                                       return $this->inHeadMode( $token, $value, $attribs, $selfClose );
 
-                       case 'caption':
-                       case 'colgroup':
-                       case 'tbody':
-                       case 'tfoot':
-                       case 'thead':
-                               return $this->switchModeAndReprocess(
-                                       'inTableMode', $token, $value, $attribs, $selfClose
-                               );
+                               case 'caption':
+                               case 'colgroup':
+                               case 'tbody':
+                               case 'tfoot':
+                               case 'thead':
+                                       return $this->switchModeAndReprocess(
+                                               'inTableMode', $token, $value, $attribs, $selfClose
+                                       );
 
-                       case 'col':
-                               return $this->switchModeAndReprocess(
-                                       'inColumnGroupMode', $token, $value, $attribs, $selfClose
-                               );
+                               case 'col':
+                                       return $this->switchModeAndReprocess(
+                                               'inColumnGroupMode', $token, $value, $attribs, $selfClose
+                                       );
 
-                       case 'tr':
-                               return $this->switchModeAndReprocess(
-                                       'inTableBodyMode', $token, $value, $attribs, $selfClose
-                               );
+                               case 'tr':
+                                       return $this->switchModeAndReprocess(
+                                               'inTableBodyMode', $token, $value, $attribs, $selfClose
+                                       );
 
-                       case 'td':
-                       case 'th':
-                               return $this->switchModeAndReprocess(
-                                       'inRowMode', $token, $value, $attribs, $selfClose
-                               );
+                               case 'td':
+                               case 'th':
+                                       return $this->switchModeAndReprocess(
+                                               'inRowMode', $token, $value, $attribs, $selfClose
+                                       );
                        }
                        return $this->switchModeAndReprocess(
                                'inBodyMode', $token, $value, $attribs, $selfClose
                        );
                } elseif ( $token === 'endtag' ) {
                        switch ( $value ) {
-                       case 'template':
-                               return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+                               case 'template':
+                                       return $this->inHeadMode( $token, $value, $attribs, $selfClose );
                        }
                        return true;
                } else {
index a4dfb2b..0d8ef89 100644 (file)
@@ -234,7 +234,7 @@ class User implements IDBAccessObject, UserIdentity {
         * @deprecated since 1.29
         */
        private $mGroups;
-       /** @var array Associative array of (group name => UserGroupMembership object) */
+       /** @var UserGroupMembership[] Associative array of (group name => UserGroupMembership object) */
        protected $mGroupMemberships;
        /** @var array */
        protected $mOptionOverrides;
@@ -3317,7 +3317,7 @@ class User implements IDBAccessObject, UserIdentity {
         * Get the list of explicit group memberships this user has, stored as
         * UserGroupMembership objects. Implicit groups are not included.
         *
-        * @return array Associative array of (group name as string => UserGroupMembership object)
+        * @return UserGroupMembership[] Associative array of (group name => UserGroupMembership object)
         * @since 1.29
         */
        public function getGroupMemberships() {
index a06be83..f771f42 100644 (file)
@@ -276,7 +276,7 @@ class UserGroupMembership {
         *
         * @param int $userId ID of the user to search for
         * @param IDatabase|null $db Optional database connection
-        * @return array Associative array of (group name => UserGroupMembership object)
+        * @return UserGroupMembership[] Associative array of (group name => UserGroupMembership object)
         */
        public static function getMembershipsForUser( $userId, IDatabase $db = null ) {
                if ( !$db ) {
index 1415ea3..d12531b 100644 (file)
@@ -392,18 +392,18 @@ class ClassCollector {
                // Note: When changing class name discovery logic,
                // AutoLoaderTest.php may also need to be updated.
                switch ( $token[0] ) {
-               case T_NAMESPACE:
-               case T_CLASS:
-               case T_INTERFACE:
-               case T_TRAIT:
-               case T_DOUBLE_COLON:
-                       $this->startToken = $token;
-                       break;
-               case T_STRING:
-                       if ( $token[1] === 'class_alias' ) {
+                       case T_NAMESPACE:
+                       case T_CLASS:
+                       case T_INTERFACE:
+                       case T_TRAIT:
+                       case T_DOUBLE_COLON:
                                $this->startToken = $token;
-                               $this->alias = [];
-                       }
+                               break;
+                       case T_STRING:
+                               if ( $token[1] === 'class_alias' ) {
+                                       $this->startToken = $token;
+                                       $this->alias = [];
+                               }
                }
        }
 
@@ -414,78 +414,78 @@ class ClassCollector {
         */
        protected function tryEndExpect( $token ) {
                switch ( $this->startToken[0] ) {
-               case T_DOUBLE_COLON:
-                       // Skip over T_CLASS after T_DOUBLE_COLON because this is something like
-                       // "self::static" which accesses the class name. It doens't define a new class.
-                       $this->startToken = null;
-                       break;
-               case T_NAMESPACE:
-                       if ( $token === ';' || $token === '{' ) {
-                               $this->namespace = $this->implodeTokens() . '\\';
-                       } else {
-                               $this->tokens[] = $token;
-                       }
-                       break;
-
-               case T_STRING:
-                       if ( $this->alias !== null ) {
-                               // Flow 1 - Two string literals:
-                               // - T_STRING  class_alias
-                               // - '('
-                               // - T_CONSTANT_ENCAPSED_STRING 'TargetClass'
-                               // - ','
-                               // - T_WHITESPACE
-                               // - T_CONSTANT_ENCAPSED_STRING 'AliasName'
-                               // - ')'
-                               // Flow 2 - Use of ::class syntax for first parameter
-                               // - T_STRING  class_alias
-                               // - '('
-                               // - T_STRING TargetClass
-                               // - T_DOUBLE_COLON ::
-                               // - T_CLASS class
-                               // - ','
-                               // - T_WHITESPACE
-                               // - T_CONSTANT_ENCAPSED_STRING 'AliasName'
-                               // - ')'
-                               if ( $token === '(' ) {
-                                       // Start of a function call to class_alias()
-                                       $this->alias = [ 'target' => false, 'name' => false ];
-                               } elseif ( $token === ',' ) {
-                                       // Record that we're past the first parameter
-                                       if ( $this->alias['target'] === false ) {
-                                               $this->alias['target'] = true;
-                                       }
-                               } elseif ( is_array( $token ) && $token[0] === T_CONSTANT_ENCAPSED_STRING ) {
-                                       if ( $this->alias['target'] === true ) {
-                                               // We already saw a first argument, this must be the second.
-                                               // Strip quotes from the string literal.
-                                               $this->alias['name'] = substr( $token[1], 1, -1 );
+                       case T_DOUBLE_COLON:
+                               // Skip over T_CLASS after T_DOUBLE_COLON because this is something like
+                               // "self::static" which accesses the class name. It doens't define a new class.
+                               $this->startToken = null;
+                               break;
+                       case T_NAMESPACE:
+                               if ( $token === ';' || $token === '{' ) {
+                                       $this->namespace = $this->implodeTokens() . '\\';
+                               } else {
+                                       $this->tokens[] = $token;
+                               }
+                               break;
+
+                       case T_STRING:
+                               if ( $this->alias !== null ) {
+                                       // Flow 1 - Two string literals:
+                                       // - T_STRING  class_alias
+                                       // - '('
+                                       // - T_CONSTANT_ENCAPSED_STRING 'TargetClass'
+                                       // - ','
+                                       // - T_WHITESPACE
+                                       // - T_CONSTANT_ENCAPSED_STRING 'AliasName'
+                                       // - ')'
+                                       // Flow 2 - Use of ::class syntax for first parameter
+                                       // - T_STRING  class_alias
+                                       // - '('
+                                       // - T_STRING TargetClass
+                                       // - T_DOUBLE_COLON ::
+                                       // - T_CLASS class
+                                       // - ','
+                                       // - T_WHITESPACE
+                                       // - T_CONSTANT_ENCAPSED_STRING 'AliasName'
+                                       // - ')'
+                                       if ( $token === '(' ) {
+                                               // Start of a function call to class_alias()
+                                               $this->alias = [ 'target' => false, 'name' => false ];
+                                       } elseif ( $token === ',' ) {
+                                               // Record that we're past the first parameter
+                                               if ( $this->alias['target'] === false ) {
+                                                       $this->alias['target'] = true;
+                                               }
+                                       } elseif ( is_array( $token ) && $token[0] === T_CONSTANT_ENCAPSED_STRING ) {
+                                               if ( $this->alias['target'] === true ) {
+                                                       // We already saw a first argument, this must be the second.
+                                                       // Strip quotes from the string literal.
+                                                       $this->alias['name'] = substr( $token[1], 1, -1 );
+                                               }
+                                       } elseif ( $token === ')' ) {
+                                               // End of function call
+                                               $this->classes[] = $this->alias['name'];
+                                               $this->alias = null;
+                                               $this->startToken = null;
+                                       } elseif ( !is_array( $token ) || (
+                                               $token[0] !== T_STRING &&
+                                               $token[0] !== T_DOUBLE_COLON &&
+                                               $token[0] !== T_CLASS &&
+                                               $token[0] !== T_WHITESPACE
+                                       ) ) {
+                                               // Ignore this call to class_alias() - compat/Timestamp.php
+                                               $this->alias = null;
+                                               $this->startToken = null;
                                        }
-                               } elseif ( $token === ')' ) {
-                                       // End of function call
-                                       $this->classes[] = $this->alias['name'];
-                                       $this->alias = null;
-                                       $this->startToken = null;
-                               } elseif ( !is_array( $token ) || (
-                                       $token[0] !== T_STRING &&
-                                       $token[0] !== T_DOUBLE_COLON &&
-                                       $token[0] !== T_CLASS &&
-                                       $token[0] !== T_WHITESPACE
-                               ) ) {
-                                       // Ignore this call to class_alias() - compat/Timestamp.php
-                                       $this->alias = null;
-                                       $this->startToken = null;
                                }
-                       }
-                       break;
-
-               case T_CLASS:
-               case T_INTERFACE:
-               case T_TRAIT:
-                       $this->tokens[] = $token;
-                       if ( is_array( $token ) && $token[0] === T_STRING ) {
-                               $this->classes[] = $this->namespace . $this->implodeTokens();
-                       }
+                               break;
+
+                       case T_CLASS:
+                       case T_INTERFACE:
+                       case T_TRAIT:
+                               $this->tokens[] = $token;
+                               if ( is_array( $token ) && $token[0] === T_STRING ) {
+                                       $this->classes[] = $this->namespace . $this->implodeTokens();
+                               }
                }
        }
 
index 554dda9..153b313 100644 (file)
@@ -37,133 +37,133 @@ class AvroValidator {
         */
        public static function getErrors( AvroSchema $schema, $datum ) {
                switch ( $schema->type ) {
-               case AvroSchema::NULL_TYPE:
-                       if ( !is_null( $datum ) ) {
-                               return self::wrongType( 'null', $datum );
-                       }
-                       return [];
-               case AvroSchema::BOOLEAN_TYPE:
-                       if ( !is_bool( $datum ) ) {
-                               return self::wrongType( 'boolean', $datum );
-                       }
-                       return [];
-               case AvroSchema::STRING_TYPE:
-               case AvroSchema::BYTES_TYPE:
-                       if ( !is_string( $datum ) ) {
-                               return self::wrongType( 'string', $datum );
-                       }
-                       return [];
-               case AvroSchema::INT_TYPE:
-                       if ( !is_int( $datum ) ) {
-                               return self::wrongType( 'integer', $datum );
-                       }
-                       if ( AvroSchema::INT_MIN_VALUE > $datum
-                               || $datum > AvroSchema::INT_MAX_VALUE
-                       ) {
-                               return self::outOfRange(
-                                       AvroSchema::INT_MIN_VALUE,
-                                       AvroSchema::INT_MAX_VALUE,
-                                       $datum
-                               );
-                       }
-                       return [];
-               case AvroSchema::LONG_TYPE:
-                       if ( !is_int( $datum ) ) {
-                               return self::wrongType( 'integer', $datum );
-                       }
-                       if ( AvroSchema::LONG_MIN_VALUE > $datum
-                               || $datum > AvroSchema::LONG_MAX_VALUE
-                       ) {
-                               return self::outOfRange(
-                                       AvroSchema::LONG_MIN_VALUE,
-                                       AvroSchema::LONG_MAX_VALUE,
-                                       $datum
-                               );
-                       }
-                       return [];
-               case AvroSchema::FLOAT_TYPE:
-               case AvroSchema::DOUBLE_TYPE:
-                       if ( !is_float( $datum ) && !is_int( $datum ) ) {
-                               return self::wrongType( 'float or integer', $datum );
-                       }
-                       return [];
-               case AvroSchema::ARRAY_SCHEMA:
-                       if ( !is_array( $datum ) ) {
-                               return self::wrongType( 'array', $datum );
-                       }
-                       $errors = [];
-                       foreach ( $datum as $d ) {
-                               $result = self::getErrors( $schema->items(), $d );
-                               if ( $result ) {
+                       case AvroSchema::NULL_TYPE:
+                               if ( !is_null( $datum ) ) {
+                                       return self::wrongType( 'null', $datum );
+                               }
+                               return [];
+                       case AvroSchema::BOOLEAN_TYPE:
+                               if ( !is_bool( $datum ) ) {
+                                       return self::wrongType( 'boolean', $datum );
+                               }
+                               return [];
+                       case AvroSchema::STRING_TYPE:
+                       case AvroSchema::BYTES_TYPE:
+                               if ( !is_string( $datum ) ) {
+                                       return self::wrongType( 'string', $datum );
+                               }
+                               return [];
+                       case AvroSchema::INT_TYPE:
+                               if ( !is_int( $datum ) ) {
+                                       return self::wrongType( 'integer', $datum );
+                               }
+                               if ( AvroSchema::INT_MIN_VALUE > $datum
+                                       || $datum > AvroSchema::INT_MAX_VALUE
+                               ) {
+                                       return self::outOfRange(
+                                               AvroSchema::INT_MIN_VALUE,
+                                               AvroSchema::INT_MAX_VALUE,
+                                               $datum
+                                       );
+                               }
+                               return [];
+                       case AvroSchema::LONG_TYPE:
+                               if ( !is_int( $datum ) ) {
+                                       return self::wrongType( 'integer', $datum );
+                               }
+                               if ( AvroSchema::LONG_MIN_VALUE > $datum
+                                       || $datum > AvroSchema::LONG_MAX_VALUE
+                               ) {
+                                       return self::outOfRange(
+                                               AvroSchema::LONG_MIN_VALUE,
+                                               AvroSchema::LONG_MAX_VALUE,
+                                               $datum
+                                       );
+                               }
+                               return [];
+                       case AvroSchema::FLOAT_TYPE:
+                       case AvroSchema::DOUBLE_TYPE:
+                               if ( !is_float( $datum ) && !is_int( $datum ) ) {
+                                       return self::wrongType( 'float or integer', $datum );
+                               }
+                               return [];
+                       case AvroSchema::ARRAY_SCHEMA:
+                               if ( !is_array( $datum ) ) {
+                                       return self::wrongType( 'array', $datum );
+                               }
+                               $errors = [];
+                               foreach ( $datum as $d ) {
+                                       $result = self::getErrors( $schema->items(), $d );
+                                       if ( $result ) {
+                                               $errors[] = $result;
+                                       }
+                               }
+                               return $errors;
+                       case AvroSchema::MAP_SCHEMA:
+                               if ( !is_array( $datum ) ) {
+                                       return self::wrongType( 'array', $datum );
+                               }
+                               $errors = [];
+                               foreach ( $datum as $k => $v ) {
+                                       if ( !is_string( $k ) ) {
+                                               $errors[] = self::wrongType( 'string key', $k );
+                                       }
+                                       $result = self::getErrors( $schema->values(), $v );
+                                       if ( $result ) {
+                                               $errors[$k] = $result;
+                                       }
+                               }
+                               return $errors;
+                       case AvroSchema::UNION_SCHEMA:
+                               $errors = [];
+                               foreach ( $schema->schemas() as $schema ) {
+                                       $result = self::getErrors( $schema, $datum );
+                                       if ( !$result ) {
+                                               return [];
+                                       }
                                        $errors[] = $result;
                                }
-                       }
-                       return $errors;
-               case AvroSchema::MAP_SCHEMA:
-                       if ( !is_array( $datum ) ) {
-                               return self::wrongType( 'array', $datum );
-                       }
-                       $errors = [];
-                       foreach ( $datum as $k => $v ) {
-                               if ( !is_string( $k ) ) {
-                                       $errors[] = self::wrongType( 'string key', $k );
-                               }
-                               $result = self::getErrors( $schema->values(), $v );
-                               if ( $result ) {
-                                       $errors[$k] = $result;
-                               }
-                       }
-                       return $errors;
-               case AvroSchema::UNION_SCHEMA:
-                       $errors = [];
-                       foreach ( $schema->schemas() as $schema ) {
-                               $result = self::getErrors( $schema, $datum );
-                               if ( !$result ) {
-                                       return [];
-                               }
-                               $errors[] = $result;
-                       }
-                       if ( $errors ) {
-                               return [ "Expected any one of these to be true", $errors ];
-                       }
-                       return "No schemas provided to union";
-               case AvroSchema::ENUM_SCHEMA:
-                       if ( !in_array( $datum, $schema->symbols() ) ) {
-                               $symbols = implode( ', ', $schema->symbols );
-                               return "Expected one of $symbols but recieved $datum";
-                       }
-                       return [];
-               case AvroSchema::FIXED_SCHEMA:
-                       if ( !is_string( $datum ) ) {
-                               return self::wrongType( 'string', $datum );
-                       }
-                       $len = strlen( $datum );
-                       if ( $len !== $schema->size() ) {
-                               return "Expected string of length {$schema->size()}, "
-                                       . "but recieved one of length $len";
-                       }
-                       return [];
-               case AvroSchema::RECORD_SCHEMA:
-               case AvroSchema::ERROR_SCHEMA:
-               case AvroSchema::REQUEST_SCHEMA:
-                       if ( !is_array( $datum ) ) {
-                               return self::wrongType( 'array', $datum );
-                       }
-                       $errors = [];
-                       foreach ( $schema->fields() as $field ) {
-                               $name = $field->name();
-                               if ( !array_key_exists( $name, $datum ) ) {
-                                       $errors[$name] = 'Missing expected field';
-                                       continue;
-                               }
-                               $result = self::getErrors( $field->type(), $datum[$name] );
-                               if ( $result ) {
-                                       $errors[$name] = $result;
-                               }
-                       }
-                       return $errors;
-               default:
-                       return "Unknown avro schema type: {$schema->type}";
+                               if ( $errors ) {
+                                       return [ "Expected any one of these to be true", $errors ];
+                               }
+                               return "No schemas provided to union";
+                       case AvroSchema::ENUM_SCHEMA:
+                               if ( !in_array( $datum, $schema->symbols() ) ) {
+                                       $symbols = implode( ', ', $schema->symbols );
+                                       return "Expected one of $symbols but recieved $datum";
+                               }
+                               return [];
+                       case AvroSchema::FIXED_SCHEMA:
+                               if ( !is_string( $datum ) ) {
+                                       return self::wrongType( 'string', $datum );
+                               }
+                               $len = strlen( $datum );
+                               if ( $len !== $schema->size() ) {
+                                       return "Expected string of length {$schema->size()}, "
+                                               . "but recieved one of length $len";
+                               }
+                               return [];
+                       case AvroSchema::RECORD_SCHEMA:
+                       case AvroSchema::ERROR_SCHEMA:
+                       case AvroSchema::REQUEST_SCHEMA:
+                               if ( !is_array( $datum ) ) {
+                                       return self::wrongType( 'array', $datum );
+                               }
+                               $errors = [];
+                               foreach ( $schema->fields() as $field ) {
+                                       $name = $field->name();
+                                       if ( !array_key_exists( $name, $datum ) ) {
+                                               $errors[$name] = 'Missing expected field';
+                                               continue;
+                                       }
+                                       $result = self::getErrors( $field->type(), $datum[$name] );
+                                       if ( $result ) {
+                                               $errors[$name] = $result;
+                                       }
+                               }
+                               return $errors;
+                       default:
+                               return "Unknown avro schema type: {$schema->type}";
                }
        }
 
index 8d3984d..467dc78 100644 (file)
@@ -3117,18 +3117,18 @@ class Language {
         */
        function getArrow( $direction = 'forwards' ) {
                switch ( $direction ) {
-               case 'forwards':
-                       return $this->isRTL() ? '←' : '→';
-               case 'backwards':
-                       return $this->isRTL() ? '→' : '←';
-               case 'left':
-                       return '←';
-               case 'right':
-                       return '→';
-               case 'up':
-                       return '↑';
-               case 'down':
-                       return '↓';
+                       case 'forwards':
+                               return $this->isRTL() ? '←' : '→';
+                       case 'backwards':
+                               return $this->isRTL() ? '→' : '←';
+                       case 'left':
+                               return '←';
+                       case 'right':
+                               return '→';
+                       case 'up':
+                               return '↑';
+                       case 'down':
+                               return '↓';
                }
        }
 
index 38c50d2..a94343c 100644 (file)
@@ -43,30 +43,30 @@ class LanguageGa extends Language {
                }
 
                switch ( $case ) {
-               case 'ainmlae':
-                       switch ( $word ) {
-                       case 'an Domhnach':
-                               $word = 'Dé Domhnaigh';
-                               break;
-                       case 'an Luan':
-                               $word = 'Dé Luain';
-                               break;
-                       case 'an Mháirt':
-                               $word = 'Dé Mháirt';
-                               break;
-                       case 'an Chéadaoin':
-                               $word = 'Dé Chéadaoin';
-                               break;
-                       case 'an Déardaoin':
-                               $word = 'Déardaoin';
-                               break;
-                       case 'an Aoine':
-                               $word = 'Dé hAoine';
-                               break;
-                       case 'an Satharn':
-                               $word = 'Dé Sathairn';
-                               break;
-                       }
+                       case 'ainmlae':
+                               switch ( $word ) {
+                                       case 'an Domhnach':
+                                               $word = 'Dé Domhnaigh';
+                                               break;
+                                       case 'an Luan':
+                                               $word = 'Dé Luain';
+                                               break;
+                                       case 'an Mháirt':
+                                               $word = 'Dé Mháirt';
+                                               break;
+                                       case 'an Chéadaoin':
+                                               $word = 'Dé Chéadaoin';
+                                               break;
+                                       case 'an Déardaoin':
+                                               $word = 'Déardaoin';
+                                               break;
+                                       case 'an Aoine':
+                                               $word = 'Dé hAoine';
+                                               break;
+                                       case 'an Satharn':
+                                               $word = 'Dé Sathairn';
+                                               break;
+                               }
                }
                return $word;
        }
index f4082af..8a3a9d2 100644 (file)
@@ -47,65 +47,65 @@ class LanguageLa extends Language {
                }
 
                switch ( $case ) {
-               case 'genitive':
-                       // only a few declensions, and even for those mostly the singular only
-                       $in = [
-                               '/u[ms]$/',                          # 2nd declension singular
-                               '/ommunia$/',                        # 3rd declension neuter plural (partly)
-                               '/a$/',                              # 1st declension singular
-                               '/libri$/', '/nuntii$/', '/datae$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
-                               '/es$/'                              # 5th declension singular
-                       ];
-                       $out = [
-                               'i',
-                               'ommunium',
-                               'ae',
-                               'librorum', 'nuntiorum', 'datorum',
-                               'tionis', 'ntis', 'atis',
-                               'ei'
-                       ];
-                       return preg_replace( $in, $out, $word );
-               case 'accusative':
-                       // only a few declensions, and even for those mostly the singular only
-                       $in = [
-                               '/u[ms]$/',                          # 2nd declension singular
-                               '/a$/',                              # 1st declension singular
-                               '/ommuniam$/',                       # 3rd declension neuter plural (partly)
-                               '/libri$/', '/nuntii$/', '/datam$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
-                               '/es$/'                              # 5th declension singular
-                       ];
-                       $out = [
-                               'um',
-                               'am',
-                               'ommunia',
-                               'libros', 'nuntios', 'data',
-                               'tionem', 'ntem', 'atem',
-                               'em'
-                       ];
-                       return preg_replace( $in, $out, $word );
-               case 'ablative':
-                       // only a few declensions, and even for those mostly the singular only
-                       $in = [
-                               '/u[ms]$/',                          # 2nd declension singular
-                               '/ommunia$/',                        # 3rd declension neuter plural (partly)
-                               '/a$/',                              # 1st declension singular
-                               '/libri$/', '/nuntii$/', '/data$/',  # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
-                               '/es$/'                              # 5th declension singular
-                       ];
-                       $out = [
-                               'o',
-                               'ommunibus',
-                               'a',
-                               'libris', 'nuntiis', 'datis',
-                               'tione', 'nte', 'ate',
-                               'e'
-                       ];
-                       return preg_replace( $in, $out, $word );
-               default:
-                       return $word;
+                       case 'genitive':
+                               // only a few declensions, and even for those mostly the singular only
+                               $in = [
+                                       '/u[ms]$/',                          # 2nd declension singular
+                                       '/ommunia$/',                        # 3rd declension neuter plural (partly)
+                                       '/a$/',                              # 1st declension singular
+                                       '/libri$/', '/nuntii$/', '/datae$/', # 2nd declension plural (partly)
+                                       '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                                       '/es$/'                              # 5th declension singular
+                               ];
+                               $out = [
+                                       'i',
+                                       'ommunium',
+                                       'ae',
+                                       'librorum', 'nuntiorum', 'datorum',
+                                       'tionis', 'ntis', 'atis',
+                                       'ei'
+                               ];
+                               return preg_replace( $in, $out, $word );
+                       case 'accusative':
+                               // only a few declensions, and even for those mostly the singular only
+                               $in = [
+                                       '/u[ms]$/',                          # 2nd declension singular
+                                       '/a$/',                              # 1st declension singular
+                                       '/ommuniam$/',                       # 3rd declension neuter plural (partly)
+                                       '/libri$/', '/nuntii$/', '/datam$/', # 2nd declension plural (partly)
+                                       '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                                       '/es$/'                              # 5th declension singular
+                               ];
+                               $out = [
+                                       'um',
+                                       'am',
+                                       'ommunia',
+                                       'libros', 'nuntios', 'data',
+                                       'tionem', 'ntem', 'atem',
+                                       'em'
+                               ];
+                               return preg_replace( $in, $out, $word );
+                       case 'ablative':
+                               // only a few declensions, and even for those mostly the singular only
+                               $in = [
+                                       '/u[ms]$/',                          # 2nd declension singular
+                                       '/ommunia$/',                        # 3rd declension neuter plural (partly)
+                                       '/a$/',                              # 1st declension singular
+                                       '/libri$/', '/nuntii$/', '/data$/',  # 2nd declension plural (partly)
+                                       '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                                       '/es$/'                              # 5th declension singular
+                               ];
+                               $out = [
+                                       'o',
+                                       'ommunibus',
+                                       'a',
+                                       'libris', 'nuntiis', 'datis',
+                                       'tione', 'nte', 'ate',
+                                       'e'
+                               ];
+                               return preg_replace( $in, $out, $word );
+                       default:
+                               return $word;
                }
        }
 }
index 3ba0b96..3ec6f95 100644 (file)
        "rcfilters-preference-label": "أخف النسخة المحسنة من أحدث التغييرات",
        "rcfilters-preference-help": "يسترجع عملية إعادة تصميم الواجهة لعام 2017 وكل الأدوات التي أضيفت منذ ذلك الوقت.",
        "rcfilters-filter-showlinkedfrom-label": "عرض التغييرات في الصفحات الموصولة من",
-       "rcfilters-filter-showlinkedfrom-option-label": "عرض التغييرات في الصفحات الموصولة <strong>من</strong> صفحة",
-       "rcfilters-filter-showlinkedto-label": "أظÙ\87ر التغييرات في الصفحات الموصولة بصفحة",
-       "rcfilters-filter-showlinkedto-option-label": "عرض التغييرات في الصفحات الموصولة <strong>إلى</strong> صفحة",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>الصفحات الموصولة من</strong> الصفحة المختارة",
+       "rcfilters-filter-showlinkedto-label": "عرض التغييرات في الصفحات الموصولة بصفحة",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>الصفحات الموصولة إلى</strong> الصفحة المختارة",
        "rcfilters-target-page-placeholder": "أدخل اسم صفحة",
        "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
        "rclistfromreset": "إعادة ضبط خيار التاريخ",
        "tag-mw-replace-description": "التعديلات التي أزالت أكثر من 90% من محتوى صفحة",
        "tag-mw-rollback": "استرجاع",
        "tag-mw-rollback-description": "التعديلات التي استرجعت التعديلات السابقة باستخدام وصلة الاسترجاع",
+       "tag-mw-undo": "رجوع",
+       "tag-mw-undo-description": "التعديلات التي ترجع عن التعديلات السابقة باستخدام وصلة رجوع",
        "tags-title": "وسوم",
        "tags-intro": "هذه الصفحة تعرض الوسوم التي ربما يعلم البرنامج تعديلا بها، ومعانيها.",
        "tags-tag": "اسم الوسم",
index 64af5da..6d2ed73 100644 (file)
        "botpasswords-insert-failed": "Nun pudo amestase'l nome de bot «$1». ¿Taba añadíu yá?",
        "botpasswords-update-failed": "Nun pudo anovase'l nome de bot «$1». ¿Desaniciaríase?",
        "botpasswords-created-title": "Creóse la contraseña de bot",
-       "botpasswords-created-body": "Creóse la contraseña del bot llamáu «$1» del usuariu «$2».",
+       "botpasswords-created-body": "Creóse la contraseña del bot llamáu «$1» {{GENDER:$2|del usuariu|de la usuaria}} «$2».",
        "botpasswords-updated-title": "Anovóse la contraseña de bot",
-       "botpasswords-updated-body": "Anovóse la contraseña del bot llamáu «$1» del usuariu «$2».",
+       "botpasswords-updated-body": "Anovóse la contraseña del bot llamáu «$1» {{GENDER:$2|del usuariu|de la usuaria}} «$2».",
        "botpasswords-deleted-title": "Desanicióse la contraseña de bot",
-       "botpasswords-deleted-body": "Desanicióse la contraseña del bot llamáu «$1» del usuariu «$2».",
+       "botpasswords-deleted-body": "Desanicióse la contraseña del bot llamáu «$1» {{GENDER:$2|del usuariu|de la usuaria}} «$2».",
        "botpasswords-newpassword": "La nueva contraseña p'aniciar sesión con <strong>$1</strong> ye <strong>$2</strong>. <em>Por favor, rexistra esto pa referencies futures.</em> <br> (Pa los bots antiguos que necesiten que'l nome d'aniciu de sesión sía'l mesmu que'l nome d'usuariu, tamién pue usase <strong>$3</strong> como nome d'usuariu y <strong>$4</strong> como contraseña.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider nun ta disponible.",
        "botpasswords-restriction-failed": "Hai torgues de contraseña de bot que torgaron esti aniciu de sesión.",
        "recentchangesdays-max": "Máximo $1 {{PLURAL:$1|día|díes}}",
        "recentchangescount": "Númberu d'ediciones p'amosar de mou predetermináu:",
        "prefs-help-recentchangescount": "Incluye los cambios recientes, los historiales de páxines y los rexistros.",
-       "prefs-help-watchlist-token2": "Esta ye la clave secreta pa la canal de noticies web de la so llista de vixilancia.\nCualquiera que la sepa podrá lleer la so llista de vixilancia; nun la comparta.\n[[Special:ResetTokens|Calque equí si necesita reaniciala]].",
+       "prefs-help-watchlist-token2": "Esta ye la clave secreta pa la canal de noticies web de la to llista de vixilancia.\nCualquiera que la sepa podrá lleer la to llista de vixilancia; nun la compartas.\nSi lo necesites [[Special:ResetTokens|puedes reaniciala]].",
        "savedprefs": "Guardáronse les preferencies.",
        "savedrights": "Guardáronse los grupos {{GENDER:$1|del usuariu|de la usuaria}} $1.",
        "timezonelegend": "Estaya horaria:",
        "timezoneregion-indian": "Océanu Índicu",
        "timezoneregion-pacific": "Océanu Pacíficu",
        "allowemail": "Permitir qu'otros usuarios m'unvien correos",
+       "email-allow-new-users-label": "Permitir los correos de los usuarios nuevos",
        "email-blacklist-label": "Torgar qu'estos usuarios m'unvien correos electrónicos:",
        "prefs-searchoptions": "Buscar",
        "prefs-namespaces": "Espacios de nome",
        "right-siteadmin": "Candar y descandar la base de datos",
        "right-override-export-depth": "Esportar páxines, incluyendo páxines enllazaes fasta una fondura de 5",
        "right-sendemail": "Unviar corréu a otros usuarios",
+       "right-sendemail-new-users": "Unviar corréu electrónicu a usuarios ensin aiciones rexistraes",
        "right-managechangetags": "Crear y (des)activar [[Special:Tags|etiquetes]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetes]] xunto colos cambios propios",
        "right-changetags": "Amestar y desaniciar [[Special:Tags|etiquetes]] arbitraries en revisiones individuales y entraes del rexistru",
        "recentchanges-noresult": "Nengún cambiu nel periodu conseñáu coincide con esos criterios.",
        "recentchanges-timeout": "Esta gueta escosó'l tiempu. Escurque quieras tentar con parámetros de gueta distintos.",
        "recentchanges-network": "Nun se cargó nenguna resultancia por cuenta d'un problema técnicu. Tenta volver a cargar la páxina.",
+       "recentchanges-notargetpage": "Escribe'l nome d'una páxina más arriba pa ver los cambeos rellacionaos con esa páxina.",
        "recentchanges-feed-description": "Sigui nesta canal los últimos cambios de la wiki.",
        "recentchanges-label-newpage": "Esta edición creó una páxina nueva",
        "recentchanges-label-minor": "Esta ye una edición menor",
        "rcfilters-watchlist-showupdated": "Los cambeos fechos en páxines que nun visitasti desque se ficieron apaecen en <strong>negrina</strong>, con marcadores sólidos.",
        "rcfilters-preference-label": "Tapecer la versión meyorada de Cambios recién",
        "rcfilters-preference-help": "Revierte'l rediseñu de la interfaz de 2017 y toles ferramientes añadíes d'entós aquí.",
+       "rcfilters-filter-showlinkedfrom-label": "Amosar los cambios nes páxines enllazaes dende",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páxines enllazaes dende</strong> la páxina seleicionada",
+       "rcfilters-filter-showlinkedto-label": "Amosar los cambios nes páxines qu'enllacen a",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Páxines qu'enllacen a</strong> la páxina seleicionada",
+       "rcfilters-target-page-placeholder": "Escribe'l nome de la páxina",
        "rcnotefrom": "Abaxo {{PLURAL:$5|tá'l cambiu|tan los cambios}} dende'l <strong>$3</strong>, a les <strong>$4</strong> (s'amuesen un máximu de <strong>$1</strong>).",
        "rclistfromreset": "Reaniciar la seleición de data",
        "rclistfrom": "Amosar los nuevos cambios dende'l $3 a les $2",
        "recentchangeslinked-feed": "Cambios rellacionaos",
        "recentchangeslinked-toolbox": "Cambios rellacionaos",
        "recentchangeslinked-title": "Cambios rellacionaos con \"$1\"",
-       "recentchangeslinked-summary": "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada).\nLes páxines de [[Special:Watchlist|la to llista de siguimientu]] tán en <strong>negrina</strong>.",
+       "recentchangeslinked-summary": "Esscribe'l nome d'una páxina pa ver los cambios nes páxines enllazaes a o dende esa páxina. (Pa ver los miembros d'una categoría, escribe Categoría:Nome de la categoría). Los cambios nes páxines de [[Special:Watchlist|la to llista de siguimientu]] tán en <strong>negrina</strong>.",
        "recentchangeslinked-page": "Nome de la páxina:",
        "recentchangeslinked-to": "Amosar los cambios de les páxines qu'enllacen en cuenta de los de la páxina dada",
        "recentchanges-page-added-to-category": "[[:$1]] amestóse a la categoría",
index 379c774..1a46a3f 100644 (file)
        "rcfilters-activefilters": "Aktiv filtrlər",
        "rcfilters-advancedfilters": "Geniş filtr",
        "rcfilters-limit-title": "Göstərilməli dəyişikliklər",
+       "rcfilters-limit-and-date-label": "{{PLURAL:$1|redaktə|redaktə}}, $2",
+       "rcfilters-date-popup-title": "Axtarış üçün vaxt aralığı",
        "rcfilters-days-title": "Son günlər",
        "rcfilters-hours-title": "Son saatlar",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|gün|gün}}",
index b8c3ea9..2a89558 100644 (file)
        "gender-unknown": "Калі вы будзеце згадвацца, праграмнае забесьпячэньне будзе кожны раз пры магчымасьці ўжываць гендэрна нэўтральныя словы",
        "gender-male": "Ён рэдагуе вікістаронкі",
        "gender-female": "Яна рэдагуе вікістаронкі",
-       "prefs-help-gender": "Ð\92Ñ\8bзнаÑ\87аÑ\86Ñ\8c Ð³Ñ\8dÑ\82а Ð½ÐµÐ°Ð±Ð°Ð²Ñ\8fзкова.\nÐ\90пÑ\80агÑ\80амаваньне выкарыстоўвае гэтае значэньне толькі для граматычна карэктнага звароту да вас.\nГэтая інфармацыя будзе агульнадаступнай.",
+       "prefs-help-gender": "Ð\92Ñ\8bзнаÑ\87аÑ\86Ñ\8c Ð³Ñ\8dÑ\82а Ð½ÐµÐ°Ð±Ð°Ð²Ñ\8fзкова.\nÐ\9fÑ\80агÑ\80амнае Ð·Ð°Ð±ÐµÑ\81Ñ\8cпÑ\8fÑ\87Ñ\8dньне выкарыстоўвае гэтае значэньне толькі для граматычна карэктнага звароту да вас.\nГэтая інфармацыя будзе агульнадаступнай.",
        "email": "Электронная пошта",
        "prefs-help-realname": "Сапраўднае імя паведамляць неабавязковае.\nКалі Вы яго пазначыце, яно можа быць выкарыстанае для пазначэньня Вашай працы.",
-       "prefs-help-email": "Ð\90дÑ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð½ÐµÐ°Ð±Ð°Ð²Ñ\8fзковÑ\8b, Ð°Ð»Ðµ Ñ\91н Ð´Ð°Ðµ Ð¼Ð°Ð³Ñ\87Ñ\8bмаÑ\81Ñ\8cÑ\86Ñ\8c Ð´Ð°Ñ\81лаÑ\86Ñ\8c Ð\92ам Ð¿Ð°Ñ\80олÑ\8c, ÐºÐ°Ð»Ñ\96 Ð\92Ñ\8b Ð·Ð°Ð±Ñ\8bлÑ\96 яго.",
-       "prefs-help-email-others": "Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ñ\82акÑ\81ама Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\96Ñ\86Ñ\8c Ñ\96нÑ\88Ñ\8bм Ñ\83дзелÑ\8cнÑ\96кам ÐºÐ°Ð½Ñ\82акÑ\82аваÑ\86Ñ\8c Ð· Ð\92амÑ\96 Ð¿Ñ\80аз Ð\92аÑ\88Ñ\83Ñ\8e Ð°Ñ\81абÑ\96Ñ\81Ñ\82Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83 Ð³Ñ\83Ñ\82аÑ\80ак Ð±ÐµÐ·Ñ\8c Ð½ÐµÐ°Ð±Ñ\85однаÑ\81Ñ\8cÑ\86Ñ\96 Ñ\80аÑ\81кÑ\80Ñ\8bÑ\86Ñ\8cÑ\86Ñ\8f Ð°Ð´Ñ\80аÑ\81Ñ\83 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b.",
+       "prefs-help-email": "Ð\90дÑ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð½ÐµÐ°Ð±Ð°Ð²Ñ\8fзковÑ\8b, Ð°Ð»Ðµ Ñ\91н Ð½ÐµÐ°Ð±Ñ\85однÑ\8b Ð´Ð»Ñ\8f Ñ\81кÑ\96данÑ\8cнÑ\8f Ð¿Ð°Ñ\80олÑ\8e, ÐºÐ°Ð»Ñ\96 Ð²Ñ\8b Ð·Ð°Ð±Ñ\83дзеÑ\86е яго.",
+       "prefs-help-email-others": "Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ñ\82акÑ\81ама Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\96Ñ\86Ñ\8c Ñ\96нÑ\88Ñ\8bм Ñ\83дзелÑ\8cнÑ\96кам ÐºÐ°Ð½Ñ\82акÑ\82аваÑ\86Ñ\8c Ð· Ð²Ð°Ð¼Ñ\96 Ð¿Ñ\80аз Ñ\8dлекÑ\82Ñ\80оннÑ\83Ñ\8e Ð¿Ð¾Ñ\88Ñ\82Ñ\83 Ð¿Ð° Ñ\81паÑ\81Ñ\8bлÑ\86Ñ\8b Ð½Ð° Ð²Ð°Ñ\88ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ñ\86Ñ\96 Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ð³Ñ\83Ñ\82аÑ\80ак.\nÐ\92аÑ\88 Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð½Ñ\8f Ð±Ñ\83дзе Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ\8b Ñ\96нÑ\88Ñ\8bм Ñ\83дзелÑ\8cнÑ\96кам Ð¿Ñ\80Ñ\8b ÐºÐ°Ð½Ñ\82акÑ\82аванÑ\8cнÑ\96.",
        "prefs-help-email-required": "Патрабуецца адрас электроннай пошты.",
        "prefs-info": "Асноўныя зьвесткі",
        "prefs-i18n": "Інтэрнацыяналізацыя",
        "rcfilters-preference-label": "Схаваць палепшаную вэрсію апошніх зьменаў",
        "rcfilters-preference-help": "Адкатвае рэдызайн інтэрфэйсу 2017 году і ўсе інструмэнты, дададзеныя з таго часу.",
        "rcfilters-filter-showlinkedfrom-label": "Паказаць зьмены на старонках, на якія спасылаецца",
-       "rcfilters-filter-showlinkedfrom-option-label": "Паказаць зьмены старонак, на якія ёсьць спасылкі <strong>З</strong> старонкі",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Старонкі, на якія спасылаецца</strong> абраная старонка",
        "rcfilters-filter-showlinkedto-label": "Паказаць зьмены старонак, якія спасылаюцца на",
-       "rcfilters-filter-showlinkedto-option-label": "Паказаць зьмены старонак, якія спасылаюцца <strong>НА</strong> старонку",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Старонкі, якія спасылаюцца на</strong> абраную старонку",
        "rcfilters-target-page-placeholder": "Увядзіце назву старонкі",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
        "rclistfromreset": "Скінуць выбар даты",
        "import-mapping-subpage": "Імпарт у якасьці падстаронак наступнай старонкі:",
        "import-upload-filename": "Назва файла:",
        "import-upload-username-prefix": "Прэфікс інтэрвікі:",
+       "import-assign-known-users": "Прызначаць праўкі лякальным удзельнікам, калі ўдзельнік з такім імем існуе лякальна",
        "import-comment": "Камэнтар:",
        "importtext": "Калі ласка, экспартуйце файл з крынічнай вікі з дапамогай [[Special:Export|прылады экспарту]].\nЗахавайце яго на свой кампутар, а потым загрузіце сюды.",
        "importstart": "Імпартаваньне старонак…",
        "imported-log-entries": "{{PLURAL:$1|Імпартаваны $1 запіс журнала|Імпартаваныя $1 запісы журнала|Імпартаваныя $1 запісаў журнала}}.",
        "importfailed": "Немагчыма імпартаваць: $1",
        "importunknownsource": "Невядомы тып крыніцы імпарту",
+       "importnoprefix": "Не пададзены прэфікс інтэрвікі",
        "importcantopen": "Немагчыма адкрыць файл імпарту",
        "importbadinterwiki": "Няслушная спасылка на іншую моўную вэрсію",
        "importsuccess": "Імпартаваньне скончанае!",
        "autosumm-blank": "Выдалены ўвесь зьмест старонкі",
        "autosumm-replace": "Старонка замененая на '$1'",
        "autoredircomment": "Перанакіроўвае на [[$1]]",
+       "autosumm-removed-redirect": "Выдаленае перанакіраваньне на [[$1]]",
+       "autosumm-changed-redirect-target": "Перанакіраваньне зьмененае з [[$1]] на [[$2]]",
        "autosumm-new": "Створана старонка са зьместам '$1'",
        "autosumm-newblank": "Створаная пустая старонка",
        "size-bytes": "$1 б",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Метка|Меткі}}]]: $2)",
        "tag-mw-contentmodelchange": "зьмена мадэлі зьместу",
        "tag-mw-contentmodelchange-description": "Рэдагаваньні, якія [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel зьмяняюць мадэль зьместу] старонкі",
+       "tag-mw-new-redirect": "Новае перанакіраваньне",
+       "tag-mw-new-redirect-description": "Рэдагаваньні, якія ствараюць новае перанакіраваньне ці зьмяняюць старонку на перанакіраваньне",
+       "tag-mw-removed-redirect": "Выдаленае перанакіраваньне",
+       "tag-mw-removed-redirect-description": "Праўкі, якія зьмяняюць існае перанакіраваньне на не перанакіраваньне",
        "tags-title": "Меткі",
        "tags-intro": "На гэтай старонцы знаходзіцца сьпіс метак, якімі праграмнае забесьпячэньне можа пазначыць рэдагаваньне, і іх значэньне.",
        "tags-tag": "Назва меткі",
index 5a6cb01..db39ac0 100644 (file)
        "botpasswords-label-delete": "Изтриване",
        "botpasswords-label-resetpassword": "Възстановяване на парола",
        "botpasswords-label-grants": "Приложими разрешения:",
+       "botpasswords-label-grants-column": "Дадено",
        "botpasswords-bad-appid": "Името на бота „$1“ не е валидно.",
        "botpasswords-insert-failed": "Неуспешно добавяне на име на бота „$1“. Дали не е добавяно вече?",
        "botpasswords-update-failed": "Неуспешно подновяване на името на бота „$1“. Дали не е изтрито?",
        "passwordreset-emailelement": "Потребителско име: \n$1\n\nВременна парола: \n$2",
        "passwordreset-emailsentemail": "Ако електронната Ви поща е свързана със сметката Ви, на нея е изпратено писмо за възстановяване на паролата.",
        "passwordreset-emailsentusername": "Ако това потребителско име е свързано с електронна поща, е изпратено писмо за възстановяване на паролата.",
+       "passwordreset-nosuchcaller": "Източникът на извикването не съществува: $1",
        "passwordreset-invalidemail": "Неправилен email адрес",
        "passwordreset-nodata": "Не сте указали нито потребителско име, нито адрес на ел. поща",
        "changeemail": "Промяна или премахване на адреса за е-поща",
        "recentchangesdays-max": "(най-много $1 {{PLURAL:$1|ден|дни}})",
        "recentchangescount": "Брой показвани редакции по подразбиране:",
        "prefs-help-recentchangescount": "Това включва последните промени, историите на страниците и дневниците.",
-       "prefs-help-watchlist-token2": "Това е секретният ключ към уеб хранилката на вашия списък за наблюдение. Всеки, който го знае, би могъл да прегледа списъка ви за наблюдение, така че не го споделяйте. При нужда можете да го [[Специални:ResetTokens|изчистите]].",
+       "prefs-help-watchlist-token2": "Това е секретният ключ към уеб хранилката на вашия списък за наблюдение.\nВсеки, който го знае, би могъл да прегледа списъка ви за наблюдение, така че не го споделяйте.\nПри нужда можете да го [[Special:ResetTokens|изчистите]].",
        "savedprefs": "Настройките ви бяха съхранени.",
        "savedrights": "Потребителските групи на {{GENDER:$1|$1}} са запазени.",
        "timezonelegend": "Часова зона:",
        "right-siteadmin": "Заключване и отключване на базата от данни",
        "right-override-export-depth": "Изнасяне на страници, включително свързаните с тях в дълбочина до пето ниво",
        "right-sendemail": "Изпращане на е-писма до другите потребители",
-       "right-managechangetags": "Създаване и (де)активиране на [[Специални:Етикети|етикети]]",
+       "right-managechangetags": "Създаване и (де)активиране на [[Special:Tags|етикети]]",
        "grant-group-page-interaction": "Взаимодействие със страници",
        "grant-group-file-interaction": "Взаимодействие с медийни файлове",
        "grant-group-watchlist-interaction": "Взаимодействие с вашия списък за наблюдение",
        "rcfilters-restore-default-filters": "Възстановяване на филтрите по подразбиране",
        "rcfilters-clear-all-filters": "Изчистване на всички филтри",
        "rcfilters-show-new-changes": "Преглед на най-новите промени",
-       "rcfilters-search-placeholder": "Филтриране на последните промени (изберете или започнете да въвеждате)",
+       "rcfilters-search-placeholder": "Филтриране на промените (използвайте менюто или търсете по име на филтър)",
        "rcfilters-invalid-filter": "Невалиден филтър",
        "rcfilters-empty-filter": "Няма активни филтри. Показани са всички редакции.",
        "rcfilters-filterlist-title": "Филтри",
        "rcfilters-filterlist-whatsthis": "Как работи това?",
-       "rcfilters-filterlist-feedbacklink": "Ð\9eÑ\81Ñ\82авеÑ\82е ÐºÐ¾Ð¼ÐµÐ½Ñ\82аÑ\80 Ð·Ð° Ð½Ð¾Ð²Ð¸Ñ\82е (беÑ\82а) Ñ\84илÑ\82Ñ\80и",
+       "rcfilters-filterlist-feedbacklink": "СподелеÑ\82е ÐºÐ°ÐºÐ²Ð¾ Ð¼Ð¸Ñ\81лиÑ\82е Ð·Ð° Ñ\82ези (нови) Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82и Ð·Ð° Ñ\84илÑ\82Ñ\80иÑ\80ане",
        "rcfilters-highlightbutton-title": "Отбелязване на резултатите",
        "rcfilters-highlightmenu-title": "Изберете цвят",
        "rcfilters-highlightmenu-help": "Изберете цвят за отбелязване на свойството",
        "rcfilters-filter-editsbyself-description": "Ваши редакции.",
        "rcfilters-filter-editsbyother-label": "Чужди редакции",
        "rcfilters-filter-editsbyother-description": "Всички редакции с изключение на вашите собствени.",
-       "rcfilters-filtergroup-userExpLevel": "Ð\9dиво Ð½Ð° Ð¾Ð¿Ð¸Ñ\82а (Ñ\81амо Ð·Ð° Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80ани Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82ели)",
+       "rcfilters-filtergroup-userExpLevel": "РегиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\8f Ð¸ Ð¾Ð¿Ð¸Ñ\82",
        "rcfilters-filter-user-experience-level-registered-label": "Регистрирани",
        "rcfilters-filter-user-experience-level-registered-description": "Влезли в системата редактори.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Нерегистрирани",
        "rcfilters-filter-user-experience-level-unregistered-description": "Редактори, които не са влезли в системата.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Новодошли",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Ð\9fо-малко Ð¾Ñ\82 10 Ñ\80едакÑ\86ии Ð¸ 5 дни активност.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "РегиÑ\81Ñ\82Ñ\80иÑ\80ани Ñ\80едакÑ\82оÑ\80и Ñ\81 Ð¿Ð¾-малко Ð¾Ñ\82 10 Ñ\80едакÑ\86ии Ð¸Ð»Ð¸ 4 дни активност.",
        "rcfilters-filter-user-experience-level-learner-label": "Учещи се",
-       "rcfilters-filter-user-experience-level-learner-description": "Ð\9fовеÑ\87е Ð¾Ð¿Ð¸Ñ\82 Ð¾Ñ\82 â\80\9eÐ\9dоводоÑ\88лиâ\80\9c, Ð½Ð¾ Ð¿Ð¾-малко Ð¾Ñ\82 „Опитни потребители“.",
+       "rcfilters-filter-user-experience-level-learner-description": "РегиÑ\81Ñ\82Ñ\80иÑ\80ани Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82ели Ñ\81 Ð¾Ð¿Ð¸Ñ\82 Ð¾Ñ\82 â\80\9eÐ\9dоводоÑ\88лиâ\80\9c Ð´Ð¾ „Опитни потребители“.",
        "rcfilters-filter-user-experience-level-experienced-label": "Опитни потребители",
-       "rcfilters-filter-user-experience-level-experienced-description": "Ð\9fовеÑ\87е Ð¾Ñ\82 30 Ð´Ð½Ð¸ Ð°ÐºÑ\82ивноÑ\81Ñ\82 Ð¸ 500 Ñ\80едакÑ\86ии.",
+       "rcfilters-filter-user-experience-level-experienced-description": "РегиÑ\81Ñ\82Ñ\80иÑ\80ани Ñ\80едакÑ\82оÑ\80и Ñ\81 Ð¿Ð¾Ð²ÐµÑ\87е Ð¾Ñ\82 500 Ñ\80едакÑ\86ии Ð¸ 30 Ð´Ð½Ð¸ Ð°ÐºÑ\82ивноÑ\81Ñ\82.",
        "rcfilters-filtergroup-automated": "Автоматизирани редакции",
        "rcfilters-filter-bots-label": "Бот",
        "rcfilters-filter-bots-description": "Редакции, направени с помощта на автоматизирани инструменти.",
        "rcfilters-filter-logactions-description": "Административни действия, създавания на сметки, изтривания на страници, качвания...",
        "rcfilters-filtergroup-lastRevision": "Текущи версии",
        "rcfilters-filter-lastrevision-label": "Текуща версия",
-       "rcfilters-filter-lastrevision-description": "Ð\9fоследната промяна на страница.",
-       "rcfilters-filter-previousrevision-label": "Ð\9fо-Ñ\80анни Ð²ÐµÑ\80Ñ\81ии",
-       "rcfilters-filter-previousrevision-description": "Всички редакции, които не са последните на страница.",
+       "rcfilters-filter-lastrevision-description": "Само Ð¿оследната промяна на страница.",
+       "rcfilters-filter-previousrevision-label": "Ð\9dе Ð¿Ð¾Ñ\81леднаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f",
+       "rcfilters-filter-previousrevision-description": "Всички редакции, които не са „последната версия“.",
        "rcfilters-filter-excluded": "Изключени",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:не</strong> $1",
        "rcfilters-exclude-button-off": "Изключване на избраните",
        "backend-fail-read": "Файлът „$1“ не може да бъде прочетен.",
        "backend-fail-create": "Файлът „$1“ не може да бъде съхранен.",
        "backend-fail-maxsize": "Файлът „$1“ не може да бъде съхранен, тъй като размерът му надвишава {{PLURAL:$2|един байт|$2 байт}}.",
-       "backend-fail-connect": "Не е възможно свързването към бекенда за съхранение „1“.",
-       "backend-fail-internal": "Възникна неизвестна грешка в бекенда за съхранение „1“.",
+       "backend-fail-connect": "Не е възможно свързването към бекенда за съхранение „$1“.",
+       "backend-fail-internal": "Възникна неизвестна грешка в бекенда за съхранение „$1“.",
        "zip-file-open-error": "Възникна грешка при отваряне на файла за проверка на ZIP.",
        "zip-wrong-format": "Указаният файл не е ZIP файл.",
        "zip-bad": "Файлът е повреден или е нечетим ZIP файл.\nСигурността му не може да бъде проверена.",
        "listfiles_size": "Размер",
        "listfiles_description": "Описание",
        "listfiles_count": "Версии",
-       "listfiles-show-all": "Включване на старите версии на изображенията",
+       "listfiles-show-all": "Включване на стари версии на файлове",
        "listfiles-latestversion": "Текущата версия",
        "listfiles-latestversion-yes": "Да",
        "listfiles-latestversion-no": "Не",
        "filerevert-comment": "Причина:",
        "filerevert-defaultcomment": "Възвръщане към версия от $2, $1 ($3)",
        "filerevert-submit": "Възвръщане",
-       "filerevert-success": "Файлът '''[[Media:$1|$1]]''' беше възвърнат към [$4 версия от $3, $2].",
+       "filerevert-success": "Файлът <strong>[[Media:$1|$1]]</strong> беше възвърнат към [$4 версия от $3, $2].",
        "filerevert-badversion": "Не съществува предишна локална версия на файла със зададения времеви отпечатък.",
        "filedelete": "Изтриване на $1",
        "filedelete-legend": "Изтриване на файл",
        "filedelete-comment": "Причина:",
        "filedelete-submit": "Изтриване",
        "filedelete-success": "Файлът '''$1''' беше изтрит.",
-       "filedelete-success-old": "Версията на '''[[Media:$1|$1]]''' към $3, $2 е била изтрита.",
-       "filedelete-nofile": "Файлът '''$1''' не съществува.",
+       "filedelete-success-old": "Версията на <strong>[[Media:$1|$1]]</strong> към $3, $2 е била изтрита.",
+       "filedelete-nofile": "Файлът <strong>$1</strong> не съществува.",
        "filedelete-nofile-old": "Не съществува архивна версия на '''$1''' с указаните параметри.",
        "filedelete-otherreason": "Друга/допълнителна причина:",
        "filedelete-reason-otherlist": "Друга причина",
        "notvisiblerev": "Версията беше изтрита",
        "watchlist-details": "{{PLURAL:$1|Една наблюдавана страница|$1 наблюдавани страници}} от списъка Ви за наблюдение (без беседи).",
        "wlheader-enotif": "Известяването по е-поща е включено.",
-       "wlheader-showupdated": "Страниците, които са били променени след последния път, когато сте ги посетили, са показани в '''получер'''.",
+       "wlheader-showupdated": "Страниците, които са били променени след последния път, когато сте ги посетили, са показани в <strong>получер</strong>.",
        "wlnote": "{{PLURAL:$1|Показана е последната промяна|Показани са последните <strong>$1</strong> промени}} през {{PLURAL:$2|последния час|последните <strong>$2</strong> часа}}, започвайки от $3, $4.",
        "wlshowlast": "Показване на последните $1 часа $2 дни",
        "watchlist-hide": "Скриване",
        "contributions-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
        "nocontribs": "Не са намерени промени, отговарящи на критерия.",
        "uctop": "(текуща)",
-       "month": "Ð\9cеÑ\81еÑ\86:",
-       "year": "Ð\93одина:",
+       "month": "Ð\9eÑ\82 Ð¼ÐµÑ\81еÑ\86 (и Ð¿Ð¾-Ñ\80ано):",
+       "year": "Ð\9eÑ\82 Ð³Ð¾Ð´Ð¸Ð½Ð° (и Ð¿Ð¾-Ñ\80ано):",
        "sp-contributions-newbies": "Показване само на приносите на нови потребители",
        "sp-contributions-newbies-sub": "на нови потребители",
        "sp-contributions-newbies-title": "Потребителски приноси за нови сметки",
        "whatlinkshere": "Какво сочи насам",
        "whatlinkshere-title": "Страници, които сочат към „$1“",
        "whatlinkshere-page": "Страница:",
-       "linkshere": "Следните страници сочат към '''[[:$1]]''':",
-       "nolinkshere": "Няма страници, сочещи към '''[[:$1]]'''.",
+       "linkshere": "Следните страници сочат към <strong>[[:$1]]</strong>:",
+       "nolinkshere": "Няма страници, сочещи към <strong>[[:$1]]</strong>.",
        "nolinkshere-ns": "Няма страници, сочещи към [[:$1]] в избраното именно пространство.",
        "isredirect": "пренасочваща страница",
        "istemplate": "включване",
        "movereason": "Причина:",
        "revertmove": "връщане",
        "delete_and_move_text": "Целевата страница „[[:$1]]“ вече съществува.\nИскате ли да я изтриете, за да освободите място за преместването?",
-       "delete_and_move_confirm": "Да, искам да изтрия тази страница.",
+       "delete_and_move_confirm": "Да, искам да изтрия тази страница",
        "delete_and_move_reason": "Изтрита, за да се освободи място за преместване от „[[$1]]“",
-       "selfmove": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80емеÑ\81Ñ\82ена, Ñ\82Ñ\8aй ÐºÐ°Ñ\82о Ñ\86елевоÑ\82о Ð¸Ð¼Ðµ Ñ\81Ñ\8aвпада Ñ\81 Ð¿Ñ\8aÑ\80вонаÑ\87алноÑ\82о Ñ\9d Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ.",
+       "selfmove": "Ð\97аглавиеÑ\82о Ñ\81Ñ\8aвпада;\nÑ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ñ\80емеÑ\81Ñ\82ена Ð²Ñ\8aÑ\80Ñ\85Ñ\83 Ñ\81амаÑ\82а Ð½ÐµÑ\8f.",
        "immobile-source-namespace": "Не могат да се местят страници в именно пространство „$1“",
        "immobile-target-namespace": "Не могат да се местят страници в именно пространство „$1“.",
        "immobile-target-namespace-iw": "Страницата не може да бъде преместена под заглавие, оформено като междууики препратка.",
        "import-nonewrevisions": "Не са импортирани версии (всички вече съществуват или са пропуснати поради грешки).",
        "xml-error-string": "$1 на ред $2, колона $3 (байт $4): $5",
        "import-upload": "Качване на XML данни",
-       "import-token-mismatch": "Загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. <strong>Моля, уверете се, че сте влезли в профила си и опитайте отново</strong>.\nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.",
+       "import-token-mismatch": "Загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. '''Моля, уверете се, че сте влезли в профила си и опитайте отново'''.\nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.",
        "import-invalid-interwiki": "Не може да бъде извършено внасяне от посоченото уики.",
        "import-error-edit": "Страницата „$1“ не беше внесена, тъй като нямате права да я редактирате.",
        "import-error-create": "Страницата „$1“ не беше внесена, тъй като нямате права да я създадете.",
        "tooltip-ca-delete": "Изтриване на страницата",
        "tooltip-ca-undelete": "Възстановяване на изтрити редакции на страницата",
        "tooltip-ca-move": "Преместване на страницата",
-       "tooltip-ca-watch": "Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а ÐºÑ\8aм Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение",
-       "tooltip-ca-unwatch": "Ð\9fÑ\80емаÑ\85ване Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение",
+       "tooltip-ca-watch": "Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а ÐºÑ\8aм Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение",
+       "tooltip-ca-unwatch": "Ð\9fÑ\80емаÑ\85ване Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение",
        "tooltip-search": "Претърсване на {{SITENAME}}",
        "tooltip-search-go": "Отиване на страницата, ако тя съществува с точно това име",
        "tooltip-search-fulltext": "Търсене в страниците за този текст",
        "tooltip-p-logo": "Посещаване на началната страница",
        "tooltip-n-mainpage": "Началната страница",
        "tooltip-n-mainpage-description": "Посещаване на началната страница",
-       "tooltip-n-portal": "Ð\98нÑ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° Ð¿Ñ\80оекÑ\82а â\80\94 какво, къде, как",
+       "tooltip-n-portal": "Ð\98нÑ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° Ð¿Ñ\80оекÑ\82а â\80\93 какво, къде, как",
        "tooltip-n-currentevents": "Информация за текущи събития",
        "tooltip-n-recentchanges": "Списък на последните промени в уикито",
        "tooltip-n-randompage": "Зареждане на случайна страница",
        "exif-software": "Използван софтуер",
        "exif-artist": "Автор",
        "exif-copyright": "Притежател на авторското право",
-       "exif-exifversion": "Exif версия",
+       "exif-exifversion": "Версия на Exif",
        "exif-flashpixversion": "Поддържана версия на Flashpix",
        "exif-colorspace": "Цветово пространство",
        "exif-componentsconfiguration": "Значение на всеки компонент",
        "autosumm-blank": "Премахване на цялото съдържание на страницата",
        "autosumm-replace": "Заместване на съдържанието на страницата с „$1“",
        "autoredircomment": "Пренасочване към [[$1]]",
+       "autosumm-changed-redirect-target": "Промяна на целта на пренасочване от [[$1]] на [[$2]]",
        "autosumm-new": "Нова страница: „$1“",
        "autosumm-newblank": "Създаване на празна страница",
        "lag-warn-normal": "Промените от {{PLURAL:$1|последната $1 секунда|последните $1 секунди}} вероятно не са показани в списъка.",
        "redirect-submit": "Отваряне",
        "redirect-lookup": "Параметър:",
        "redirect-value": "Стойност:",
-       "redirect-user": "Ð\9fоÑ\82Ñ\80ебиÑ\82елÑ\81ки Ð½Ð¾Ð¼Ðµр",
+       "redirect-user": "Ð\9fоÑ\82Ñ\80ебиÑ\82елÑ\81ки Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82ор",
        "redirect-page": "Номер на страницата",
        "redirect-revision": "Версия на страницата",
        "redirect-file": "Име на файл",
        "tag-filter-submit": "Филтриране",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Етикет|Етикети}}]]: $2)",
        "tag-mw-contentmodelchange": "промяна на модела на съдържание",
+       "tag-mw-undo": "Отмяна",
        "tags-title": "Етикети",
        "tags-intro": "Тук са изброени всички етикети, които могат да се ползват за отбелязване на редакциите, както и тяхното значение.",
        "tags-tag": "Име на етикета",
index f0cbb13..9ce3d2c 100644 (file)
        "recentchangeslinked-feed": "संबंधित बदलाव",
        "recentchangeslinked-toolbox": "संबंधित बदलाव",
        "recentchangeslinked-title": "\"$1\" संबंधी बदलाव",
-       "recentchangeslinked-summary": "à¤\88 à¤\8fà¤\97à¥\8b à¤ªà¤¨à¥\8dना à¤¬à¤¿à¤¸à¥\87स à¤¸à¥\87 (या à¤\8fà¤\97à¥\8b à¤¶à¥\8dरà¥\87णà¥\80 à¤¬à¤¿à¤¸à¥\87स à¤\95à¥\80 à¤¸à¤¦à¤¸à¥\8dय à¤¸à¥\87) à¤\9cà¥\81ड़ल à¤ªà¤¨à¥\8dनवन à¤®à¥\87à¤\82 à¤¹à¤¾à¤² à¤®à¥\87à¤\82 à¤­à¤\87ल à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤\8fà¤\97à¥\8b à¤²à¤¿à¤¸à¥\8dà¤\9f à¤¹à¤µà¥\87। \n[[Special:Watchlist|à¤\86पà¤\95à¥\80 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80]] à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤¸à¤¬ <strong>मोट अच्छर में</strong> लउकत बाने।",
+       "recentchangeslinked-summary": "à¤\95à¥\8cनà¥\8bà¤\82 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¯à¤¾ à¤«à¤¿à¤° à¤\93à¤\95रा à¤¸à¥\87 à¤\9cà¥\81ड़à¥\87 à¤µà¤¾à¤²à¤¾ à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤®à¥\87à¤\82 à¤­à¤\87ल à¤¬à¤¦à¤²à¤¾à¤µ à¤¦à¥\87à¤\96à¥\87 à¤\96ातà¥\80 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¨à¤¾à¤\81व à¤¦à¥\80à¤\82। (à¤\95à¥\8cनà¥\8bà¤\82 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\86वà¥\87 à¤µà¤¾à¤²à¤¾ à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤\96ातà¥\80, à¤¶à¥\8dरà¥\87णà¥\80:शà¥\8dरà¥\87णà¥\80 à¤\95à¥\87 à¤¨à¤¾à¤\81व à¤¡à¤¾à¤²à¥\80à¤\82)। [[Special:Watchlist|राà¤\89र à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80]] à¤®à¥\87à¤\82 à¤¶à¤¾à¤®à¤¿à¤² à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ <strong>मोट अच्छर में</strong> लउकत बाने।",
        "recentchangeslinked-page": "पन्ना नाँव:",
        "recentchangeslinked-to": "एकरे बजाय ए पन्ना से जुड़ल पन्नवन मे भइल बदलाव देखावल जाय",
        "recentchanges-page-added-to-category": "[[:$1]] श्रेणी में जोड़ल गइल",
        "booksources-search-legend": "किताबी स्रोत के खोज",
        "booksources-search": "खोज",
        "log": "सगरी लॉग",
+       "all-logs-page": "सगरी पब्लिक लॉग",
        "allpages": "सगरी पन्ना",
        "nextpage": "अगिला पन्ना ($1)",
        "prevpage": "पछिला पन्ना ($1)",
        "trackingcategories-name": "संदेस नाँव",
        "emailuser": "ई प्रयोगकर्ता के ईमेल करीं",
        "emailusername": "प्रयोगकर्तानाँव:",
+       "usermessage-editor": "सिस्टम मसेंजर",
        "watchlist": "धियानसूची",
        "mywatchlist": "धियानसूची",
        "watch": "धियानसूची में डालीं",
        "protectlogpage": "सुरक्षा लॉग",
        "protectlogtext": "नीचे पन्ना सुरक्षा में भइल बदलावकुल के सूची बा।\nहाल में सुरक्षित पन्नन के सूची खातिर [[Special:ProtectedPages|सुरक्षित पन्नन के सूची]] देखीं।",
        "protectedarticle": "\"[[$1]]\" सुरक्षित कइल गइल",
+       "protect-default": "सगरी प्रयोगकर्ता लोग के एलाऊ करीं",
+       "restriction-edit": "संपादन करीं",
        "restriction-move": "स्थानांतरण",
        "restriction-create": "बनावे पर",
        "restriction-upload": "अपलोड",
        "sp-contributions-blocked-notice": "ई प्रयोगकर्ता के ई समय निष्क्रीय करल गईल बा।\nनविनतम नष्ट लौग प्रविष्टी उद्धरण खातिर निचे दिहल बा:",
        "sp-contributions-search": "योगदान खातिर खोज करीं",
        "sp-contributions-username": "आइपी पता भा प्रयोगकर्तानाँव:",
+       "sp-contributions-toponly": "खाली उहे संपादन देखीं जवन सभसे नया होखें",
        "sp-contributions-newonly": "खाली उहे संपादन देखीं जेकरा से नया पन्ना बनल होखे",
        "sp-contributions-submit": "खोजीं",
        "whatlinkshere": "इहाँ का जुड़ल बा",
        "change-blocklink": "ब्लॉक बदलीं",
        "contribslink": "योगदान",
        "blocklogpage": "निष्क्रिय खाता",
+       "blocklogentry": "[[$1]] के ब्लॉक कइल गइल, समाप्ती के अवधि $2 $3",
        "movepagebtn": "पन्ना स्थांतरण करीं",
        "movelogpage": "स्थानांतरण लॉग",
        "revertmove": "पिछलका स्थिति",
        "tooltip-save": "जवन बदलाव कइलीं ओकरा के सहेजीं",
        "tooltip-preview": "जवन बदलाव कइलीं ओकर झलक देखीं। सहेजे से पहिले एकर इस्तेमाल करे के आगरह बा।",
        "tooltip-diff": "देखीं कि पाठ में आप का बदलाव कइले बानी",
+       "tooltip-compareselectedversions": "एह पन्ना के चुनल गइल दू गो रिवीजन सभ में अंतर देखीं",
        "tooltip-rollback": "\"रोलबैक\" एह पन्ना पर सभसे अंतिम संपादन करे वाला संपादक के कइल बदलाव(सभ) एकही क्लिक में वापस लवटा देला",
        "tooltip-undo": "\"वापस लीं\" ए संपादन के पलट देला आ संपादन फार्म के झलक देखावे वाला मोड में खोलेला। ई छोट सारांश में कारण जोड़े के मोका देला।",
        "tooltip-summary": "संछेप में एगो सारांश लिखीं",
        "simpleantispam-label": "स्पैम-बिरोधी रोक (Anti-spam check)\nएके <strong>मत</strong> भरीं!",
+       "pageinfo-header-edits": "संपादन इतिहास",
        "pageinfo-length": "पन्ना लंबाई (बाइट में)",
+       "pageinfo-article-id": "पन्ना आइडी",
        "pageinfo-subpages-name": "एह पन्ना के उपपन्ना संख्या",
+       "pageinfo-firstuser": "पन्ना बनावेवाला",
+       "pageinfo-firsttime": "पन्ना बनावे के तारीख",
+       "pageinfo-lastuser": "अंतिम संपादक",
+       "pageinfo-lasttime": "सभसे नया संपादन के तारीख",
+       "pageinfo-edits": "कुल संपादन गिनती",
+       "pageinfo-authors": "कुल अलग-अलग संपादकन के गिनती",
        "pageinfo-magic-words": "जादुई शब्द {{{{PLURAL:$1||शब्द|शब्द}}}} ($1)",
        "pageinfo-toolboxlink": "पन्ना से जुड़ल जानकारी",
        "previousdiff": "← पुरान संपादन",
        "logentry-newusers-create": "खाता $1 {{GENDER:$2|बनावल गइल}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|अपलोड कइलें}} $3",
        "searchsuggest-search": "{{SITENAME}} में खोजीं",
+       "duration-days": "$1 दिन",
        "expandtemplates": "टेम्पलेट बिस्तार",
        "mediastatistics": "मीडिया सांख्यिकी"
 }
index 21f66a7..9037116 100644 (file)
        "contentmodelediterror": "আপনি এই পুনর্বিবেচনা সম্পাদনা করতে পারবেন না কারণ এর বিষয়বস্তু মডেল <code>$1</code>, যা বর্তমান বিষয়বস্তু মডেল <code>$2</code>-এর থেকে ভিন্ন।",
        "recreate-moveddeleted-warn": "'''সতর্কীকরণ: আপনি এমন একটি পাতা পুনরায় তৈরি করছেন যা পূর্বে অপসারণ করা হয়েছিল।'''\n\nআপনি পাতাটি সম্পাদনা চালিয়ে যাওয়া ঠিক হবে কিনা, তা বিবেচনা করুন।\nআপনার সুবিধার্থে পাতাটির অপলুপ্তি লগ এখানে দেয়া হলো:",
        "moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এই পাতার অপসারণ, সুরক্ষা ও স্থানান্তর লগ দেওয়া হলো।",
-       "moveddeleted-notice-recent": "দà§\81à¦\83à¦\96িত, à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦¾à¦®à§\8dপà§\8dরতি à¦\85পসারিত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 (সরà§\8dবশà§\87ষ à§¨à§ª à¦\98ণà§\8dà¦\9fায়)।\nসà§\82তà§\8dর à¦¹à¦¿à¦¸à§\87বà§\87 à¦¨à¦¿à¦\9aà§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾ অপসারণ, সুরক্ষা ও স্থানান্তর লগ দেয়া হয়েছে।",
+       "moveddeleted-notice-recent": "দà§\81à¦\83à¦\96িত, à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦®à§\8dপà§\8dরতি à¦\85পসারিত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 (সরà§\8dবশà§\87ষ à§¨à§ª à¦\98ণà§\8dà¦\9fায়)।\nসà§\82তà§\8dর à¦¹à¦¿à¦¸à§\87বà§\87 à¦¨à¦¿à¦\9aà§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° অপসারণ, সুরক্ষা ও স্থানান্তর লগ দেয়া হয়েছে।",
        "log-fulllog": "সম্পূর্ণ লগ দেখুন",
        "edit-hook-aborted": "হূক দ্বারা সম্পাদনা পরিত্যক্ত হয়েছে।\nএর কোন ব্যাখ্যা নাই।",
        "edit-gone-missing": "পাতাটি হালনাগাদ হয়নি।\nসম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।",
        "tag-mw-replace-description": "সম্পাদনাগুলি যা একটি পাতার বিষয়বস্তুর ৯০ ভাগের বেশী সরিয়ে ফেলে",
        "tag-mw-rollback": "পুনর্বহাল",
        "tag-mw-rollback-description": "সম্পাদনাগুলি যা রোলব্যাক সংযোগ ব্যবহার করে পূর্বের সম্পাদনায় ফেরত নেয়",
+       "tag-mw-undo": "পূর্বাবস্থায় ফেরত",
        "tags-title": "ট্যাগসমূহ",
        "tags-intro": "এই পাতায় সফটওয়্যারটি একটি সম্পাদনা চিহ্নিত করার জন্য যে সকল ট্যাগ ব্যবহার করে তার তালিকা ও বর্ণনা রয়েছে।",
        "tags-tag": "ট্যাগ নাম",
index f8eb1cc..312b20c 100644 (file)
        "anonpreviewwarning": "''Niste prijavljeni. Nakon spremanja izmjena vaša IP adresa će biti zapisana u historiji uređivanja ove stranice.''",
        "missingsummary": "<strong>Napomena:</strong> Niste unijeli sažetak izmjene.\nAko ponovo kliknete na \"$1\", Vaša izmjena će biti sačuvana bez sažetka.",
        "selfredirect": "<strong>Upozorenje:</strong> Preusmjerili ste stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"$1\", ipak će nastati preusmjerenje.",
-       "missingcommenttext": "Unesite komentar ispod.",
+       "missingcommenttext": "Unesite komentar.",
        "missingcommentheader": "<strong>Napomena:</strong> Niste napisali naslov ovog komentara.\nAko ponovo kliknete na \"$1\", Vaša izmjena će biti sačuvana bez naslova.",
        "summary-preview": "Pregled sažetka:",
        "subject-preview": "Pregled teme:",
        "contentmodelediterror": "Ne možete urediti ovu izmjenu jer je njen model sadržaja <code>$1</code>, što se razlikuje od trenutnog modela sadržaja stranice <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Upozorenje: Ponovo pravite stranicu koja je prethodno obrisana.</strong>\n\nRazmotrite je li prikladno nastaviti s uređivanjem ove stranice.\nOvdje je naveden zapisnik brisanja i premještanja:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nZapisnik brisanja, zaštite i premještanja stranice prikazan je ispod.",
-       "moveddeleted-notice-recent": "Žao nam je, ova stranica je nedavno obrisana (u prethodna 24 sata).\nNiže su navedeni zapisnici brisanja i premještanja.",
+       "moveddeleted-notice-recent": "Žao nam je, ova stranica je nedavno obrisana (u prethodna 24 sata).\nNiže su navedeni zapisnici brisanja, zaštite i premještanja.",
        "log-fulllog": "Prikaži cijeli zapisnik",
        "edit-hook-aborted": "Izmjena je poništena putem interfejsa.\nNije ponuđeno nikakvo objašnjenje.",
        "edit-gone-missing": "Stranica se nije mogla osvježiti.\nIzgleda da je obrisana.",
        "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međuizmjena|Nisu prikazane $1 međuizmjene|Nije prikazano $1 međuizmjena}} istog korisnika)",
        "diff-multi-otherusers": "(Nije prikazana {{PLURAL:$1|jedna međuverzija|$1 međuverzija}} {{PLURAL:$2|drugog korisnika|$2 korisnika}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Jedna međurevizija|$1 međurevizije|$1 međurevizija}} od više od $2 {{PLURAL:$2|korisnika|korisnika}} {{PLURAL:$1|nije prikazana|nisu prikazane}})",
+       "diff-paragraph-moved-tonew": "Pasus je premješten. Kliknite da pređete na njegovo novo mjesto.",
+       "diff-paragraph-moved-toold": "Pasus je premješten. Kliknite da pređete na njegovo staro mjesto.",
        "difference-missing-revision": "{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].",
        "searchresults": "Rezultati pretrage",
        "searchresults-title": "Rezultati pretrage za \"$1\"",
        "uploadstash-refresh": "Osvježi spisak datoteka",
        "uploadstash-thumbnail": "pogledaj minijaturu",
        "uploadstash-exception": "Ne mogu sačuvati datoteku u skladište ($1): \"$2\".",
+       "uploadstash-bad-path": "Putanja ne postoji.",
+       "uploadstash-bad-path-invalid": "Putanja nije ispravna.",
+       "uploadstash-bad-path-unknown-type": "Nepoznata vrsta \"$1\".",
+       "uploadstash-bad-path-bad-format": "Ključ \"$1\" nije u odgovarajućem formatu.",
+       "uploadstash-file-not-found-no-thumb": "Ne mogu dobiti minijaturu.",
+       "uploadstash-file-not-found-no-local-path": "Nema lokalne putanje za umanjenu stavku.",
+       "uploadstash-file-not-found-no-object": "Ne mogu napraviti lokalni podatkovni objekt za minijaturu.",
+       "uploadstash-file-not-found-no-remote-thumb": "Dobavljanje minijature nije uspjelo: $1\nURL = $2",
+       "uploadstash-file-not-found-missing-content-type": "Nedostaje zaglavlje za vrstu sadržaja.",
+       "uploadstash-file-not-found-not-exists": "Ne mogu naći putanju ili ovo nije obična datoteka.",
+       "uploadstash-file-too-large": "Ne mogu poslužiti datoteku veću od $1 {{PLURAL:$1|bajta|bajtova}}",
+       "uploadstash-not-logged-in": "Niko nije prijavljen. Datoteke moraju pripadati korisnicima.",
+       "uploadstash-wrong-owner": "Ova datoteka ($1) ne pripada trenutnom korisniku.",
+       "uploadstash-no-such-key": "Nema takvog ključa ($1). Ne mogu ukloniti.",
+       "uploadstash-no-extension": "Proširenje je prazno.",
+       "uploadstash-zero-length": "Datoteka ima nultu dužinu.",
        "invalid-chunk-offset": "Neispravna polazna tačka",
        "img-auth-accessdenied": "Pristup onemogućen",
        "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije postavljen da daje ovu informaciju.\nMožda je zasnovan na CGI koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "enotif_lastdiff": "Da vidite ovu izmjenu, pogledajte $1",
        "enotif_anon_editor": "anonimni korisnik $1",
        "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osim ako prijavljeni ponovno posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\nVaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki email obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
+       "enotif_minoredit": "Ovo je manja izmjena",
        "created": "napravljena",
        "changed": "izmijenjena",
        "deletepage": "Obriši stranicu",
        "undelete-search-title": "Pretraga obrisanih stranica",
        "undelete-search-box": "Pretraga obrisanih stranica",
        "undelete-search-prefix": "Prikaži stranice koje počinju sa:",
+       "undelete-search-full": "Prikaži naslove koji sadrže:",
        "undelete-search-submit": "Traži",
        "undelete-no-results": "Nije pronađena odgovarajuća stranica u arhivi brisanja.",
        "undelete-filename-mismatch": "Ne može se vratiti revizija datoteke od $1: pogrešno ime datoteke",
        "ipb_blocked_as_range": "Greška: IP adresa $1 nije direktno blokirana i ne može se deblokirati.\nMeđutim, možda je blokirana kao dio bloka $2, koji se ne može deblokirati.",
        "ip_range_invalid": "Netačan opseg IP-adresa.",
        "ip_range_toolarge": "Nisu dopuštene blokade veće od /$1.",
+       "ip_range_exceeded": "IP-opseg prekoračuje gornju granicu. Dozvoljeni opseg: /$1.",
+       "ip_range_toolow": "IP-opsezi nisu dozvoljeni.",
        "proxyblocker": "Zaštita od proxya",
        "proxyblockreason": "Vaša IP adresa je blokirana jer je ona otvoreni proxy.\nMolimo vas da kontaktirate vašeg davatelja internetskih usluga ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.",
        "sorbsreason": "Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.",
        "delete_and_move_text": "Odredišna stranica \"[[:$1]]\" već postoji.\nŽelite li je obrisati da biste oslobodili mjesto za premještanje?",
        "delete_and_move_confirm": "Da, obriši stranicu",
        "delete_and_move_reason": "Obrisano da se oslobodi mjesto za premještanje iz \"[[$1]]\"",
-       "selfmove": "Izvorni i ciljani naziv su isti; strana ne može da se premjesti preko same sebe.",
+       "selfmove": "Naziv je isti;\nne mogu premjestiti stranicu preko same sebe.",
        "immobile-source-namespace": "Ne mogu premjestiti stranice u imenski prostor \"$1\"",
        "immobile-target-namespace": "Ne mogu se premjestiti stranice u imenski prostor \"$1\"",
        "immobile-target-namespace-iw": "Međuwiki link nije ispravno odredište premještanja stranice.",
        "import-mapping-namespace": "Uvezi u imenski prostor:",
        "import-mapping-subpage": "Uvezi kao podstranice sljedeće stranice:",
        "import-upload-filename": "Naziv datoteke:",
+       "import-upload-username-prefix": "Međuwiki-prefiks:",
        "import-comment": "Komentar:",
        "importtext": "Izvezite datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].\nSačuvajte je na svoj računar i postavite je ovdje.",
        "importstart": "Uvozim stranice...",
        "imported-log-entries": "{{PLURAL:$1|Uvezena $1 stavka zapisnika|Uvezene $1 stavke zapisnika|Uvezeno $1 stavki zapisnika}}.",
        "importfailed": "Uvoz nije uspio: $1",
        "importunknownsource": "Nepoznat izvorni tip uvoza",
+       "importnoprefix": "Nije naveden međuwiki-prefiks",
        "importcantopen": "Ne mogu otvoriti datoteku za uvoz",
        "importbadinterwiki": "Loš interwiki link",
        "importsuccess": "Uspješno ste uvezli stranicu!",
        "autosumm-blank": "Uklonjen cjelokupan sadržaj stranice",
        "autosumm-replace": "Zamijenjen sadržaj stranice sa \"$1\"",
        "autoredircomment": "Preusmjereno na [[$1]]",
+       "autosumm-removed-redirect": "Uklonjeno preusmjerenje na [[$1]]",
+       "autosumm-changed-redirect-target": "Izmijenjeno odredište preusmjerenja sa [[$1]] na [[$2]]",
        "autosumm-new": "Nova stranica: $1",
        "autosumm-newblank": "Napravljena prazna stranica",
        "size-bytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|oznaka|oznake}}]]: $2)",
        "tag-mw-contentmodelchange": "promjena modela sadržaja",
        "tag-mw-contentmodelchange-description": "Izmjena kojom se [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mijenja model sadržaja] stranice",
+       "tag-mw-new-redirect": "novo preusmjerenje",
+       "tag-mw-removed-redirect": "uklonjeno preusmjerenje",
+       "tag-mw-changed-redirect-target": "izmijenjena odredišna stranica preusmjerenja",
+       "tag-mw-blank": "pražnjenje",
+       "tag-mw-replace": "zamijenjeno",
+       "tag-mw-rollback": "vraćanje",
        "tags-title": "Oznake",
        "tags-intro": "Ova stranica prikazuje spisak oznaka koje softver može staviti na svaku izmjenu i njihovo značenje.",
        "tags-tag": "Naziv oznake",
        "undelete-cantedit": "Ne možete vratiti ovu stranicu jer Vam nije dozvoljeno da je uređujete.",
        "undelete-cantcreate": "Ne možete vratiti stranicu jer ne postoji stranica s tim nazivom i nije Vam dozvoljeno da je napravite.",
        "pagedata-title": "Podaci o stranici",
+       "pagedata-not-acceptable": "Nije pronađen odgovarajući format. Podržane MIME-vrste: $1",
        "pagedata-bad-title": "Neispravan naslov: $1."
 }
index 8e9cc41..7ae9227 100644 (file)
        "rcfilters-group-results-by-page": "Agrupa els resultats per pàgina",
        "rcfilters-activefilters": "Filtres actius",
        "rcfilters-advancedfilters": "Filtres avançats",
-       "rcfilters-limit-title": "Canvis a mostrar",
+       "rcfilters-limit-title": "Resultats a mostrar",
+       "rcfilters-limit-and-date-label": "{{PLURAL:$1|canvi|$1 canvis}}, $2",
        "rcfilters-date-popup-title": "Període de temps per cercar",
        "rcfilters-days-title": "Darrers dies",
        "rcfilters-hours-title": "Hores recents",
        "rcfilters-liveupdates-button-title-off": "Mostra els nous canvis al moment",
        "rcfilters-watchlist-markseen-button": "Marca tots els canvis com a vistos",
        "rcfilters-watchlist-edit-watchlist-button": "Editeu la vostra llista de pàgines seguides",
+       "rcfilters-preference-label": "Amaga la versió millorada de Canvis recents",
        "rcfilters-target-page-placeholder": "Escriviu el nom d’una pàgina",
        "rcnotefrom": "A sota hi ha {{PLURAL:$5|el canvi|els canvis}} a partir de <strong>$3, $4</strong> (fins a <strong>$1</strong>).",
        "rclistfromreset": "Reinicialitza la selecció de data",
        "uploadstash-bad-path": "El camí no existeix.",
        "uploadstash-bad-path-invalid": "El camí no és vàlid.",
        "uploadstash-bad-path-unknown-type": "El tipus «$1» és desconegut.",
+       "uploadstash-no-extension": "L’extensió és nul·la.",
        "invalid-chunk-offset": "El desplaçament del fragment no és vàlid",
        "img-auth-accessdenied": "Accés denegat",
        "img-auth-nopathinfo": "Hi manca PATH_INFO.\nEl servidor no està configurat per passar aquesta informació.\nPot estar basat en CGI i no ser compatible amb img_auth.\nConsulteu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "apisandbox-reset": "Neteja",
        "apisandbox-retry": "Torna a provar",
        "apisandbox-loading": "S'està carregant la informació del mòdul d'API «$1»...",
+       "apisandbox-load-error": "S’ha produït un error en carregar la informació del mòdul «$1» de l’API: $2",
        "apisandbox-no-parameters": "Aquest mòdul API no té paràmetres.",
        "apisandbox-helpurls": "Enllaços d'ajuda",
        "apisandbox-examples": "Exemples",
        "unblocked-id": "S'ha eliminat el blocatge de $1",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] ha estat desblocat.",
        "blocklist": "Usuaris blocats",
+       "autoblocklist": "Blocatges automàtics",
        "autoblocklist-submit": "Cerca",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Blocatge automàtic local|Blocatges automàtics locals}}",
+       "autoblocklist-total-autoblocks": "Nombre total de blocatges automàtics: $1",
+       "autoblocklist-empty": "La llista de blocatges automàtics és buida.",
        "ipblocklist": "Usuaris blocats",
        "ipblocklist-legend": "Cerca un usuari blocat",
        "blocklist-userblocks": "Amaga blocatges de compte",
        "fileduplicatesearch-noresults": "No s'ha trobat cap fitxer anomenat «$1».",
        "specialpages": "Pàgines especials",
        "specialpages-note-top": "Llegenda",
+       "specialpages-note-restricted": "* Pàgines especials normals.\n* <span class=\"mw-specialpagerestricted\">Pàgines especials restringides.</span>",
        "specialpages-group-maintenance": "Informes de manteniment",
        "specialpages-group-other": "Altres pàgines especials",
        "specialpages-group-login": "Iniciar sessió / Crear un compte",
        "tag-filter-submit": "Filtra",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetes}}]]: $2)",
        "tag-mw-contentmodelchange": "canvi de model de contingut",
+       "tag-mw-new-redirect": "Redirecció nova",
+       "tag-mw-blank": "Buidament",
+       "tag-mw-replace": "Substitució",
        "tags-title": "Etiquetes",
        "tags-intro": "Aquesta pàgina llista les etiquetes amb què el programari pot marcar una modificació, i el seu significat.",
        "tags-tag": "Nom de l'etiqueta",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha esborrat}} la pàgina $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|ha esborrat}} la redirecció $3 sobreescrivint-la",
        "logentry-delete-restore": "$1 {{GENDER:$2|ha restaurat}} la pàgina $3 ($4)",
+       "restore-count-revisions": "{{PLURAL:$1|Una revisió|$1 revisions}}",
+       "restore-count-files": "{{PLURAL:$1|Un fitxer|$1 fitxers}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ha canviat}} la visibilitat d'esdeveniments al registre de $3",
        "mediastatistics": "Estadístiques dels multimèdia",
        "mediastatistics-summary": "Les estadístiques sobre els tipus de fitxers pujats. Això només inclou la versió més recent d'un fitxer. S'exclouen les versions antigues o eliminades dels fitxers.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Mida de fitxer total d’aquesta secció: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3 %).",
        "mediastatistics-allbytes": "Mida de fitxer total de tots els fitxers {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Tipus MIME",
        "mediastatistics-table-extensions": "Extensions possibles",
        "special-characters-group-thai": "Tailandès",
        "special-characters-group-lao": "Laosià",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Sil·labaris canadencs",
        "special-characters-title-endash": "guió curt",
        "special-characters-title-emdash": "guió llarg",
        "special-characters-title-minus": "signe menys",
        "restrictionsfield-label": "Intervals d'IP permesos:",
        "revid": "revisió $1",
        "pageid": "ID de pàgina $1",
+       "gotointerwiki": "A punt d’abandonar {{SITENAME}}",
        "gotointerwiki-invalid": "El títol especificat no és vàlid.",
+       "gotointerwiki-external": "Esteu a punt d’abandonar {{SITENAME}} per a visitar [[$2]], un lloc web diferent.\n\n'''[$1 Continua a $1]'''",
+       "undelete-cantedit": "Com que no podeu editar aquesta pàgina, no en podeu desfer la supressió.",
        "pagedata-title": "Dades de la pàgina",
        "pagedata-bad-title": "Títol no vàlid: $1"
 }
index 21c5df1..432fdaf 100644 (file)
        "rcfilters-liveupdates-button": "Авто-карлаяккха",
        "rcfilters-liveupdates-button-title-off": "Керла хийцамаш ма-бинехь гайта",
        "rcfilters-preference-label": "Керла хийцамийн дика кечйина верси къайлаяккха",
+       "rcfilters-preference-help": "2017 шеран интерфейсан редизайн а, оцу хенахь дуьйна тӀетоьхна гӀирсаш а къайлайоху.",
        "rcnotefrom": "Лахахь гайтина тӀера <strong>$2</strong> (хийцамаш <strong>$1</strong> кӀезиг).",
        "rclistfromreset": "Терахь харжар дӀадаккха",
        "rclistfrom": "Гайта хийцам {{CURRENTYEAR}} шеран {{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTTIME}} бина болу",
        "tooltip-n-mainpage-description": "Коьрта агӀона дехьа гӀо",
        "tooltip-n-portal": "Оцу кхолламах, мичахь хlу йу лаьташ а хlудалур ду шуьга",
        "tooltip-n-currentevents": "ДӀаоьхуш болу хаамашна могӀам",
-       "tooltip-n-recentchanges": "ТӀаьххьаралера хийцаман могӀам",
+       "tooltip-n-recentchanges": "ТӀаьххьара хийцамийн могӀам",
        "tooltip-n-randompage": "Хьажа цахууш нисйеллачу агlоне",
        "tooltip-n-help": "ГӀоде меттиг",
        "tooltip-t-whatlinkshere": "ХӀокху агӀонан тӀе хьажийна йолу массо агӀонийн могӀам",
        "exif-focalplaneresolutionunit": "Магоран фокалан дустар",
        "exif-sensingmethod": "Сенсоран тайп",
        "exif-filesource": "Файлан хьост",
+       "exif-scenetype": "Сценан тайпа",
        "exif-customrendered": "Кхин тӀе кечдар",
        "exif-exposuremode": "Сурт доккхуш йолу серлон хьал харжар",
        "exif-whitebalance": "Къайн баланс",
        "tag-filter": "[[Special:Tags|Билгалонаш]] луьттург:",
        "tag-filter-submit": "Литта",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Билгало|Билгалонаш}}]]: $2)",
+       "tag-mw-new-redirect": "Керла дӀасахьажорг",
        "tag-mw-rollback": "Юхаяккха",
+       "tag-mw-undo": "цаоьшу",
        "tags-title": "Билгалонаш",
        "tags-intro": "ХӀокху агӀона чохь гойтуш бу билгалонийн могӀам царца программин латторо билгал доху нисдарш, кхин билгалонийн маьӀна а.",
        "tags-tag": "Билгалона цӀе",
index 9d62dbb..aea4564 100644 (file)
        "tag-mw-replace-description": "Editace, které odstraňují více než 90 % obsahu stránky",
        "tag-mw-rollback": "Rychlý revert",
        "tag-mw-rollback-description": "Editace, jimiž byly předchozí editace vráceny zpět pomocí rychlého revertu",
+       "tag-mw-undo": "Vrácení zpět",
+       "tag-mw-undo-description": "Editace, jimiž se ruší předchozí editace pomocí odkazu „zrušit editaci“",
        "tags-title": "Značky",
        "tags-intro": "Tato stránka obsahuje seznam značek, kterými může software označovat jednotlivé editace, a jejich významy.",
        "tags-tag": "Název značky",
        "logentry-newusers-autocreate": "Automaticky byl {{GENDER:$2|založen}} účet $1",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|přesunul|přesunula}} nastavení zámků ze stránky $4 na stránku $3",
        "logentry-protect-unprotect": "$1 {{GENDER:$2|odemknul|odemknula}} stránku $3",
-       "logentry-protect-protect": "$1 {{GENDER:$2|zamknul|zamknula}} stránku $3 $4",
-       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zamknul|zamknula}} stránku $3 $4 [kaskádovým zámkem]",
+       "logentry-protect-protect": "$1 {{GENDER:$2|zamkl|zamkla|zamkl(a)}} stránku $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zamkl|zamkla|zamkl(a)}} stránku $3 $4 [kaskádovým zámkem]",
        "logentry-protect-modify": "$1 {{GENDER:$2|změnil|změnila}} úroveň ochrany stránky $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|změnil|změnila}} úroveň ochrany stránky $3 $4 [kaskádový zámek]",
        "logentry-rights-rights": "$1 {{GENDER:$2|změnil|změnila}} členství {{GENDER:$6|uživatele|uživatelky}} $3 ve skupinách z $4 na $5",
index 75b4e0c..3d71fbe 100644 (file)
        "minoredit": "To je drobnô edicjô",
        "watchthis": "Ùzérôj",
        "savearticle": "Zapiszë artikel",
+       "publishchanges": "Òpùblikùj zmianë",
        "preview": "Pòdzérk",
        "showpreview": "Wëskrzëni pòdzérk",
        "showdiff": "Wëskrzëni zjinaczi",
        "recentchanges-label-plusminus": "Zjinaczonô wiôlgòsc starnë (lëczba bajtów)",
        "recentchanges-legend-heading": "<strong>Légenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (òbaczë téż [[Special:NewPages|lëstã nowëch strón]])",
-       "rcfilters-legend-heading": "<strong>Wëkôz skrodzënów:</strong>",
+       "rcfilters-legend-heading": "<strong>Ùżëté skrócënczi:</strong>",
        "rcfilters-other-review-tools": "Jiné nôrzãdza przezéru zjinaków",
+       "rcfilters-group-results-by-page": "Grëpòwanié pòdle strón.",
        "rcfilters-activefilters": "Aktiwné filtrë",
+       "rcfilters-limit-title": "Lëczba wëników do wëskrzënieniô",
+       "rcfilters-date-popup-title": "Cząd czasu dlô szëkbë.",
+       "rcfilters-days-title": "Slédnëch dni",
+       "rcfilters-hours-title": "Slédnëch gòdzënów",
+       "rcfilters-quickfilters-placeholder-title": "Ni môsz jesz zapisónëch filtrów",
+       "rcfilters-quickfilters-placeholder-description": "Abë zapisac nastôwë filtrów i ùżëwac jich pózni, klikni ikonkã załóżczi w pòlu aktiwnëch filtrów, jaczé nachôdô sã niżi.",
+       "rcfilters-savedqueries-defaultlabel": "Zapisóné filtrë",
+       "rcfilters-savedqueries-add-new-title": "Zapiszë aktualné ùstôwë filtrów.",
+       "rcfilters-clear-all-filters": "Wëczëszczë filtrë",
        "rcfilters-search-placeholder": "Fitruj nowé zjinaczi (ùżij do te menu abò wëszukôj pòdle pòzwë filtra)",
        "rcfilters-filterlist-title": "Filtrë",
+       "rcfilters-filterlist-feedbacklink": "Napiszë, jak cë sã widzą te nowé nôrzãdza filtrowaniô.",
        "rcfilters-highlightbutton-title": "Pòdsztrichnąc wëniczi",
        "rcfilters-filtergroup-authorship": "Aùtorstwò wkładu",
        "rcfilters-filter-editsbyself-label": "Zjinaczi, chtërne zrobił jem jô.",
        "rcfilters-filter-minor-label": "Drobné zjinaczi",
        "rcfilters-filter-minor-description": "Zjinaczi, chtërne aùtor nacéchòwôł jakò „drobné”.",
        "rcfilters-filter-major-description": "Zjinaczi nie nacéchòwóné jakò „drobné”.",
+       "rcfilters-filtergroup-watchlist": "Starnë z lëstë ùzéraniô",
+       "rcfilters-filter-watchlist-watched-label": "Z lëstë ùzéraniô",
+       "rcfilters-filter-watchlist-watched-description": "Zjinaczi na starnach, jaczé môsz na lësce ùzéraniô.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nowé zjinaczi na starnach z lëstë ùzéraniô",
+       "rcfilters-filter-watchlist-watchednew-description": "Zjinaczi na starnach z lëstë ùzéraniô, jaczich òd czasu nëch edicjów jesz nie òdwiedzył jes.",
+       "rcfilters-filter-watchlist-notwatched-label": "Leno spòza lëstë ùzéraniô",
+       "rcfilters-filter-watchlist-notwatched-description": "Wszëtkò òkróm zjinaków na starnach z twòji lëstë ùzéraniô.",
        "rcfilters-filtergroup-changetype": "Ôrt zjinaków",
        "rcfilters-filter-pageedits-label": "Edicje starnë",
        "rcfilters-filter-pageedits-description": "Edicje zamkłoscë, starnów diskùsje, òpisënków kategòrii...",
        "rcfilters-filter-newpages-label": "Ùsôdzanié starnów",
        "rcfilters-filter-newpages-description": "Zjinaczi, chtërne ùsôdzają nowé starnë.",
+       "rcfilters-filter-categorization-label": "Zjinaczi kategòriów",
+       "rcfilters-filter-categorization-description": "Dodanié abò rëmniãcé starnë z kategòrie.",
        "rcfilters-filter-logactions-label": "Dzejania notérowóny w registru",
        "rcfilters-filter-logactions-description": "Dzejania sprôwników, ùsôdzanié kònt, rëmanié starnów, sélanié lopków...",
        "rcfilters-filtergroup-lastRevision": "Òstatné wersje.",
        "rcfilters-filter-lastrevision-description": "Leno nônowszi zjinaczi dlô kòżdi starnë.",
        "rcfilters-filter-previousrevision-label": "Wersje jiné niż nônowszô.",
        "rcfilters-filter-previousrevision-description": "Wszëtczé edicje, jaczé nie są nônowszą wersją starnë.",
+       "rcfilters-view-tags": "Edicje ze znakòwnikama przë zjinakach",
+       "rcfilters-view-tags-tooltip": "Przefiltruj wëniczi pòdle znakòwników przë zjinakach",
        "rcfilters-liveupdates-button": "Òdnôwianié na żëwò",
+       "rcfilters-liveupdates-button-title-off": "Wëskrzëniôj nowé zjinaczi zarôzkù pò tim jak sã pòjawią",
        "rcnotefrom": "Niżi {{PLURAL:$5|je zjinaka|są zjinaczi}} {{PLURAL:$5|zrobionô|zrobioné}} pò <strong>$3, $4</strong> (nie wicy jak '''$1''' pozycëji).",
        "rclistfrom": "Pòkażë nowé zmianë òd $3 $2",
        "rcshowhideminor": "$1 môłé zmianë",
        "specialpages": "Specjalné starnë",
        "tag-filter": "Filtr [[Special:Tags|znakòwników]]:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Znakòwnik|Znakòwniczi}}]]: $2)",
+       "tag-mw-blank": "Rëmniãcé całi zamkłoscë starnë",
+       "tag-mw-rollback": "Copniãcé zjinaków",
+       "tags-title": "Znakòwniczi",
        "tags-active-yes": "Jo",
        "tags-active-no": "Ni",
        "tags-hitcount": "{{PLURAL:$1|zjinaka|zjinaczi|zjinaków}}",
        "revdelete-content-hid": "zamkłosc òsta zataconô",
        "revdelete-restricted": "nastôwi ògrańczenia dlô sprôwników",
        "revdelete-unrestricted": "rëmôj ògrańczenia dlô sprôwników",
+       "logentry-block-block": "$1 {{GENDER:$2|zablokòwôł}} {{GENDER:$4|$3}}; cząd blokadë: $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|zablokòwôł}} {{GENDER:$4|$3}}; cząd blokadë: $5 $6",
        "logentry-move-move": "$1 {{GENDER:$2|przeniós|przeniosła}} starnã $3 do $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|przeniós|przeniosła}} starnã $3 na $4, bez òstôwienia przczerowaniô pòd stôrim titlã",
        "logentry-move-move_redir": "$1 {{GENDER:$2|przeniós|przeniosła}} starnã $3 na $4 w plac przeczérowaniô",
index 37f7e83..cce61a4 100644 (file)
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
        "tag-mw-new-redirect": "Ny omdirigering",
        "tag-mw-removed-redirect": "Fjernede omdirigering",
+       "tag-mw-changed-redirect-target": "Omdigeringsmål ændret",
        "tag-mw-blank": "Sidetømning",
        "tag-mw-replace": "Erstattet",
        "tag-mw-rollback": "Tilbagerulning",
index 1836c65..e9d3e62 100644 (file)
        "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.",
        "rcfilters-filter-showlinkedfrom-label": "Änderungen auf Seiten anzeigen, die verlinkt sind von",
-       "rcfilters-filter-showlinkedfrom-option-label": "Änderungen auf Seiten anzeigen, die <strong>VON</strong> einer Seite verlinkt sind.",
-       "rcfilters-filter-showlinkedto-label": "Änderungen auf Seiten anzeigen, die verlinkt sind auf",
-       "rcfilters-filter-showlinkedto-option-label": "Änderungen auf Seiten anzeigen, die <strong>AUF</strong> eine Seite verlinkt sind.",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Seiten</strong>, die <strong>von</strong> der ausgewählten Seite <strong>verlinkt</strong> sind",
+       "rcfilters-filter-showlinkedto-label": "Änderungen auf Seiten anzeigen, die verlinken auf",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Seiten</strong>, die <strong>auf</strong> die ausgewählte Seite <strong>verlinken</strong>",
        "rcfilters-target-page-placeholder": "Einen Seitennamen eingeben",
        "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",
        "tag-mw-replace-description": "Bearbeitungen, die mehr als 90 % des Inhalts einer Seite entfernen.",
        "tag-mw-rollback": "Zurücksetzung",
        "tag-mw-rollback-description": "Bearbeitungen, die frühere Bearbeitungen mithilfe des Zurücksetzen-Links rückgängig machen.",
+       "tag-mw-undo": "Rückgängigmachung",
+       "tag-mw-undo-description": "Bearbeitungen, die frühere Versionen mit dem Link „Rückgängig machen“ zurücksetzen",
        "tags-title": "Markierungen",
        "tags-intro": "Diese Seite zeigt alle Markierungen, die für Bearbeitungen verwendet wurden, sowie deren Bedeutung. \n\nBei entsprechender Einstellung können die Missbrauchfilter beliebige Markierungen in die Versionsgeschichte setzen. Man kann die Versionsgeschichte dann nach den Markierungen filtern.",
        "tags-tag": "Markierungsname",
index e70d1c8..bbaa3bc 100644 (file)
        "nstab-main": "Perre",
        "nstab-user": "Pera karberi",
        "nstab-media": "Perra medya",
-       "nstab-special": "Pera hısusi",
+       "nstab-special": "Perra xısusiye",
        "nstab-project": "Perra proji",
        "nstab-image": "Dosya",
        "nstab-mediawiki": "Mesac",
index 3a67982..301408f 100644 (file)
        "tag-mw-replace-description": "Edits that remove more than 90% of the content of a page",
        "tag-mw-rollback": "Rollback",
        "tag-mw-rollback-description": "Edits that roll back previous edits using the rollback link",
+       "tag-mw-undo": "Undo",
+       "tag-mw-undo-description": "Edits that undo previous edits using the undo link",
        "tags-title": "Tags",
        "tags-intro": "This page lists the tags that the software may mark an edit with, and their meaning.",
        "tags-tag": "Tag name",
index 42974b7..2056034 100644 (file)
@@ -88,6 +88,7 @@
        "tog-watchlisthideminor": "Kaŝi malgrandajn redaktojn de la atentaro",
        "tog-watchlisthideliu": "Kaŝi redaktojn de ensalutitaj uzantoj de la atentaro",
        "tog-watchlistreloadautomatically": "Reŝargi la atentaron aŭtomate ĉiam, kiam filtrilo estas ŝanĝita (bezonas Ĝavoskripton)",
+       "tog-watchlistunwatchlinks": "Aldoni rektajn (mal)atentendajn ligojn al atentaro (bezonas Javascripton por komuti la funkciecon)",
        "tog-watchlisthideanons": "Kaŝi redaktojn de anonimuloj de la atentaro",
        "tog-watchlisthidepatrolled": "Kaŝi patrolitajn redaktojn de la atentaro",
        "tog-watchlisthidecategorization": "Kaŝi enkategoriigon de paĝoj",
        "botpasswords-insert-failed": "Aldono de la robota nomo \"$1\" ne sukcesis. Ĉu ĝi jam estis aldonita?",
        "botpasswords-update-failed": "Ĝisdatigo de la robota nomo \"$1\" ne sukcesis. Ĉu ĝi estis forigita?",
        "botpasswords-created-title": "Robota pasvorto kreita",
-       "botpasswords-created-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis kreita.",
+       "botpasswords-created-body": "La pasvorto de roboto por nomo de roboto \"$1\" de la uzanto \"$2\" estis kreita.",
        "botpasswords-updated-title": "Robota pasvorto ĝisdatigita",
-       "botpasswords-updated-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis ĝisdatigita.",
+       "botpasswords-updated-body": "La pasvorto de roboto por nomo de roboto \"$1\" de la uzanto \"$2\" estis ĝisdatigita.",
        "botpasswords-deleted-title": "Robota pasvorto forigita",
        "botpasswords-deleted-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis forigita.",
        "botpasswords-newpassword": "La nova pasvorto por ensaluti per <strong>$1</strong> estas <strong>$2</strong>. <em>Bonvolu noti ĝin por estonta konsultado.</em> <br> (Por malnovaj robotoj, kiuj postulas, ke la ensaluta nomo estu sama kiel la eventuala uzantonomo, vi povas uzi <strong>$3</strong> kiel uzantonomon kaj <strong>$4</strong> kiel pasvorton.)",
        "import-mapping-subpage": "Importi kiel subpaĝojn de la jena paĝo:",
        "import-upload-filename": "Dosiernomo:",
        "import-comment": "Komento:",
-       "importtext": "Bonvolu elporti la dosieron el la fonta vikio per la [[Special:Export|eksportilo]]. Konservu ĝin sur via persona komputilo kaj poste alŝutu ĝin ĉi tien.",
+       "importtext": "Bonvolu elporti la dosieron el la fonta vikio per la [[Special:Export|elportilo]]. Konservu ĝin sur via persona komputilo kaj poste alŝutu ĝin ĉi tien.",
        "importstart": "Importante paĝojn...",
        "import-revision-count": "$1 {{PLURAL:$1|versio|versioj}}",
        "importnopages": "Neniu paĝo por importi.",
index a86ccea..945db30 100644 (file)
        "tooltip-ca-edit": "Usted puede editar esta página. Por favor, use el botón de previsualización antes de grabar.",
        "tooltip-ca-history": "Versiones anteriores de esta página y sus autores",
        "tooltip-ca-watch": "Añadir esta página a tu lista de seguimiento",
-       "tooltip-ca-unwatch": "Borrar esta página de su lista de seguimiento",
+       "tooltip-ca-unwatch": "Quitar esta página de su lista de seguimiento",
        "tooltip-search": "Buscar en {{SITENAME}}",
        "tooltip-search-fulltext": "Busca este texto en las páginas",
        "tooltip-p-logo": "Visitar la página principal",
index a3a9cad..dc1af80 100644 (file)
                        "Luisangelrg",
                        "Pierpao",
                        "Ohlila",
-                       "KATRINE1992"
+                       "KATRINE1992",
+                       "Athena in Wonderland"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "content-json-empty-object": "Objeto vacío",
        "content-json-empty-array": "Matriz vacía",
        "deprecated-self-close-category": "Páginas que utilizan etiquetas HTML autocerradas no válidas",
-       "deprecated-self-close-category-desc": "Esta página contiene etiquetas HTML de autocierre no válidas, tales como <code>&lt;b/></code> o <code>&lt;span/></code>. El comportamiento de estas cambiará pronto para ser consistente con la especificación de HTML5, por lo que su utilización en el wikitexto está obsoleta.",
+       "deprecated-self-close-category-desc": "Esta página contiene etiquetas HTML autocerradas no válidas, tales como <code>&lt;b/></code> o <code>&lt;span/></code>. El comportamiento de estas cambiará pronto para ser coherente con la especificación de HTML5, por lo que su utilización en el wikitexto está obsoleta.",
        "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] llama a [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
        "duplicate-args-category": "Páginas que usan argumentos duplicados en invocaciones de plantillas",
        "duplicate-args-category-desc": "La página contiene invocaciones de plantillas que utilizan argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "rcfilters-watchlist-showupdated": "Los cambios hechos a páginas que no has visitado desde que se efectuaron aparecen en <strong>negrita</strong>, acompañados de marcadores sólidos.",
        "rcfilters-preference-label": "Ocultar la versión mejorada de Cambios recientes",
        "rcfilters-preference-help": "Revierte el rediseño de interfaz de 2017 y desactiva todas las herramientas añadidas desde entonces.",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páginas enlazadas desde</strong> la página seleccionada",
+       "rcfilters-filter-showlinkedto-label": "Mostrar cambios en páginas que enlazan a",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Páginas que enlazan hacia</strong> la página seleccionada",
        "rcfilters-target-page-placeholder": "Escribe el nombre de una página",
        "rcnotefrom": "Debajo {{PLURAL:$5|aparece el cambio|aparecen los cambios}} desde <strong>$3, $4</strong> (se muestran hasta <strong>$1</strong>).",
        "rclistfromreset": "Restablecer selección de fecha",
        "uploadstash-wrong-owner": "Este archivo ($1) no pertenece al usuario actual.",
        "uploadstash-no-such-key": "No existe esta clave ($1); no se puede eliminar.",
        "uploadstash-no-extension": "No hay ninguna extension",
-       "uploadstash-zero-length": "El fichero esta vacio",
+       "uploadstash-zero-length": "El archivo está vacío.",
        "invalid-chunk-offset": "Desplazamiento inválido del fragmento",
        "img-auth-accessdenied": "Acceso denegado",
        "img-auth-nopathinfo": "Falta PATH_INFO.\nEl servidor no está configurado para proporcionar esta información.\nEs posible que esté basado en CGI y que no sea compatible con img_auth.\nConsulte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "apisandbox-reset": "Limpiar",
        "apisandbox-retry": "Reintentar",
        "apisandbox-loading": "Cargando la información para el módulo API \"$1\"...",
-       "apisandbox-load-error": "Ocurrió un error al cargar la información para el módulo API \"$1\": $2",
+       "apisandbox-load-error": "Ocurrió un error al cargar la información del módulo «$1» de la API: $2",
        "apisandbox-no-parameters": "Este módulo API no tiene parámetros.",
        "apisandbox-helpurls": "Enlaces de ayuda",
        "apisandbox-examples": "Ejemplos",
        "exif-gpsdop-moderate": "Moderado ($1)",
        "exif-gpsdop-fair": "Pasable ($1)",
        "exif-gpsdop-poor": "Pobre ( $1 )",
-       "exif-objectcycle-a": "Sólo por la mañana",
-       "exif-objectcycle-p": "Sólo por el atardecer",
+       "exif-objectcycle-a": "Por la mañana únicamente",
+       "exif-objectcycle-p": "Por el atardecer únicamente",
        "exif-objectcycle-b": "Tanto por la mañana y por la tarde",
        "exif-gpsdirection-t": "Dirección real",
        "exif-gpsdirection-m": "Dirección magnética",
        "tag-mw-contentmodelchange": "cambio de modelo de contenido",
        "tag-mw-contentmodelchange-description": "Ediciones que [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel cambian el modelo de contenido] de una página",
        "tag-mw-new-redirect": "Redirección nueva",
+       "tag-mw-new-redirect-description": "Ediciones que crean una nueva redirección o convierten la página en una redirección",
+       "tag-mw-removed-redirect": "Redirección eliminada",
+       "tag-mw-removed-redirect-description": "Ediciones que convierten una página de redirección existente en una sin redirección",
+       "tag-mw-changed-redirect-target": "Destino de redirección modificado",
        "tag-mw-changed-redirect-target-description": "Ediciones que modifican el destino de una redirección",
        "tag-mw-blank": "Vaciado",
        "tag-mw-blank-description": "Ediciones que blanquean una página",
+       "tag-mw-replace": "Reemplazo",
        "tag-mw-replace-description": "Ediciones que eliminan más del 90 % del contenido de una página",
        "tag-mw-rollback": "Reversión",
+       "tag-mw-rollback-description": "Ediciones que deshacen modificaciones previas usando la herramienta de reversor",
+       "tag-mw-undo": "Deshacer",
+       "tag-mw-undo-description": "Ediciones que deshacen modificaciones anteriores mediante el enlace «Deshacer»",
        "tags-title": "Etiquetas",
        "tags-intro": "Esta página lista las etiquetas con las que el software puede marcar una edición y su significado.",
        "tags-tag": "Nombre de etiqueta",
        "mediastatistics-summary": "Estadísticas sobre los tipos de archivos cargados. Solo se tiene en cuenta la versión más reciente de cada archivo. Los archivos antiguos o eliminados están excluidos.",
        "mediastatistics-nfiles": "$1 ($2 %)",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 ''byte''|$1 ''bytes''}} ($2; $3 %)",
-       "mediastatistics-bytespertype": "Tamaño de archivo total para esta sección: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
+       "mediastatistics-bytespertype": "Tamaño de archivo total de esta sección: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3 %).",
        "mediastatistics-allbytes": "Tamaño de archivo total para todos los archivos: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Tipo MIME",
        "mediastatistics-table-extensions": "Extensiones posibles",
index ef98e7a..86a9236 100644 (file)
        "timezoneregion-indian": "India ookean",
        "timezoneregion-pacific": "Vaikne ookean",
        "allowemail": "Luba teistel kasutajatel mulle e-kirju saata",
+       "email-allow-new-users-label": "Luba e-kirjad tuliuutelt kasutajatelt",
        "email-blacklist-label": "Keela neil kasutajatel mulle e-kirju saata:",
        "prefs-searchoptions": "Otsimine",
        "prefs-namespaces": "Nimeruumid",
        "right-siteadmin": "Panna lukku ja lukust lahti teha andmebaasi",
        "right-override-export-depth": "Eksportida lehekülgi, kaasates viidatud leheküljed kuni viienda tasemeni",
        "right-sendemail": "Saata teistele kasutajatele e-kirju",
+       "right-sendemail-new-users": "Saata e-kirju logitud toiminguteta kasutajatele",
        "right-managechangetags": "Koostada ja (in)aktiveerida [[Special:Tags|märgiseid]]",
        "right-applychangetags": "Rakendada [[Special:Tags|märgiseid]] enda muudatuste suhtes",
        "right-changetags": "Lisada ja eemaldada käsitsi rakendatavaid [[Special:Tags|märgiseid]] üksikute redaktsioonide ja logisissekannete juures",
        "rcfilters-preference-label": "Peida viimaste muudatuste täiustatud versioon",
        "rcfilters-preference-help": "Pöörab tagasi 2017. aastast alates tehtud muudatused kujunduses ja lisatud tööriistad.",
        "rcfilters-filter-showlinkedfrom-label": "Näita muudatusi lehekülgedel, millele viidatakse leheküljelt:",
-       "rcfilters-filter-showlinkedfrom-option-label": "Näita muudatusi lehekülgedel, millele viidatakse <strong>leheküljelt</strong>",
-       "rcfilters-filter-showlinkedto-label": "Näita muudatusi lehekülgedel, millel viidatakse leheküljele:",
-       "rcfilters-filter-showlinkedto-option-label": "Näita muudatusi lehekülgedel, mis viitavad <strong>leheküljele</strong>",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Leheküljed, millele viidatakse</strong> valitud leheküljel",
+       "rcfilters-filter-showlinkedto-label": "Näita muudatusi lehekülgedel, millel viidatakse leheküljele",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Leheküljed, mis viitavad</strong> valitud leheküljele",
        "rcfilters-target-page-placeholder": "Sisesta lehekülje pealkiri",
        "rcnotefrom": "Allpool on toodud {{PLURAL:$5|muudatus|muudatused}} alates: <strong>$3, kell $4</strong> (näidatakse kuni <strong>$1</strong> muudatust)",
        "rclistfromreset": "Lähtesta kuupäeva valik",
        "tag-mw-replace-description": "Muudatused, millega asendatakse lehekülje sisust enam kui 90%",
        "tag-mw-rollback": "Tühistamine",
        "tag-mw-rollback-description": "Muudatused, millega eelmised muudatused pööratakse tagasi, kasutades tühistuslinki",
+       "tag-mw-undo": "Eemaldamine",
+       "tag-mw-undo-description": "Muudatused, millega eelmised muudatused pööratakse tagasi, kasutades eemaldamislinki",
        "tags-title": "Märgised",
        "tags-intro": "See lehekülg loetleb märgised, millega tarkvara võib muudatused märgistada, ja nende kirjeldused.",
        "tags-tag": "Märgise nimi",
index 66a399b..3cddb1a 100644 (file)
        "botpasswords-insert-failed": "Ezin izan da bot \"$1\" izen hori gehitu. Dagoeneko gehituta zegoen?",
        "botpasswords-update-failed": "\"$1\" Errobota ezin eguneratu. Ezabatua izan al da?",
        "botpasswords-created-title": "Botaren pasahitza sortu da",
-       "botpasswords-created-body": "$2 erabiltzailearen $1 errobot izenarentzako pasahitza sortu egin da.",
+       "botpasswords-created-body": "$2 erabiltzailearen $1 bot izenarentzako pasahitza sortu egin da.",
        "botpasswords-updated-title": "Botaren pasahitza eguneratu da",
        "botpasswords-updated-body": "$2 erabiltzailearen $1 errobot izenarentzako pasahitza gaurkotua izan da.",
        "botpasswords-deleted-title": "Botaren pasahitza ezabatu da",
        "timezoneregion-indian": "Indiar Ozeanoa",
        "timezoneregion-pacific": "Ozeano Barea",
        "allowemail": "Beste erabiltzaileei niri posta mezuak bidaltzea gaitu",
+       "email-allow-new-users-label": "Baimendu mezuak erabiltzaile berrietatik",
        "email-blacklist-label": "Erabiltzaile hauei niri mezu elektronikoak bidaltzen debekatu:",
        "prefs-searchoptions": "Bilatu",
        "prefs-namespaces": "Izen-tarteak",
        "right-siteadmin": "Blokeatu eta desblokeatu datu basea blokeatu",
        "right-override-export-depth": "5eko sakonerararteko loturiko orrialdeak barne esportatu",
        "right-sendemail": "Beste erabiltzaileei e-posta bidali",
+       "right-sendemail-new-users": "Bidali mezu elektronikoa ekintzarik gabe dauden erabiltzaileei",
        "right-managechangetags": "Sortu eta (des)aktibatzeko  [[Special:Tags|tags]]",
        "right-applychangetags": "Aplikatu [[Special:Tags|tags]] bakoitzaren aldaketekin batera",
        "right-changetags": "[[Special:Tags|tags]] arbitrarioak gehitu edo kendu berrikusketa eta sarrera indibidualetan",
        "recentchanges-noresult": "Ez da egon aldaketarik emandako tartean irizpide hau betetzen dutenik.",
        "recentchanges-timeout": "Bilaketa honek denbora muga gainditu du. Agian beste parametro batzuekin bilatu nahi duzu.",
        "recentchanges-network": "Errore tekniko baten ondorioz, ez da emaitzarik kargatu. Saiatu orria freskatzen.",
+       "recentchanges-notargetpage": "Idatzi goian orriaren izena orri horri lotutako aldaketak ikusteko.",
        "recentchanges-feed-description": "Sindikazio honetan wikian eginiko azkeneko aldaketak jarrai daitezke.",
        "recentchanges-label-newpage": "Aldaketa honek orri berri bat sortu du",
        "recentchanges-label-minor": "Aldaketa hau txikia da",
        "rcfilters-group-results-by-page": "Talde emaitzak orrika",
        "rcfilters-activefilters": "Iragazki aktiboak",
        "rcfilters-advancedfilters": "Iragazki aurreratuak",
-       "rcfilters-limit-title": "Aldaketak erakutsi",
+       "rcfilters-limit-title": "Erakusteko emaitzak",
+       "rcfilters-limit-and-date-label": "{{PLURAL:aldaketa|$1|$1 aldaketa}}, $2",
+       "rcfilters-date-popup-title": "Bilatzeko denbora tartea",
        "rcfilters-days-title": "Azken egunak",
        "rcfilters-hours-title": "Azken orduak",
        "rcfilters-days-show-days": "{{PLURAL:$1|Egun $1|$1 egun}}",
        "rcfilters-watchlist-showupdated": "Azkenengo aldaketak egin zirenetik bisitatu ez dituzun orrietan eman diren aldaketak <strong>lodi estiloan</strong> daude, markatzaile sendoekin.",
        "rcfilters-preference-label": "Azkenengo Aldaketen hobetutako bertsioa ezkutatu",
        "rcfilters-preference-help": "2017 interfazearen birmoldaketa eta geroztik gehitu diren tresna guztietara bueltatzen da.",
+       "rcfilters-target-page-placeholder": "Sartu orrialde baten izena",
        "rcnotefrom": "Jarraian azaltzen diren {{PLURAL:$5|aldaketak}} data honetatik aurrerakoak dira: <strong>$3,$4</strong> (gehienez <b>$1</b> erakusten dira).",
        "rclistfromreset": "Data aukeraketa berrezarri",
        "rclistfrom": "Erakutsi $3 $2 ondorengo aldaketa berriak",
        "uploadstash-bad-path": "Bidea ez da existitzen.",
        "uploadstash-bad-path-invalid": "Bideak ez du balio.",
        "uploadstash-bad-path-unknown-type": "Mota ezezaguna \"$1\".",
+       "uploadstash-bad-path-bad-format": "\"$1\" giltza ez dago formatu apropos batean.",
        "uploadstash-file-not-found-missing-content-type": "Eduki-motako goiburua falta da.",
        "uploadstash-file-not-found-not-exists": "Ezin da bidea aurkitu, edo ez da fitxategi arrunta.",
        "uploadstash-file-too-large": "Ezin da $1 byte baino handiagoa den fitxategia zerbitzatu.",
        "import-mapping-namespace": "Izen eremu batera inportatu:",
        "import-mapping-subpage": "Hurrengo orriaren azpi-orri bezala inportatu:",
        "import-upload-filename": "Fitxategiaren izena:",
+       "import-upload-username-prefix": "Interwiki aurrizkia:",
        "import-comment": "Iruzkina:",
        "importtext": "Mesedez, jatorrizko wikitik orrialdea esportatzeko [[Special:Export|esportazio tresna]] erabil ezazu, zure diskoan gorde eta jarraian hona igo.",
        "importstart": "Orrialdeak inportatzen...",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiketa|Etiketak}}]]: $2)",
        "tag-mw-contentmodelchange": "Eduki eredu aldaketa",
        "tag-mw-contentmodelchange-description": "Orri baten [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel change the content model] aldaketak",
+       "tag-mw-new-redirect": "Birbideratze berria",
+       "tag-mw-blank-description": "Orria zuriz jartzen duten aldaketak",
+       "tag-mw-replace": "Ordezkatuta",
+       "tag-mw-replace-description": "Orrialde baten edukiaren %90a baino gehiagok ezabatzen duten aldaketak",
+       "tag-mw-rollback": "Desegin",
        "tags-title": "Etiketak",
        "tags-intro": "Orri honek softwareak aldatzeko bezala marka ditzazkeen etiketak zerrendatzen ditu, eta berauen esanahia.",
        "tags-tag": "Etiketaren izena",
index 004c740..873c74f 100644 (file)
        "tags-activate": "فعال‌سازی",
        "tags-deactivate": "غیرفعال کردن",
        "tags-hitcount": "$1 {{PLURAL:$1|تغییر|تغییر}}",
-       "tags-manage-no-permission": "Ø´Ù\85ا Ø§Ø¬Ø§Ø²Ù\87 Ù\85دÛ\8cرÛ\8cت ØªØºÛ\8cÛ\8cر ØªÚ¯‌ها را ندارید.",
+       "tags-manage-no-permission": "Ø´Ù\85ا Ø§Ø¬Ø§Ø²Ù\87 Ù\85دÛ\8cرÛ\8cت ØªØºÛ\8cÛ\8cر Ø¨Ø±Ú\86سب‌ها را ندارید.",
        "tags-manage-blocked": "امکان تغییر برچسب‌ها را در زمان بسته‌بودن {{GENDER:$1|ندارید}}",
        "tags-create-heading": "ایجاد یک برچسب جدید",
        "tags-create-explanation": "به طور پیش‌فرض، تگ‌های تازه ایجاد شده برای استفاده کاربران و ربات‌ها در دسترس قرار می‌گیرند.",
        "tags-create-tag-name": "نام برچسب:",
        "tags-create-reason": "دلیل:",
        "tags-create-submit": "ایجاد",
-       "tags-create-no-name": "Ù\86اÙ\85 ØªÚ¯ باید مشخص شود.",
+       "tags-create-no-name": "Ù\86اÙ\85 Ø¨Ø±Ú\86سب باید مشخص شود.",
        "tags-create-invalid-chars": "نام برچسب‌ها نباید حاوی کاما (<code>,</code>) یا خط مورب (<code>/</code>) باشد.",
-       "tags-create-invalid-title-chars": "Ù\86اÙ\85 ØªÚ¯‌ها نباید شامل حروفی شود که نمی‌توان از آن‌ها در عنوان صفحات استفاده کرد.",
-       "tags-create-already-exists": "تگ \"$1\" هم‌اکنون موجود است.",
-       "tags-create-warnings-above": "در Ù\87Ù\86گاÙ\85 Ø§Û\8cجاد ØªÚ¯ \"$1\" با {{PLURAL:$2|هشدار|هشدارهای}} زیر پیش آمد:",
-       "tags-create-warnings-below": "Ø¢Û\8cا Ù\85اÛ\8cÙ\84 Ø¨Ù\87 Ø§Ø¯Ø§Ù\85Ù\87 Ø§Û\8cجاد ØªÚ¯ هستید؟",
+       "tags-create-invalid-title-chars": "Ù\86اÙ\85 Ø¨Ø±Ú\86سب‌ها نباید شامل حروفی شود که نمی‌توان از آن‌ها در عنوان صفحات استفاده کرد.",
+       "tags-create-already-exists": "برÚ\86سب \"$1\" هم‌اکنون موجود است.",
+       "tags-create-warnings-above": "در Ù\87Ù\86گاÙ\85 Ø§Û\8cجاد Ø¨Ø±Ú\86سب \"$1\" با {{PLURAL:$2|هشدار|هشدارهای}} زیر پیش آمد:",
+       "tags-create-warnings-below": "Ø¢Û\8cا Ù\85اÛ\8cÙ\84 Ø¨Ù\87 Ø§Ø¯Ø§Ù\85Ù\87 Ø§Û\8cجاد Ø¨Ø±Ú\86سب هستید؟",
        "tags-delete-title": "حذف برچسب",
-       "tags-delete-explanation-initial": "Ø´Ù\85ا Ø¯Ø± Ø­Ø§Ù\84 Ø­Ø°Ù\81 ØªÚ¯ «$1» از پایگاه داده هستید.",
+       "tags-delete-explanation-initial": "Ø´Ù\85ا Ø¯Ø± Ø­Ø§Ù\84 Ø­Ø°Ù\81 Ø¨Ø±Ú\86سب «$1» از پایگاه داده هستید.",
        "tags-delete-explanation-in-use": "این از {{PLURAL:$2|$2 ویرایش یا ورودی سیاهه|همهٔ $2 ویرایش و/یا ورودی سیاهه}} حذف خواهد شد با وجودی که الان تائید شده‌است.",
        "tags-delete-explanation-warning": "این عمل <strong>غیر قابل بازگشت</strong> است، حتی توسط مدیران پایگاه داده. مطمئن باشید که این همان تگی است که می‌خواهید آن‌را حذف کنید.",
        "tags-delete-explanation-active": "<strong>برچسب \"$1\" هنوز فعال است و در آینده اعمال خواهد شد.</strong> برای جلوگیری از این اتفاق، به قسمت(‌هایی) که برچسب فعال شده رفته و از آنجا غیرفعالش کنید.",
        "tags-delete-reason": "دلیل:",
-       "tags-delete-submit": "اÛ\8cÙ\86 ØªÚ¯ را به‌صورت غیرقابل بازگشت حذف کن",
+       "tags-delete-submit": "اÛ\8cÙ\86 Ø¨Ø±Ú\86سب را به‌صورت غیرقابل بازگشت حذف کن",
        "tags-delete-not-allowed": "برچسب‌هایی که در یک افزونه تعریف می‌شوند قابل حذف نیستند، مگر اینکه آن افزونه در این مورد خاص این قابلیت را بدهد.",
-       "tags-delete-not-found": "تگ «$1» وجود ندارد.",
+       "tags-delete-not-found": "برÚ\86سب «$1» وجود ندارد.",
        "tags-delete-too-many-uses": "برچسب \"$1\" در بیش از $2 نسخه اعمال شده است و نمی‌توان آن را حذف نمود.",
        "tags-delete-warnings-after-delete": "برچسب \"$1\" حذف شد، اما با {{PLURAL:$2|خطای|خطاهای}} زیر همراه بود:",
        "tags-delete-no-permission": "شما اجازهٔ حذف برچسب‌های تغییر را ندارید.",
        "tags-activate-title": "فعال‌سازی برچسب",
-       "tags-activate-question": "Ø´Ù\85ا Ø¯Ø± Ø­Ø§Ù\84 Ù\81عاÙ\84â\80\8cسازÛ\8c ØªÚ¯ «$1» هستید.",
+       "tags-activate-question": "Ø´Ù\85ا Ø¯Ø± Ø­Ø§Ù\84 Ù\81عاÙ\84â\80\8cسازÛ\8c Ø¨Ø±Ú\86سب «$1» هستید.",
        "tags-activate-reason": "دلیل:",
-       "tags-activate-not-allowed": "Ù\81عاÙ\84â\80\8cسازÛ\8c ØªÚ¯ «$1» ممکن نیست.",
-       "tags-activate-not-found": "تگ «$1» وجود ندارد.",
+       "tags-activate-not-allowed": "Ù\81عاÙ\84â\80\8cسازÛ\8c Ø¨Ø±Ú\86سب «$1» ممکن نیست.",
+       "tags-activate-not-found": "برÚ\86سب «$1» وجود ندارد.",
        "tags-activate-submit": "فعال‌سازی",
        "tags-deactivate-title": "غیرفعال‌سازی برچسب",
-       "tags-deactivate-question": "Ø´Ù\85ا Ø¯Ø± Ø­Ø§Ù\84 ØºÛ\8cرÙ\81عاÙ\84â\80\8cسازÛ\8c ØªÚ¯ «$1» هستید.",
+       "tags-deactivate-question": "Ø´Ù\85ا Ø¯Ø± Ø­Ø§Ù\84 ØºÛ\8cرÙ\81عاÙ\84â\80\8cسازÛ\8c Ø¨Ø±Ú\86سب «$1» هستید.",
        "tags-deactivate-reason": "دلیل:",
-       "tags-deactivate-not-allowed": "غÛ\8cرÙ\81عاÙ\84â\80\8cسازÛ\8c ØªÚ¯ «$1» ممکن نیست.",
+       "tags-deactivate-not-allowed": "غÛ\8cرÙ\81عاÙ\84â\80\8cسازÛ\8c Ø¨Ø±Ú\86سب «$1» ممکن نیست.",
        "tags-deactivate-submit": "غیرفعال‌سازی",
        "tags-apply-no-permission": "دسترسی برای تغییر برچسب تغییراتتان را ندارید.",
        "tags-apply-blocked": "در زمان بسته‌بودن امکان اعمال تغییراتتان بر روی برچسب‌ها را {{GENDER:$1|ندارید}}.",
        "logentry-upload-upload": "$1 $3 را {{GENDER:$2|بارگذاری کرد}}",
        "logentry-upload-overwrite": "$1 نسخهٔ تازه‌ای از $3 را {{GENDER:$2|بارگذاری کرد}}",
        "logentry-upload-revert": "$1 {{GENDER:$2|بارگذاری کرد}} $3",
-       "log-name-managetags": "تارÛ\8cØ®Ú\86Ù\87 Ù\85دÛ\8cرÛ\8cت ØªÚ¯",
+       "log-name-managetags": "تارÛ\8cØ®Ú\86Ù\87 Ù\85دÛ\8cرÛ\8cت Ø¨Ø±Ú\86سب",
        "log-description-managetags": "این صفحه امور مدیریتی مربوط به [[Special:Tags|برچسب‌ها]] را فهرست می‌کند. سیاهه فقط حاوی فعالیت‌هایی است که توسط یک مدیر به صورت دستی انجام شده‌اند؛ برچسب‌ها ممکن است توسط نرم‌افزار ویکی ساخته یا حذف بشوند بدون اینکه هیچ ورودی در این سیاهه ثبت گردد.",
        "logentry-managetags-create": "$1 برچسب «$4» را {{GENDER:$2|ایجاد کرد}}",
        "logentry-managetags-delete": "$1 برچسب را از \"$4\" {{GENDER:$2|حذف کرد}} (حذف شده از $5 {{PLURAL:$5|نسخه یا ورودی سیاهه|نسخه یا/و ورودی سیاهه}})",
        "log-action-filter-delete-revision": "حذف ویرایش",
        "log-action-filter-import-interwiki": "ورودی ترانسویکی",
        "log-action-filter-import-upload": "درون‌ریزی به کمک بارگذاری XML",
-       "log-action-filter-managetags-create": "اÛ\8cجاد ØªÚ¯",
-       "log-action-filter-managetags-delete": "حذÙ\81 Ú©Ø±Ø¯Ù\86 ØªÚ¯",
-       "log-action-filter-managetags-activate": "Ù\81عاÙ\84سازÛ\8c ØªÚ¯",
-       "log-action-filter-managetags-deactivate": "تغÛ\8cÛ\8cر ØªÚ¯",
+       "log-action-filter-managetags-create": "اÛ\8cجاد Ø¨Ø±Ú\86سب",
+       "log-action-filter-managetags-delete": "حذÙ\81 Ú©Ø±Ø¯Ù\86 Ø¨Ø±Ú\86سب",
+       "log-action-filter-managetags-activate": "Ù\81عاÙ\84سازÛ\8c Ø¨Ø±Ú\86سب",
+       "log-action-filter-managetags-deactivate": "تغÛ\8cÛ\8cر Ø¨Ø±Ú\86سب",
        "log-action-filter-move-move": "انتقال بدون بازنویسی تغییر مسیرها",
        "log-action-filter-move-move_redir": "انتقال با بازنویسی تغییر مسیرها",
        "log-action-filter-newusers-create": "ایجاد شده توسط کاربر ناشناس",
index dbc52f6..b0ad41e 100644 (file)
        "emailccsubject": "Kopio lähettämästäsi viestistä osoitteeseen $1: $2",
        "emailsent": "Sähköposti lähetetty",
        "emailsenttext": "Sähköpostiviestisi on lähetetty.",
-       "emailuserfooter": "Tämän sähköpostin {{GENDER:$1|lähetti}} $1 vastaanottajalle {{GENDER:$2|$2}} käyttämällä ”{{int:emailuser}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}. Jos vastaat tähän sähköpostiin, sähköpostisi lähetetään suoraan {{GENDER:$1|alkuperäiselle lähettäjälle}}, paljastaen {{GENDER:$2|sinun}} sähköpostiosoitteesi {{GENDER:$1|hänelle}}.",
+       "emailuserfooter": "Tämän sähköpostin {{GENDER:$1|lähetti}} $1 vastaanottajalle {{GENDER:$2|$2}} käyttämällä ”{{int:emailuser}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}. Jos vastaat tähän sähköpostiin, sinun sähköpostiviestisi lähetetään suoraan {{GENDER:$1|alkuperäiselle lähettäjälle}} ja samalla paljastetaan {{GENDER:$2|sinun}} sähköpostiosoitteesi {{GENDER:$1|hänelle}}.",
        "usermessage-summary": "Jätetään järjestelmäviesti.",
        "usermessage-editor": "Järjestelmäviestittäjä",
        "watchlist": "Tarkkailulista",
index eb6f531..928250e 100644 (file)
        "rcfilters-advancedfilters": "Filtres avancés",
        "rcfilters-limit-title": "Résultats à afficher",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|modification|$1 modifications}}, $2",
-       "rcfilters-date-popup-title": "Periode de temps pour chercher",
+       "rcfilters-date-popup-title": "Période de temps à rechercher",
        "rcfilters-days-title": "Derniers jours",
        "rcfilters-hours-title": "Dernières heures",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|jour|jours}}",
        "rcfilters-liveupdates-button-title-off": "Afficher les nouveaux changements dès qu'ils se produisent",
        "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-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 puces pleines.",
        "rcfilters-preference-label": "Masquer la version améliorée des modifications récentes",
        "rcfilters-preference-help": "Désactive la version 2017 de l'interface ainsi que de tous les outils ajoutés alors et depuis.",
        "rcfilters-filter-showlinkedfrom-label": "Montrer les modifications des pages liées depuis",
-       "rcfilters-filter-showlinkedfrom-option-label": "Montrer les modifications des pages liées <strong>DEPUIS</strong> une page",
-       "rcfilters-filter-showlinkedto-label": "Montrer les modifications des pages liées vers",
-       "rcfilters-filter-showlinkedto-option-label": "Montrer les modifications des pages liées <strong>VERS</strong> une page",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Pages liées depuis</strong> la page sélectionnée",
+       "rcfilters-filter-showlinkedto-label": "Montrer les modifications des pages pointant vers",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Pages pointant vers</strong> la page sélectionnée",
        "rcfilters-target-page-placeholder": "Entrer un nom de page",
        "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",
        "imported-log-entries": "$1 {{PLURAL:$1|entrée|entrées}} du journal {{PLURAL:$1|importée|importées}}.",
        "importfailed": "Échec de l'importation : <nowiki>$1</nowiki>",
        "importunknownsource": "Type inconnu de la source à importer",
-       "importnoprefix": "Aucun prefixe de interwiki n'a ete fourni",
+       "importnoprefix": "Aucun prefixe interwiki n’a été fourni",
        "importcantopen": "Impossible d'ouvrir le fichier à importer",
        "importbadinterwiki": "Mauvais lien inter-wiki",
        "importsuccess": "L'importation a réussi !",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Un titre a été|$1 titres ont été}} retirés :",
        "watchlistedit-too-many": "Il y a trop de pages à afficher ici.",
        "watchlisttools-clear": "Effacer la liste de suivi",
-       "watchlisttools-view": "Voir les changements intervenus",
+       "watchlisttools-view": "Voir les changements correspondants",
        "watchlisttools-edit": "Voir et modifier la liste de suivi",
        "watchlisttools-raw": "Modifier la liste de suivi en mode brut",
        "iranian-calendar-m1": "Farvardin",
        "tag-mw-contentmodelchange": "modification du modèle de contenu",
        "tag-mw-contentmodelchange-description": "Modifications qui [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel changent le modèle de contenu] d'une page",
        "tag-mw-new-redirect": "Nouvelle redirection",
-       "tag-mw-new-redirect-description": "Editions qui vont creer une nouvelle redirection ou modifier una page vers une redirection",
+       "tag-mw-new-redirect-description": "Modifications qui créent une nouvelle redirection ou transforment une page en redirection",
        "tag-mw-removed-redirect": "Redirection supprimée",
-       "tag-mw-removed-redirect-description": "Les editions qui vont changer la redirection courante a une non redirection",
-       "tag-mw-changed-redirect-target": "La destination de redirection a ete modifiee",
+       "tag-mw-removed-redirect-description": "Modifications qui remplacent une redirection existante par une page sans redirection",
+       "tag-mw-changed-redirect-target": "La destination de redirection a été modifiée",
        "tag-mw-changed-redirect-target-description": "Modifications qui modifient la cible d’une redirection",
        "tag-mw-blank": "Blanchiment",
        "tag-mw-blank-description": "Modifications qui suppriment le contenu des pages",
        "tag-mw-replace-description": "Modifications qui enlèvent plus de 90% du contenu des pages",
        "tag-mw-rollback": "Révocation",
        "tag-mw-rollback-description": "Modifications qui annulent des modifications existantes en utilisant le lien de révocation (''rollback'')",
+       "tag-mw-undo": "Annuler",
+       "tag-mw-undo-description": "Modifications qui annulent les précédentes en utilisant le lien annuler",
        "tags-title": "Balises",
        "tags-intro": "Cette page liste les balises que le logiciel peut utiliser pour marquer une modification et la signification de chacune d’elles.",
        "tags-tag": "Nom de la balise",
index a02c743..8281e6b 100644 (file)
        "recentchanges-legend-heading": "<strong>Ferklaarang:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (luke uk bi't [[Special:NewPages|list mä nei sidjen]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "rcfilters-preference-label": "Det nei werjuun faan a Leetst Feranrangen versteeg",
        "rcnotefrom": "Diar {{PLURAL:$5|woort det feranrang|wurd a feranrangen}} sant <strong>$3,$4</strong>uunwiset (ei muar üs <strong>$1</strong> feranrangen).",
        "rclistfrom": "Bluas feranrangen sant $3 $2 wise",
        "rcshowhideminor": "$1 letj feranrangen",
        "autosumm-blank": "Det sidj as leesag maaget wurden.",
        "autosumm-replace": "Di tekst as ütjbütjet wurden mä \"$1\"",
        "autoredircomment": "Sidj tu [[$1]] widjerfeerd",
+       "autosumm-changed-redirect-target": "Widjerfeerang feranert faan [[$1]] tu [[$2]]",
        "autosumm-new": "Det sidj as nei uunlaanj wurden: \"$1\"",
        "autosumm-newblank": "En leesag sidj maaget",
        "lag-warn-normal": "Feranrangen faan {{PLURAL:$1|at leetst sekund|a leetst $1 sekunden}} kön noch ei uunwiset wurd.",
index e8ae7e6..a530e16 100644 (file)
@@ -24,7 +24,8 @@
                        "Banjo",
                        "Josep Maria Roca Peña",
                        "Luan",
-                       "Hamilton Abreu"
+                       "Hamilton Abreu",
+                       "Athena in Wonderland"
                ]
        },
        "tog-underline": "Subliñar as ligazóns:",
        "rcfilters-preference-label": "Ocultar a versión mellorada de cambios recentes",
        "rcfilters-preference-help": "Reverte o redeseño da interface de 2017 e tódalas ferramentas engadidas dende entón.",
        "rcfilters-filter-showlinkedfrom-label": "Amosar os cambios en páxinas ligadas desde",
-       "rcfilters-filter-showlinkedfrom-option-label": "Amosar os cambios en páxinas ligadas <strong>DESDE</strong> unha páxina",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páxinas ligadas desde</strong> a páxina seleccionada",
        "rcfilters-filter-showlinkedto-label": "Amosar os cambios en páxinas que ligan con",
-       "rcfilters-filter-showlinkedto-option-label": "Amosar os cambios en páxinas que ligan <strong>CON</strong> unha páxina",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Páxinas que ligan</strong> para a páxina seleccionada",
        "rcfilters-target-page-placeholder": "Insire un nome de páxina",
        "rcnotefrom": "A continuación {{PLURAL:$5|móstrase o cambio feito|móstranse os cambios feitos}} desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).",
        "rclistfromreset": "Reinicializar a selección da data",
        "tag-mw-replace-description": "Edicións que eliminan máis do 90% do contido dunha páxina",
        "tag-mw-rollback": "Desfacer",
        "tag-mw-rollback-description": "Edicións que desfán modificacións previas usando a ligazón de desfacer",
+       "tag-mw-undo": "Desfacer",
        "tags-title": "Etiquetas",
        "tags-intro": "Esta páxina lista as etiquetas coas que o software pode marcar unha edición, e mailos seus significados.",
        "tags-tag": "Nome da etiqueta",
index 0175d2d..cf76e44 100644 (file)
        "rcfilters-watchlist-showupdated": "שינויים בדפים שלא ביקרת בהם מאז ביצוע השינויים מופיעים בכתב <strong>מודגש</strong>, ומודגשים בצבע.",
        "rcfilters-preference-label": "הסתרת הגרסה המשופרת של השינויים האחרונים",
        "rcfilters-preference-help": "ביטול של העיצוב מחדש של הממשק (שבוצע בשנת 2017) ושל כל הכלים שנוספו אז ומאז.",
-       "rcfilters-filter-showlinkedfrom-label": "×\94צ×\92ת ×©×\99× ×\95×\99×\99×\9d ×\91×\93פ×\99×\9d ×\94×\9eק×\95שר×\99×\9d ×\9e",
-       "rcfilters-filter-showlinkedfrom-option-label": "הצגת שינויים בדפים המקושרים <strong>מתוך</strong> דף",
-       "rcfilters-filter-showlinkedto-label": "×\94צ×\92ת ×©×\99× ×\95×\99×\99×\9d ×\91×\93פ×\99×\9d ×\94×\9eקשר×\99×\9d ל",
-       "rcfilters-filter-showlinkedto-option-label": "הצגת שינויים בדפים המקשרים <strong>אל</strong> דף",
+       "rcfilters-filter-showlinkedfrom-label": "×\94צ×\92ת ×©×\99× ×\95×\99×\99×\9d ×\91×\93פ×\99×\9d ×©×\9eק×\95שר×\99×\9d ×\9eת×\95×\9a",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>דפים שמקושרים מתוך</strong> הדף שנבחר",
+       "rcfilters-filter-showlinkedto-label": "×\94צ×\92ת ×©×\99× ×\95×\99×\99×\9d ×\91×\93פ×\99×\9d ×©×\9eקשר×\99×\9d ×\90ל",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>דפים שמקשרים אל</strong> הדף שנבחר",
        "rcfilters-target-page-placeholder": "הקלדת שם דף",
        "rcnotefrom": "להלן {{PLURAL:$5|השינוי שבוצע|השינויים שבוצעו}} מאז <strong>$3, $4</strong> (מוצגים עד <strong>$1</strong>).",
        "rclistfromreset": "איפוס בחירת התאריך",
        "tag-mw-replace-description": "עריכות שמסירות יותר מ־90% מהתוכן של דף",
        "tag-mw-rollback": "שחזור",
        "tag-mw-rollback-description": "עריכות שמשחזרות עריכות קודמות בעזרת קישור השחזור",
+       "tag-mw-undo": "ביטול",
+       "tag-mw-undo-description": "עריכות שמבטלות עריכות קודמות בעזרת קישור הביטול",
        "tags-title": "תגיות",
        "tags-intro": "דף זה מכיל רשימה של תגיות שהתוכנה יכולה לסמן איתן עריכה, ומשמעויותיהן.",
        "tags-tag": "שם התגית",
index 25a09cb..981706c 100644 (file)
                        "Anamdas",
                        "Sachinkatiyar",
                        "Rishi.Singh",
-                       "Clockery"
+                       "Clockery",
+                       "Rajatkatiyar10",
+                       "Dcljr"
                ]
        },
-       "tog-underline": "à¤\95ड़ियाà¤\81 à¤\85धà¥\8bरà¥\87à¤\96न:",
-       "tog-hideminor": "हाल में हुए परिवर्तन में छोटे बदलाव छिपाएँ",
-       "tog-hidepatrolled": "हाल में हुए परिवर्तन में परीक्षित बदलाव छिपाएँ",
-       "tog-newpageshidepatrolled": "नये पृष्ठों की सूची में परीक्षित पृष्ठ छिपाएँ",
+       "tog-underline": "लिà¤\82à¤\95 à¤°à¥\87à¤\96ाà¤\82à¤\95ित à¤\95रà¥\87à¤\82:",
+       "tog-hideminor": "हाल में हुए परिवर्तनों में छोटे बदलाव छिपाएँ",
+       "tog-hidepatrolled": "हाल में हुए परिवर्तनों में परीक्षित बदलाव छिपाएँ",
+       "tog-newpageshidepatrolled": "नये पृष्ठ की सूची में परीक्षित पृष्ठों को छिपाएँ",
        "tog-hidecategorization": "पृष्ठों का श्रेणीकरण छिपाएं",
-       "tog-extendwatchlist": "à¤\95à¥\87वल à¤¹à¤¾à¤²à¤¿à¤¯à¤¾ à¤¹à¥\80 à¤¨à¤¹à¥\80à¤\82, à¤¬à¤²à¥\8dà¤\95ि à¤¸à¤­à¥\80 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¥\8bà¤\82 à¤\95à¥\8b à¤¦à¤¿à¤\96ानà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤\95à¥\8b à¤µà¤¿à¤¸à¥\8dतारित करें",
+       "tog-extendwatchlist": "à¤\95à¥\87वल à¤¹à¤¾à¤²à¤¿à¤¯à¤¾ à¤¹à¥\80 à¤¨à¤¹à¥\80à¤\82, à¤¬à¤²à¥\8dà¤\95ि à¤¸à¤­à¥\80 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¥\8bà¤\82 à¤\95à¥\8b à¤¦à¤¿à¤\96ानà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤\95à¥\8b à¤µà¤¿à¤¸à¥\8dतà¥\83त करें",
        "tog-usenewrc": "हाल में हुए परिवर्तनों और ध्यानसूची में परिवर्तनों को पृष्ठ अनुसार समूहों में बाँटें",
-       "tog-numberheadings": "शà¥\80रà¥\8dषà¤\95 à¤¸à¥\8dव-à¤\95à¥\8dरमाà¤\82à¤\95ित à¤\95रà¥\87à¤\82",
+       "tog-numberheadings": "सà¥\8dव-à¤\95à¥\8dरमाà¤\82à¤\95ित à¤¶à¥\80रà¥\8dषà¤\95",
        "tog-showtoolbar": "सम्पादन उपकरण पट्टी दिखाएँ",
        "tog-editondblclick": "डबल क्लिक पर पृष्ठ संपादित करें",
        "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दायाँ क्लिक करने पर अनुभाग सम्पादित करें",
        "tog-watchdefault": "मेरे द्वारा सम्पादित पृष्ठों और फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchmoves": "मेरे द्वारा स्थानांतरित पृष्ठों एवं फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchdeletion": "मेरे द्वारा हटाए गए पृष्ठों एवं फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
-       "tog-watchuploads": "मà¥\87रà¥\87 à¤¨à¤\8f à¤«à¤¼à¤¾à¤\87लà¥\8bà¤\82 à¤\95à¥\8b à¤®à¥\87रà¥\87 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¡à¤¾à¤²à¥\87à¤\82।",
+       "tog-watchuploads": "मà¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤®à¥\87रà¥\80 à¤\85पलà¥\8bड à¤\95रनà¥\87 à¤µà¤¾à¤²à¥\80 à¤¨à¤\88 à¤«à¤¼à¤¾à¤\87लà¥\87à¤\82 à¤¡à¤¾à¤²à¥\87à¤\82|",
        "tog-watchrollback": "मेरे द्वारा प्रत्यापन्न (रोलबैक) किये हुये पृष्ठों को मेरी ध्यानसूची में जोड़ें।",
        "tog-minordefault": "मेरे सभी सम्पादनों को छोटे बदलाव के रूप में चिह्नित करें",
        "tog-previewontop": "सम्पादन सन्दूक से पहले झलक दिखायें",
        "viewdeleted_short": "देखें {{PLURAL:$1|एक हटाया गया सम्पादन|$1 हटाए गए सम्पादन}}",
        "protect": "सुरक्षित करें",
        "protect_change": "बदलें",
-       "unprotect": "à¤\85सà¥\81रà¤\95à¥\8dषित",
+       "unprotect": "सà¥\81रà¤\95à¥\8dषा à¤¬à¤¦à¤²à¥\87à¤\82",
        "newpage": "नया पृष्ठ",
        "talkpagelinktext": "चर्चा",
        "specialpage": "विशेष पृष्ठ",
        "pool-queuefull": "पूल पंक्ति भरी हुई है",
        "pool-errorunknown": "अज्ञात त्रुटि",
        "pool-servererror": "पूल काउंटर सेवा उपलब्ध नहीं है ($1)।",
-       "poolcounter-usage-error": "à¤\89पयोग त्रुटि: $1",
+       "poolcounter-usage-error": "पà¥\8dरयोग त्रुटि: $1",
        "aboutsite": "{{SITENAME}} के बारे में",
-       "aboutpage": "Project:परिà¤\9aय",
+       "aboutpage": "Project:à¤\95à¥\87 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\82",
        "copyright": "उपलब्ध सामग्री $1 के अधीन है जब तक अलग से उल्लेख ना किया गया हो।",
        "copyrightpage": "{{ns:project}}:कॉपीराइट",
        "currentevents": "हाल की घटनाएँ",
        "nosuchusershort": "\"$1\" नाम का कोई सदस्य नहीं है।\nकृपया अपनी दी हुई वर्तनी जाँचें।",
        "nouserspecified": "सदस्यनाम देना अनिवार्य है।",
        "login-userblocked": "यह सदस्य प्रतिबन्धित है। सत्रारम्भ की अनुमति नहीं है।",
-       "wrongpassword": "आपने जो कूटशब्द लिखा है वह गलत है। कृपया पुनः प्रयास करें।",
+       "wrongpassword": "आपने जो कूटशब्द लिखा है वह गलत है। \nकृपया पुनः प्रयास करें।",
        "wrongpasswordempty": "कूटशब्द खाली है।\nपुनः यत्न करें।",
        "passwordtooshort": "आपका कूटशब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षरों}} का होना चाहिये।",
        "passwordtoolong": "पासवर्ड {{PLURAL:$1|1 वर्ण|$1 वर्णों}} से ज़्यादा लम्बे नही हो सकते।",
        "diff-multi-sameuser": "(इसी सदस्य द्वारा {{PLURAL:$1|किया गया बीच का एक अवतरण नहीं दर्शाया गया|किये गये बीच के $1 अवतरण नहीं दर्शाए गए}})",
        "diff-multi-otherusers": "({{PLURAL:$2|एक अन्य सदस्य|$2 सदस्यों}} द्वारा {{PLURAL:$1|किया गया बीच का एक अवतरण नहीं दर्शाया गया|किये गये बीच के $1 अवतरण नहीं दर्शाए गए}})",
        "diff-multi-manyusers": "({{PLURAL:$2|एक योगदानकर्ता|$2 योगदानकर्ताओं}} द्वारा {{PLURAL:$1|किया बीच का एक|किए बीच के $1}} अवतरण दर्शाए नहीं हैं।)",
+       "diff-paragraph-moved-tonew": "अनुच्छेद को स्थानांतरित कर दिया गया था| नए स्थान पर जाने के लिए क्लिक करें|",
+       "diff-paragraph-moved-toold": "पैराग्राफ को स्थानांतरित कर दिया गया था| पुराने स्थान पर जाने के लिए क्लिक करें|",
        "difference-missing-revision": "इस अंतर {{PLURAL:$2|का एक अवतरण|के $2 अवतरण}} ($1) नहीं {{PLURAL:$2|पाया गया|पाए गए}}।\n\nयह आम तौर पर एक हटाए गए पृष्ठ के अवतरणों में अंतर ढूँढने पर होता है। अधिक जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाने के लॉग] में पायी जा सकती है।",
        "searchresults": "खोज परिणाम",
        "searchresults-title": "\"$1\" के लिए खोज परिणाम",
        "recentchangesdays-max": "अधिकतम $1 {{PLURAL:$1|दिन}}",
        "recentchangescount": "मूल रूप से कितने संपादन दिखाएँ:",
        "prefs-help-recentchangescount": "इसमें हाल के बदलाव, पृष्ठ इतिहास व लॉग शामिल हैं।",
-       "prefs-help-watchlist-token2": "यह आपकी ध्यानसूची की वेब फ़ीड की गोपनीय चाबी है।\nयह जिसके भी पास होगी वह आपकी ध्यानसूची पढ़ सकेगा, इसिलए इसे किसी के साथ बांटियेगा नहीं।\n[[Special:ResetTokens|इसे रीसेट करने के लिए यहाँ क्लिक करें]]।",
+       "prefs-help-watchlist-token2": "यह आपकी ध्यानसूची की वेब फ़ीड की गोपनीय चाबी है।\nयह जिसके भी पास होगी वह आपकी ध्यानसूची पढ़ सकेगा, इसिलए इसे किसी के साथ बांटियेगा नहीं।\nअगर आप की जरूरत है, [[Special:ResetTokens|आप इसे रीसेट कर सकते हैं]]।",
        "savedprefs": "आपकी वरीयताएँ संजोई गई हैं।",
        "savedrights": "सदस्य {{GENDER:$1|$1}} का सदस्य अधिकार सहेजा गया।",
        "timezonelegend": "समयमंडल:",
        "timezoneregion-indian": "हिंद महासागर",
        "timezoneregion-pacific": "प्रशांत महासागर",
        "allowemail": "अन्य सदस्यों से ई-मेल सक्षम करें",
+       "email-allow-new-users-label": "एकदम नये उपयोगकर्ताओं को ईमेल की अनुमति दें",
        "email-blacklist-label": "इन उपयोगकर्ताओं को मुझे ईमेल भेजने से रोकना:",
        "prefs-searchoptions": "खोज",
        "prefs-namespaces": "नामस्थान",
        "right-siteadmin": "डाटाबेस को ताला लगायें या खोलें",
        "right-override-export-depth": "पृष्ठ निर्यात करें, पाँच स्तर की गहराई तक जुड़े हुए पृष्ठों समेत",
        "right-sendemail": "अन्य सदस्यों को ई-मेल भेजें",
+       "right-sendemail-new-users": "एक भी लॉग इन क्रिया नहीं करने वाले उपयोगकर्ताओं को ईमेल भेजें",
        "right-managechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] बनायें और हटायें",
        "right-applychangetags": "प्रयोग में लाइये [[Special:Tags|tags]] किसी के बदलाव के साथ।",
        "right-changetags": "जमा करो और हटाओ स्वतंत्र [[Special:Tags|टैग]] व्यक्तिगत अवतरणों और लॉग प्रविक्तियों पर",
        "recentchanges-summary": "इस विकि पर हाल में हुए बदलाव इस पन्ने पर देखे जा सकते हैं।",
        "recentchanges-noresult": "इस अवधि के दौरान इन मापदंडों को पूर्ण करते कोई परिवर्तन नहीं किए गए हैं।",
        "recentchanges-timeout": "इस खोज का समय समाप्त हो गया है आप विभिन्न खोज मापदंडों की कोशिश करना चाहेंगे।",
+       "recentchanges-network": "तकनीकी त्रुटि के कारण, कोई भी परिणाम लोड नहीं किया जा सकता। कृपया पृष्ठ को रिफ्रेश करते रहें।",
+       "recentchanges-notargetpage": "उस पृष्ठ से संबंधित ऊपर परिवर्तन देखने के लिए पृष्ठ का नाम डालें|",
        "recentchanges-feed-description": "इस विकि पर हाल में हुए बदलाव इस फ़ीड में देखे जा सकते हैं।",
        "recentchanges-label-newpage": "इस संपादन से नया पृष्ठ बना",
        "recentchanges-label-minor": "यह एक छोटा सम्पादन है",
        "rcfilters-group-results-by-page": "पेज द्वारा समूह परिणाम",
        "rcfilters-activefilters": "सक्रिय फिल्टर",
        "rcfilters-advancedfilters": "उन्नत फ़िल्टर",
-       "rcfilters-limit-title": "दिखाने के लिए बदलाव",
+       "rcfilters-limit-title": "दिखाने के लिए परिणाम",
+       "rcfilters-limit-and-date-label": "{{PLURAL:$1|बदलाव|$1 परिवर्तन}}, $2",
+       "rcfilters-date-popup-title": "खोजने के लिए समय अवधि",
        "rcfilters-days-title": "कुछ दिनों के",
        "rcfilters-hours-title": "कुछ घंटों के",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|दिन}}",
        "rcfilters-savedqueries-apply-and-setdefault-label": "डिफ़ॉल्ट फ़िल्टर बनाएं",
        "rcfilters-savedqueries-cancel-label": "रद्द करें",
        "rcfilters-savedqueries-add-new-title": "वर्तमान फ़िल्टर सेटिंग को सहेजें",
+       "rcfilters-savedqueries-already-saved": "ये फ़िल्टर पहले ही सुरक्षित कर लिए गए हैं| नए सुरक्षित फ़िल्टर बनाने के लिए अपनी सेटिंग बदले|",
        "rcfilters-restore-default-filters": "मूलभूत फिल्टर पुनर्स्थापित करे",
        "rcfilters-clear-all-filters": "सभी फिल्टर हटाएँ",
        "rcfilters-show-new-changes": "नवीनतम बदलाव दिखाएँ",
-       "rcfilters-search-placeholder": "हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µ à¤«à¤¼à¤¿à¤²à¥\8dà¤\9fर (बà¥\8dराà¤\89à¤\9c़ à¤¯à¤¾ à¤\9fाà¤\87प à¤\95रना à¤\86रà¤\82भ करें)",
+       "rcfilters-search-placeholder": "परिवरà¥\8dतन à¤«à¤¼à¤¿à¤²à¥\8dà¤\9fर à¤\95रà¥\87à¤\82 (मà¥\87नà¥\8dयà¥\82 à¤\95ा à¤\87सà¥\8dतà¥\87माल à¤\95रà¥\87à¤\82 à¤¯à¤¾ à¤«à¤¼à¤¿à¤²à¥\8dà¤\9fर à¤¨à¤¾à¤® à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\96à¥\8bà¤\9c करें)",
        "rcfilters-invalid-filter": "अमान्य फ़िल्टर",
        "rcfilters-empty-filter": "कोई सक्रिय फिल्टर नहीं। सभी योगदान दिखाए गए है।",
        "rcfilters-filterlist-title": "फिल्टर",
        "rcfilters-watchlist-showupdated": "उन पन्नों में परिवर्तन जिनपर आप परिवर्तन के बाद से नहीं गए हैं, ठोस चिन्ह के साथ <strong>bold</strong> दिखाए गए हैं।",
        "rcfilters-preference-label": "हाल के परिवर्तनों के बेहतर संस्करण को छुपाएं",
        "rcfilters-preference-help": "2017 इंटरफ़ेस के नये स्वरूप को वापस रोल करा  गया और सभी टूल तब और बाद में जोड़े गए।",
+       "rcfilters-filter-showlinkedfrom-label": "जुड़े पृष्ठों पर से परिवर्तन दिखाएं",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>से जुड़े पृष्ठ</strong> चयनित पृष्ठ",
+       "rcfilters-filter-showlinkedto-label": "लिंक करने वाले पृष्ठों पर परिवर्तन दिखाएं",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>से जुड़ने वाले पृष्ठ</strong> चयनित पृष्ठ",
+       "rcfilters-target-page-placeholder": "पृष्ठ का नाम दर्ज करें",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
        "rclistfromreset": "चुने दिनांक पहले जैसा करें",
        "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
        "recentchangeslinked-feed": "पृष्ठ से जुड़े बदलाव",
        "recentchangeslinked-toolbox": "पृष्ठ से जुड़े बदलाव",
        "recentchangeslinked-title": "\"$1\" से जुड़े बदलाव",
-       "recentchangeslinked-summary": "यह à¤ªà¥\83षà¥\8dठ à¤\95िसà¥\80 à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤ªà¥\83षà¥\8dठ à¤¸à¥\87 à¤\9cà¥\81à¥\9cà¥\87 à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 (या à¤\95िसà¥\80 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¶à¥\8dरà¥\87णà¥\80बदà¥\8dध à¤ªà¥\83षà¥\8dठà¥\8bà¤\82) à¤®à¥\87à¤\82 à¤¹à¤¾à¤² à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¦à¤°à¥\8dशाता à¤¹à¥\88।\n[[Special:Watchlist|à¤\86पà¤\95à¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80]] à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤ªà¥\83षà¥\8dठ '''मà¥\8bà¤\9fà¥\87''' à¤\85à¤\95à¥\8dषरà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤¦à¤¿à¤\96à¥\87à¤\82à¤\97à¥\87।",
+       "recentchangeslinked-summary": "à¤\89स à¤ªà¥\83षà¥\8dठ à¤ªà¤° à¤¯à¤¾ à¤\89स à¤ªà¥\83षà¥\8dठ à¤¸à¥\87 à¤\9cà¥\81ड़à¥\87 à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤ªà¤° à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96नà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤ªà¥\83षà¥\8dठ à¤\95ा à¤¨à¤¾à¤® à¤¡à¤¾à¤²à¥\87à¤\82। (à¤\8fà¤\95 à¤µà¤°à¥\8dà¤\97 à¤\95à¥\87 à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\8b à¤¦à¥\87à¤\96नà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f, à¤¶à¥\8dरà¥\87णà¥\80 à¤¦à¤°à¥\8dà¤\9c à¤\95रà¥\87à¤\82: à¤¶à¥\8dरà¥\87णà¥\80 à¤\95ा à¤¨à¤¾à¤®)| [[Special:Watchlist|your Watchlist]] à¤\95à¥\87 à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन <strong>बà¥\8bलà¥\8dड</strong> à¤®à¥\87à¤\82 à¤¹à¥\88à¤\82|",
        "recentchangeslinked-page": "पृष्ठ नाम:",
        "recentchangeslinked-to": "इसके बदले में दिये हुए पृष्ठसे जुडे पन्नोंके बदलाव दर्शायें",
        "recentchanges-page-added-to-category": "[[:$1]] श्रेणी में जुड़ा",
        "uploaded-script-svg": "अपलोड की गयी एसवीजी फ़ाइल में स्क्रीप्ट अवयव \"$1\" पाया गया।",
        "uploaded-hostile-svg": "अपलोड की गयी एसवीजी फाइल के शैली अवयव में असुरक्षित सीएसएस पायी गयी।",
        "uploaded-event-handler-on-svg": "सेटिंग ईवेंट हैंडलर (आयोजन प्रबन्धनकर्ता वरियता) <code>$1=\"$2\"</code> एसवीजी फ़ाइल में अनुमत नहीं है।",
-       "uploaded-href-attribute-svg": "href केवल एसवीजी फ़ाइल हेतु ही http:// या https:// उपयोग करने देता है। <code>&lt;$1 $2=\"$3\"&gt;</code>",
+       "uploaded-href-attribute-svg": "<a> तत्व केवल डेटा से लिंक किया जा सकता है: (अंतःस्थापित दस्तावेज), http:// or https://, या टुकड़ा (#, समरूप दस्तावेज) लक्ष्य| अन्य तत्वों के लिए, जैसे <image>, केवल डेटा: और टुकड़ों की अनुमति है| अपने एसवीजी को निर्यात करते समय छवियों को अंतःस्थापित करने का प्रयास करें| मिला <code> &lt;$1 $2=\"$3\"&gt;</code>।",
        "uploaded-href-unsafe-target-svg": "अपलोड की गयी फ़ाइल में असुरक्षित लक्ष्य <code>&lt;$1 $2=\"$3\"&gt;</code> पाये गए।",
        "uploaded-animate-svg": "चिप्पि \"animate\" पायी गई जिससे href परिवर्तित हो सकता है, अपलोड की गयी फ़ाइल में \"from\" विशेषता <code>&lt;$1 $2=\"$3\"&gt;</code> काम में ली जा रही है।",
        "uploaded-setting-event-handler-svg": "विकल्प आयोजन-संभालने वाला अवरोधित है, एसवीजी फ़ाइल में मिला <code>&lt;$1 $2=\"$3\"&gt;</code> है।",
        "uploadstash-refresh": "फ़ाइलों की सूची रिफ़्रेश करें",
        "uploadstash-thumbnail": "छवि देखें",
        "uploadstash-exception": "गुप्त कोष में अपलोड स्टोर नहीं किया जा सका ($1): \"$2\".",
+       "uploadstash-bad-path": "पथ मौजूद नहीं है|",
+       "uploadstash-bad-path-invalid": "पथ मौजूद नहीं है|",
+       "uploadstash-bad-path-unknown-type": "अज्ञात प्रकार \"$1\"",
+       "uploadstash-bad-path-unrecognized-thumb-name": "अपरिचित अंगूठे का नाम|",
+       "uploadstash-bad-path-no-handler": "फ़ाइल $2 में से $1 के लिए कोई प्रहस्तक नहीं मिला|",
+       "uploadstash-bad-path-bad-format": "कुंजी \"$1\" एक उचित प्रारूप में नहीं है|",
+       "uploadstash-file-not-found": "छिपाने की जगह में कुंजी \"$1\" नहीं मिली|",
+       "uploadstash-file-not-found-no-thumb": "थंबनेल प्राप्त नहीं किया जा सका|",
+       "uploadstash-file-not-found-no-local-path": "स्केल की गयी वस्तु के लिए कोई स्थानीय पथ नहीं है|",
+       "uploadstash-file-not-found-no-object": "थंबनेल के लिए स्थानीय फ़ाइल ऑब्जेक्ट नहीं बना सके।",
+       "uploadstash-file-not-found-no-remote-thumb": "थंबनेल प्राप्त करना विफल: $1\nयूआरएल = $2",
+       "uploadstash-file-not-found-missing-content-type": "सामग्री प्रकार हैडर अनुपलब्ध|",
+       "uploadstash-file-not-found-not-exists": "पथ नहीं मिल सकता, न ही सादी फाइल|",
+       "uploadstash-file-too-large": "$1 बाइट्स से बड़ी फ़ाइल नहीं दे सकता|",
+       "uploadstash-not-logged-in": "कोई भी उपयोगकर्ता लॉग इन नहीं है, फाइल उपयोगकर्ताओं से संबंधित होनी चाहिए।",
+       "uploadstash-wrong-owner": "यह फ़ाइल ($1) वर्तमान उपयोगकर्ता से संबंधित नहीं है|",
+       "uploadstash-no-such-key": "ऐसी कोई भी कुंजी ($1), नहीं हटा सकते हैं|",
+       "uploadstash-no-extension": "आयतन शून्य है|",
+       "uploadstash-zero-length": "फ़ाइल शून्य लंबाई की है|",
        "invalid-chunk-offset": "अग्राह्य चंक ऑफ़सेट",
        "img-auth-accessdenied": "अनुमति नहीं है",
        "img-auth-nopathinfo": "PATH_INFO मौजूद नहीं है।\nआपके सर्वर में इस जानकारी को भेजने के लिए जमाव नहीं है।\nयह सी॰जी॰आई-आधारित हो सकता है और img_auth को स्वीकार नहीं करता है।\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization देखें।",
        "enotif_impersonal_salutation": "{{SITENAME}} सदस्य",
        "enotif_subject_deleted": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|$2}} ने हटा दिया है",
        "enotif_subject_created": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|$2}} ने बना दिया है",
-       "enotif_subject_moved": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|$2}} ने स्थानांतरित कर दिया है",
+       "enotif_subject_moved": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|चले गए}} $2 द्वारा चले जा चुका है",
        "enotif_subject_restored": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|$2}} ने पुनर्स्थापित कर दिया है",
        "enotif_subject_changed": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|$2}} ने परिवर्तित किया है",
-       "enotif_body_intro_deleted": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|$2}} ने $PAGEEDITDATE को हटा दिया है, देखें $3।",
+       "enotif_body_intro_deleted": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|$2}} ने $PAGEEDITDATE को हटा दिया है, देखें <$3>।",
        "enotif_body_intro_created": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|$2}} ने $PAGEEDITDATE को बनाया है, वर्तमान अवतरण के लिए $3 देखें।",
        "enotif_body_intro_moved": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|$2}} ने $PAGEEDITDATE को स्थानांतरित किया है, वर्तमान अवतरण के लिए $3 देखें।",
        "enotif_body_intro_restored": "{{SITENAME}} पृष्ठ $1 को {{GENDER:$2|$2}} ने $PAGEEDITDATE को पुनर्स्थापित किया है, वर्तमान अवतरण के लिए $3 देखें।",
        "import-mapping-namespace": "किसी नामस्थान पर आयात करें",
        "import-mapping-subpage": "निम्न लिखित पृष्ठ के उपपृष्ठ के रूप में आयात करें:",
        "import-upload-filename": "संचिका नाम:",
+       "import-upload-username-prefix": "इंटरविकी उपसर्ग:",
+       "import-assign-known-users": "स्थानीय उपयोगकर्ताओं को संपादन नियुक्त करें जहां नामित उपयोगकर्ता स्थानीय स्तर पर मौजूद है",
        "import-comment": "टिप्पणी:",
        "importtext": "कृपया स्रोत विकि से संचिका निर्यातित करने के लिए [[Special:Export|निर्यात सुविधा]] का इस्तेमाल करें।\nइसे अपने संगणक पर सँजो के यहाँ चढ़ा दें।",
        "importstart": "पृष्ठ आयात कर रहें हैं...",
        "imported-log-entries": "आयातित $1 {{PLURAL:$1|लॉग प्रविष्टि|लॉग प्रविष्टियाँ}}.\nजब कभी कोई फाइल आपको import करनी हो",
        "importfailed": "आयात विफल हुआ: <nowiki>$1</nowiki>",
        "importunknownsource": "अज्ञात आयात स्रोत प्रकार",
+       "importnoprefix": "कोई इंटरविकी उपसर्ग नहीं दिया गया था",
        "importcantopen": "आयात फ़ाईल खोल नहीं पायें",
        "importbadinterwiki": "अवैध अन्तरविकि कड़ी",
        "importsuccess": "आयात सफल हुआ!",
        "autosumm-blank": "पृष्ठ को खाली किया",
        "autosumm-replace": "पृष्ठ को '$1' से बदल रहा है।",
        "autoredircomment": "[[$1]] को अनुप्रेषित",
+       "autosumm-removed-redirect": "हटाया गया रीडायरेक्ट [[$1]] के लिए",
+       "autosumm-changed-redirect-target": "[[$1]] से [[$2]] तक पुन्नः प्रेषित लक्ष्य बदल गया|",
        "autosumm-new": "'$1' के साथ नया पृष्ठ बनाया",
        "autosumm-newblank": "रिक्त पृष्ठ बनाया",
        "size-bytes": "$1 B",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|टैग}}]]: $2)",
        "tag-mw-contentmodelchange": "सामग्री मॉडल परिवर्तन",
        "tag-mw-contentmodelchange-description": "पृष्ठ [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel सामग्री मॉडल को परिवर्तित करें] के संपादन।",
+       "tag-mw-new-redirect": "नया पुन्नः प्रेषित लक्ष्य",
+       "tag-mw-new-redirect-description": "बदलाव जो एक नया रीडायरेक्ट बनाते हैं या पुनर्निर्देशन के लिए एक पृष्ठ बदलते हैं",
+       "tag-mw-removed-redirect": "हटाया गया पुनर्निर्देशन",
+       "tag-mw-removed-redirect-description": "संपादन जो किसी मौजूदा रीडायरेक्ट को गैर रीडायरेक्ट में बदलता है",
+       "tag-mw-changed-redirect-target": "रीडायरेक्ट लक्ष्य बदल गया",
+       "tag-mw-changed-redirect-target-description": "संपादन जो रीडायरेक्ट लक्ष्य को बदलते हैं",
+       "tag-mw-blank": "रिक्त",
+       "tag-mw-blank-description": "सम्पादन जो पृष्ट को खाली कर देता है",
+       "tag-mw-replace": "बदला गया",
+       "tag-mw-replace-description": "संपादन जिसने 90% से अधिक पृष्ट की सामग्री को हटा दिया",
+       "tag-mw-rollback": "पीछे हटना",
+       "tag-mw-rollback-description": "संपादन जो रोलबैक लिंक का उपयोग करके पिछला संपादन वापस रोल करता है",
+       "tag-mw-undo": "किए हुए कार्य को पूर्वत करना",
+       "tag-mw-undo-description": "संपादन जो पिछले लिंक का उपयोग करके पिछले संपादन को पूर्वत करता है",
        "tags-title": "चिप्पियाँ",
        "tags-intro": "यह पृष्ठ अर्थ सहित वह चिप्पियाँ दर्शाता है जिनका कोई तंत्रांश किसी संपादन पर निशान लगाने के लिए इस्तेमाल कर सकता है।",
        "tags-tag": "चिप्पी का नाम",
index a29aa2c..53328df 100644 (file)
        "passwordreset-emailsentemail": "Ako je ova adresa povezana s Vašim suradničkim računom, na nju će biti poslan podsjetnik na zaporku.",
        "passwordreset-emailsentusername": "Ukoliko je ova adresa povezana s Vašim suradničkim računom, na istu će biti poslan podsjetnik sa zaporkom.",
        "passwordreset-invalidemail": "Nevaljala adresa e-pošte",
+       "passwordreset-nodata": "Niste naveli ni suradničko ime, a niti adresu e-pošte",
        "changeemail": "Promijeni ili izbriši e-mail adresu",
        "changeemail-header": "Ispunite ovaj obrazac da biste promijenili svoju adresu e-pošte. Ukoliko želite ukloniti povezanost svoje adrese e-pošte i suradničkoga računa, prilikom popunjavanja obrasca ostavite prazno polje umjesto upisivanja nove adrese e-pošte.",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "blockedtitle": "Suradnik je blokiran",
        "blockedtext": "<strong>Vaše je suradničko ime blokirano ili je Vaša IP adresa blokirana.</strong>\n\nBlokirao Vas je $1.\nRazlog blokiranja je sljedeći: <em>$2</em>.\n\n* Početak blokade: $8\n* Blokada istječe: $6\n* Blokirani suradnik: $7\n\nMožete kontaktirati $1 ili jednog od [[{{MediaWiki:Grouppage-sysop}}|administratora]] kako bi Vam pojasnili razlog blokiranja.\n\nPrimijetite da ne možete koristiti opciju \"Pošalji e-poruku suradnici – suradniku\" ako niste upisali valjanu adresu e-pošte u Vašim [[Special:Preferences|suradničkim postavkama]] i ako niste u tome onemogućeni prilikom blokiranja.\n\nVaša trenutačna IP adresa je $3, a oznaka bloka #$5. Molimo uvrstite sve gore navedene detalje u svaki upit koji napišete.",
        "autoblockedtext": "Vaša IP adresa automatski je blokirana zbog toga što ju je koristio drugi suradnik, kojeg je blokirao $1.\nRazlog blokiranja je sljedeći:\n\n:<em>$2</em>\n\n* Početak blokade: $8\n* Blokada istječe: $6\n* Blokirani suradnik: $7\n\nMožete kontaktirati $1 ili jednog od [[{{MediaWiki:Grouppage-sysop}}|administratora]] kako bi Vam pojasnili razlog blokiranja.\n\nPrimijetite da ne možete rabiti opciju \"Pošalji e-poruku suradnici – suradniku\" ako niste upisali valjanu adresu e-pošte u Vašim [[Special:Preferences|suradničkim postavkama]] i ako niste u tome onemogućeni prilikom blokiranja.\n\nVaša trenutačna IP adresa je $3, a oznaka bloka #$5. Molimo uvrstite sve gore navedene detalje u svaki upit koji napišete.",
+       "systemblockedtext": "MediaWiki je automatski blokirao Vaše suradničko ime ili IP-adresu.\nDano je sljedeće obrazloženje:\n\n:<em>$2</em>\n\n* Početak blokade: $8\n* Istek blokade: $6\n* Blokada je namijenjena za: $7\n\nVaša trenutačna IP-adresa je $3.\nAko imate pitanja u svezi s blokadom, priložite sve pojedinosti koje su prethodno navedene.",
        "blockednoreason": "bez obrazloženja",
        "whitelistedittext": "Za uređivanje stranice molimo $1.",
        "confirmedittext": "Morate potvrditi Vašu adresu e-pošte prije nego što Vam bude omogućeno uređivanje. Molim unesite i ovjerite Vašu adresu e-pošte u [[Special:Preferences|suradničkim postavkama]].",
        "cascadeprotectedwarning": "'''UPOZORENJE:''' Ova stranica je zaključana i mogu je uređivati samo suradnici s administratorskim pravima, jer je uključena u {{PLURAL:$1|slijedeću stranicu|slijedeće stranice}} koje su zaštićene \"prenosivom\" zaštitom:",
        "titleprotectedwarning": "<strong>Upozorenje: Ova je stranica zaključana i samo ju suradnici s [[Special:ListGroupRights|određenim pravima]] mogu stvoriti.</strong>\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
        "templatesused": "{{PLURAL:$1|Predložak koji se rabi|Predlošci koji se rabe}} na ovoj stranici:",
-       "templatesusedpreview": "{{PLURAL:$1|Predložak koji se rabi|Predlošci koji se rabe}} u ovom predpregledu:",
+       "templatesusedpreview": "{{PLURAL:$1|Predložak koji se rabi|Predlošci koji se rabe}} u ovom pretpregledu:",
        "templatesusedsection": "{{PLURAL:$1|Predložak koji se rabi|Predlošci koji se rabe}} u ovom odjeljku:",
        "template-protected": "(zaštićen)",
        "template-semiprotected": "(djelomično zaštićen)",
        "search-external": "Vanjski pretraživač",
        "searchdisabled": "<p>Oprostite! Pretraga po cjelokupnoj bazi je zbog bržeg rada projekta {{SITENAME}} trenutačno onemogućena. Možete se poslužiti tražilicom Google.</p>",
        "search-error": "Greška prilikom pretrage: $1",
+       "search-warning": "Došlo je do upozorenja prilikom pretraživanja: $1",
        "preferences": "Postavke",
        "mypreferences": "Postavke",
        "prefs-edits": "Broj uređivanja:",
        "timezoneregion-indian": "Indijski ocean",
        "timezoneregion-pacific": "Tihi ocean",
        "allowemail": "Omogući primanje e-maila od drugih suradnika",
+       "email-allow-new-users-label": "Dopusti e-poruke od posve novopridošlih suradnika",
        "email-blacklist-label": "Zabrani sljedećim suradnicima da mi šalju e-poruke:",
        "prefs-searchoptions": "Način traženja",
        "prefs-namespaces": "Imenski prostori",
        "right-siteadmin": "Zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "Izvezi stranice uključujući i povezane stranice do dubine od 5",
        "right-sendemail": "Slanje e-pošte drugim suradnicima",
+       "right-sendemail-new-users": "Pošalji e-poruku suradnicima bez radnji zabilježenih u evidencijama",
+       "right-managechangetags": "Stvaranje i (de)aktiviranje [[Special:Tags|oznaka]]",
        "grant-generic": "Snop prava »$1«",
        "grant-group-email": "Pošalji e-mail",
+       "grant-group-other": "Raznovrsno djelovanje",
        "grant-blockusers": "Blokiraj i odblokiraj korisnike",
        "grant-createaccount": "Otvori račune",
        "grant-createeditmovepage": "Stvaranje, uređivanje i premještanje stranica",
+       "grant-delete": "Brisanje stranica, izmjena i unosa u evidencijama",
        "grant-editmyoptions": "Uređivanje vlastitih suradničkih postavki",
        "grant-editmywatchlist": "Uređivanje Vašega popisa praćenih stranica",
        "grant-editpage": "Uređivanje postojećih stranica",
        "recentchanges-legend-newpage": "Nova stranica",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Prikaži",
+       "rcfilters-tag-remove": "Ukloni »$1«",
        "rcfilters-legend-heading": "<strong>Popis kratica:</strong>",
        "rcfilters-other-review-tools": "Ostali alati za pregledavanje:",
        "rcfilters-group-results-by-page": "Grupiranje rezultata po stranici",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|sat|sata|sati}}",
        "rcfilters-highlighted-filters-list": "Istaknuto: $1",
        "rcfilters-quickfilters": "Spremljeni filtri",
-       "rcfilters-quickfilters-placeholder-title": "Još nema spremljenih poveznica",
+       "rcfilters-quickfilters-placeholder-title": "Još nema spremljenih filtara",
        "rcfilters-quickfilters-placeholder-description": "Da biste spremili postavke filtra i rabili ih poslije, kliknite ispod na oznaku dočitnice u polju Aktivni filtri.",
        "rcfilters-savedqueries-defaultlabel": "Spremljeni filteri",
        "rcfilters-savedqueries-rename": "Preimenuj",
        "rcfilters-savedqueries-new-name-label": "Naziv",
        "rcfilters-savedqueries-new-name-placeholder": "Opišite svrhu filtra",
        "rcfilters-savedqueries-apply-label": "Stvori filtar",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Stvori predodređeni filtar",
        "rcfilters-savedqueries-cancel-label": "Otkaži",
        "rcfilters-savedqueries-add-new-title": "Spremi trenutačne postavke filtra",
        "rcfilters-restore-default-filters": "Vrati zadane filtre",
        "rcfilters-filter-watchlist-watchednew-description": "Izmjene stranica na popisu praćenja koje niste posjetili od vremena učinjenih izmjena.",
        "rcfilters-filter-watchlist-notwatched-label": "Izvan popisa praćenja",
        "rcfilters-filter-watchlist-notwatched-description": "Sve izmjene na stranicama osim onih na popisu praćenja.",
+       "rcfilters-filtergroup-watchlistactivity": "Aktivnost na popisu praćenja",
+       "rcfilters-filter-watchlistactivity-unseen-label": "Nepregledane izmjene",
+       "rcfilters-filter-watchlistactivity-seen-label": "Pregledane izmjene",
+       "rcfilters-filter-watchlistactivity-seen-description": "Izmjene na stranicama koje ste posjetili otkako su načinjene.",
        "rcfilters-filtergroup-changetype": "Vrste promjena",
        "rcfilters-filter-pageedits-label": "Uređivanja stranica",
        "rcfilters-filter-pageedits-description": "Uređivanja wikisadržaja, rasprave, opisi kategorija...",
        "rcfilters-liveupdates-button": "Ažuriranja uživo",
        "rcfilters-liveupdates-button-title-on": "Isključi ažuriranja uživo",
        "rcfilters-liveupdates-button-title-off": "Prikaži nove izmjene uživo",
+       "rcfilters-watchlist-markseen-button": "Označi sve izmjene kao pregledane",
+       "rcfilters-watchlist-edit-watchlist-button": "Izmijeni popis praćenih stranica",
        "rcfilters-preference-label": "Skrij poboljšanu inačicu nedavnih promjena",
        "rcfilters-preference-help": "Vraća natrag stanje prije redizajna sučelja 2017., te svih oruđa dodanih tada i poslije toga.",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (prikazano ih do <strong>$1</strong>).",
        "uploadstash-refresh": "Osvježi popis datoteka",
        "uploadstash-thumbnail": "pogledaj kao minijaturu",
        "uploadstash-exception": "Postavljanje u zalihu nije bilo moguće ($1): »$2«.",
+       "uploadstash-bad-path": "Putanja ne postoji.",
+       "uploadstash-bad-path-invalid": "Putanja nije valjana.",
+       "uploadstash-bad-path-unknown-type": "Neprepoznata vrsta »$1«.",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Neprepoznano ime sličice.",
+       "uploadstash-file-not-found-no-thumb": "Ne mogu dobiti minijaturu.",
+       "uploadstash-file-not-found-no-local-path": "Nema lokalne putanje za umanjenu stavku.",
+       "uploadstash-file-not-found-no-object": "Ne mogu načiniti lokalni podatkovni objekt za minijaturu.",
+       "uploadstash-file-not-found-no-remote-thumb": "Dobavljanje minijature nije uspjelo: $1\nURL = $2",
+       "uploadstash-file-not-found-missing-content-type": "Nedostaje zaglavlje za vrstu sadržaja.",
+       "uploadstash-file-not-found-not-exists": "Ne mogu naći putanju ili ovo nije uobičajena datoteka.",
+       "uploadstash-file-too-large": "Ne mogu poslužiti datoteku veću od $1 {{PLURAL:$1|bajta|bajtova}}.",
+       "uploadstash-not-logged-in": "Nije prijavljen ijedan suradnik. Datoteke moraju biti povezane sa suradnicima koji ih postavljaju.",
+       "uploadstash-no-extension": "Nema traženog proširenja.",
+       "uploadstash-zero-length": "Veličina datoteke je nula bajtova.",
        "invalid-chunk-offset": "Nevaljana točka nastavka snimanja",
        "img-auth-accessdenied": "Pristup onemogućen",
        "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš poslužitelj nije postavljen da prosljeđuje ovu informaciju.\nMožda se temelji na CGI skripti i ne može podržavati img_auth.\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=hr Pogledajte stranicu o autorizaciji slika]",
        "pageswithprop-legend": "Stranice s određenim osobinama",
        "pageswithprop-text": "Ovo je popis stranica koje koriste određene osobine stranica.",
        "pageswithprop-prop": "Ime osobine:",
+       "pageswithprop-reverse": "Sortiraj obrnutim redoslijedom",
        "pageswithprop-sortbyvalue": "Sortiraj po vrijednosti svojstva",
        "pageswithprop-submit": "Idi",
        "doubleredirects": "Dvostruka preusmjeravanja",
        "magiclink-tracking-isbn": "Stranice s čarobnim ISBN poveznicama",
        "magiclink-tracking-isbn-desc": "Ova stranica rabi čarobne ISBN poveznice. Za njihovu migraciju vidi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "specialloguserlabel": "Suradnik:",
-       "speciallogtitlelabel": "Cilj (naslov ili suradnik):",
+       "speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:suradničko ime):",
        "log": "Evidencije",
        "logeventslist-submit": "Prikaži",
        "all-logs-page": "Sve javne evidencije",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-hide": "Sakrij",
        "watchlist-submit": "Prikaži",
-       "wlshowtime": "Prikaži posljednjih:",
+       "wlshowtime": "Vremensko razdoblje za prikaz:",
        "wlshowhideminor": "manje promjene",
        "wlshowhidebots": "botove",
        "wlshowhideliu": "prijavljene suradnike",
        "enotif_body_intro_moved": "Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|premjestio|premjestila}} je dana $PAGEEDITDATE {{GENDER:$2|suradnik|suradnica}} $2, vidi $3 za trenutačnu inačicu stranice.",
        "enotif_body_intro_restored": "Stranica $1 projekta {{SITENAME}} {{GENDER:$2|vratio|vratila}} je dana $PAGEEDITDATE {{GENDER:$2|suradnik|suradnica}} $2, vidi $3 za trenutačnu inačicu stranice.",
        "enotif_body_intro_changed": "Stranica $1 projekta {{SITENAME}} {{GENDER:$2|promijenio|promijenila}} je dana $PAGEEDITDATE {{GENDER:$2|suradnik|suradnica}} $2, vidi $3 za trenutačnu inačicu stranice.",
-       "enotif_lastvisited": "Pogledaj $1 za promjene od zadnjeg posjeta.",
+       "enotif_lastvisited": "Za sve izmjene od Vašega posljednjeg posjeta, pogledajte $1",
        "enotif_lastdiff": "Pogledajte $1 kako biste mogli vidjeti tu izmjenu.",
        "enotif_anon_editor": "neprijavljeni suradnik $1",
        "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak uređivača: $PAGESUMMARY $PAGEMINOREDIT\n\nMožete kontaktirati suradnika koji je posljednji uređivao stranicu:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDo Vašega ponovnog posjeta stranici ne ćete dobivati nove obavijesti. Postavke za izvješćivanje možete vratiti na prvobitno zadane za sve praćene stranice Vašega popisa praćenja.\n\nVaš sustav izvješćivanja {{SITENAME}}.\n\n--\nZa promjene postavki izvješćivanja putem e-pošte, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjene svog popisa praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nZa brisanje stranica iz svog popisa praćenja, posjetite\n$UNWATCHURL\n\nZa povratne informacije i pomoć posjetite:\n$HELPPAGE",
        "confirmdeletetext": "Zauvijek ćete izbrisati stranicu ili sliku zajedno s prijašnjim inačicama.\nMolim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Radnja je dovršena",
        "actionfailed": "Radnja nije uspjela",
-       "deletedtext": "\"$1\" je izbrisana.\nVidi $2 za evidenciju nedavnih brisanja.",
+       "deletedtext": "Stranica »$1« je izbrisana.\nVidi pod $2 za zapise nedavnih brisanja.",
        "dellogpage": "Evidencija brisanja",
        "dellogpagetext": "Dolje je popis nedavnih brisanja.\nSva vremena su prema poslužiteljevom vremenu.",
        "deletionlog": "evidencija brisanja",
        "rollbacklinkcount": "ukloni $1 {{PLURAL:$1|uređivanje|uređivanja}}",
        "rollbacklinkcount-morethan": "ukloni više od $1 {{PLURAL:$1|uređivanje|uređivanja}}",
        "rollbackfailed": "Brzo uklanjanje nije uspjelo",
+       "rollback-missingrevision": "Ne mogu učitati podatke o izmjeni.",
        "cantrollback": "Ne mogu ukloniti posljednju promjenu, postoji samo jedna promjena.",
        "alreadyrolled": "Ne mogu ukloniti posljednju promjenu članka [[:$1]] koju je napravio [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); netko je već promijenio stranicu ili uklonio promjenu.\n\nPosljednju promjenu napravio je [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sažetak promjene je bio: <em>$1</em>.",
        "revertpage": "uklonjena promjena {{GENDER:$2|suradnika|suradnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]), vraćeno na posljednju inačicu {{GENDER:$1|suradnika|suradnice}} [[User:$1|$1]]",
        "revertpage-nouser": "Vraćene izmjene suradnika (suradničko ime uklonjeno) na posljednju inačicu suradnika [[User:$1|$1]]",
-       "rollback-success": "uklonjeno uređivanje {{GENDER:$1|suradnika|suradnice}} $1\nvraćeno na posljednju inačicu {{GENDER:$2|suradnika|suradnice}} $2.",
+       "rollback-success": "Uklonjeno uređivanje {{GENDER:$3|suradnika|suradnice}} $1; vraćeno na posljednju inačicu {{GENDER:$4|suradnika|suradnice}} $2.",
+       "rollback-success-notify": "Uklonili ste izmjene suradnika $1;\nvraćeno na posljednju izmjenu suradnika $2. [$3 Prikaži izmjene]",
        "sessionfailure-title": "Prekid sesije",
        "sessionfailure": "Izgleda da postoji problem s uspostavom sjednice kod Vašega prijavljivanja; ta radnja otkazana je kao način sprječavanja krađe sjednice. Molimo Vas da se u pregledniku vratite natrag na prethodnu stranicu, ponovo ju učitate i zatim pokušate opet.",
        "changecontentmodel": "Promjena modela sadržaja stranice",
        "changecontentmodel-reason-label": "Razlog:",
        "changecontentmodel-submit": "Promijeni",
        "changecontentmodel-success-title": "Sadržaj modela je promijenjen",
+       "changecontentmodel-success-text": "Model sadržaja stranice [[:$1]] je promijenjen.",
+       "changecontentmodel-cannot-convert": "Model sadržaja stranice [[:$1]] se ne može pretvoriti u vrstu $2.",
+       "changecontentmodel-nodirectediting": "Model sadržaja $1 ne podržava izravno uređivanje",
+       "changecontentmodel-emptymodels-title": "Nema dostupnih modela sadržaja",
+       "changecontentmodel-emptymodels-text": "Model sadržaja stranice [[:$1]] ne može se pretvoriti ni u jednu drugu vrstu.",
        "log-name-contentmodel": "Evidencija promjena modela sadržaja",
+       "log-description-contentmodel": "Ova stranica navodi izmjene modela sadržaja stranica, kao i stranice napravljene s modelom sadržaja koji se razlikuje od predodređenoga.",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|načinio|načinila}} je stranicu $3 s nestandardnim modelom sadržaja »$5«",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|promijenio|promijenila}} je model sadržaja stranice $3 iz »$4« u »$5«",
        "logentry-contentmodel-change-revertlink": "vrati",
        "logentry-contentmodel-change-revert": "vraćanje modela",
        "protectlogpage": "Evidencija zaštićivanja",
        "prot_1movedto2": "$1 premješteno na $2",
        "protect-badnamespace-title": "Nezaštitljiv imenski prostor",
        "protect-badnamespace-text": "Stranice u ovom imenskom prostoru ne mogu se zaštititi.",
+       "protect-norestrictiontypes-text": "Ova se stranica ne može zaštititi jer nema dostupnih oblika ograničenja.",
        "protect-norestrictiontypes-title": "Stranicu nije moguće zaštititi",
        "protect-legend": "Potvrda zaštite",
        "protectcomment": "Razlog:",
        "protect-cascadeon": "Ova stranica je zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosivu zaštitu. Možete promijeniti stupanj zaštite ove stranice, no to neće utjecati na prenosivu zaštitu.",
        "protect-default": "Omogućeno svim suradnicima",
        "protect-fallback": "Potrebno je imati \"$1\" ovlasti",
-       "protect-level-autoconfirmed": "Onemogućeno novim i neprijavljenim suradnicima",
+       "protect-level-autoconfirmed": "Dopušteno samo autopotvrđenima",
        "protect-level-sysop": "Samo administratori",
        "protect-summary-cascade": "prenosiva zaštita",
        "protect-expiring": "istječe $1 (UTC)",
        "undelete-search-title": "Pretraži obrisane stranice",
        "undelete-search-box": "Pretraži obrisane stranice",
        "undelete-search-prefix": "Pretraži stranice koje počinju s:",
+       "undelete-search-full": "Prikaži naslove koji sadržavaju:",
        "undelete-search-submit": "Pretraži",
        "undelete-no-results": "Nije pronađena odgovarajuća stranica u arhivu brisanja.",
        "undelete-filename-mismatch": "Ne mogu vratiti inačicu datoteke s vremenom i datumom $1: imena se ne slažu (''filename mismatch'')",
        "sp-contributions-newbies-sub": "Za nove suradnike",
        "sp-contributions-newbies-title": "Doprinosi novih suradnika",
        "sp-contributions-blocklog": "evidencija blokiranja",
-       "sp-contributions-deleted": "obrisani suradnički doprinosi",
+       "sp-contributions-suppresslog": "pobrisani {{GENDER:$1|suradnikovi|suradničini}} doprinosi",
+       "sp-contributions-deleted": "pobrisani {{GENDER:$1|suradnikovi|suradničini}} doprinosi",
        "sp-contributions-uploads": "postavljene datoteke",
        "sp-contributions-logs": "evidencije",
        "sp-contributions-talk": "razgovor",
        "articleexists": "Stranica pod tim imenom već postoji ili ime koje ste odabrali nije u skladu s pravilima.\nMolimo odaberite drugo ime.",
        "cantmove-titleprotected": "Ne možete premjestiti ovu stranicu na ovo mjesto, jer je novi naslov zaštićen od kreiranja",
        "movetalk": "Premjesti i njezinu stranicu za razgovor ako je moguće.",
-       "move-subpages": "Premjesti podstranice (na $1)",
+       "move-subpages": "Premjesti podstranice (najviše do $1)",
        "move-talk-subpages": "Premjesti podstranice od stranice za razgovor (na $1)",
        "movepage-page-exists": "Stranica $1 već postoji i ne može biti automatski prepisana",
        "movepage-page-moved": "Stranica $1 je premještena na $2.",
        "tag-mw-contentmodelchange": "promjena modela sadržaja",
        "tag-mw-contentmodelchange-description": "Uređivanja koja [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mijenjanju model sadržaja] stranice",
        "tag-mw-new-redirect": "novo preusmjeravanje",
+       "tag-mw-new-redirect-description": "Uređivanja kojima se stvara novo preusmjeravanje ili mijenja stranica na koju se preusmjerava",
        "tag-mw-removed-redirect": "uklonjeno preusmjeravanje",
+       "tag-mw-removed-redirect-description": "Uređivanja kojima se mijenja postojeće preusmjeravanje u nepreusmjeravanje",
        "tag-mw-changed-redirect-target": "promijenjeno preusmjeravanje",
        "tag-mw-changed-redirect-target-description": "Uređivanja koja mijenjaju odredište preusmjeravanja",
        "tag-mw-blank": "bjelidba",
        "tag-mw-blank-description": "Uređivanje kojim je načinjena bjelidba stranice",
        "tag-mw-replace": "preko 90 % zamijenjen tekst",
+       "tag-mw-replace-description": "Uređivanja kojima se uklanja više nego 90 % sadržaja stranice",
        "tag-mw-rollback": "brzo uklanjanje",
+       "tag-mw-rollback-description": "Uređivanja kojima se brzo uklanjaju prethodne izmjene rabeći poveznicu za brzo uklanjanje",
        "tags-title": "Oznake",
        "tags-intro": "Ova stranica sadržava popis oznaka s kojima programska oprema može označivati promjene te njihova značenja.",
        "tags-tag": "Naziv oznake",
        "logentry-block-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke blokiranja {{GENDER:$4|suradnika|suradnice}} {{GENDER:$4|$3}} s krajnjim rokom koji ističe $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} s krajnjim rokom koji ističe $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke blokiranja {{GENDER:$4|suradnika|suradnice}} {{GENDER:$4|$3}} s krajnjim rokom koji ističe $5 $6",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 s drugog wikija",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 sa $5 ($4 {{PLURAL:$4|izmjena|izmjene|izmjena}})",
        "logentry-merge-merge": "$1 je {{GENDER:$2|spojio|spojila}} $3 s $4 (izmjene do $5)",
        "logentry-move-move": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4",
        "logentry-move-move-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 bez preusmjeravanja",
        "duration-centuries": "$1 {{PLURAL:$1|stoljeće|stoljeća}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenij|milenija}}",
        "rotate-comment": "Sliku je $1 zaokrenuo za {{PLURAL:$1|stupanj|stupnja|stupnjeva}} u smjeru kazaljke na satu.",
+       "limitreport-title": "Podatci profiliranja raščlanjivača:",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "limitreport-walltime": "Uporaba u realnom vremenu",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "pagelang-submit": "Pošalji",
        "right-pagelang": "Promijeni jezik stranice",
        "log-name-pagelang": "Evidencija mijenjanja jezika",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|promijenio|promijenila}} je jezik stranice $3 iz $4 u $5.",
        "mediastatistics": "Statistika datoteka",
        "mediastatistics-summary": "Slijede statistike postavljenih datoteka koje pokazuju zadnju inačicu datoteke. Starije ili izbrisane inačice nisu prikazane.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3 %)",
        "authmanager-realname-help": "Pravo ime suradnika",
        "authmanager-provider-password": "Autorizacija zaporkom",
        "authmanager-provider-temporarypassword": "Privremena zaporka",
+       "cannotauth-not-allowed-title": "Pristup odbijen",
+       "cannotauth-not-allowed": "Nije Vam dopušteno rabiti ovu stranicu",
        "changecredentials": "Promjena vjerodajnica",
        "changecredentials-submit": "Promijeni vjerodajnice",
+       "changecredentials-invalidsubpage": "$1 nije valjana vrsta vjerodajnice.",
+       "changecredentials-success": "Vaše su vjerodajnice promijenjene.",
        "removecredentials": "Uklanjanje vjerodajnica",
        "removecredentials-submit": "Ukloni vjerodajnice",
        "credentialsform-provider": "Vrsta vjerodajnica:",
        "credentialsform-account": "Suradnički račun:",
+       "gotointerwiki": "Napuštate projekt {{SITENAME}}",
+       "gotointerwiki-invalid": "Navedeni naslov nije valjan.",
+       "gotointerwiki-external": "Napuštate projekt {{SITENAME}} da biste posjetili zasebno mrežno mjesto [[$2]].\n\n<strong>[$1 Nastavljate na $1]</strong>",
        "pagedata-title": "Podatci o stranici",
        "pagedata-bad-title": "Naslov nije valjan: $1."
 }
index 88dbec0..d37bff1 100644 (file)
        "timezoneregion-indian": "Indiai-óceán",
        "timezoneregion-pacific": "Csendes-óceán",
        "allowemail": "E-mail engedélyezése más szerkesztőktől",
+       "email-allow-new-users-label": "E-mail engedélyezése frissen regisztrált szerkesztőktől",
        "email-blacklist-label": "Letiltás ezen felhasználóknak, hogy e-mailt küldhessenek nekem",
        "prefs-searchoptions": "Keresés",
        "prefs-namespaces": "Névterek",
        "right-siteadmin": "adatbázis lezárása, felnyitása",
        "right-override-export-depth": "Lapok exportálása a hivatkozott lapokkal együtt, legfeljebb 5-ös mélységig",
        "right-sendemail": "e-mail küldése más felhasználóknak",
+       "right-sendemail-new-users": "e-mail küldése olyan felhasználóknak, akiknek nincs naplózott művelete",
        "right-managechangetags": "[[Special:Tags|címkék]] létrehozása és (de)aktiválása",
        "right-applychangetags": "[[Special:Tags|címkék]] alkalmazása saját változatokra",
        "right-changetags": "egyedi lapváltozatokon és naplóbejegyzéseken tetszőleges [[Special:Tags|címkék]] hozzáadása és törlése",
        "emailuser-title-target": "E-mail küldése ennek a felhasználónak: $1",
        "emailuser-title-notarget": "E-mail küldése a felhasználónak",
        "emailpagetext": "Ezzel az űrlappal tudsz ennek a {{GENDER:$1|felhasználónak}} e-mailt küldeni.\nFeladóként a [[Special:Preferences|beállításaidnál]] megadott e-mail címed fog szerepelni, így a címzett közvetlenül tud majd válaszolni neked.",
-       "defemailsubject": "{{SITENAME}} e-mail a következő felhasználótól: „$1”",
+       "defemailsubject": "{{SITENAME}}-e-mail a következő felhasználótól: „$1”",
        "usermaildisabled": "Email fogadás letiltva",
        "usermaildisabledtext": "Nem küldhetsz emailt más felhasználóknak ezen a wikin",
        "noemailtitle": "Nincs e-mail-cím",
        "autosumm-blank": "Eltávolította a lap teljes tartalmát",
        "autosumm-replace": "A lap tartalmának cseréje erre: $1",
        "autoredircomment": "Átirányítás ide: [[$1]]",
+       "autosumm-removed-redirect": "Átirányítás megszüntetve. Eredeti cél: [[$1]]",
        "autosumm-changed-redirect-target": "Az átirányítás célja módosítva: [[$1]]→[[$2]]",
        "autosumm-new": "Új oldal, tartalma: „$1”",
        "autosumm-newblank": "Üres oldal létrehozva",
        "tag-mw-replace-description": "Szerkesztések, amelyet egy oldal tartalmának több mint 90%-át törölték",
        "tag-mw-rollback": "Visszaállítás",
        "tag-mw-rollback-description": "Szerkesztések, amelyek visszaállítottak szerkesztéseket a „visszavonás” gombra kattintva",
+       "tag-mw-undo": "Visszavonás",
+       "tag-mw-undo-description": "Szerkesztések, amelyek visszaállítottak szerkesztéseket a „visszavonás” linkre kattintva",
        "tags-title": "Címkék",
        "tags-intro": "Ez a lap azokat a címkéket és jelentéseiket tartalmazza, amikkel a szoftver megjelölhet egy szerkesztést.",
        "tags-tag": "Címke neve",
index 4697462..f71620b 100644 (file)
        "timezoneregion-indian": "Oceano Indian",
        "timezoneregion-pacific": "Oceano Pacific",
        "allowemail": "Permitter que altere usatores me invia e-mail",
+       "email-allow-new-users-label": "Permitte e-mail de usatores toto nove",
        "email-blacklist-label": "Prohibir a iste usatores de inviar me e-mail:",
        "prefs-searchoptions": "Recerca",
        "prefs-namespaces": "Spatios de nomines",
        "rcfilters-preference-label": "Celar le version meliorate del Modificationes recente",
        "rcfilters-preference-help": "Disface le nove interfacie de 2017 e tote le instrumentos addite alora e posta.",
        "rcfilters-filter-showlinkedfrom-label": "Monstrar modificationes sur paginas ligate ab",
-       "rcfilters-filter-showlinkedfrom-option-label": "Monstrar modificationes sur paginas ligate <strong>AB</strong> un pagina",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Paginas ligate ab</strong> le pagina seligite",
        "rcfilters-filter-showlinkedto-label": "Monstrar modificationes sur paginas que liga a",
-       "rcfilters-filter-showlinkedto-option-label": "Monstrar modificationes sur paginas con ligamines <strong>VERSO</strong> un pagina",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Paginas que liga verso</strong> le pagina seligite",
        "rcfilters-target-page-placeholder": "Entra un nomine de pagina",
        "rcnotefrom": "Ecce le {{PLURAL:$5|modification|modificationes}} a partir del <strong>$3 a $4</strong> (usque a <strong>$1</strong> entratas monstrate).",
        "rclistfromreset": "Reinitialisar selection de data",
        "tag-mw-replace-description": "Modificationes que elimina plus de 90% del contento de un pagina",
        "tag-mw-rollback": "Revocation",
        "tag-mw-rollback-description": "Modificationes que disface previe modificationes usante le ligamine \"revocar\"",
+       "tag-mw-undo": "Disfacer",
+       "tag-mw-undo-description": "Modificationes que disface previe modificationes usante le ligamine \"disfacer\"",
        "tags-title": "Etiquettas",
        "tags-intro": "Iste pagina lista le etiquettas con le quales le software pote marcar un modification, e lor significato.",
        "tags-tag": "Nomine del etiquetta",
index cc616d4..f7ec581 100644 (file)
        "htmlform-user-not-exists": "<strong>$1</strong> er ekki til.",
        "htmlform-user-not-valid": "<strong>$1</strong> er ekki gilt notandanafn.",
        "logentry-delete-delete": "$1 {{GENDER:$2|eyddi}} síðunni $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|eyddi}} tilvísun $3 með því að yfirskrifa",
        "logentry-delete-restore": "$1 {{GENDER:$2|endurvakti}} síðu $3 ($4)",
        "logentry-delete-event": "$1 {{GENDER:$2|breytti}} sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|breytti}} sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4",
index e5ae975..90f4e60 100644 (file)
        "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.",
        "rcfilters-filter-showlinkedfrom-label": "Mostra le modifiche alle pagine collegate da",
-       "rcfilters-filter-showlinkedfrom-option-label": "Mostra le modifiche alle pagine collegate <strong>DA</strong> una pagina",
-       "rcfilters-filter-showlinkedto-label": "Mostra le modifiche alle pagine collegate a",
-       "rcfilters-filter-showlinkedto-option-label": "Mostra le modifiche alle pagine collegate <strong>A</strong> una pagina",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Pagine con collegamenti da</strong> la pagina selezionata",
+       "rcfilters-filter-showlinkedto-label": "Mostra le modifiche alle pagine che colegano a",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Pagine con collegamenti a</strong> la pagina selezionata",
        "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",
        "tag-mw-replace-description": "Modifiche che rimuovono oltre il 90% del contenuto di una pagina",
        "tag-mw-rollback": "Rollback",
        "tag-mw-rollback-description": "Modifiche che ripristinano le versioni precedenti utilizzando il collegamento di rollback",
+       "tag-mw-undo": "Annulla",
+       "tag-mw-undo-description": "Modifiche che annullano le modifiche precedenti utilizzando il collegamento \"Annulla\"",
        "tags-title": "Etichette",
        "tags-intro": "Questa pagina elenca le etichette che il software potrebbe associare a una modifica e il loro significato.",
        "tags-tag": "Nome dell'etichetta",
index e7298a7..a79d9e6 100644 (file)
@@ -88,7 +88,8 @@
                        "Hinaloe",
                        "Phantomize",
                        "Suzukaze-c",
-                       "Kkairri"
+                       "Kkairri",
+                       "Yusuke1109"
                ]
        },
        "tog-underline": "リンクの下線:",
        "yourtext": "編集中の文章",
        "storedversion": "保存された版",
        "editingold": "<strong>警告: このページの古い版を編集しています。</strong>\n保存すると、この版以降になされた変更がすべて失われます。",
+       "unicode-support-fail": "お使いのブラウザはUnicodeをサポートしていないようです。 ページを編集する必要があるため、編集内容は保存されませんでした。",
        "yourdiff": "差分",
        "copyrightwarning": "{{SITENAME}}への投稿はすべて、$2 (詳細は$1を参照)のもとで公開したと見なされることにご注意ください。\n自分が書いたものが他の人に容赦なく編集され、自由に配布されるのを望まない場合は、ここに投稿しないでください。<br />\nまた、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。\n<strong>著作権保護されている作品は、許諾なしに投稿しないでください!</strong>",
        "copyrightwarning2": "{{SITENAME}}への投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。\n自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。<br />\nまた、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は$1を参照)。\n<strong>著作権保護されている作品は、許諾なしに投稿しないでください!</strong>",
        "timezoneregion-indian": "インド洋",
        "timezoneregion-pacific": "太平洋",
        "allowemail": "他の利用者からのメールを受け取る",
+       "email-allow-new-users-label": "新しいユーザーからのメールを許可する",
        "email-blacklist-label": "次のユーザーからのメールを受け取らない:",
        "prefs-searchoptions": "検索",
        "prefs-namespaces": "名前空間",
        "right-siteadmin": "データベースをロックおよびロック解除",
        "right-override-export-depth": "リンク先ページを5階層まで含めて書き出す",
        "right-sendemail": "他の利用者にメールを送信",
+       "right-sendemail-new-users": "ログに記録されていないユーザーにメールを送信する",
        "right-managechangetags": "[[Special:Tags|タグ]]の作成、有効化および無効化",
        "right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する",
        "right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除",
        "recentchanges-legend": "最近の更新のオプション",
        "recentchanges-summary": "このページでは、このウィキでの最近の更新を確認できます。",
        "recentchanges-noresult": "指定した条件に該当する期間の変更はありません。",
+       "recentchanges-timeout": "この検索はタイムアウトしました。 さまざまな検索パラメータを試してみることもできます。",
+       "recentchanges-network": "技術的なエラーのため、結果をロードできませんでした。ページをリフレッシュしてみてください。",
+       "recentchanges-notargetpage": "上記のページ名を入力すると、そのページに関連する変更が表示されます。",
        "recentchanges-feed-description": "このフィードでこのウィキの最近の更新を追跡できます。",
        "recentchanges-label-newpage": "ページの新規作成",
        "recentchanges-label-minor": "細部の編集",
        "rcfilters-activefilters": "絞り込み",
        "rcfilters-advancedfilters": "詳細フィルター",
        "rcfilters-limit-title": "表示件数の変更",
+       "rcfilters-date-popup-title": "検索期間",
        "rcfilters-days-title": "日数",
        "rcfilters-hours-title": "時間",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|日}}",
        "rcfilters-savedqueries-apply-and-setdefault-label": "既定フィルターを作成",
        "rcfilters-savedqueries-cancel-label": "キャンセル",
        "rcfilters-savedqueries-add-new-title": "現在のフィルター設定を保存する",
+       "rcfilters-savedqueries-already-saved": "これらのフィルタは既に保存されています。設定を変更して、新しい保存フィルタを作成します。",
        "rcfilters-restore-default-filters": "標準設定の絞り込み条件を適用",
        "rcfilters-clear-all-filters": "すべてのフィルターをクリア",
        "rcfilters-show-new-changes": "最新の変更を表示",
        "rcfilters-invalid-filter": "無効なフィルター",
        "rcfilters-empty-filter": "絞り込みは行われていません。全ての項目が表示さます。",
        "rcfilters-filterlist-title": "フィルター",
-       "rcfilters-filterlist-whatsthis": "ã\81\93ã\82\8cã\81¯ä½\95?",
+       "rcfilters-filterlist-whatsthis": "ã\81\93ã\82\8cã\82\89ã\81¯ã\81©ã\81®ã\82\88ã\81\86ã\81«æ©\9fè\83½ã\81\97ã\81¾ã\81\99ã\81\8b?",
        "rcfilters-filterlist-feedbacklink": "(新しい)絞り込み機能に関するフィードバックをお願いします",
        "rcfilters-highlightbutton-title": "該当項目を強調表示する",
        "rcfilters-highlightmenu-title": "色を選ぶ",
        "rcfilters-filter-watchlist-watchednew-description": "ウォッチリストに登録されていて、前回訪れた後に更新があったページ。",
        "rcfilters-filter-watchlist-notwatched-label": "ウォッチリスト登録外",
        "rcfilters-filter-watchlist-notwatched-description": "ウォッチリストに登録されているページ以外の全ての変更。",
+       "rcfilters-filter-watchlistactivity-unseen-label": "保存していません!",
+       "rcfilters-filter-watchlistactivity-unseen-description": "ウォッチリストに登録されていて、前回訪れた後に更新があったページ。",
+       "rcfilters-filter-watchlistactivity-seen-label": "最近の更新",
        "rcfilters-filtergroup-changetype": "変更の種類",
        "rcfilters-filter-pageedits-label": "ページの編集",
        "rcfilters-filter-pageedits-description": "ウィキの本文、議論、カテゴリの説明などの編集",
        "rcfilters-watchlist-showupdated": "最終訪問以降に変更されたページは、塗りつぶされた丸印と一緒に、<strong>太字</strong>で表示されます。",
        "rcfilters-preference-label": "最近の更新の改善版を隠す",
        "rcfilters-preference-help": "2017年のインターフェース更新、当時追加したや以来の新しいツールの使用を断る。",
+       "rcfilters-filter-showlinkedfrom-label": "リンク先ページの変更を表示する",
+       "rcfilters-target-page-placeholder": "ページ名を入力",
        "rcnotefrom": "以下は<strong>$3 $4</strong>以降の{{PLURAL:$5|更新です}} (最大 <strong>$1</strong> 件)。",
        "rclistfromreset": "日時指定をリセット",
        "rclistfrom": "$3の$2以降の更新を表示する",
index 7c4b4f4..d83a5ea 100644 (file)
        "logentry-newusers-byemail": "$1 $3 деген аккаунт {{GENDER:$2|тіркеді}} және құпия сөзі е-пошта арқылы жіберілді",
        "logentry-newusers-autocreate": "$1 қатысушы аккаунтын автоматты түрде {{GENDER:$2|тіркеді}}",
        "logentry-protect-move_prot": "$1 protection settings from $4 дегеннен $3 дегенге қорғалу баптауларын {{GENDER:$2|жылжытты}}",
-       "logentry-protect-unprotect": "$1 $3 бетінің қорғанысын {{GENDER:$2|алыпсады}}",
+       "logentry-protect-unprotect": "$1 $3 бетінің қорғанысын {{GENDER:$2|алып тастады}}",
        "logentry-protect-protect": "$1 $3 бетін {{GENDER:$2|қорғады}}  $4",
        "logentry-protect-modify-cascade": "$1 $3 бетінің қорғалу деңгейін $4 мерзіміне {{GENDER:$2|өзгертті}} [баулы]",
        "logentry-rights-rights": "$1 $3 үшін топ мүшелігін $4 дегеннен $5 дегенге {{GENDER:$2|өзгертті}}",
index 04e37e8..1ceca05 100644 (file)
        "recentchangesdays-max": "최대 $1{{PLURAL:$1|일}}",
        "recentchangescount": "기본으로 보여줄 편집 수:",
        "prefs-help-recentchangescount": "이 설정은 최근 바뀜, 문서 역사와 기록에 적용됩니다.",
-       "prefs-help-watchlist-token2": "ë\82´ ì£¼ì\8b\9c문ì\84\9c ëª©ë¡\9dì\9d\98 ì\9b¹ í\94¼ë\93\9cì\9d\98 ë¹\84ë°\80 í\82¤ì\9e\85ë\8b\88ë\8b¤.\nì\9d´ í\82¤ë¥¼ ì\95\8cê³  ì\9e\88ë\8a\94 ì\82¬ë\9e\8cì\9d\80 ë\82´ ì£¼ì\8b\9c문ì\84\9c ëª©ë¡\9dì\9d\84 ì\9d½ì\9d\84 ì\88\98 ì\9e\88ì\9c¼ë\8b\88 ì\9d´ í\82¤ë¥¼ ê³µì\9c í\95\98ì§\80 ë§\88ì\84¸ì\9a\94.\ní\95\84ì\9a\94í\95\98ë\8b¤ë©´ [[Special:ResetTokens|ì\9d´ í\82¤ë¥¼ ì\9e¬ì\84¤ì \95í\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤]].",
+       "prefs-help-watchlist-token2": "ì\9d´ê²\83ì\9d\80 ë\82´ ì£¼ì\8b\9c문ì\84\9c ëª©ë¡\9dì\9d\98 ì\9b¹ í\94¼ë\93\9cì\9d\98 ë¹\84ë°\80 í\82¤ì\9e\85ë\8b\88ë\8b¤.\nì\9d´ í\82¤ë¥¼ ì\95\8cê³  ì\9e\88ë\8a\94 ì\82¬ë\9e\8cì\9d\80 ë\88\84구ë\93 ì§\80 ë\82´ ì£¼ì\8b\9c문ì\84\9c ëª©ë¡\9dì\9d\84 ì\9d½ì\9d\84 ì\88\98 ì\9e\88ì\9c¼ë\8b\88 ì\9d´ í\82¤ë¥¼ ê³µì\9c í\95\98ì§\80 ë§\88ì\84¸ì\9a\94.\ní\95\84ì\9a\94í\95\98ë\8b¤ë©´ [[Special:ResetTokens|ì\9d´ í\82¤ë¥¼ ì\9e¬ì\84¤ì \95í\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤]].",
        "savedprefs": "설정을 저장했습니다.",
        "savedrights": "{{GENDER:$1|$1}}의 사용자 그룹이 저장되었습니다.",
        "timezonelegend": "시간대:",
        "recentchangeslinked-feed": "가리키는 글의 최근 바뀜",
        "recentchangeslinked-toolbox": "가리키는 글의 최근 바뀜",
        "recentchangeslinked-title": "\"$1\" 문서에 관련된 문서 바뀜",
-       "recentchangeslinked-summary": "지정된 문서를 가리키는 문서(또는 지정된 분류에 들어 있는 문서)에 대한 최근에 바뀐 목록입니다.\n[[Special:Watchlist|주시문서 목록]]에 있는 문서는 <strong>굵게</strong> 나타납니다.",
+       "recentchangeslinked-summary": "해당 문서에 연결된 문서의 변경사항을 확인하려면 문서 이름을 입력하십시오. (분류에 들어있는 문서를 보려면 분류:분류명으로 입력하십시오). [[Special:Watchlist|내 주시문서 목록]]에 있는 문서의 변경사항은 <strong>굵게</strong> 나타납니다.",
        "recentchangeslinked-page": "문서 이름:",
        "recentchangeslinked-to": "해당 문서를 가리키는 문서의 최근 바뀜 보기",
        "recentchanges-page-added-to-category": "[[:$1]]이(가) 분류에 추가되었습니다",
        "autosumm-replace": "내용을 \"$1\"(으)로 바꿈",
        "autoredircomment": "[[$1]] 문서로 넘겨주기",
        "autosumm-removed-redirect": "[[$1]]에 대한 넘겨주기를 제거함",
-       "autosumm-changed-redirect-target": "넘겨주기 대상을 [[$1]]에서 [[$2]](으)로 변경했습니다",
+       "autosumm-changed-redirect-target": "넘겨주기 대상을 [[$1]]에서 [[$2]] 문서로 변경했습니다",
        "autosumm-new": "새 문서: $1",
        "autosumm-newblank": "빈 문서를 만듦",
        "size-bytes": "$1 {{PLURAL:$1|바이트}}",
        "tag-mw-replace-description": "문서 내용 중 90% 보다 많은 내용을 제거한 편집",
        "tag-mw-rollback": "되돌리기",
        "tag-mw-rollback-description": "되돌리기 링크를 사용하여 이전 편집을 되돌리는 편집",
+       "tag-mw-undo": "편집 취소",
+       "tag-mw-undo-description": "편집 취소 링크를 사용하여 이전 편집을 취소하는 편집",
        "tags-title": "태그",
        "tags-intro": "이 문서는 소프트웨어에서 편집에 대해 표시하는 태그와 그 의미를 설명하는 목록입니다.",
        "tags-tag": "태그 이름",
index 2e93cba..1374c9f 100644 (file)
        "svg-long-desc-animated": "Animéierten SVG-Fichier, Basisgréisst $1 x $2 Pixel, Gréisst vum Fichier: $3",
        "svg-long-error": "Ongëltegen SVG-Fichier: $1",
        "show-big-image": "Original Fichier",
-       "show-big-image-preview": "Gréisst vun dësem Preview: $1.",
-       "show-big-image-preview-differ": "Gréisst vun dësem $3-Preview vun dësem $2-Fichier: $1.",
+       "show-big-image-preview": "Gréisst vun dëser Duerstellung: $1.",
+       "show-big-image-preview-differ": "Gréisst vun dëser $3-Duerstellung vun dësem $2-Fichier: $1.",
        "show-big-image-other": "Aner {{PLURAL:$2|Opléisung|Opléisungen}}: $1.",
        "show-big-image-size": "$1 × $2 Pixel",
        "file-info-gif-looped": "endlos Schleef",
index 8ec2530..f29f31d 100644 (file)
        "permissionserrorstext-withaction": "Jūs neturite leidimo $2 dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:",
        "contentmodelediterror": "Jūs negalite redaguoti šios versijos, nes jos turinio modelis yra <code>$1</code>, kuris skiriasi nuo dabartinio puslapio turinio modelio, kuris yra <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Dėmesio: Jūs atkuriate puslapį, kuris anksčiau buvo ištrintas.'''\n\nTurėtumėte nuspręsti, ar reikėtų toliau redaguoti šį puslapį.\nJūsų patogumui čia pateikiamas šio puslapio šalinimų ir perkėlimų sąrašas:",
-       "moveddeleted-notice": "Šis puslapis buvo ištrintas.\nŽemiau pateikiamas puslapio šalinimų ir pervadinimų sąrašas.",
+       "moveddeleted-notice": "Šis puslapis buvo ištrintas.\nŽemiau pateikiamas puslapio šalinimų, apsaugojimų, ir pervadinimų sąrašas.",
        "moveddeleted-notice-recent": "Atsiprašome, šis puslapis neseniai buvo ištrintas (per pastarąsias 24 valandas). Žemiau pateikiama detali puslapio ištrynimo ir perkėlimo istorija.",
        "log-fulllog": "Rodyti visą istoriją",
        "edit-hook-aborted": "Keitimas nutrauktas užlūžimo.\nTam nėra paaiškinimo.",
        "unwatchthispage": "Nustoti stebėti",
        "notanarticle": "Ne turinio puslapis",
        "notvisiblerev": "Versija buvo ištrinta",
-       "watchlist-details": "Stebima {{PLURAL:$1|$1 puslapis|$1 puslapiai|$1 puslapių}}, neskaičiuojant aptarimų puslapių.",
+       "watchlist-details": "Stebima {{PLURAL:$1|$1 puslapis|$1 puslapiai|$1 puslapių}}, (įskaičiuojant aptarimų puslapius).",
        "wlheader-enotif": "El. pašto pranešimai yra įjungti.",
        "wlheader-showupdated": "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra '''paryškinti'''.",
        "wlnote": "{{PLURAL:$1|Rodomas '''$1''' paskutinis pakeitimas, atliktas|Rodomi '''$1''' paskutiniai pakeitimai, atlikti|Rodoma '''$1''' paskutinių pakeitimų, atliktų}} per '''$2''' {{PLURAL:$2|paskutinę valandą|paskutines valandas|paskutinių valandų}}, nuo $3 $4.",
index bda6a87..083141b 100644 (file)
        "mypreferencesprotected": "Jums nav tiesību rediģēt savus iestatījumus.",
        "ns-specialprotected": "Nevar izmainīt īpašās lapas.",
        "titleprotected": "Šī lapa ir aizsargāta pret izveidošanu. To aizsargāja [[User:$1|$1]].\nNorādītais iemesls bija <em>$2</em>.",
+       "invalidtitle-knownnamespace": "Nederīgs nosaukums ar vārdtelpu \"$2\" un tekstu \"$3\"",
+       "invalidtitle-unknownnamespace": "Nederīgs nosaukums ar nezināmu vārdtelpas numuru \"$1\" un tekstu \"$2\"",
        "exception-nologin": "Neesat pieslēdzies",
        "virus-badscanner": "Nekorekta konfigurācija: nezināms vīrusu skeneris: ''$1''",
        "virus-scanfailed": "skenēšana neizdevās (kods $1)",
        "preview": "Pirmskats",
        "showpreview": "Rādīt pirmskatu",
        "showdiff": "Rādīt izmaiņas",
+       "blankarticle": "<strong>Brīdinājums:</strong> Lapa, ko tu veido, ir tukša.\nJa tu vēlreiz nospiedīsi uz \"$1\", tiks izveidota lapa bez jebkāda satura.",
        "anoneditwarning": "<strong>Uzmanību:</strong> tu neesi pieslēdzies. Ja veiksi labojumus, publiski būs redzama tava IP adrese. Ja tu <strong>[$1 pieslēgsies]</strong> vai <strong>[$2 izveidosi kontu]</strong>, visi labojumi tiks piesaistīti tavam kontam; būs arī citi ieguvumi.",
        "anonpreviewwarning": "''Tu neesi ienācis. Saglabājot lapu, Tava IP adrese tiks ierakstīta šīs lapas hronoloģijā.''",
        "missingsummary": "'''Atgādinājums''': Tu neesi norādījis izmaiņu kopsavilkumu. Vēlreiz klikšķinot uz \"Saglabāt lapu\", Tavas izmaiņas tiks saglabātas bez kopsavilkuma.",
        "autosumm-blank": "Nodzēsa lapu",
        "autosumm-replace": "Aizvieto lapas saturu ar '$1'",
        "autoredircomment": "Pāradresē uz [[$1]]",
+       "autosumm-removed-redirect": "Noņēma pāradresāciju uz [[$1]]",
+       "autosumm-changed-redirect-target": "Pāradresācija nomainīta no [[$1]] uz [[$2]]",
        "autosumm-new": "Jauna lapa: $1",
        "autosumm-newblank": "Izveidota tukša lapa",
        "lag-warn-normal": "Izmaiņas, kas ir jaunākas par  $1 {{PLURAL:$1|sekundēm|sekundi|sekundēm}}, var neparādīties šajā sarakstā.",
        "tag-filter-submit": "Filtrs",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Iezīmes|Iezīme|Iezīmes}}]]: $2)",
        "tag-mw-contentmodelchange": "satura modeļa izmaiņa",
+       "tag-mw-contentmodelchange-description": "Labojumi, kas [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel maina lapas satura modeli]",
+       "tag-mw-new-redirect": "Jauna pāradresācija",
+       "tag-mw-new-redirect-description": "Labojumi, kas izveido jaunu pāradresāciju, vai pārveido lapu par pāradresāciju",
+       "tag-mw-removed-redirect": "Noņēma pāradresāciju",
+       "tag-mw-changed-redirect-target": "Pāradresācijas mērķis nomainīts",
+       "tag-mw-changed-redirect-target-description": "Labojumi, kas maina pāradresācijas mērķi",
+       "tag-mw-blank": "Nodzēsta lapa",
+       "tag-mw-blank-description": "Labojumi, kas nodzēš lapas saturu",
+       "tag-mw-replace": "Aizvietots",
+       "tag-mw-replace-description": "Labojumi, kas izņem vairāk kā 90% no lapas satura",
        "tags-title": "Iezīmes",
        "tags-intro": "Šajā lapā uzskaitītas iezīmes, ar kurām programmatūra var atzīmēt labojumus, un to nozīme.",
        "tags-tag": "Iezīmes nosaukums",
index d835015..97745ad 100644 (file)
        "rcfilters-preference-label": "Скриј ја подобрената верзија во Скорешните промени",
        "rcfilters-preference-help": "Го отповикува преуредувањето на околината од 2017 г. и сите алатки додадени оттогаш.",
        "rcfilters-filter-showlinkedfrom-label": "Прикажи промени во страници кои водат од",
-       "rcfilters-filter-showlinkedfrom-option-label": "Прикажи промени во страници кои водат <strong>ОД</strong> страница",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Страници кон кои води</strong> избраната страница",
        "rcfilters-filter-showlinkedto-label": "Прикажи промени во страници кои водат кон",
-       "rcfilters-filter-showlinkedto-option-label": "Прикажи промени во страници кои водат <strong>КОН</strong> страница",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Страници кои води кон</strong> избраната страница",
        "rcfilters-target-page-placeholder": "Внесете страница",
        "rcnotefrom": "Подолу {{PLURAL:$5|е прикажана промената|се прикажани промените}} почнувајќи од <strong>$3, $4</strong>  (се прикажуваат до <b>$1</b>).",
        "rclistfromreset": "Нов избор на датуми",
        "exif-model": "Модел",
        "exif-software": "Користен програм",
        "exif-artist": "Автор",
-       "exif-copyright": "Ð\9dоÑ\81иÑ\82ел Ð½Ð° Ð°Ð²Ñ\82оÑ\80Ñ\81киÑ\82е Ð¿Ñ\80ава",
+       "exif-copyright": "Ð\9fÑ\80аводÑ\80жеÑ\86",
        "exif-exifversion": "Exif-верзија",
        "exif-flashpixversion": "Поддржана верзија на Flashpix",
        "exif-colorspace": "Боен простор",
        "exif-rating": "Оценка (од 5)",
        "exif-rightscertificate": "Уверение за раководство со права",
        "exif-copyrighted": "Авторскоправен статус:",
-       "exif-copyrightowner": "Ð\9dоÑ\81иÑ\82ел Ð½Ð° Ð°Ð²Ñ\82оÑ\80Ñ\81киÑ\82е Ð¿Ñ\80ава",
+       "exif-copyrightowner": "Ð\9fÑ\80аводÑ\80жеÑ\86",
        "exif-usageterms": "Услови на употреба",
        "exif-webstatement": "Изјава за авторското право",
        "exif-originaldocumentid": "Единствена назнака на изворниот документ",
        "tag-mw-replace-description": "Уредувања што отстрануваат преку 90% од содржината на една страница",
        "tag-mw-rollback": "Отповикување",
        "tag-mw-rollback-description": "Уредувања што отповикуваат претходни уредувања користејќи ја соодветната врска",
+       "tag-mw-undo": "Отповикај",
+       "tag-mw-undo-description": "Уредувања што ги отповикуваат претходните уредувања користејќи ја врската за таа намена",
        "tags-title": "Ознаки",
        "tags-intro": "На оваа страница е даден список на ознаки со кои програмската опрема може да ги означи измените и нивното значење.",
        "tags-tag": "Име на ознака",
index 9bed034..cbaa2e5 100644 (file)
@@ -8,7 +8,8 @@
                        "Romaine",
                        "Urhixidur",
                        "아라",
-                       "MokaAkashiyaPT"
+                       "MokaAkashiyaPT",
+                       "Athena in Wonderland"
                ]
        },
        "tog-underline": "Sublinhar lhigaçones:",
        "navigation": "Nabegaçon",
        "and": "&#32;i",
        "faq": "FAQ",
+       "actions": "Açones",
        "namespaces": "Domínios",
        "variants": "Bariadades",
        "navigation-heading": "Menu de nabegaçon",
index 6bd8f38..ff40d9d 100644 (file)
        "botpasswords-bad-appid": "ဘော့အမည် \"$1\" သည် မရေရာပါ။",
        "botpasswords-insert-failed": "ဘော့အမည် \"$1\" ကို ထည့်သွင်းရန် မဖြစ်ပါ။ ထည့်ပြီးသားလား?",
        "botpasswords-created-title": "ဘော့စကားဝှက် ဖန်တီးပြီးပါပြီ",
-       "botpasswords-created-body": "အသုံးပြုသူ \"$2\" ၏ ဘော့အမည် \"$1\" အတွက် ဘော့စကားဝှက် ဖန်တီးပြီးပါပြီ။",
+       "botpasswords-created-body": "{{GENDER:$2|အသုံးပြုသူ}} \"$2\" ၏ ဘော့အမည် \"$1\" အတွက် ဘော့စကားဝှက် ဖန်တီးပြီးပါပြီ။",
        "botpasswords-updated-title": "ဘော့စကားဝှက် မွမ်းမံပြီးပါပြီ",
-       "botpasswords-updated-body": "အသုံးပြုသူ \"$2\" ၏ ဘော့အမည် \"$1\" အတွက် ဘော့စကားဝှက်ကို မွမ်းမံပြီးပါပြီ။",
+       "botpasswords-updated-body": "{{GENDER:$2|အသုံးပြုသူ}}\"$2\" ၏ ဘော့အမည် \"$1\" အတွက် ဘော့စကားဝှက်ကို မွမ်းမံပြီးပါပြီ။",
        "botpasswords-deleted-title": "ဘော့စကားဝှက် ဖျက်ပြီးပါပြီ",
-       "botpasswords-deleted-body": "အသုံးပြုသူ \"$2\" ၏ ဘော့အမည် \"$1\" အတွက် ဘော့စကားဝှက်ကို ဖျက်ပြီးပါပြီ။",
+       "botpasswords-deleted-body": "{{GENDER:$2|အသုံးပြုသူ}} \"$2\" ၏ ဘော့အမည် \"$1\" အတွက် ဘော့စကားဝှက်ကို ဖျက်ပြီးပါပြီ။",
        "resetpass_forbidden": "စကားဝှက် ပြောင်းမရနိုင်ပါ",
        "resetpass-no-info": "ဤစာမျက်နှာကို တိုက်ရိုက်အသုံးပြုနိုင်ရန်အတွက် Log in ဝင်ထားရပါမည်။",
        "resetpass-submit-loggedin": "စကားဝှက်ပြောင်းရန်",
        "rcfilters-group-results-by-page": "စာမျက်နှာအလိုက် ရလဒ်များ အုပ်စုဖွဲ့ရန်",
        "rcfilters-activefilters": "သက်ဝင်နေသာ filter များ",
        "rcfilters-advancedfilters": "အဆင့်မြင့် filter များ",
-       "rcfilters-limit-title": "á\80\95á\80¼á\80\9eá\80\99á\80\8aá\80·á\80º á\80\95á\80¼á\80±á\80¬á\80\84á\80ºá\80¸á\80\9cá\80²á\80\99á\80¾á\80¯များ",
+       "rcfilters-limit-title": "á\80\95á\80¼á\80\9eá\80\99á\80\8aá\80·á\80º á\80\9bá\80\9cá\80\92á\80ºများ",
        "rcfilters-days-title": "မကြာသေးမီက ရက်များ",
        "rcfilters-hours-title": "မကြာသေးမီက နာရီများ",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|ရက်|ရက်}}",
        "recentchangeslinked-feed": "ဆက်စပ်သော ​အ​ပြောင်း​အ​လဲ​များ​",
        "recentchangeslinked-toolbox": "ဆက်စပ်သော အပြောင်းအလဲများ",
        "recentchangeslinked-title": "\"$1\" နှင့် ဆက်စပ်သော အပြောင်းအလဲများ",
-       "recentchangeslinked-summary": "á\80¤á\80\9eá\80\8aá\80ºá\80\99á\80¾á\80¬ á\80\9eá\80®á\80¸á\80\9eá\80\94á\80·á\80ºá\80\95á\80¼á\80\91á\80¬á\80¸á\80\9eá\80±á\80¬ á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬ (á\80\9eá\80­á\80¯á\80· á\80\9eá\80®á\80¸á\80\9eá\80\94á\80·á\80ºá\80\80á\80\8fá\80¹á\80\8dá\80\99á\80»á\80¬á\80¸) á\80\99á\80¾ á\80\8aá\80½á\80¾á\80\94á\80ºá\80¸á\80\91á\80¬á\80¸á\80\9eá\80±á\80¬ á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\81\8f á\80\9cá\80\90á\80ºá\80\90á\80\9cá\80±á\80¬ á\80\95á\80¼á\80±á\80¬á\80\84á\80ºá\80¸á\80\9cá\80²á\80\99á\80¾á\80¯á\80\99á\80»á\80¬á\80¸á\81\8f á\80\85á\80¬á\80\9bá\80\84á\80ºá\80¸á\80\96á\80¼á\80\85á\80ºá\80\9eá\80\8aá\80ºá\81\8b [[Special:Watchlist|á\80\85á\80±á\80¬á\80\84á\80·á\80ºá\80\80á\80¼á\80\8aá\80·á\80ºá\80\85á\80¬á\80\9bá\80\84á\80ºá\80¸]] á\80\99á\80¾ á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ á\80\85á\80¬á\80\9cá\80¯á\80¶á\80¸á\80\99á\80\8aá\80ºá\80¸ဖြင့် ပြထားသည်။",
+       "recentchangeslinked-summary": "á\80¤á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80¾ á\80\9eá\80­á\80¯á\80·á\80\99á\80\9fá\80¯á\80\90á\80º á\80¤á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\9eá\80­á\80¯á\80· á\80\81á\80»á\80­á\80\90á\80ºá\80\86á\80\80á\80ºá\80\91á\80¬á\80¸á\80\9eá\80±á\80¬ á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\81\8f á\80\95á\80¼á\80±á\80¬á\80\84á\80ºá\80¸á\80\9cá\80²á\80\99á\80¾á\80¯á\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ á\80\80á\80¼á\80\8aá\80·á\80ºá\80\9bá\80¾á\80¯á\80\94á\80­á\80¯á\80\84á\80ºá\80\9bá\80\94á\80º á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80¡á\80\99á\80\8aá\80ºá\80\90á\80\85á\80ºá\80\81á\80¯á\80\80á\80­á\80¯ á\80\91á\80\8aá\80·á\80ºá\80\9eá\80½á\80\84á\80ºá\80¸á\80\95á\80«á\81\8b (á\80\80á\80\8fá\80¹á\80\8dá\80\90á\80\85á\80ºá\80\81á\80¯á\81\8f á\80¡á\80\96á\80½á\80²á\80·á\80\9dá\80\84á\80ºá\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ á\80\80á\80¼á\80\8aá\80·á\80ºá\80\9bá\80¾á\80¯á\80\9bá\80\94á\80º Category:á\80\80á\80\8fá\80¹á\80\8dá\80¡á\80\99á\80\8aá\80º á\80\80á\80­á\80¯ á\80\9bá\80­á\80¯á\80\80á\80ºá\80\91á\80\8aá\80·á\80ºá\80\95á\80«á\81\8b) [[Special:Watchlist|á\80\9eá\80\84á\80·á\80ºá\80\85á\80±á\80¬á\80\84á\80·á\80ºá\80\80á\80¼á\80\8aá\80·á\80ºá\80\85á\80¬á\80\9bá\80\84á\80ºá\80¸]]á\80\9bá\80¾á\80­ á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\81\8f á\80\95á\80¼á\80±á\80¬á\80\84á\80ºá\80¸á\80\9cá\80²á\80\99á\80¾á\80¯á\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ <strong>á\80\85á\80¬á\80\9cá\80¯á\80¶á\80¸á\80¡á\80\91á\80°</strong>ဖြင့် ပြထားသည်။",
        "recentchangeslinked-page": "စာမျက်နှာ အမည် -",
        "recentchangeslinked-to": "ပေးထားသော စာမျက်နှာများအစား လင့်များနှင့် ဆက်စပ်နေသာ စာမျက်နှာများ၏ အပြောင်းအလဲများကို ပြရန်",
        "recentchanges-page-added-to-category": "ကဏ္ဍထဲသို့ [[:$1]] ကို ပေါင်းထည့်ခဲ့သည်",
        "table_pager_empty": "မည်သည့်ရလဒ်မှ မရှိပါ",
        "autosumm-blank": "စာမျက်နှာကို ဗလာလုပ်လိုက်သည်",
        "autoredircomment": "စာမျက်နှာကို [[$1]] သို့ ပြန်ညွှန်းလိုက်သည်",
+       "autosumm-changed-redirect-target": "ပြန်ညွှန်းကို [[$1]] မှ [[$2]] သို့ ပြောင်းလဲခဲ့သည်",
        "autosumm-new": "\"$1\" အစချီသော စာလုံးတို့နှင့် စာမျက်နှာကို ဖန်တီးလိုက်သည်",
        "size-bytes": "$1 {{PLURAL:$1|ဘိုက်|ဘိုက်}}",
        "watchlistedit-normal-title": "စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်",
        "tag-filter": "[[Special:Tags|Tag]] သီးသန့်စစ်ထုတ်ရန် -",
        "tag-filter-submit": "စိစစ်မှု",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|စာတွဲ|စာတွဲများ}}]]: $2)",
+       "tag-mw-new-redirect": "ပြန်ညွှန်းအသစ်",
+       "tag-mw-removed-redirect": "ပြန်ညွှန်းကို ဖယ်ရှားခဲ့သည်",
+       "tag-mw-changed-redirect-target": "ပြန်ညွှန်းကို ပြောင်းလဲခဲ့သည်",
+       "tag-mw-blank": "ဗလာပြုလုပ်ခြင်း",
+       "tag-mw-replace": "အစားထိုးခဲ့သည်",
+       "tag-mw-rollback": "နောက်ပြန် ပြန်ပြင်ခြင်း",
        "tags-title": "အမည်တွဲ",
        "tags-tag": "အမည်တွဲ အမည်",
        "tags-active-yes": "မှန်",
index aa9636f..895a91a 100644 (file)
        "rcfilters-preference-label": "Skjul den forbedrede versjonen av siste endringer",
        "rcfilters-preference-help": "Fjerner grensesnittendringen fra 2017 og alle verktøyene som ble lagt fra og med da.",
        "rcfilters-filter-showlinkedfrom-label": "Vis endringer på sider som lenkes fra",
-       "rcfilters-filter-showlinkedfrom-option-label": "Vis endringer på sider som lenkes <strong>FRA</strong> en side",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Sider som lenkes fra</strong> den valgte siden",
        "rcfilters-filter-showlinkedto-label": "Vis endringer på sider som lenker til",
-       "rcfilters-filter-showlinkedto-option-label": "Vis endringer på sider som lenker <strong>TIL</strong> en side",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Sider som lenker til</strong> den valgte siden",
        "rcfilters-target-page-placeholder": "Skriv inn et sidenavn",
        "rcnotefrom": "Nedenfor er vist {{PLURAL:$5|endringen|endringene}} som er gjort siden <strong>$3, $4</strong> (frem til <strong>$1</strong>).",
        "rclistfromreset": "Nullstill datovalg",
        "tag-mw-replace-description": "Redigeringer som fjerner mer enn 90 % av innholdet på en side",
        "tag-mw-rollback": "Tilbakestilling",
        "tag-mw-rollback-description": "Redigeringer som tilbakestiller redigeringer med tilbakestillingsknappen",
+       "tag-mw-undo": "Endringsomgjøring",
+       "tag-mw-undo-description": "Redigeringer som fjerner tidligere redigeringer med lenka «{{int:editundo}}»",
        "tags-title": "Tagger",
        "tags-intro": "Denne siden lister opp taggene programvaren kan merke en endring med, og hva de betyr.",
        "tags-tag": "Taggnavn",
index b8d8b37..75d2fef 100644 (file)
        "rcfilters-preference-label": "Verberg de verbeterde versie van recente wijzigingen",
        "rcfilters-preference-help": "Zet het oude uiterlijk van de recente wijzigingen-pagina terug, inclusief alle hulpmiddelen die sindsdien zijn toegevoegd.",
        "rcfilters-filter-showlinkedfrom-label": "Toon wijzigingen op pagina's gekoppeld aan",
-       "rcfilters-filter-showlinkedfrom-option-label": "Toon wijzigingen op paginas gekoppeld <strong>AAN</strong> een pagina",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Paginas gekoppeld aan</strong> de geselecteerde pagina",
        "rcfilters-filter-showlinkedto-label": "Toon wijzigingen op pagina's gekoppeld naar",
-       "rcfilters-filter-showlinkedto-option-label": "Toon wijzigingen op pagina's gekoppeld <strong>NAAR</strong> een pagina",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Pagina's gekoppeld naar</strong> de geselecteerde pagina",
        "rcfilters-target-page-placeholder": "Voer een paginanaam in",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
        "rclistfromreset": "Datum selectie opnieuw instellen",
        "tag-mw-replace-description": "Bewerkingen die meer dan 90% van de pagina verwijderen",
        "tag-mw-rollback": "Terugdraaiing",
        "tag-mw-rollback-description": "Bewerkingen die eerdere bewerkingen terugdraaien door middel van de koppeling \"terugdraaien\"",
+       "tag-mw-undo": "Ongedaan maken",
+       "tag-mw-undo-description": "Bewerkingen die vorige bewerkingen door middel van de ongedaan maken koppeling ongedaan maken",
        "tags-title": "Labels",
        "tags-intro": "Op deze pagina staan de labels waarmee de software iedere bewerking kan markeren, en hun betekenis.",
        "tags-tag": "Labelnaam",
index 9ffc4f9..225857c 100644 (file)
        "action-upload_by_url": "laste påå denne fila frå ein URL",
        "action-writeapi": "bruke skrive-API",
        "action-delete": "slette denne sida",
-       "action-deleterevision": "slette denne endringa",
+       "action-deleterevision": "slette versjonar",
        "action-deletedhistory": "sjå slettehistorikken til sida",
+       "action-deletedtext": "sjå teksten til sletta versjonar",
        "action-browsearchive": "søke i sletta sider",
        "action-undelete": "attopprette denne sida",
        "action-suppressrevision": "sjå og attopprette denne skjulte endringa",
        "table_pager_limit_submit": "Gå",
        "table_pager_empty": "Ingen resultat",
        "autosumm-blank": "Tømde sida",
-       "autosumm-replace": "Erstattar innhaldet på sida med «$1»",
+       "autosumm-replace": "Erstatta innhaldet på sida med «$1»",
        "autoredircomment": "Omdirigerer til [[$1]]",
+       "autosumm-removed-redirect": "Fjerna omdirigering til [[$1]]",
+       "autosumm-changed-redirect-target": "Endra omdirigeringsmål frå [[$1]] til [[$2]]",
        "autosumm-new": "Oppretta sida med «$1»",
        "autosumm-newblank": "Oppretta tom side",
        "lag-warn-normal": "Endringar som er nyare enn {{PLURAL:$1|sekund|sekund}} er ikkje viste på denne lista.",
        "tag-filter-submit": "Filtrer",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merke}}]]: $2)",
        "tag-mw-contentmodelchange": "endring av innhaldsmodell",
+       "tag-mw-new-redirect": "Ny omdirigering",
        "tag-mw-removed-redirect": "Fjerna omdirigering",
        "tag-mw-changed-redirect-target": "Omdirigeringsmål endra",
        "tag-mw-changed-redirect-target-description": "Endringar som endrar målet til ei omdirigering",
        "compare-invalid-title": "Tittelen du oppgav er ugild.",
        "compare-title-not-exists": "Tittelen du oppgav finst ikkje.",
        "compare-revision-not-exists": "Versjonen du oppgav finst ikkje.",
-       "diff-form": "eit '''skjema'''",
+       "diff-form": "Skilnader",
+       "permanentlink": "Fast lenkje",
+       "permanentlink-revid": "Versjons-ID",
+       "permanentlink-submit": "Gå til versjon",
        "dberr-problems": "Nettstaden har tekniske problem.",
        "dberr-again": "Venta nokre minutt og last sida inn på nytt.",
        "dberr-info": "(Kan ikkje kontakta databasetenaren: $1)",
        "logentry-delete-delete": "$1 {{GENDER:$2|sletta}} sida $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|sletta}} omdirigeringa $3 gjennom overskriving",
        "logentry-delete-restore": "$1 {{GENDER:$2|attoppretta}} sida $3 ($4)",
+       "restore-count-revisions": "{{PLURAL:$1|éin versjon|$1 versjonar}}",
        "logentry-delete-event": "$1 {{GENDER:$2|endra}} synlegdomen av {{PLURAL:$5|éi loggoppføring|$5 loggoppføringar}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|endra}} synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|endra}} synlegdomen til loggoppføringar på $3",
        "date-range-to": "Til dato:",
        "randomrootpage": "Tilfeldig rotside",
        "log-action-filter-rights": "Type endring av rettar:",
+       "log-action-filter-delete-delete_redir": "Overskriving av omdirigering",
+       "log-action-filter-delete-restore": "Attoppretting av side",
+       "log-action-filter-delete-revision": "Versjonssletting",
+       "log-action-filter-move-move": "Flytting utan overskriving av omdirigeringar",
+       "log-action-filter-move-move_redir": "Flytting med overskriving av omdirigeringar",
+       "log-action-filter-suppress-revision": "Versjonsundertrykking",
        "authmanager-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
        "authmanager-provider-temporarypassword": "Mellombels passord",
        "userjsispublic": "Merk: JavaScript-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar.",
-       "usercssispublic": "Merk: CSS-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar."
+       "usercssispublic": "Merk: CSS-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar.",
+       "revid": "versjon $1"
 }
index dd45a21..68bca8a 100644 (file)
        "parser-template-loop-warning": "Wykryto pętlę w szablonie [[$1]]",
        "template-loop-category": "Strony z pętlami szablonów",
        "template-loop-category-desc": "Strona zawiera pętlę szablonów, czyli szablon, który wywołuje sam siebie rekursywnie.",
+       "template-loop-warning": "<strong>Ostrzeżenie:</strong> Ta strona wywołuje [[:$1]], co tworzy pętlę szablonu (nieskończone wywołanie rekurencyjne).",
        "parser-template-recursion-depth-warning": "Przekroczno limit głębokości rekurencji szablonu ($1)",
        "language-converter-depth-warning": "Przekroczono ograniczenie ($1) głębokości zagnieżdżenia konwersji językowej",
        "node-count-exceeded-category": "Strony, gdzie przekroczono liczbę węzłów",
        "uploadbtn": "Prześlij plik",
        "reuploaddesc": "Przerwij wysyłanie i wróć do formularza wysyłki",
        "upload-tryagain": "Zapisz zmieniony opis pliku",
+       "upload-tryagain-nostash": "Prześlij ponownie przesłany plik i zmodyfikowany opis",
        "uploadnologin": "Nie jesteś zalogowany",
        "uploadnologintext": "Musisz $1 przed przesłaniem plików.",
        "upload_directory_missing": "Katalog dla przesyłanych plików ($1) nie istnieje i nie może zostać utworzony przez serwer WWW.",
        "file-deleted-duplicate-notitle": "Plik jest identyczny z plikiem, który został wcześniej usunięty, a jego nazwa została ukryta. Należy poprosić kogoś z możliwością przeglądania ukrytych danych, aby przeanalizował sytuację przed przystąpieniem do jego ponownego przesłania.",
        "uploadwarning": "Ostrzeżenie o przesyłaniu",
        "uploadwarning-text": "Zmień poniższy opis pliku i spróbuj ponownie.",
+       "uploadwarning-text-nostash": "Ponownie prześlij plik, zmodyfikuj poniższy opis i spróbuj ponownie.",
        "savefile": "Zapisz plik",
        "uploaddisabled": "Przesyłanie plików wyłączone",
        "copyuploaddisabled": "Przesyłanie poprzez podanie adres URL jest wyłączone.",
        "uploadstash-exception": "Nie udało się zapisać przesyłanego pliku w magazynie tymczasowym ($1): „$2”.",
        "uploadstash-bad-path": "Ścieżka nie istnieje.",
        "uploadstash-bad-path-invalid": "Ścieżka jest nieprawidłowa.",
+       "uploadstash-bad-path-unknown-type": "Nieznany typ „$1”.",
+       "uploadstash-file-not-found-no-thumb": "Nie można uzyskać miniaturki.",
+       "uploadstash-file-not-found-no-local-path": "Brak lokalnej ścieżki dla skalowanego elementu.",
+       "uploadstash-file-not-found-no-object": "Nie można utworzyć lokalnego obiektu pliku dla miniatury.",
+       "uploadstash-file-not-found-no-remote-thumb": "Nie udało się pobrać miniatury: $1\nURL = $2",
        "uploadstash-file-not-found-missing-content-type": "Brakuje nagłówka content-type.",
+       "uploadstash-file-too-large": "Nie można wyświetlić pliku większego niż $1 bajtów.",
+       "uploadstash-not-logged-in": "Użytkownik nie jest zalogowany, a pliki muszą należeć do użytkowników.",
+       "uploadstash-wrong-owner": "Ten plik ($1) nie należy do bieżącego użytkownika.",
+       "uploadstash-no-extension": "Rozszerzenie ma wartość zerową.",
+       "uploadstash-zero-length": "Plik ma zerowy rozmiar.",
        "invalid-chunk-offset": "Nieprawidłowe przesunięcie fragmentu",
        "img-auth-accessdenied": "Odmowa dostępu",
        "img-auth-nopathinfo": "Brak PATH_INFO.\nSerwer nie został skonfigurowany, tak aby przekazywał tę informację.\nMożliwe, że jest oparty na CGI i nie może obsługiwać img_auth.\nWięcej o informacji o autoryzacji grafik na https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "sp-contributions-newonly": "Pokazuj tylko edycje tworzące nową stronę",
        "sp-contributions-hideminor": "Ukryj drobne zmiany",
        "sp-contributions-submit": "Szukaj",
+       "sp-contributions-outofrange": "Nie można wyświetlić żadnych wyników. Żądany zakres IP jest większy niż limit CIDR równy /$1.",
        "whatlinkshere": "Linkujące",
        "whatlinkshere-title": "Strony linkujące do „$1”",
        "whatlinkshere-page": "Strona:",
        "ipb_blocked_as_range": "Błąd – adres IP $1 nie został zablokowany bezpośrednio i nie może zostać odblokowany.\nNależy on do zablokowanego zakresu adresów $2. Odblokować można tylko cały zakres.",
        "ip_range_invalid": "Niepoprawny zakres adresów IP.",
        "ip_range_toolarge": "Zakresy IP większe niż /$1 są niedozwolone.",
+       "ip_range_exceeded": "Zakres IP przekracza zakres maksymalny. Dozwolony zakres to /$1.",
        "proxyblocker": "Blokowanie proxy",
        "proxyblockreason": "Twój adres IP został zablokowany, ponieważ jest to adres otwartego proxy.\nO tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dostawcę Internetu lub pomoc techniczną.",
        "sorbsreason": "Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.",
        "tag-mw-replace-description": "Edycja, która usuwa ponad 90% zawartości strony",
        "tag-mw-rollback": "Wycofanie zmian",
        "tag-mw-rollback-description": "Edycja, która przywraca poprzednią wersję przy użyciu funkcji cofania zmian (rollback)",
+       "tag-mw-undo": "Cofnij",
        "tags-title": "Znaczniki",
        "tags-intro": "Na tej stronie znajduje się lista znaczników, którymi oprogramowanie może oznaczyć edycje, oraz ich opisy.",
        "tags-tag": "Nazwa znacznika",
index 9c13b73..a757afc 100644 (file)
        "anontalkpagetext": "----''دا د يوه ورکنومي کارن چې کارن-نوم نه لري او يا خپل کارن-نوم نه کاروي، د سکالو يوه پاڼه ده. نو د يوه کس د پېژندلو پخاطر موږ د هماغه کارن د انټرنېټ شمېره يا IP پته دلته ثبتوؤ. داسې يوه IP پته د ډېرو کارنانو لخوا هم کارېدلی شي. که تاسې يو ورکنومی کارن ياست او تاسې ته دا څرگندېږي چې تاسې ته نااړونده پېغامونه او تبصرې اشاره شوي، نو د نورو بې نومو کارنانو او ستاسې ترمېنځ د ټکنتوب د مخ نيونې لپاره لطفاً [[Special:CreateAccount|يو گڼون جوړ کړۍ]] او يا هم [[Special:UserLogin|غونډال ته ورننوځۍ]].''",
        "noarticletext": "دم مهال په دې مخ کې څه نشته.\nتاسې کولای شی چې په نورو مخونو کې [[Special:Search/{{PAGENAME}}|د دې مخ د سرليک پلټنه]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د اړوندو يادښتونو پلټنه] ،\nاو يا [{{fullurl:{{FULLPAGENAME}}|action=edit}} همدا مخ جوړ کړئ]</span>.",
        "noarticletext-nopermission": "دم مهال په دې مخ کې متن نشته.\nتاسې کولای شی چې [[Special:Search/{{PAGENAME}}|همدا سرليک په نورو مخونو کې وپلټۍ]]، يا هم <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} اړونده يادښتونه وپلټۍ]</span>، خو تاسې د دې مخ د جوړولو اجازه نه لرۍ.",
+       "missing-revision": "سمون #$1 د «{{FULLPAGENAME}}» څخه شتون نه لري.\n\nدا عموما د ړنگ شوي مخ د تاریخ لپاره د لینک لاندینۍ پيښې سره تړاو لري.\nکولای شي نور معلومات [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ړنګ شوي] ساحه کې پيدا کړي.",
        "userpage-userdoesnotexist": "د \"<nowiki>$1</nowiki>\" گڼون نه دی ثبت شوی.\nلطفاً ځان ډاډه کړئ چې آيا تاسې په رښتيا همدا مخ جوړول/سمول غواړئ.",
        "userpage-userdoesnotexist-view": "د \"$1\" گڼون نه دی ثبت شوی.",
        "blocked-notice-logextract": "دم مهال په دې کارن بنديز لگېدلی.\nد بنديز يادښت تازه مالومات په لاندې توگه دي:",
        "userjspreview": "'''هېر مو نشي چې دا يوازې ستاسې د کارن د جاوا سکرېپټ آزمېيل/مخليدنه ده.'''\n'''تر اوسه پورې لا ستاسې بدلونونه نه دي خوندي شوي!'''",
        "sitecsspreview": "'''په پام کې دې وي چې دا يوازې ستاسې د CSS مخليدنه ده.'''\n'''تر اوسه پورې لا ستاسې بدلونونه نه دي خوندي شوي!'''",
        "sitejspreview": "'''په پام کې مو اوسه چې تاسې يوازې د دغه جاواسکرېپټ کوډ مخليدنه کوۍ.'''\n'''تر اوسه پورې دا نه دی خوندي شوی!'''",
+       "userinvalidcssjstitle": "<strong>خبرداری:</strong>دلته  هیڅ پوست نشته \"$1\".\nد ګمرکونو .ثي اس اس او .ج س مخونه  کوچني سرلیک استعمالوي، او داسې نور. {{ns:user}}:Foo/vector.css  که مخالف وي نو {{ns:user}}:Foo/Vector.css.",
        "updated": "(تازه)",
        "note": "'''يادونه:'''",
        "previewnote": "'''هېر مو نه شي چې دا يواځې يوه مخليدنه ده.'''\nستاسې لخوا ترسره شوي بدلونونه لا تر اوسه پورې نه دي خوندي شوي!!",
        "continue-editing": "د سمولو سيمې ته ورتلل",
+       "previewconflict": "دا غوښتنه د متن د سمون په سیمه کې متن منعکس کوي ځکه چې دا به هلته ښکاره شي چي تاسو يي د خوندي کولو لپاره غوره کړئ.",
+       "session_fail_preview": "وبخښي! موږ د سیشن ډاټا د ضایع کيدلو له امله ستاسو سمون ندی ترسره کړي..\n\nکېدی شي تاسو د سيسټم څخه وتلي ياست. <strong>لطفا تایید کړئ چې تاسو لا تر اوسه ننوتلي یاست او کړنه بیا ترسره کړئ</strong>.\nکه دا تراوسه لا هم کار نه کوي، نو بيا يو ځل [[Special:UserLogout|د دي ځای څخه ووځي]] او بيرته راننوځي، او ډاډه کړئ چې ستاسو براؤزر اجازه لري چې د دې سایټ څخه کوکیز ترلاسه کړي.",
+       "session_fail_preview_html": "وبخښي! موږ د سیشن ډاټا د ضایع کيدلو له امله ستاسو سمون ندی ترسره کړي..\n\n<em>ځکه د {{SITENAME}} اي ټي ام ال لين بند کړل شوي وو،  وړاندې کول د جاواسکرېپ بریدونو په وړاندې د احتیاط په توګه پټ شوي.</em>\n\n<strong>که دا د قانوني سمونې هڅه وي، لطفا بیا هڅه وکړئ.</strong>\nکه دا تراوسه لا هم کار نه کوي، نو بيا يو ځل [[Special:UserLogout|د دي ځای څخه ووځي]] او بيرته راننوځي، او ډاډه کړئ چې ستاسو براؤزر اجازه لري چې د دې سایټ څخه کوکیز ترلاسه کړي.",
+       "token_suffix_mismatch": "<strong>ستاسو سمون ونه منل شو ځکه چې ستاسو مراجع د تفتیش په نښه کې د تکرار تورو نښې نښانې کړي.</strong>\nدا سمون د پاڼې د ټکو د فساد مخنیولو لپاره ونه منل شوه.\nدا کله پېښ شي چې تاسو د ګوتو ویب سایټ پریمین پراکسي خدمت کاروئ.",
+       "edit_form_incomplete": "<strong>د سمون فورم ځینې برخې وانه وښتي; دوه ځله يي وګورئ چې ستاسو سمونونه پاتي دي او بیا هڅه وکړئ.</strong>",
        "editing": "د $1 سمونه",
        "creating": "$1 جوړېدنې کې دی",
        "editingsection": "$1 (برخه) په سمېدنې کې دی",
        "editingcomment": "د $1 سمون (نوې برخه)",
        "editconflict": "په سمولو کې خنډ: $1",
+       "explainconflict": "بل چا په دې مخ کي هغه وخت سمون راوست چې تاسو هم په سمون اخته وست.\nد مخ په ساحه کې دا  متن شامل دي ځکه چې دا اوس مهال شتون لري.\nستاسو بدلونونه په لاندې متن کې ښودل شوي.\nتاسو باید خپل بدلونونه په موجوده متن کې ضمیمه کړئ..\n<strong>يوازې</strong> د متن په ساحه کې به متن هغه وخت خوندي شي کله چې تاسو دلته  \"$1\" کليک کړي.",
        "yourtext": "ستاسې متن",
        "storedversion": "زېرمه شوې مخکتنه",
        "yourdiff": "توپيرونه",
        "recreate-moveddeleted-warn": "'''گواښنه: تاسې د يوه داسې مخ بياجوړونه کوۍ کوم چې يو ځل پخوا ړنگ شوی وو.'''\n\nپکار ده چې تاسې په دې ځان پوه کړۍ چې ايا دا تاسې ته وړ ده چې د همدې مخ جوړول په پرله پسې توگه وکړۍ.\nستاسې د اسانتياوو لپاره د همدې مخ د ړنگېدلو يادښت هم ورکړ شوی:",
        "moveddeleted-notice": "دا مخ ړنگ شوی.\nدلته لاندې ددې مخ د ړنگېدنې او لېږدېدنې ياداښت د سرچينې په توگه ورکړل شوی دي.",
        "log-fulllog": "بشپړ يادښت کتل",
+       "edit-hook-aborted": "ړنګول د هوک په واسطه وتړل شو.\nدا نور هيڅ څرګندوني نه ورکوي.",
        "edit-gone-missing": "د دې مخ اوسمهالول و نه کړای شول.\nداسې ښکاري چې دا مخ ړنگ شوی.",
        "edit-conflict": "د سمولو خنډ",
        "edit-no-change": "ستاسې سمون بابېزه وګڼل شو، دا ځکه چې تاسې په متن کې کوم بدلون نه دی راوستلی.",
        "postedit-confirmation-saved": "ستاسې سمون خوندي شو.",
        "edit-already-exists": "په دې نوم يو نوی مخ جوړ نه شو.\nپدې نوم د پخوا نه يو مخ شته.",
        "defaultmessagetext": "تلواليزه پيغام متن",
+       "content-failed-to-parse": "په منځپانګې کې د ناسم کولو ناکامي $2 د موډل لپاره $1: $3",
        "invalid-content-data": "د ناباوره منځپانګې ډاټا",
        "content-not-allowed-here": "\"$1\" په پاڼه کې منځپانګې ته اجازه نشته [[$2]]",
        "editpage-invalidcontentmodel-text": "د منځپانګې موډيول \"$1\" ملاتړ ندی شوی.",
        "grant-editpage": "شته مخونه سمول",
        "grant-editprotected": "ژغورلي مخونه سمول",
        "grant-highvolume": "د لوړ حجم سمون",
-       "grant-oversight": "د Ú©Ø§Ø±Ù\88Ù\88Ù\86Ú©Ù\88 Ù¾Ù¼Ù\88Ù\84 Ø§Ù\88 Ø¨Û\8cا Ú©ØªÙ\86Ù\87 Ú©Ù\88Ù\84",
+       "grant-oversight": "د Ú©Ø§Ø±Ù\88Ù\88Ù\86Ú©Ù\88 Ù¾Ù¼Ù\88Ù\84 Ø¯ Ù\87غÙ\88Ù\8a Ø¯ Ø³Ù\85Ù\88Ù\86Ù\88 Ø³Ø±Ù\87",
        "grant-patrol": "د مخونو بدلونونه ګزمه کړي",
        "grant-privateinfo": "شخصي معلوماتو ته لاسرسۍ",
+       "grant-protect": "د مخونو ژغورنه او ژغورنه لري کونه",
+       "grant-rollback": "د مخونو بدلونونه راګرځونکي",
        "grant-sendemail": "نورو کارنانو ته برېښليک لېږل",
+       "grant-uploadeditmovefile": "پورته کول، د دوتنو لیږد او بدلونه",
        "grant-uploadfile": "نوې دوتنې پورته کول",
        "grant-basic": "بنسټيزې رښتې",
+       "grant-viewdeleted": "ړنګ شوي دوتنې او مخونه کتونکي",
        "grant-viewmywatchlist": "خپل کتنلړ کتل",
+       "grant-viewrestrictedlogs": "محدود شوي ننوتلي ثبتونې وګورئ",
        "newuserlogpage": "د کارن-نوم د جوړېدو يادښت",
        "newuserlogpagetext": "دا د کارن-نوم د جوړېدو يادښت دی",
        "rightslog": "د کارن رښتو يادښت",
        "backend-fail-create": "د \"$1\" په دوتنه کې نور څه و نه ليکل شول.",
        "zip-wrong-format": "ځانگړې شوې دوتنه يوه ZIP دوتنه نه وه.",
        "uploadstash": "پورته کول سټش",
+       "uploadstash-clear": "پاک شوي دوتنې",
+       "uploadstash-nofiles": "تاسو جعلي فایلونه نلرئ.",
+       "uploadstash-badtoken": "د دې عمل تعقیب ناکام شو، شاید ممکن چې ستاسو د سمون اعتباري اسناد پای ته ورسیږي. مهرباني وکړئ بیا هڅه وکړئ.",
+       "uploadstash-errclear": "د دوتنو پاکول ناکام شول.",
        "uploadstash-refresh": "د دوتنو لړليک بياتازه کول",
+       "uploadstash-thumbnail": "تڼۍ وګوره",
+       "uploadstash-exception": "د زیرمه د بار د ژغورلو توان نلري ($1): \"$2\".",
+       "uploadstash-bad-path": "نښان نشته",
+       "uploadstash-bad-path-invalid": "د پوست پېژند سم نه دی.",
        "uploadstash-bad-path-unknown-type": "ناڅرگنده ډول \"$1\".",
+       "uploadstash-bad-path-unrecognized-thumb-name": "ناپیژندل شوی ګوته نوم.",
+       "uploadstash-bad-path-no-handler": "د  $1 د ښکاره کولو لپار دوتنه $2 اجرایی وړ ونه موندل شي.",
+       "uploadstash-bad-path-bad-format": "کیلي \"$1\" په مناسبه بڼه نده.",
+       "uploadstash-file-not-found": "په \"$1\" کي فلش ونه موندل شو.",
+       "uploadstash-file-not-found-no-thumb": "تڼۍ ونه موندل شوه.",
+       "uploadstash-file-not-found-no-local-path": "د وړ شوي توکي لپاره محلي لاره نشته.",
+       "uploadstash-file-not-found-no-object": "د تاليف لپاره د ځایي دوتنې اعتراض نشي جوړولی.",
+       "uploadstash-file-not-found-no-remote-thumb": "د تڼۍ په ترلاسه کولو کې پاتې راغلي:$1\nنښاني= $2",
+       "uploadstash-file-not-found-missing-content-type": "ورک شوي مواد - د سرلیک ډول.",
+       "uploadstash-file-not-found-not-exists": "لاره نشي موندل کیدی، یا په یو ساده ډول دوتنه نشته.",
+       "uploadstash-file-too-large": "د $1 بټونو څخه لوړې دوتني نشي سرويس کولاي.",
+       "uploadstash-not-logged-in": "هیڅ کارن نه دی ننوتلي، دوتنې باید د کاروونکو سره تړاو ولري.",
+       "uploadstash-wrong-owner": "دا دوتنه ($1) په اوسني کارن پورې تړاو نلري.",
+       "uploadstash-no-such-key": "نه داسي هیڅ ډول کيلي ($1) نه شي لري کولی.",
+       "uploadstash-no-extension": "تمدید غټ دی.",
+       "uploadstash-zero-length": "دوتنه صفر اوږدوالی لري.",
+       "invalid-chunk-offset": "د ناباوره ټوټې ټکی",
        "img-auth-accessdenied": "لاسرسی رد شو",
+       "img-auth-nopathinfo": "PATH_INFO موجود ندي.\nستا پالنګر د دې ارزښت ردولو لپاره ندی ټاکل شوی.\nدا کیدای شي د CGI او له مخې د img_auth ملاتړ وکړي.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization وګوري.",
        "img-auth-nofile": "د $1 په نوم کومه دوتنه نشته.",
        "img-auth-streaming": "سټريمينګ \"$1\".",
        "http-invalid-url": "ناسم URL: $1",
        "apisandbox-request-time": "د غوښتنې وخت: {{PLURAL:$1|$1 م.ث}}",
        "apisandbox-continue": "پرله پورې",
        "apisandbox-continue-clear": "سپينول",
+       "apisandbox-multivalue-all-values": "د $1 (ټول ارزښتونه)",
        "booksources": "د کتاب سرچينې",
        "booksources-search-legend": "د کتابي سرچينو پلټنه",
        "booksources-isbn": "ISBN:",
        "listgrouprights-namespaceprotection-namespace": "نوم-تشيال",
        "listgrouprights-namespaceprotection-restrictedto": "د کارن سمون ترسره کولو رښته(رښتې)",
        "listgrants": "منلې",
+       "listgrants-grant": "منلې",
        "listgrants-rights": "رښتې",
        "trackingcategories": "موندونکې وېشنيزې",
        "trackingcategories-summary": "په دې مخ کې هغه موندونکې وېشنيزې چې په اتوماتيک ډول د مېډياويکي ساوترې لخوا ډکېږي، د لړليک په توگه راغلي. د وېشنيزو نومونه د اړونده غونډال پيغامونو په بدلون سره چې د {{ns:8}} په نومتشيال کې دي، د بدلېدلو وړتيا لري.",
        "rollbacklinkcount": "$1 {{PLURAL:$1|سمون|سمونونه}} پرشابېول",
        "editcomment": "د سمون لنډيز دا وو: \"''$1''\".",
        "changecontentmodel-title-label": "مخ سرليک",
+       "changecontentmodel-model-label": "د نوي مېنځپانگې موډل",
        "changecontentmodel-reason-label": "سبب:",
        "changecontentmodel-submit": "بدلول",
        "logentry-contentmodel-change-revertlink": "په څټ گرځول",
        "whatlinkshere-hideimages": "د دوتنې تړنې $1",
        "whatlinkshere-filters": "چاڼگرونه",
        "whatlinkshere-submit": "ورځه",
+       "autoblockid": "خپلواک بنديز #$1",
        "block": "په کارن بنديز لگول",
        "unblock": "کارن له بنديزه وېستل",
        "blockip": "په {{GENDER:$1|کارن}} بنديز لگول",
        "ipbhidename": "کارن-نوم له سمون او لړليکونو پټول",
        "ipbwatchuser": "د دې کارن د خبرو اترو مخ او کارن مخ کتل",
        "ipb-disableusertalk": "د بنديز لگېدو سره دې د کارن د خبرو اترو مخ د سمولو مخنيوی هم پلي شي",
+       "ipb-change-block": "د کارن څخه بنديز لرې کول ددغو امستنې له لارې",
        "ipb-confirm": "د بنديز تاييد",
        "badipaddress": "ناسمه IP پته",
        "blockipsuccesssub": "بنديز په برياليتوب سره ولگېده",
        "blockipsuccesstext": "په [[Special:Contributions/$1|$1]] بنديز لگېدلی.<br />\nد بنديزونو د څارلو لپاره [[Special:BlockList|بنديز لړليک]] وگورۍ.",
+       "ipb-blockingself": "تاسو پر خپل ځان د بنديز لګولو په حال کې یاست! ایا تاسو ډاډه یاست چې تاسو دا کار کول غواړئ؟",
        "ipb-edit-dropdown": "د بنديز سببونه سمول",
        "ipb-unblock-addr": "له $1 بنديز ليرې کول",
        "ipb-unblock": "له يوه کارن-نوم يا IP پتې بنديز ليري کول",
        "unblocked-range": "له $1 بنديز ليرې شو",
        "unblocked-ip": "له [[Special:Contributions/$1|$1]] څخه بنديز ليرې شو.",
        "blocklist": "بنديز لگېدلي کارنان",
+       "autoblocklist": "خپلواک بنديزونه",
        "autoblocklist-submit": "پلټل",
+       "autoblocklist-legend": "د خپلواک بنديزونو لړليک",
+       "autoblocklist-localblocks": "ځایي {{PLURAL:$1|خپلواک بنديز|خپلواک بنديزونه}}",
+       "autoblocklist-total-autoblocks": "د خپلواک بنديز ټول لړليک: $1",
+       "autoblocklist-empty": "د بنديز لړليک تش دی",
+       "autoblocklist-otherblocks": "نور {{PLURAL:$1|خپلواک بنديز|خپلواک بنديزونه}}",
        "ipblocklist": "بنديز لگېدلي کارنان",
        "ipblocklist-legend": "يو بنديز شوی کارن موندل",
        "blocklist-userblocks": "گڼون بنديزونه پټول",
        "blocklist-tempblocks": "لنډمهاله بنديزونه پټول",
        "blocklist-addressblocks": "يواځې آی پي بنديزونه پټول",
+       "blocklist-rangeblocks": "پټ اندازه بنديزونه",
        "blocklist-timestamp": "وخت ټاپه",
        "blocklist-target": "موخه",
        "blocklist-expiry": "پای نېټه",
        "blocklist-by": "بنديز لگونکی پازوال",
+       "blocklist-params": "بنديز  پاراميټرونه",
        "blocklist-reason": "سبب",
        "ipblocklist-submit": "پلټل",
        "ipblocklist-localblock": "سيمه ايز بنديز",
        "infiniteblock": "نامحدوده",
        "expiringblock": "په $1 نېټه، $2 بجو پای ته رسېږي",
        "anononlyblock": "يواځې ورکنومی",
+       "noautoblockblock": "خپلواک بنديز ترسره نشو",
        "createaccountblock": "په گڼون جوړولو بنديز لگېدلی",
        "emailblock": "پر برېښليک بنديز ولگېد",
        "blocklist-nousertalk": "د خبرواترو خپل مخ نه شی سمولای",
        "ipblocklist-empty": "د بنديز لړليک تش دی",
+       "ipblocklist-no-results": "پر غوښتل شوي آي پي پتې باندې بنديز نه دي لګول شوي.",
        "blocklink": "بنديز لگول",
        "unblocklink": "بنديز لرې کول",
        "change-blocklink": "د بنديز بدلون",
        "unblocklogentry": "بنديز ليرې شو $1",
        "block-log-flags-anononly": "يواځې ورکنومي کارنان",
        "block-log-flags-nocreate": "د گڼون جوړول ناچارن شوی",
+       "block-log-flags-noautoblock": "خپلواک بنديز ترسره نشو",
        "block-log-flags-noemail": "ددې برېښليک مخه نيول شوی",
        "block-log-flags-nousertalk": "خپل د خبرو اترو مخ نه شي سمولای",
        "block-log-flags-hiddenname": "پټ کارن-نوم",
+       "ipb_expiry_invalid": "د پاي ته رسيدو وخت غلط دی.",
+       "ipb_expiry_old": "د پای ته رسېدو وخت په تېرمهال کې دی.",
        "ipb_already_blocked": "پر \"$1\" د پخوا نه بنديز دی",
        "ipb-needreblock": "پر $1 د پخوا نه بنديز لگېدلی.\nآيا تاسې د امستنو بدلول غواړۍ؟",
        "ipb-otherblocks-header": "{{PLURAL:$1|بل بنديز|نور بنديزونه}}",
        "imported-log-entries": "$1 {{PLURAL:$1|يادښتليک راوړل شوی|يادښتليکونه راوړل شوي}}.",
        "importcantopen": "واردونکې دوتنه و نه پرانيستل شوه.",
        "importbadinterwiki": "ناسمه ويکيخپلمنځي تړنه",
+       "importsuccess": "راليږل بشپړ شوه!",
+       "import-noarticle": "د رالېږدولو لپاره مخونه نشته.",
        "import-upload": "د XML اومتوک پورته کول",
-       "import-token-mismatch": "د اومتوک غونډېدنه له لاسه وتلې.\n\nتاسو شاید په نښه شوي وي. لطفا ډاډ ترلاسه کړئ چې ته ننوځئ او بیا بیا هڅه وکړه.\nکه تاسو د سیسټم څخه یو ځل بیا پیغام ترلاسه کړئ چي [[Special:UserLogout|ووځي]]، بيا ننوځي، و از این‌ که او ډاډه کړئ چې ستاسو براؤزر اجازه لري چې د دې سایټ څخه کوکیز ترلاسه کړي.",
+       "import-token-mismatch": "د اومتوک غونډېدنه له لاسه وتلې.\n\nتاسو شاید په نښه شوي وي. لطفا ډاډ ترلاسه کړئ چې ته ننوځئ او بیا بیا هڅه وکړه.\nکه تاسو د سیسټم څخه یو ځل بیا پیغام ترلاسه کړئ چي [[Special:UserLogout|ووځي]]، بيا ننوځي، او ډاډه کړئ چې ستاسو براؤزر اجازه لري چې د دې سایټ څخه کوکیز ترلاسه کړي.",
        "importlogpage": "د واردولو يادښت",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|بڼه|بڼې}} راولېږدېدې",
        "javascripttest": "د جاوا سکرېپټ آزمېښت",
        "siteuser": "د {{SITENAME}} کارن $1",
        "anonuser": "د {{SITENAME}} ورکنومی کارن $1",
        "lastmodifiedatby": "دا مخ وروستی ځل د $3 لخوا په $2، $1 بدلون موندلی.",
+       "othercontribs": "نور کار پر بنسټ",
        "others": "نور",
        "siteusers": "د {{SITENAME}} {{PLURAL:$2|کارن|کارنان}} $1",
        "anonusers": "د {{SITENAME}} {{PLURAL:$2|ورکنومی کارن|ورکنومي کارنان}} $1",
        "exif-objectname": "لنډ سرليک",
        "exif-headline": "سرليک",
        "exif-source": "سرچينه",
+       "exif-urgency": "بیړنی حالت",
+       "exif-fixtureidentifier": "د ثابتولو نوم",
+       "exif-locationdest": "ځای ښودل شوی",
+       "exif-locationdestcode": "د موقعیت کوډ ښودل شوی",
+       "exif-objectcycle": "د ورځې وخت چې رسنۍ اراده لري",
        "exif-contact": "د اړيکو مالومات",
        "exif-writer": "ليکوال",
        "exif-languagecode": "ژبه",
+       "exif-iimversion": "د IIM بڼه",
        "exif-iimcategory": "وېشنيزه",
+       "exif-iimsupplementalcategory": "ضمیمه وېشنيزه",
        "exif-datetimeexpires": "مه يې کاروۍ وروسته له",
        "exif-datetimereleased": "خپرېدلی په",
        "exif-identifier": "پېژندنه",
        "exif-serialnumber": "د کامرې پرله پسې شمېره",
        "exif-cameraownername": "د کامرې خاوند",
        "exif-label": "نښکه",
+       "exif-rating": "درجه (له ۵ څخه بهر)",
        "exif-copyrighted": "د رښتو دريځ",
        "exif-copyrightowner": "د رښتو خاوند",
        "exif-usageterms": "د کارولو شرايط",
        "exif-pngfilecomment": "د PNG دوتنې تبصره",
        "exif-disclaimer": "ردادعاليک",
+       "exif-contentwarning": "د منځپانګي خبرداری",
        "exif-giffilecomment": "د GIF دوتنې تبصره",
+       "exif-intellectualgenre": "د توکو ډول",
+       "exif-subjectnewscode": "د موضوع کوډ",
+       "exif-scenecode": "د اي پي ثي ټي(IPTC) منظر کوډ",
+       "exif-event": "پيښه ښودل شوي",
+       "exif-organisationinimage": "سازمان ښودل شوي",
        "exif-personinimage": "شخص ښودل شوی",
        "exif-copyrighted-true": "په رښتو سمبال",
        "exif-copyrighted-false": "د خپراوي د رښتو دريځ نه دی ټاکل شوی",
        "exif-photometricinterpretation-1": "تور او سپين (تور 0 دی)",
        "exif-unknowndate": "ناڅرگنده نېټه",
        "exif-orientation-1": "نورمال",
+       "exif-orientation-3": "څرخيدونکي °١٨٠",
+       "exif-orientation-4": "چورليځه اړونه",
+       "exif-orientation-5": "څرخيدونکي °٩٠ CCW او عمودی یې وویشل",
+       "exif-orientation-6": "څرخيدونکي °٩٠ CCW",
        "exif-componentsconfiguration-0": "نشته دی",
        "exif-exposureprogram-1": "لارښوونيز",
        "exif-exposureprogram-2": "نورماله پروگرام",
        "exif-meteringmode-1": "منځالی",
        "exif-meteringmode-3": "سپوټ",
        "exif-meteringmode-5": "مخبېلگه",
+       "exif-meteringmode-6": "برخيز",
        "exif-meteringmode-255": "نور",
        "exif-lightsource-0": "ناجوت",
        "exif-lightsource-1": "د ورځې رڼا",
        "exif-lightsource-9": "ښه هوا",
        "exif-lightsource-10": "ورېځ پوښلې هوا",
        "exif-lightsource-11": "سيوری",
+       "exif-lightsource-12": "ورځنې فلوروسینټ (ډالر ۵۷۰۰ – ۷۱۰۰ زره)",
+       "exif-lightsource-17": "معياري رڼا '''ا'''",
+       "exif-lightsource-18": "معياري رڼا '''ب'''",
+       "exif-lightsource-19": "معياري رڼا '''ث'''",
        "exif-lightsource-255": "د رڼا بله سرچينه",
        "exif-flash-fired-0": "فلش و نه ځلېده",
        "exif-flash-mode-3": "خپلکاره حالت",
        "version-other": "بل",
        "version-hooks": "کونډۍ",
        "version-hook-name": "کونډۍ نوم",
+       "version-hook-subscribedby": "سبسکرايبيدنه لخوا د",
        "version-version": "($1)",
        "version-no-ext-name": "[بې نومه]",
        "version-license": "مېډياويکي منښتليک",
        "version-ext-colheader-description": "څرگندونه",
        "version-ext-colheader-credits": "ليکوالان",
        "version-license-title": "د $1 منښتليک",
+       "version-credits-title": "د کریډیټ د $1 لپاره",
        "version-poweredby-credits": "دا ويکي د '''[https://www.mediawiki.org/ مېډياويکي]''' په سېک چلېږي، ټولې رښتې خوندي دي © 2001-$1 $2.",
        "version-poweredby-others": "نور",
        "version-poweredby-translators": "د translatewiki.net ژباړنان",
        "tag-filter": "[[Special:Tags|نښلن]] چاڼگر:",
        "tag-filter-submit": "چاڼگر",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|نښلن|نښلنونه}}]]: $2)",
+       "tag-mw-blank": "بسته بندي",
+       "tag-mw-replace": "ځايناستول",
+       "tag-mw-rollback": "په شابېول",
+       "tag-mw-undo": "ناکړل",
        "tags-title": "نښلنونه",
        "tags-tag": "نښلن نوم",
        "tags-display-header": "د بدلون په لړليکونو کې ښکارېدنه",
        "tags-deactivate-submit": "نافعالول",
        "tags-edit-title": "نښلنونه سمول",
        "tags-edit-manage-link": "نښلنونه مهارول",
+       "tags-edit-existing-tags": "شته ټګونه:",
        "tags-edit-existing-tags-none": "<em>هېڅ</em>",
        "tags-edit-new-tags": "نوي نښلنونه:",
        "tags-edit-add": "دا نښلنونه ورگډول:",
        "tags-edit-remove-all-tags": "(ټول نښلنونه غورځول)",
        "tags-edit-chosen-placeholder": "ځينې نښلنونه ټاکل",
        "tags-edit-reason": "سبب:",
+       "tags-edit-success": "بدلونونه تطبيق شوي دي.",
+       "tags-edit-failure": "بدلونونه کارول نشي تطبيق کيداي:\n$1",
+       "tags-edit-nooldid-title": "ناباوره پيښنليک ته اشاره",
+       "tags-edit-nooldid-text": "تاسو د کوم هدف بیا کتنه نده مشخصه کړې چې دا فعالیت ترسره کړي، یا مشخصه بیاکتنه شتون نلري.",
+       "tags-edit-none-selected": "مهرباني وکړئ لږترلږه یو ٹیګ غوره یا لرې کړئ.",
        "comparepages": "مخونه پرتلل",
        "compare-page1": "۱ مخ",
        "compare-page2": "۲ مخ",
        "compare-invalid-title": "کوم سرليک مو چې ځانگړی کړی ناسم دی.",
        "compare-title-not-exists": "کوم سرليک مو چې ځانگړی کړی نشته.",
        "compare-revision-not-exists": "کومه مخکتنه مو چې ځانگړې کړې نشته.",
+       "diff-form": "توپيرونه",
+       "diff-form-oldid": "د زړي بیاکتنې پيژندګلوي (اختیاري)",
+       "diff-form-revid": "د بیاکتنې د پيژندګلوي توپیر",
+       "diff-form-submit": "توپيرونه ښکاره کول",
+       "permanentlink": "تلپاتې تړنه",
+       "permanentlink-revid": "د بیاکتنې پيژندګلوي",
+       "permanentlink-submit": "بیاکتنې ته ولاړ شي",
        "dberr-problems": "اوبخښۍ! دم مهال دا وېبپاڼه د تخنيکي ستونزو سره مخامخ شوې.",
        "dberr-usegoogle": "تاسې کولای شی چې هم مهاله د گووگل له لخوا هم د پلټنې هڅه وکړۍ.",
        "htmlform-invalid-input": "ستاسې ځينې ورکړېينې ستونزې لري",
        "htmlform-cloner-create": "نور ورگډول",
        "htmlform-cloner-delete": "غورځول",
        "htmlform-cloner-required": "لږ تر لږه يو ارزښت ته اړتيا شته.",
+       "htmlform-date-placeholder": "کککک-م م-و و",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "هغه ارزښت چې تاسو یې مشخص کړی د پېژندل شوې نیټه ندی. د YYYY-MM-DD بڼه کارولو هڅه وکړئ.",
+       "htmlform-time-invalid": "هغه ارزښت چې تا مشخص کړی د پېژندل شوي وخت ندی. کارولو هڅه وکړي HH:MM:SS .",
+       "htmlform-datetime-invalid": "هغه ارزښت چې تا مشخص شوی د پېژندل شوې نیټې او وخت ندی. د YYYY-MM-DD HH کارولو هڅه وکړئ: MM: SS بڼه.",
+       "htmlform-date-toolow": "هغه ارزښت چې تاسو یې مشخص کړی وي د پیل څخه مخکې د $1 نیټې څخه مخکې وي.",
+       "htmlform-date-toohigh": "هغه ارزښت چې تاسو یې مشخص کړی وي د $1 وروستی نیټې نیټې وروسته دی.",
+       "htmlform-time-toolow": "هغه ارزښت چې تاسو یې مشخص کړی وي د ترټولو ترټولو غوره وخت د $1 وخت دی.",
+       "htmlform-time-toohigh": "هغه ارزښت چې تاسو یې مشخص کړی وي د $1 وروستیو وختونو څخه وروسته وي.",
+       "htmlform-datetime-toolow": "هغه ارزښت چې تاسو یې مشخص کړئ د پیل نیټه او د $1 وخت څخه مخکې وي.",
+       "htmlform-title-badnamespace": "[[:$1]] په \"{{ns:$2}}\" کي نشته.",
+       "htmlform-title-not-creatable": "\"$1\" مخ د جوړېدو وړ سرليک نه دی",
        "htmlform-title-not-exists": "$1 نشته.",
        "htmlform-user-not-exists": "<strong>$1</strong> نشته.",
+       "htmlform-user-not-valid": "<strong>$1</strong> یو باوري کارن نوم نه دی.",
        "logentry-delete-delete": "$1 د $3 مخ {{GENDER:$2|ړنگ کړ}}",
        "logentry-delete-restore": "$1 د $3 مخ $4 ته {{GENDER:$2|ولېږداوه}}",
        "logentry-delete-revision": "$1 {{GENDER:$2|بدل شو}} لیدل د{{PLURAL:$5|a هيسټري|$5 هيسټري}} په مخ کي $3: $4",
        "revdelete-content-hid": "مېنځپانگه پټېدلې",
+       "revdelete-summary-hid": "پټ سمون لنډیز",
        "revdelete-uname-hid": "کارن نوم پټ شوی",
        "revdelete-content-unhid": "مېنځپانگه ښکاره شوی",
+       "revdelete-summary-unhid": "ښکاره سمون لنډیز",
        "revdelete-uname-unhid": "ښکاره کارن-نوم",
+       "revdelete-restricted": "پازوالانو ته پلي شوي محدوديتونه",
+       "revdelete-unrestricted": "د پازوالانو لپاره لیرې شوي بندیزونه",
+       "logentry-block-block": "$1 تر $5 $6 نيټې پورې پر {{GENDER:$4|$3}} باندې {{GENDER:$2|بنديز}} ولګوي",
+       "logentry-block-unblock": "$1 د {{GENDER:$4|$3}} څخه {{GENDER:$2|بنديز}} لري کړ",
+       "logentry-suppress-block": "$1 تر $5 $6 نيټې پورې پر {{GENDER:$4|$3}} باندې {{GENDER:$2|بنديز}} ولګوي",
+       "logentry-suppress-reblock": "$1 تر $5 $6 نيټې پورې پر {{GENDER:$4|$3}} باندې {{GENDER:$2|بنديز}} بدلون وموند",
+       "logentry-import-upload": "$1 $3 د دوتنې اپلوډ له لارې {{GENDER:$2|واردکړ}}",
        "logentry-move-move": "$1 د $3 مخ $4 ته {{GENDER:$2|ولېږداوه}}",
        "logentry-move-move-noredirect": "$1 پرته له دې چې يو مخ گرځونی پرېږدي له $3 څخه $4 ته مخ {{GENDER:$2|ولېږداوه}}",
        "logentry-move-move_redir": "$1 د $3 مخ $4 ته د مخ گرځونې له لارې {{GENDER:$2|ولېږداوه}}.",
        "logentry-newusers-create": "د $1 کارن گڼون {{GENDER:$2|جوړ شو}}",
        "logentry-newusers-autocreate": "د $1 گڼون په اتوماتيک ډول {{GENDER:$2|جوړ شو}}",
        "logentry-protect-unprotect": "$1 له $3 څخه ژغورنه {{GENDER:$2|ليرې کړه}}",
+       "logentry-protect-protect": "$1 د $3 مخ {{GENDER:$2|وژغوره}} $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|وژغورل شو}} $3 $4 [کڅوړی]",
+       "logentry-protect-modify": "$1 د $3 د ژغورلو کچه {{GENDER:$2|بدله کړه}} $4",
+       "logentry-protect-modify-cascade": "$1 د $3 ژغورنې په کچه کي {{GENDER:$2|بدلون راوست}} و $4 [کالیډیډنګ]",
        "logentry-rights-rights": "$1 د $3 لپاره د غړيتوب ډله له $4 څخه $5 ته {{GENDER:$2|بدله کړه}}",
        "logentry-rights-rights-legacy": "$1 د $3 لپاره د غړيتوب ډله {{GENDER:$2|بدله کړه}}",
        "logentry-upload-upload": "$1 $3 {{GENDER:$2|ورپورته يې کړ}}",
        "logentry-upload-overwrite": "$1 نوي ويرژن {{GENDER:$2|پورته}} سو $3",
        "logentry-upload-revert": "$1 $3 يې {{GENDER:$2|ورپورته کړه}}",
        "log-name-managetags": "د نښلن مهارولو يادښت",
+       "logentry-managetags-create": "$1 {{GENDER:$2|د}} د ټګ \"$4\" جوړ کړ",
        "log-name-tag": "نښلن يادښت",
        "rightsnone": "(هېڅ)",
        "rightslogentry-temporary-group": "$1 (لنډمهاله، تر $2)",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|ثانيه|ثانيې}}",
        "limitreport-walltime": "اصلي وخت کارېدنه",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|ثانيه|ثانيې}}",
+       "limitreport-ppvisitednodes": "د راتلونکو پروسس کوونکو شمیرې شمیرل شوي",
        "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes": "د پروسس کوونکو ګرنټيد شمیرل شوي",
        "limitreport-ppgeneratednodes-value": "$1/$2",
+       "limitreport-postexpandincludesize": "د پوسټ پراخول داندازې په شمول",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|بايټ|بايټونه}}",
+       "limitreport-templateargumentsize": "د کينډۍ د مسايلو کچه",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بايټ|بايټونه}}",
+       "limitreport-expansiondepth": "تر ټولو لوړه ژوره پراختیا",
        "limitreport-expansiondepth-value": "$1/$2",
+       "limitreport-expensivefunctioncount": "د قیمتي پارسير فعالیت شمیرې",
        "limitreport-expensivefunctioncount-value": "$1/$2",
        "expandtemplates": "کينډۍ غځول",
+       "expand_templates_intro": "په دا ځانګړي مخ کي متن پاڼه ترلاسه کیږي کوم چي په ټول ډوله مخونو کي کارول کیږي دلته دا مخ بيا بیا وده کوي. د تحلیل دندو لکه <code><nowiki>{{</nowiki>#language:…}}</code> او متغیرونه لکه <code><nowiki>{{</nowiki>CURRENTDAY}}</code> هم سره نښلوي — په واقعیت کې، د ډلو دننه هر څه. دا خپله د ميډياويکي په اړونده مرحله کولو سره ترسره کيږي.",
+       "expand_templates_title": "د موزوع سرليک، د {{FULLPAGENAME}} لپاره او نور:",
        "expand_templates_input": "ځايونکی متن:",
        "expand_templates_output": "پايله",
+       "expand_templates_xml_output": "د ایکس ایم ایل محصول",
+       "expand_templates_html_output": "د روو ايچ ټي ام ال څخه وتلي",
        "expand_templates_ok": "ښه",
        "expand_templates_remove_comments": "تبصرې غورځول",
        "expand_templates_remove_nowiki": "په پايلو کې د <nowiki> نښلنونه ځپل",
+       "expand_templates_generate_xml": "د ایکس ایم ایل پارسه وښیه",
        "expand_templates_generate_rawhtml": "خام HTML ښکاره کول",
        "expand_templates_preview": "مخليدنه",
+       "expand_templates_preview_fail_html": "<em>په دي دليل چي {{SITENAME}} اچ‌ټی‌ام‌ال خام فعال دي او د کارن حساب معلومات ورک شوي، شاته ښکارونه د جاوا سکرپټ د بریدونو په وړاندې د احتیاطي اندازې په توګه پټ دی.</em>\n\n<strong>که دا ښکارندويه تلاښ مشروع دي، هيله ده بیا هڅه وکړئ.</strong>\nکه تر اوسه هم کار نه کوي،سم يي کړي [[Special:UserLogout|د وتلو سیسټم]] بیا کلیک کړی او بيا ورننوځي، او ډاډه اوسي چې ستاسو براؤزر اجازه لري چې د دې سایټ څخه کوکیز ترلاسه کړي.",
+       "expand_templates_preview_fail_html_anon": "<em>په دي دليل چي {{SITENAME}} اچ‌ټی‌ام‌ال خام فعاله دي او د کارن معلومات له لاسه ورکړل شول،  شاته ښکارونه د جاوا سکرپټ د بریدونو په وړاندې د احتیاطي اندازې په توګه پټ دی.</em>\n\n<strong>که دا ښکارندويه تلاښ مشروع دي، هيله ده [[Special:UserLogin|په سیسټم کې ننوځي]] او بیا تلاښ وکړئ.</strong>",
+       "expand_templates_input_missing": "تاسو اړتیا لرئ چي لږترلږه یو څه متن چمتو کړئ.",
        "pagelanguage": "د مخ ژبه بدلول",
        "pagelang-name": "مخ",
        "pagelang-language": "ژبه",
        "pagelang-reason": "سبب",
        "pagelang-submit": "سپارل",
        "pagelang-nonexistent-page": "د $1 په نوم کوم مخ نشته",
+       "pagelang-unchanged-language": "د $1 مخ د $2 ژبو لپاره ټاکل شوی دي.",
+       "pagelang-unchanged-language-default": "مخ $1 لا د ډیزاین ويکي د ژبې منځپانګې لپاره ټاکل شوی.",
+       "pagelang-db-failed": "ډاټابیس د پاڼې د ژبي په بدلولو کې پاتې راغلی.",
        "right-pagelang": "د مخ ژبه بدلول",
        "action-pagelang": "د مخ ژبه بدلول",
        "log-name-pagelang": "د ژب بدلون يادښت",
+       "log-description-pagelang": "دا د پاڼو په ژبو کې د بدلونونو نښې دي.",
+       "logentry-pagelang-pagelang": "$1 ژبه $3  د $4  څخه و $5 ته {{GENDER:$2| بدله شوه}}",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (چارن)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ناچارن''')",
        "mediastatistics": "د رسنيو شمار",
        "mediastatistics-header-office": "دفتر",
        "mediastatistics-header-text": "متني",
        "mediastatistics-header-executable": "اجرايي",
+       "mediastatistics-header-archive": "کمپريزډ شوي پورمټونه",
        "mediastatistics-header-total": "ټولې دوتنې",
+       "json-warn-trailing-comma": "$1 کوماوي په پاي کي جی‌سن {{PLURAL:$1|ړنګ شوی}}.",
+       "json-error-unknown": "د جي سن سره ستونزه وه. تېروتنه: $1",
+       "json-error-depth": "د ډیری لوړ ډیزاین ژوره ډیر شوی",
+       "json-error-state-mismatch": "ناسم یا خراب شوې جي سن",
+       "json-error-ctrl-char": "د کنټرول کرکټر تېروتنه، ښایي په ناسم ډول انډول شوی وي",
+       "json-error-syntax": "د سينټاکس تېروتنه",
+       "json-error-utf8": "ناسم يو ټي اپ وړونکي - ٨، شاید په ناسم ډول انډول شوی وي",
+       "json-error-recursion": "په ارزښت کې د یو یا ډیرو بیاپروسي حواله چې کوډ شوي وي",
+       "json-error-inf-or-nan": "مقنایر INF یا NAN یو یا ډیر وخت په مقدار کې",
+       "json-error-unsupported-type": "د هغه ډول ارزښت چې کوډ نشي کوالی",
        "headline-anchor-title": "دې برخې ته تړنه",
        "special-characters-group-latin": "لاتين",
        "special-characters-group-latinextended": "غځېدلی لاتين",
        "special-characters-group-ipa": "ن.غ.ا",
        "special-characters-group-symbols": "سمبولونه",
        "special-characters-group-greek": "يوناني",
+       "special-characters-group-greekextended": "یوناني غزول",
        "special-characters-group-cyrillic": "سرېليک",
        "special-characters-group-arabic": "عربي",
        "special-characters-group-arabicextended": "غځېدلې عربي",
        "special-characters-group-thai": "تايلنډي",
        "special-characters-group-lao": "لاوي",
        "special-characters-group-khmer": "خمري",
+       "special-characters-group-canadianaboriginal": "کاناډایان لومړی استوګنان",
+       "special-characters-title-endash": "د کرښې فاصله",
+       "special-characters-title-emdash": "ډډ شوی کرښه",
+       "special-characters-title-minus": "منفي نښه",
        "mw-widgets-dateinput-no-date": "کومه نېټه نه ده ټاکل شوې",
        "mw-widgets-dateinput-placeholder-day": "کککک-م م-و و",
        "mw-widgets-dateinput-placeholder-month": "کککک-م م",
+       "mw-widgets-mediasearch-input-placeholder": "د رسنۍ پلټنه",
+       "mw-widgets-mediasearch-noresults": "پايلې و نه موندل شوې.",
        "mw-widgets-titleinput-description-new-page": "تر اوسه پورې دا مخ نشته",
        "mw-widgets-titleinput-description-redirect": "$1 ته ورگرځېدنه",
+       "mw-widgets-categoryselector-add-category-placeholder": "يوه وېشنيزه ورگډول...",
+       "mw-widgets-usersmultiselect-placeholder": "نور وراضافه کړئ ...",
        "date-range-from": "د نیټې څخه:",
        "date-range-to": "تر نيټې:",
+       "sessionmanager-tie": "تاسو ډیری ډول ډول تصدیقونه نشي نشر کولی: $1.",
+       "sessionprovider-generic": "$1 برخې",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "د کوکی پر بنسټ خپروني",
+       "sessionprovider-nocookies": "کوکیز ممکن معیوب شي. ډاډ ترلاسه کړئ چې تاسو کوکیز لرونکي يي او بیا پیل کوي.",
        "randomrootpage": "د ناټاکلې ريښې مخ",
+       "log-action-filter-block": "د بنديز ډول:",
+       "log-action-filter-contentmodel": "د منځپانګې نومونې بدلول:",
+       "log-action-filter-delete": "د ړنګولو ډولː",
+       "log-action-filter-import": "د واردولو ډول:",
+       "log-action-filter-managetags": "د لیګ مدیریت ډول:",
+       "log-action-filter-move": "د ورګرځولو ډول:",
+       "log-action-filter-newusers": "د ګڼون جوړونې ډول:",
+       "log-action-filter-patrol": "د ګزمي ډول:",
+       "log-action-filter-protect": "د ژغورلو ډول:",
+       "log-action-filter-rights": "د حقوق بدلولو ډول:",
+       "log-action-filter-suppress": "د ماتوني ډول:",
+       "log-action-filter-upload": "د پورته کولو ډول:",
        "log-action-filter-all": "ټول",
        "log-action-filter-block-block": "بنديز لگول",
+       "log-action-filter-block-reblock": "د بنديز تعدیل",
        "log-action-filter-block-unblock": "بنديز لرې کول",
+       "log-action-filter-contentmodel-change": "د منځپانګې او ماډل بدلول",
+       "log-action-filter-contentmodel-new": "د غیر وېشنيزي منځپانګې نمونې سره د پاڼې جوړول",
        "log-action-filter-delete-delete": "مخ ړنګونه",
        "log-action-filter-delete-delete_redir": "راګرځونه تکرار کړئ",
        "log-action-filter-delete-restore": "مخ د ړنگېدو څخه راوګرځوي",
        "log-action-filter-delete-event": "مخ ړنګونه",
        "log-action-filter-delete-revision": "يواځې ړنگ شوي",
        "log-action-filter-import-interwiki": "ټرانس ويکي واردول",
+       "log-action-filter-import-upload": "د ایکس ایم ایل اپلوډ لخوا وارد",
+       "log-action-filter-managetags-create": "مخ جوړونې",
+       "log-action-filter-managetags-delete": "مخ ړنګونه",
+       "log-action-filter-managetags-activate": "د ټيګ فعاليتونه",
+       "log-action-filter-managetags-deactivate": "د ټګ چلښت",
+       "log-action-filter-move-move": "د لارښوونې نه مخنیوی کول",
+       "log-action-filter-move-move_redir": "د لارښوونو د ګرځولو سره لاړ شئ",
+       "log-action-filter-newusers-create": "د نامعلوم کاروونکي لخوا جوړوني",
+       "log-action-filter-newusers-create2": "د ثبت شووطکاروونکي لخوا جوړوني",
+       "log-action-filter-newusers-autocreate": "خپلکاره جوړوني",
+       "log-action-filter-newusers-byemail": "د پټنوم رامینځته کول د بریښنالیک له لارې",
+       "log-action-filter-patrol-patrol": "لارښود ګزمې",
+       "log-action-filter-patrol-autopatrol": "اتومات ګزمې",
        "log-action-filter-protect-protect": "ساتنه",
+       "log-action-filter-protect-modify": "د ژغورني تعدیل",
+       "log-action-filter-protect-unprotect": "ناساتنه",
+       "log-action-filter-protect-move_prot": "ژغورنه لري کول",
+       "log-action-filter-rights-rights": "لارښود بدلون",
+       "log-action-filter-rights-autopromote": "اتوماتیک بدلون",
+       "log-action-filter-suppress-event": "د ننوتلو فشار",
+       "log-action-filter-suppress-revision": "د بیاکتنې ماتول",
+       "log-action-filter-suppress-delete": "د پاڼې ماتول",
+       "log-action-filter-suppress-block": "د بلاک لخوا د کارن تاوان",
+       "log-action-filter-suppress-reblock": "د نابلاک لخوا د کارن تاوان",
+       "log-action-filter-upload-upload": "نوې پورته کونه",
        "log-action-filter-upload-overwrite": "بيا پورته کول",
+       "authmanager-authn-not-in-progress": "تایید په پرمختګ کې ندي یا د ناستې ډاټا ورک شوی. لطفا د پیل څخه بیا شروع وکړئ.",
+       "authmanager-authn-no-primary": "ورکړل شوي اعتبارات نشی ورکول کیدی.",
+       "authmanager-authn-no-local-user": "ورکړل شوی اعتبارونه په دې ويکي د هیڅ کارن سره ندی تړلی.",
+       "authmanager-authn-no-local-user-link": "تاید شوي اعتبار باوري دي مګر په دې ويکي د هیڅ کارن سره ندی تړلی. په مختلفو لارو ننوتئ، یا یو نوی کارن جوړ کړئ، او تاسو به دا اختیار ولرئ چې خپل مخکیني سندونه د دې حساب ته لینک کړئ.",
+       "authmanager-authn-autocreate-failed": "د ايټو په ګڼون جوړولو کي ناکامه راغلي: $1",
+       "authmanager-change-not-supported": "ورکړل شوي اعتبارات نشي بدلیدای، ځکه چې هیڅ شی به یې دوی ونه کاروي.",
+       "authmanager-create-disabled": "د گڼون جوړول ناچارن شوی",
+       "authmanager-create-from-login": "د خپل حساب جوړولو لپاره، مهرباني وکړئ د کروندو ډک کړئ.",
+       "authmanager-create-not-in-progress": "تایید په پرمختګ کې ندي یا د ناستې ډاټا ورک شوی. لطفا د پیل څخه بیا شروع وکړئ.",
+       "authmanager-create-no-primary": "د ورکړل شوي کړني اعتبار نه شي کولی چي د حساب جوړولو لپاره وکارول شي.",
+       "authmanager-link-no-primary": "د ورکړل شوي تایید وړتیا د حساب کولو لپاره نه کارول کیدی.",
+       "authmanager-link-not-in-progress": "تایید په پرمختګ کې ندي یا د ناستې ډاټا ورک شوی. لطفا د پیل څخه بیا شروع وکړئ.",
+       "authmanager-authplugin-setpass-failed-title": "د پټنوم بدلون ترسره نشو",
+       "authmanager-authplugin-setpass-failed-message": "د تایید کولو پلگ ان د پاسورډ بدلون رد کړ.",
+       "authmanager-authplugin-create-fail": "د تایید کولو پلگ ان د حساب جوړولو انکار رد کړ.",
+       "authmanager-authplugin-setpass-denied": "د تاییدولو فلګن بدل شوي پټنوم اجازه نلري.",
        "authmanager-authplugin-setpass-bad-domain": "ناباوره ډومین.",
+       "authmanager-autocreate-noperm": "د اتوماتيک حساب جوړولو جوړولو اجازه نشته.",
+       "authmanager-autocreate-exception": "د پخوانیو غلطیو له امله د اتوماتیک حساب ورکولو جوړول په عارضي ډول معیوب شوی.",
+       "authmanager-userdoesnotexist": "د \"$1\" گڼون نه دی ثبت شوی.",
+       "authmanager-userlogin-remembermypassword-help": "ایا پاسورډ باید د اوږدې مودې لپاره د ناستې د اوږدې مودې لپاره یاد وساتل شي.",
+       "authmanager-username-help": "د اعتبار لپاره کارن نوم",
+       "authmanager-password-help": "د اعتبار لپاره پټنوم.",
+       "authmanager-domain-help": "د بهرني اعتبار لپاره ډومین.",
+       "authmanager-retype-help": "د پټنوم بیا تاييدول.",
        "authmanager-email-label": "برېښليک",
        "authmanager-email-help": "برېښليک پته",
        "authmanager-realname-label": "اصلي نوم",
        "authmanager-realname-help": "د کارن اصلي نوم",
+       "authmanager-provider-password": "د اعتبار لپاره پټنوم.",
+       "authmanager-provider-password-domain": "د پټنوم او ډومین پر بنسټ اعتبار",
+       "authmanager-provider-temporarypassword": "لنډمهالی پټنوم",
+       "authprovider-confirmlink-message": "ستاسو د وروستي لاگ ان هڅو پر بنسټ، لاندې حسابونه د ستاسو د ويکي حساب سره تړلی کیدی شي. د دوی سره نښلول د دې حسابونو له لارې د لیګنګ کولو توان لري. مهرباني وکړئ هغه څوک وټاکئ کوم چې باید ورسره تړاو ولري.",
+       "authprovider-confirmlink-request-label": "هغه حسابونه چې ورسره تړاو لري",
+       "authprovider-confirmlink-success-line": "$1: په بریالیتوب سره لینک شو.",
+       "authprovider-confirmlink-failed": "د حساب لینکول په بشپړ ډول بریالي نه وو: $1",
+       "authprovider-confirmlink-ok-help": "د اړیکو د ناکام پیغامونو ښودلو وروسته دوام ومومئ.",
        "authprovider-resetpass-skip-label": "تېرېدل",
+       "authprovider-resetpass-skip-help": "د پټنځی بیا سمول پریږده.",
+       "authform-nosession-login": "تصدیق بریالی شو، مګر ستاسو براؤزر ونشو کولی \"یاد وساتئ\".\n\n$1",
+       "authform-nosession-signup": "ګڼون جوړونه بریالی شوه، مګر ستاسو براؤزر ونشو کولی \"یاد وساتئ\".\n\n$1",
        "authform-newtoken": "ورک شوې نښه. $1",
        "authform-notoken": "نادرکه نښه",
        "authform-wrongtoken": "ناسمه نښه",
        "specialpage-securitylevel-not-allowed-title": "اجازه نسته",
+       "specialpage-securitylevel-not-allowed": "بخښنه غواړو، تاسو ته د دې پاڼې کارولو اجازه نه لرې ځکه چې ستا شناخت تایید نشو.",
+       "authpage-cannot-login": "د ننوتلو پیل کولو توان نلري.",
+       "authpage-cannot-login-continue": "د ننوتنې دوام نلري. ستاسو ناستې ډیری ممکن وخت نیسي.",
+       "authpage-cannot-create": "د ګڼون جوړولو پیل نشي کولی.",
+       "authpage-cannot-create-continue": "د حساب جوړول دوام ته پاتې دي. ستاسو ناستې ډیری دي ممکن به وخت نیسي.",
+       "authpage-cannot-link": "د حساب لینک کولو پیلولو توان نلري.",
+       "authpage-cannot-link-continue": "د ننوتنې دوام نلري. ستاسو ناستې ډیری ممکن وخت نیسي.",
        "cannotauth-not-allowed-title": "د اجازې تفصيل",
+       "cannotauth-not-allowed": "تاسو د دې پاڼې کارولو اجازه نلري",
+       "changecredentials": "دبدلول اعتبارونه",
        "changecredentials-submit": "بدلول",
+       "changecredentials-invalidsubpage": "$1 د ناسمو ډولونو اعتبار له مخې، دا د منلو وړ نه دی.",
+       "changecredentials-success": "ستاسو اعتبارونه بدل شوي.",
+       "removecredentials": "اعتبارونه غورځول",
        "removecredentials-submit": "غورځول",
+       "removecredentials-invalidsubpage": "$1 د ناسمو ډولونو اعتبار له مخې، دا د منلو وړ نه دی.",
+       "removecredentials-success": "ستاسو اعتبارونه لري شوي.",
        "credentialsform-provider": "د اعتبار وړ ډول:",
        "credentialsform-account": "گڼون نوم:",
        "cannotlink-no-provider-title": "دلته د منلو وړ حساب شتون نلري.",
        "linkaccounts-submit": "لينک کڼوڼونه",
        "unlinkaccounts": "ناخوښه ګڼونونه",
        "unlinkaccounts-success": "ګڼون ناخوښه سو.",
+       "authenticationdatachange-ignored": "د اعتبار ډاټا بدل ندی. کیدای شي کوم برابرونکي ترتیب نه وي؟",
+       "userjsispublic": "لطفا په یاد ولرئ: جاوا سکریپ پاڼې کې باید محرم معلومات نه وي ځکه چې دوی د نورو کاروونکو لخوا لیدل کیږي.",
+       "usercssispublic": "لطفا په یاد ولرئ: د ثي اس اس فرعي صفحې باید محرم معلومات ونه لري ځکه چې دوی د نورو کاروونکو لخوا لیدل کیږي.",
        "restrictionsfield-badip": "ناباوره آي پي  آدرس او حدود د : $1",
        "restrictionsfield-label": "اجازه ورکړل شوي آي پي حدودونه:",
+       "restrictionsfield-help": "په هر کرښه کې د اي پي پته یا د سینیر رینټ داخل کړئ. د هر شی فعالولو لپاره دا ارزښت وکاروئ: <code>0.0.0.0/0</code><br /><code>::/0</code>",
        "revid": "بیاکتنه $1",
        "pageid": "د مخ پېژند$1",
        "rawhtml-notallowed": "لیبلونه &lt;html&gt; د منظمو ليکنو څخه بهر نشي کارول کیدی.",
        "gotointerwiki-invalid": "ټاکل شوی سرلیک نامعلوم دی.",
        "gotointerwiki-external": "تاسي د  {{SITENAME}} د پريښودلو په حال کې یاست لیدلو لپاره [[$2]]، کوم یو جلا ویب پاڼه ده.\n\n'''[$1 دوام ورکونه و $1 ته]'''",
        "undelete-cantedit": "تاسو دا مخ شيه ړنګولي ځکه چې تاسو د دا پامخ د سمون اجازه نه لرئ.",
+       "undelete-cantcreate": "تاسو دا پاڼه نشي ړنګولی ځکه چې د دې نوم سره هيڅ پاڼه شتون نلري او تاسو د دې مخ د جوړولو اجازه هم نلرئ.",
        "pagedata-title": "د پاڼې ډاټا",
+       "pagedata-text": "دا پاڼه د پاڼو لپاره د ډاټا ګراف وړاندې کوي. مهرباني وکړئ د فرعي سرلیک نښې په کارولو سره د يو آر ال سرلیک چمتو کړئ.\n* د محتوا خبرې اترې د ستاسو د مراجعینو پر بنسټ د سرلیک قبولول دي. دا پدې مانا ده چې د پاڼې ډاټا به ستاسو د مراجعینو لخوا غوره شوي بڼه کې چمتو شي.",
        "pagedata-not-acceptable": "د سمون نمونه ونه موندل شوه. ملاتړ شوي ميمي ډولونه: $1",
        "pagedata-bad-title": "ناسم سرليک: $1"
 }
index 45b2dd6..7bb87c6 100644 (file)
        "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.",
        "rcfilters-filter-showlinkedfrom-label": "Mostrar alterações nas páginas ligadas de",
-       "rcfilters-filter-showlinkedfrom-option-label": "Mostrar mudanças de páginas <strong>PARA AS QUAIS</strong> uma página contém hiperligações",
-       "rcfilters-filter-showlinkedto-label": "Mostrar mudanças de páginas que contêm hiperligações para a página",
-       "rcfilters-filter-showlinkedto-option-label": "Mostrar mudanças de páginas <strong>QUE CONTÊM</strong> hiperligações para uma página",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páginas ligadas da</strong> página selecionada",
+       "rcfilters-filter-showlinkedto-label": "Mostrar alterações nas páginas que ligam para",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Páginas que ligam para</strong> página selecionada",
        "rcfilters-target-page-placeholder": "Digite o nome de uma página",
        "rcnotefrom": "Abaixo {{PLURAL:$5|é a mudança|são as mudanças}} desde <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfromreset": "Redefinir seleção da data",
        "tag-mw-replace-description": "Edições que removem mais de 90% do conteúdo de uma página",
        "tag-mw-rollback": "Reverter",
        "tag-mw-rollback-description": "Edições que revertem edições anteriores usando o link de reversão",
+       "tag-mw-undo": "Desfazer",
+       "tag-mw-undo-description": "Edições que desfazem edições anteriores usando o link de desfazer",
        "tags-title": "Etiquetas",
        "tags-intro": "Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.",
        "tags-tag": "Nome da etiqueta",
index 4832e91..1cbb513 100644 (file)
@@ -75,7 +75,8 @@
                        "Mansil",
                        "Ngl2016",
                        "RadiX",
-                       "MokaAkashiyaPT"
+                       "MokaAkashiyaPT",
+                       "Athena in Wonderland"
                ]
        },
        "tog-underline": "Sublinhar hiperligações:",
        "tagline": "Da wiki {{SITENAME}}",
        "help": "Ajuda",
        "search": "Pesquisa",
-       "search-ignored-headings": " #<!-- deixe esta linha exatamente como ela está --> <pre>\n# Títulos de página que serão ignorados pela pesquisa.\n# Mudanças a esta lista terão efeito quando a página com o título referido for indexada.\n# Pode forçar a indexação de uma página realizando uma edição nula nessa página.\n# A sintaxe é a seguinte:\n#  * Tudo desde um símbolo de cardinal (#) até ao fim da linha é um comentário\n#  * Cada linha não vazia é o título exato a ignorar, respeitando o uso de maiúsculas\nReferências\nLinks externos\nVer também\n #</pre> <!-- deixe esta linha exatamente como ela está -->",
+       "search-ignored-headings": " #<!-- deixe esta linha exatamente como ela está --> <pre>\n# Títulos de página que serão ignorados pela pesquisa.\n# Mudanças a esta lista terão efeito quando a página com o título referido for indexada.\n# Pode forçar a indexação de uma página realizando uma edição nula nessa página.\n# A sintaxe é a seguinte:\n#  * Tudo desde um símbolo de cardinal (#) até ao fim da linha é um comentário\n#  * Cada linha não vazia é o título exato a ignorar, respeitando o uso de maiúsculas\nReferências\nHiperligações externas\nVer também\n #</pre> <!-- deixe esta linha exatamente como ela está -->",
        "searchbutton": "Pesquisar",
        "go": "Prosseguir",
        "searcharticle": "Ir",
        "title-invalid-magic-tilde": "O título de página solicitado contém uma sequência de tis inválida (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "O título de página solicitado é demasiado longo. Não pode exceder $1 {{PLURAL:$1|byte|bytes}} em codificação UTF-8.",
        "title-invalid-leading-colon": "O título de página solicitado contém um sinal de dois pontos (:) inválido no início.",
-       "perfcached": "Os seguintes dados encontram-se armazenados na ''cache'' e podem não estar atualizados. {{PLURAL:$1|Está disponível na ''cache'' um máximo de um resultado|Estão disponíveis na ''cache'' um máximo de $1 resultados}}.",
-       "perfcachedts": "Os seguintes dados encontram-se armazenados na ''cache'' e foram atualizados pela última vez a $1. {{PLURAL:$4|Está disponível na ''cache'' um máximo de um resultado|Estão disponíveis na ''cache'' um máximo de $4 resultados}}.",
+       "perfcached": "Os seguintes dados encontram-se armazenados na cache e podem não estar atualizados. {{PLURAL:$1|Está disponível na cache um máximo de um resultado|Estão disponíveis na cache um máximo de $1 resultados}}.",
+       "perfcachedts": "Os seguintes dados estão na cache e foram atualizados pela última vez a $1. {{PLURAL:$4|Está disponível na cache um máximo de um resultado|Estão disponíveis na cache um máximo de $4 resultados}}.",
        "querypage-no-updates": "As atualizações estão presentemente desativadas para esta página.\nPor enquanto, os dados aqui presentes não poderão ser atualizados.",
        "viewsource": "Ver código-fonte",
        "viewsource-title": "Mostrar código-fonte de $1",
        "right-reupload-own": "Sobrescrever um ficheiro existente carregado pelo mesmo utilizador",
        "right-reupload-shared": "Sobrescrever localmente ficheiros no repositório partilhado de imagens",
        "right-upload_by_url": "Carregar um ficheiro de um endereço URL",
-       "right-purge": "Limpar a ''cache'' de uma página no servidor sem confirmação",
+       "right-purge": "Limpar a cache de uma página no servidor sem confirmação",
        "right-autoconfirmed": "Não ser afetado pelos limites de frequência de edição baseados em endereços IP",
        "right-bot": "Ser tratado como um processo automatizado",
        "right-nominornewtalk": "Não desencadear o aviso de mensagens novas ao fazer edições menores a páginas de discussão",
        "recentchanges-network": "Devido a uma falha técnica, não foi possível carregar nenhum resultado. Tente atualizar a página, por favor.",
        "recentchanges-notargetpage": "Introduza um nome de página acima para ver as alterações relacionadas a essa página.",
        "recentchanges-feed-description": "Acompanhe neste ''feed'' as mudanças mais recentes da wiki.",
-       "recentchanges-label-newpage": "Esta edição criou uma nova página",
+       "recentchanges-label-newpage": "Esta edição criou uma página nova",
        "recentchanges-label-minor": "Esta é uma edição menor",
        "recentchanges-label-bot": "Esta edição foi feita por um robô",
        "recentchanges-label-unpatrolled": "Esta edição ainda não foi patrulhada",
        "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.",
        "rcfilters-filter-showlinkedfrom-label": "Mostrar mudanças de páginas para as quais esta página contém hiperligações",
-       "rcfilters-filter-showlinkedfrom-option-label": "Mostrar mudanças de páginas <strong>PARA AS QUAIS</strong> uma página contém hiperligações",
-       "rcfilters-filter-showlinkedto-label": "Mostrar mudanças de páginas que contêm hiperligações para a página",
-       "rcfilters-filter-showlinkedto-option-label": "Mostrar mudanças de páginas <strong>QUE CONTÊM</strong> hiperligações para uma página",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páginas para as quais</strong> a página selecionada contém hiperligações",
+       "rcfilters-filter-showlinkedto-label": "Mostrar mudanças nas páginas que contêm hiperligações para",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Páginas que contêm hiperligações</strong> para a página selecionada",
        "rcfilters-target-page-placeholder": "Introduzir o nome de uma página",
        "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",
        "mostlinkedtemplates": "Páginas mais transcluídas",
        "mostcategories": "Páginas com mais categorias",
        "mostimages": "Ficheiros com mais afluentes",
-       "mostinterwikis": "Páginas com mais ligações interwikis",
+       "mostinterwikis": "Páginas com mais hiperligações interwikis",
        "mostrevisions": "Páginas com mais revisões",
        "prefixindex": "Todas as páginas iniciadas por",
        "prefixindex-namespace": "Todas as páginas com prefixo (domínio $1)",
        "apisandbox-fullscreen": "Expandir painel",
        "apisandbox-fullscreen-tooltip": "Expandir o painel da página de testes para preencher a janela do navegador.",
        "apisandbox-unfullscreen": "Mostrar página",
-       "apisandbox-unfullscreen-tooltip": "Reduza o painel da área de testes, para que as ligações de navegação estejam disponíveis.",
+       "apisandbox-unfullscreen-tooltip": "Reduza o painel da área de testes, para que as hiperligações de navegação do MediaWiki estejam disponíveis.",
        "apisandbox-submit": "Fazer o pedido",
        "apisandbox-reset": "Limpar",
        "apisandbox-retry": "Tentar novamente",
        "apisandbox-loading": "A carregar a informação do módulo API \"$1\"...",
        "apisandbox-load-error": "Ocorreu um erro ao carregar a informação do módulo API \"$1\": $2",
        "apisandbox-no-parameters": "Este módulo API não tem parâmetros.",
-       "apisandbox-helpurls": "Ligações de ajuda",
+       "apisandbox-helpurls": "Hiperligações de ajuda",
        "apisandbox-examples": "Exemplos",
        "apisandbox-dynamic-parameters": "Parâmetros adicionais",
        "apisandbox-dynamic-parameters-add-label": "Adicionar parâmetro:",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar fontes de livros",
        "booksources-search": "Pesquisar",
-       "booksources-text": "É apresentada abaixo uma lista de ligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
+       "booksources-text": "É apresentada abaixo uma lista de hiperligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique a existência de erros ao copiar da fonte original.",
-       "magiclink-tracking-rfc": "Páginas que usam links mágicos RFC",
-       "magiclink-tracking-rfc-desc": "Esta página usa links mágicos RFC. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
+       "magiclink-tracking-rfc": "Páginas que usam hiperligações mágicas RFC",
+       "magiclink-tracking-rfc-desc": "Esta página usa hiperligações mágicas RFC. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
        "magiclink-tracking-pmid": "Páginas que usam links mágicos PMID",
-       "magiclink-tracking-pmid-desc": "Esta página usa links mágicos PMID. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
+       "magiclink-tracking-pmid-desc": "Esta página usa hiperligações mágicas PMID. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
        "magiclink-tracking-isbn": "Páginas que usam links mágicos ISBN",
-       "magiclink-tracking-isbn-desc": "Esta página usa links mágicos ISBN. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
+       "magiclink-tracking-isbn-desc": "Esta página usa hiperligações mágicas ISBN. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
        "specialloguserlabel": "Executante:",
        "speciallogtitlelabel": "Alvo (título ou página ou {{ns:user}}:nome de utilizador):",
        "log": "Registos",
        "deletedcontributions": "Edições eliminadas",
        "deletedcontributions-title": "Edições eliminadas",
        "sp-deletedcontributions-contribs": "contribuições",
-       "linksearch": "Pesquisa de ligações externas",
+       "linksearch": "Pesquisa de hiperligações externas",
        "linksearch-pat": "Padrão de pesquisa:",
        "linksearch-ns": "Domínio:",
        "linksearch-ok": "Pesquisar",
        "post-expand-template-inclusion-category-desc": "O tamanho da página é superior a <code>$wgMaxArticleSize</code>, após a expansão de todas as predefinições, pelo que algumas predefinições não foram expandidas.",
        "post-expand-template-argument-category-desc": "O tamanho da página é superior a <code>$wgMaxArticleSize</code>, após a expansão de um argumento de predefinição (algo em chavetas triplas, como <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "A página tem demasiadas funções do analisador custosas (como <code>#ifexist</code>) incluídas. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "A página contém uma ligação quebrada para um ficheiro (uma ligação para incorporar um ficheiro que não existe).",
-       "hidden-category-category-desc": "Esta é uma categoria com a marca <code><nowiki>__HIDDENCAT__</nowiki></code>, que faz com que ela não apareça na caixa de ligações de categoria nas páginas, por omissão.",
+       "broken-file-category-desc": "A página contém uma hiperligação quebrada para um ficheiro (uma hiperligação para incorporar um ficheiro que não existe).",
+       "hidden-category-category-desc": "Esta é uma categoria com a marca <code><nowiki>__HIDDENCAT__</nowiki></code>, que faz com que ela não apareça na caixa de hiperligações de categoria nas páginas, por omissão.",
        "trackingcategories-nodesc": "Sem descrição disponível.",
        "trackingcategories-disabled": "A categoria está desativada.",
        "mailnologin": "Não existe endereço de envio",
        "undeleterevdel": "O restauro não será efetuado se resulta na remoção parcial da versão mais recente da página ou ficheiro.\nNestes casos, deverá desmarcar ou revelar a versão eliminada mais recente.",
        "undeletehistorynoadmin": "Esta página foi eliminada.\nO motivo de eliminação é apresentado no resumo abaixo, em conjunto com detalhes dos utilizadores que tinham editado esta página antes da sua eliminação.\nO texto atual destas edições eliminadas encontra-se agora apenas disponível para administradores.",
        "undelete-revision": "Edição eliminada da página $1 (das $5 de $4), por $3:",
-       "undeleterevision-missing": "Edição inválida ou não encontrada.\nPode ter usado uma ligação incorreta ou talvez a revisão tenha sido restaurada ou removida do arquivo.",
+       "undeleterevision-missing": "Edição inválida ou não encontrada.\nPode ter usado uma hiperligação incorreta ou talvez a revisão tenha sido restaurada ou removida do arquivo.",
        "undeleterevision-duplicate-revid": "Não foi possível restaurar {{PLURAL:$1|uma revisão|$1 revisões}}, porque {{PLURAL:$1|a sua <code>rev_id</code> já estava a ser usada|as respetivas <code>rev_id</code> já estavam a ser usadas}}.",
        "undelete-nodiff": "Não foram encontradas edições anteriores.",
        "undeletebtn": "Restaurar",
        "nolinkshere-ns": "Não existem afluentes para <strong>[[:$1]]</strong> no espaço nominal selecionado.",
        "isredirect": "página de redirecionamento",
        "istemplate": "inclusão",
-       "isimage": "ligação para ficheiro",
+       "isimage": "hiperligação para ficheiro",
        "whatlinkshere-prev": "{{PLURAL:$1|anterior|$1 anteriores}}",
        "whatlinkshere-next": "{{PLURAL:$1|próximo|próximos $1}}",
        "whatlinkshere-links": "← afluentes",
        "whatlinkshere-hideredirs": "$1 redirecionamentos",
        "whatlinkshere-hidetrans": "$1 transclusões",
-       "whatlinkshere-hidelinks": "$1 ligações",
+       "whatlinkshere-hidelinks": "$1 hiperligações",
        "whatlinkshere-hideimages": "$1 ligações para ficheiros",
        "whatlinkshere-filters": "Filtros",
        "whatlinkshere-submit": "Continuar",
        "selfmove": "O título é o mesmo;\nnão é possível mover uma página para ela mesma.",
        "immobile-source-namespace": "Não é possível mover páginas no domínio \"$1\"",
        "immobile-target-namespace": "Não é possível mover páginas para o domínio \"$1\"",
-       "immobile-target-namespace-iw": "Uma ligação interlíngua não é um destino válido para uma movimentação de página.",
+       "immobile-target-namespace-iw": "Uma hiperligação interwikis não é um destino válido para uma movimentação de página.",
        "immobile-source-page": "Esta página não pode ser movida.",
        "immobile-target-page": "Não é possível mover para esse título de destino.",
        "bad-target-model": "O destino pretendido usa um modelo de conteúdo diferente. Não é possível converter de $1 para $2.",
        "move-over-sharedrepo": "[[:$1]] já existe num repositório partilhado. Mover um ficheiro para o título [[:$1]] irá substituir o ficheiro partilhado.",
        "file-exists-sharedrepo": "O nome de ficheiro que escolheu já é utilizado num repositório partilhado.\nEscolha outro nome, por favor.",
        "export": "Exportar páginas",
-       "exporttext": "Pode exportar o texto e o histórico de edições de uma página em particular para um ficheiro XML. Poderá então importar esse conteúdo noutra wiki que utilize o programa MediaWiki, através da [[Special:Import|página de importações]].\n\nPara exportar páginas, introduza os títulos na caixa de texto abaixo (um título por linha) e selecione se deseja todas as versões, com as linhas de histórico de edições, ou apenas a edição atual e informações sobre a mais recente das edições.\n\nSe desejar, pode utilizar um link (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a [[{{MediaWiki:Mainpage}}]]).",
+       "exporttext": "Pode exportar o texto e o histórico de edições de uma página em particular para um ficheiro XML. Poderá então importar esse conteúdo noutra wiki que utilize o programa MediaWiki, através da [[Special:Import|página de importações]].\n\nPara exportar páginas, introduza os títulos na caixa de texto abaixo (um título por linha) e selecione se deseja todas as versões, com as linhas de histórico de edições, ou apenas a edição atual e informações sobre a mais recente das edições.\n\nSe desejar, pode utilizar uma hiperligação (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a [[{{MediaWiki:Mainpage}}]]).",
        "exportall": "Exportar todas as páginas",
        "exportcuronly": "Incluir apenas a edição atual, não o histórico completo",
        "exportnohistory": "----\n<strong>Nota:</strong> A exportação do histórico completo de páginas através deste formulário foi desativada por motivos de desempenho.",
        "importunknownsource": "Tipo da fonte de importação desconhecido",
        "importnoprefix": "Não foi fornecido nenhum prefixo interwikis",
        "importcantopen": "Não foi possível abrir o ficheiro a importar",
-       "importbadinterwiki": "Ligação interlíngua incorreta",
+       "importbadinterwiki": "Hiperligação interwikis incorreta",
        "importsuccess": "Importação completa!",
        "importnosources": "Não foram definidas as wikis das quais importar e o carregamento direto de históricos encontra-se desativado.",
        "importnofile": "Não foi carregado nenhum ficheiro de importação.",
        "tooltip-n-randompage": "Carregar página aleatória",
        "tooltip-n-help": "Um local reservado para auxílio.",
        "tooltip-t-whatlinkshere": "Lista de todas as páginas que contêm ligações para esta",
-       "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta contém ligação",
+       "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta contém hiperligações",
        "tooltip-feed-rss": "''Feed'' RSS desta página",
        "tooltip-feed-atom": "''Feed'' Atom desta página",
        "tooltip-t-contributions": "Ver as contribuições {{GENDER:$1|deste utilizador|desta utilizadora|deste(a) utilizador(a)}}",
        "tooltip-t-upload": "Carregar ficheiros",
        "tooltip-t-specialpages": "Lista de páginas especiais",
        "tooltip-t-print": "Versão para impressão desta página",
-       "tooltip-t-permalink": "Ligação permanente para esta versão da página",
+       "tooltip-t-permalink": "Hiperligação permanente para esta revisão da página",
        "tooltip-ca-nstab-main": "Ver a página de conteúdo",
        "tooltip-ca-nstab-user": "Ver a página de utilizador",
        "tooltip-ca-nstab-media": "Ver a página de multimédia",
        "creditspage": "Créditos da página",
        "nocredits": "Não há informação disponível sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
-       "spamprotectiontext": "O texto que desejava gravar foi bloqueado pelo filtro de spam.\nEste bloqueio foi provavelmente causado por um link para um site externo que consta da lista negra.",
+       "spamprotectiontext": "O texto que pretendia gravar foi bloqueado pelo filtro de spam.\nEste bloqueio foi provavelmente causado por uma hiperligação para um ''site'' externo que está na lista negra.",
        "spamprotectionmatch": "O seguinte texto ativou o filtro de <i>spam</i>: $1",
        "spambot_username": "MediaWiki limpeza de spam",
        "spam_reverting": "A reverter para a última revisão que não contém ligação para $1",
-       "spam_blanking": "Todas as revisões continham ligações para $1; a esvaziar",
-       "spam_deleting": "Todas as revisões continham ligações para $1; a eliminar",
+       "spam_blanking": "Todas as revisões continham hiperligações para $1; a esvaziar",
+       "spam_deleting": "Todas as revisões continham hiperligações para $1; a eliminar",
        "simpleantispam-label": "Verificação contra spam.\n<strong>Não</strong> preencha isto!",
        "pageinfo-title": "Informações sobre \"$1\"",
        "pageinfo-not-current": "Desculpe, é impossível fornecer esta informação para revisões antigas.",
        "saturday-at": "Sábado às $1",
        "sunday-at": "Domingo às $1",
        "yesterday-at": "Ontem às $1",
-       "bad_image_list": "O formato é o seguinte:\n\nSó são reconhecidos elementos na forma de lista (linhas começadas por *).\nO primeiro link em cada linha deve apontar para o ficheiro que se pretende bloquear.\nQuaisquer outras ligações nessa mesma linha são considerados excepções (ou seja, páginas de onde se pode aceder ao ficheiro).",
+       "bad_image_list": "O formato é o seguinte:\n\nSó são reconhecidos elementos na forma de lista (linhas começadas por *).\nA primeira hiperligação em cada linha deve apontar para o ficheiro que se pretende bloquear.\nQuaisquer outras hiperligações nessa mesma linha são consideradas exceções (ou seja, páginas de onde se pode aceder ao ficheiro).",
        "metadata": "Metadados",
        "metadata-help": "Este ficheiro contém informação adicional, provavelmente acrescentada pela câmara digital ou pelo digitalizador usados para criá-lo.\nCaso o ficheiro tenha sido modificado a partir do seu estado original, alguns detalhes poderão não refletir completamente as mudanças efetuadas.",
        "metadata-expand": "Mostrar detalhes adicionais",
        "confirmemail_success": "O seu endereço de correio eletrónico foi confirmado.\nPode agora [[Special:UserLogin|autenticar-se]] e desfrutar da wiki.",
        "confirmemail_loggedin": "O seu endereço de correio eletrónico foi confirmado.",
        "confirmemail_subject": "Confirmação de endereço de correio eletrónico da wiki {{SITENAME}}",
-       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio eletrónico na wiki {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e ativar\nas funcionalidades de correio eletrónico na wiki {{SITENAME}}, abra a seguinte ligação no seu navegador:\n\n$3\n\nSe a conta *não* é sua, abra a seguinte ligação para cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
-       "confirmemail_body_changed": "Alguém, provavelmente você a partir do endereço IP $1,\nalterou o endereço de correio eletrónico da conta \"$2\" para este endereço, na wiki{{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na wiki {{SITENAME}},\nabra a seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
-       "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" na wiki {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na wiki {{SITENAME}},\nabra a seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio eletrónico na wiki {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e ativar\nas funcionalidades de correio eletrónico na wiki {{SITENAME}}, abra a seguinte hiperligação no seu navegador:\n\n$3\n\nSe a conta *não* é sua, siga a seguinte hiperligação para cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body_changed": "Alguém, provavelmente você a partir do endereço IP $1,\nalterou o endereço de correio eletrónico da conta \"$2\" para este endereço, na wiki{{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na wiki {{SITENAME}},\nabra a seguinte hiperligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, siga a seguinte hiperligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" na wiki {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na wiki {{SITENAME}},\nabra a seguinte hiperligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, siga a seguinte hiperligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
        "confirmemail_invalidated": "Confirmação de endereço de correio eletrónico cancelada",
        "invalidateemail": "Cancelar confirmação do correio eletrónico",
        "notificationemail_subject_changed": "O endereço de correio eletrónico registado na wiki {{SITENAME}} foi alterado",
        "specialpages-group-developer": "Ferramentas de desenvolvimento",
        "blankpage": "Página em branco",
        "intentionallyblankpage": "Esta página foi intencionalmente deixada em branco",
-       "external_image_whitelist": " # Deixe esta linha exatamente como ela está<pre>\n# Coloque fragmentos de expressões regulares (apenas a parte entre //) abaixo\n# Estas serão comparadas com os URL das imagens externas (com ligação direta)\n# As que corresponderem serão apresentadas como imagens, caso contrário apenas será apresentado um link para a imagem\n# As linhas que começam com um símbolo de cardinal (#) são tratadas como comentários\n# Esta lista não distingue maiúsculas de minúsculas\n\n# Coloque todos os fragmentos de expressões regulares (regex) acima desta linha. Deixe esta linha exatamente como ela está</pre>",
+       "external_image_whitelist": " # Deixe esta linha exatamente como ela está<pre>\n# Coloque fragmentos de expressões regulares (apenas a parte entre //) abaixo\n# Estas serão comparadas com os URL das imagens externas (com ligação direta)\n# As que corresponderem serão apresentadas como imagens, caso contrário apenas será apresentada uma hiperligação para a imagem\n# As linhas que começam com um símbolo de cardinal (#) são tratadas como comentários\n# Esta lista não distingue maiúsculas de minúsculas\n\n# Coloque todos os fragmentos de expressões regulares (regex) acima desta linha. Deixe esta linha exatamente como ela está</pre>",
        "tags": "Etiquetas de modificação válidas",
        "tag-filter": "Filtro de [[Special:Tags|etiquetas]]:",
        "tag-filter-submit": "Filtrar",
        "tag-mw-replace-description": "Edições que removem mais de 90% do conteúdo de uma página",
        "tag-mw-rollback": "Reversão",
        "tag-mw-rollback-description": "Edições que revertem edições anteriores usando a hiperligação desfazer",
+       "tag-mw-undo": "Desfazer",
+       "tag-mw-undo-description": "Edições que desfazem edições anteriores usando a hiperligação «desfazer»",
        "tags-title": "Etiquetas de modificação válidas",
        "tags-intro": "Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.",
        "tags-tag": "Nome da etiqueta",
        "diff-form-oldid": "Identificador de revisão antigo (opcional)",
        "diff-form-revid": "Identificador de revisão da diferença",
        "diff-form-submit": "Mostrar diferenças",
-       "permanentlink": "Link permanente",
+       "permanentlink": "Hiperligação permanente",
        "permanentlink-revid": "Identificador de revisão",
        "permanentlink-submit": "Ir para a revisão",
        "dberr-problems": "Desculpe! Este site está com dificuldades técnicas.",
        "json-error-recursion": "Uma ou mais referências recursivas no valor a ser codificado",
        "json-error-inf-or-nan": "Um ou mais valores NaN ou INF no valor a ser codificado",
        "json-error-unsupported-type": "Foi dado um valor de um tipo que não pode ser codificado",
-       "headline-anchor-title": "Ligação para esta secção",
+       "headline-anchor-title": "Hiperligação para esta secção",
        "special-characters-group-latin": "Latim",
        "special-characters-group-latinextended": "Latim expandido",
        "special-characters-group-ipa": "AFI (IPA)",
index 209838e..0659453 100644 (file)
        "rcfilters-activefilters": "Title for the filters selection showing the active filters.",
        "rcfilters-advancedfilters": "Title for the buttons allowing the user to switch to the various advanced filters views.",
        "rcfilters-limit-title": "Title for the options to change the number of results shown.",
-       "rcfilters-limit-and-date-label": "Title for the button that opens the operation to control how many results to show and in which time period to search. \n\nParameters: $1 - Number of results shown\n\n$2 - Time period to search. One of {{msg-mw|rcfilters-days-title}} or {{msg-mw|rcfilters-hours-title}} is used as $2",
+       "rcfilters-limit-and-date-label": "Title for the button that opens the operation to control how many results to show and in which time period to search. \n\nParameters: $1 - Number of results shown\n\n$2 - Time period to search. One of {{msg-mw|rcfilters-days-title}} or {{msg-mw|rcfilters-hours-title}} is used as $2\n{{Identical|Change}}",
        "rcfilters-date-popup-title": "Section title of date options on recent changes results",
        "rcfilters-days-title": "Title for the options to change the number of days for the results shown.",
        "rcfilters-hours-title": "Title for the options to change the number of hours for the results shown.",
        "tag-mw-replace-description": "Description for \"replace\" change tag",
        "tag-mw-rollback": "Change tag for rolling back an edit\n{{Identical|Rollback}}",
        "tag-mw-rollback-description": "Description for \"rollback\" change tag",
+       "tag-mw-undo": "Change tag for undoing an edit",
+       "tag-mw-undo-description": "Description for \"undo\" change tag",
        "tags-title": "The title of [[Special:Tags]].\n{{Identical|Tag}}",
        "tags-intro": "Explanation on top of [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-tag": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
index 03fddda..5bf406b 100644 (file)
        "createaccountmail-help": "\nМожет использоваться, чтобы создать учетную запись для другого лица, не узнавая пароль.",
        "createacct-realname": "Настоящее имя (необязательно)",
        "createacct-reason": "Причина",
-       "createacct-reason-ph": "Зачем вы создаёте другую учетную запись",
+       "createacct-reason-ph": "Зачем вы создаёте другую учётную запись",
        "createacct-reason-help": "Сообщение, отображаемое в журнале создания учётных записей",
        "createacct-submit": "Создать учётную запись",
        "createacct-another-submit": "Создать учётную запись",
        "timezoneregion-indian": "Индийский океан",
        "timezoneregion-pacific": "Тихий океан",
        "allowemail": "Разрешить другим участникам отправлять мне электронную почту",
+       "email-allow-new-users-label": "Разрешить электронные письма от совсем новых участников",
        "email-blacklist-label": "Запретить этим участникам отправлять мне электронную почту:",
        "prefs-searchoptions": "Поиск",
        "prefs-namespaces": "Пространства имён",
        "right-siteadmin": "блокировка и разблокировка базы данных",
        "right-override-export-depth": "экспортирование страниц, включая связанные страницы с глубиной до 5",
        "right-sendemail": "отправка электронной почты другим участникам",
+       "right-sendemail-new-users": "отправка электронной почты участникам без записей журналов",
        "right-managechangetags": "создание и (де)активация [[Special:Tags|меток]]",
        "right-applychangetags": "применение [[Special:Tags|меток]] вместе со своими правками",
        "right-changetags": "добавление и удаление произвольных [[Special:Tags|меток]] на отдельных правках и записях в журнале",
        "recentchanges-noresult": "Изменений в указанный период, соответствующих указанным условиям, нет.",
        "recentchanges-timeout": "Время ожидания этого поиска истекло. Вы можете попробовать задать другие параметры поиска.",
        "recentchanges-network": "Из-за технической ошибки результаты не могут быть загружены. Попробуйте обновить страницу.",
+       "recentchanges-notargetpage": "Введите название страницы выше, чтобы увидеть правки, связанные с этой страницей.",
        "recentchanges-feed-description": "Отслеживание последних изменений в вики.",
        "recentchanges-label-newpage": "Этой правкой была создана новая страница",
        "recentchanges-label-minor": "Это незначительное изменение",
        "rcfilters-watchlist-showupdated": "Изменения страниц, которые вы не посещали с того момента, как они изменились, выделены <strong>жирным</strong> и отмечены полным маркером.",
        "rcfilters-preference-label": "Скрыть улучшенную версию Последних изменений",
        "rcfilters-preference-help": "Откатывает редизайн интерфейса 2017 года и все инструменты, добавленные с тех пор.",
+       "rcfilters-filter-showlinkedfrom-label": "Показать правки на ссылаемых страницах",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Страницы, на которые ссылается</strong> выбранная",
+       "rcfilters-filter-showlinkedto-label": "Показать правки на ссылающихся страницах",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Страницы, ссылающиеся</strong> на выбранную",
        "rcfilters-target-page-placeholder": "Введите имя страницы",
        "rcnotefrom": "Ниже {{PLURAL:$5|указано изменение|перечислены изменения}} с <strong>$3, $4</strong> (показано не более <strong>$1</strong>).",
        "rclistfromreset": "Сбросить выбор даты",
        "recentchangeslinked-feed": "Связанные правки",
        "recentchangeslinked-toolbox": "Связанные правки",
        "recentchangeslinked-title": "Связанные правки для «$1»",
-       "recentchangeslinked-summary": "ЭÑ\82о Ñ\81пиÑ\81ок Ð½ÐµÐ´Ð°Ð²Ð½Ð¸Ñ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\85, Ð½Ð° ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ñ\81Ñ\81Ñ\8bлаеÑ\82Ñ\81Ñ\8f Ñ\83казаннаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а (или Ð²Ñ\85одÑ\8fÑ\89иÑ\85 Ð² Ñ\83казаннÑ\83Ñ\8e ÐºÐ°Ñ\82егоÑ\80иÑ\8e).\nСÑ\82Ñ\80аниÑ\86Ñ\8b, Ð²Ñ\85одÑ\8fÑ\89ие Ð² [[Special:Watchlist|ваÑ\88 Ñ\81пиÑ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f]] '''вÑ\8bделенÑ\8b'''.",
+       "recentchangeslinked-summary": "Ð\92ведиÑ\82е Ð¸Ð¼Ñ\8f Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b, Ñ\87Ñ\82обÑ\8b Ñ\83видеÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\85, Ñ\81Ñ\81Ñ\8bлаÑ\8eÑ\89иÑ\85Ñ\81Ñ\8f Ð½Ð° Ñ\8dÑ\82Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð¸Ð»Ð¸, Ð½Ð°Ð¾Ð±Ð¾Ñ\80оÑ\82, c Ð½ÐµÑ\91. (ЧÑ\82обÑ\8b Ñ\83видеÑ\82Ñ\8c Ñ\87ленов ÐºÐ°Ñ\82егоÑ\80ии, Ð²Ð²ÐµÐ´Ð¸Ñ\82е Category:Ð\9dазвание ÐºÐ°Ñ\82егоÑ\80ии). Ð\98зменениÑ\8f Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\85 [[Special:Watchlist|ваÑ\88его Ñ\81пиÑ\81ка Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f]] Ð¾Ñ\82меÑ\87енÑ\8b <strong>жиÑ\80нÑ\8bм Ñ\88Ñ\80иÑ\84Ñ\82ом</strong>.",
        "recentchangeslinked-page": "Название страницы:",
        "recentchangeslinked-to": "Наоборот, показать изменения на страницах, которые ссылаются на указанную страницу",
        "recentchanges-page-added-to-category": "[[:$1]] добавлена в категорию",
        "uploadstash-bad-path-unrecognized-thumb-name": "Нераспознанное имя миниатюры.",
        "uploadstash-bad-path-no-handler": "Не найден обработчик для mime-типа $1 файла $2.",
        "uploadstash-bad-path-bad-format": "Ключ «$1» — в неподходящем формате.",
+       "uploadstash-file-not-found": "Ключ «$1» не найден во временном хранилище.",
        "uploadstash-file-not-found-no-thumb": "Не удалось получить миниатюру.",
+       "uploadstash-file-not-found-no-local-path": "Не найдено локального пути к отмасштабированному изображению.",
+       "uploadstash-file-not-found-no-object": "Не удалось создать объект локального файла для миниатюры.",
+       "uploadstash-file-not-found-no-remote-thumb": "Извлечение эскиза не удалось: $1\nURL = $2",
        "uploadstash-file-not-found-missing-content-type": "Отсутствует заголовок content-type.",
+       "uploadstash-file-not-found-not-exists": "Путь не найден или файл непонятен.",
+       "uploadstash-file-too-large": "Невозможно обработать файл размером более $1 байт.",
+       "uploadstash-not-logged-in": "Нет авторизованных участников, файлы должны принадлежать участникам.",
        "uploadstash-wrong-owner": "Этот файл ($1) не принадлежит текущему участнику.",
+       "uploadstash-no-such-key": "Нет ключа ($1), удаление невозможно.",
        "uploadstash-no-extension": "Пустое расширение.",
        "uploadstash-zero-length": "Файл нулевой длины.",
        "invalid-chunk-offset": "Недопустимое смещение фрагмента",
        "upload-disallowed-here": "Вы не можете перезаписать этот файл.",
        "filerevert": "Возврат к старой версии $1",
        "filerevert-legend": "Возвратить версию файла",
-       "filerevert-intro": "<span class=\"plainlinks\">Вы возвращаете '''[[Media:$1|$1]]''' к [$4 версии от $3, $2].</span>",
+       "filerevert-intro": "Вы возвращаете <strong>[[Media:$1|$1]]</strong> к [$4 версии от $3, $2].",
        "filerevert-comment": "Причина:",
        "filerevert-defaultcomment": "Возврат к версии от $2, $1 ($3)",
        "filerevert-submit": "Возвратить",
        "filedelete": "$1 — удаление",
        "filedelete-legend": "Удалить файл",
        "filedelete-intro": "Вы собираетесь удалить файл '''[[Media:$1|$1]]''' со всей его историей.",
-       "filedelete-intro-old": "<span class=\"plainlinks\">Вы удаляете версию '''[[Media:$1|$1]]''' от [$4 $3, $2].</span>",
+       "filedelete-intro-old": "Вы удаляете версию <strong>[[Media:$1|$1]]</strong> от [$4 $3, $2].",
        "filedelete-comment": "Причина:",
        "filedelete-submit": "Удалить",
        "filedelete-success": "'''$1''' был удалён.",
        "import-mapping-subpage": "Импортировать как подстраницы следующей страницы:",
        "import-upload-filename": "Имя файла:",
        "import-upload-username-prefix": "Префиксы интервики:",
+       "import-assign-known-users": "Связать правки с локальными участниками, когда участники с такими именами существуют.",
        "import-comment": "Примечание:",
        "importtext": "Пожалуйста, экспортируйте страницу из исходной вики, используя [[Special:Export|соответствующий инструмент]]. Сохраните файл на диск, а затем загрузите его сюда.",
        "importstart": "Импортирование страниц…",
        "imported-log-entries": "{{PLURAL:$1|Импортирована $1 запись|Импортированы $1 записи|Импортировано $1 записей}} журнала.",
        "importfailed": "Не удалось импортировать: $1",
        "importunknownsource": "Неизвестный тип импортируемой страницы",
+       "importnoprefix": "Не указан префикс интервики",
        "importcantopen": "Невозможно открыть импортируемый файл",
        "importbadinterwiki": "Неправильная интервики-ссылка",
        "importsuccess": "Импортирование выполнено!",
        "exif-exposureindex": "Индекс экспозиции",
        "exif-sensingmethod": "Тип сенсора",
        "exif-filesource": "Источник файла",
-       "exif-scenetype": "СÑ\86енан ÐºÐµÐ¿",
+       "exif-scenetype": "Тип Ñ\81Ñ\86енÑ\8b",
        "exif-customrendered": "Дополнительная обработка",
        "exif-exposuremode": "Режим выбора экспозиции",
        "exif-whitebalance": "Баланс белого",
        "tag-mw-replace-description": "Правки, которые удаляют более 90 % содержимого страницы",
        "tag-mw-rollback": "откат",
        "tag-mw-rollback-description": "Правки, которые откатывают предыдущие правки по нажатию ссылки отката",
+       "tag-mw-undo": "отмена",
+       "tag-mw-undo-description": "Правки, отменяющие предыдущие с помощью ссылки «отменить»",
        "tags-title": "Метки",
        "tags-intro": "На этой странице приведён список меток, которыми программное обеспечение отмечает правки, а также значения этих меток.",
        "tags-tag": "Имя метки",
index b889bd4..0cd11fe 100644 (file)
        "cannotdelete": "$1 نالي صفحو يا فائيل ڊهي نہ سگھيو. ٿي سگھي ٿو تہ ڪنهن ان کي اڳ ۾ ئي ڊاهي ڇڏيو هجي.",
        "cannotdelete-title": "$1 نالي صفحي کي ڊاهي نہ ٿا سگھون.",
        "badtitle": "خراب عنوان",
-       "badtitletext": "صفحي جو گھربل عنوان ڪار ڪونهي، يا خالي آهي، يا وري غيردرست طريقي سان ڳنڍيل بين‌الزباني يا بين‌الوڪي عنوان آهي. \nان ۾ هڪ يا هڪ کان وڌيڪ اهڙا اکر موجود آهن، جيڪي عنوان ۾ استعمال ڪري نہ ٿا سگھجن.",
-       "title-invalid-utf8": "صفحي جي ڄاڻايل عنوان ۾ ناقابل ڪار يُو ٽِي ايف اکر شامل آهن.",
-       "title-invalid-interwiki": "ڄاڻايل عنوان ۾ اهڙو بين‌الوڪِي ڳنڍڻو شامل آهي، جيڪو عنوانن ۾ استعمال ڪري نہ ٿو سگھجي.",
-       "title-invalid-characters": "صفحي جي ڄاڻايل عنوان ۾ ناقابل ڪار اکر شامل آهن: $1",
-       "title-invalid-leading-colon": "صفحي جي ڄاڻايل عنوان جي ابتدا ۾ ناقابل ڪار ڪالن شامل آهي.",
+       "badtitletext": "صفحي جو گھربل عنوان ڪار ڪونهي، يا خالي آهي، يا وري غيردرست طريقي سان ڳنڍيل بين‌الزباني يا بين‌الوڪي عنوان آهي. \nان ۾ هڪ يا هڪ کان وڌيڪ اهڙا اکر موجود آهن، جيڪي عنوان ۾ استعمال ڪري نٿا سگھجن.",
+       "title-invalid-utf8": "صفحي جي ڄاڻايل عنوان ۾ ناقابلِڪار يُو ٽِيئيف-8 ترتيب شامل آھي.",
+       "title-invalid-interwiki": "ڄاڻايل عنوان ۾ اهڙو بين‌الوڪِي ڳنڍڻو شامل آهي، جيڪو عنوانن ۾ استعمال ڪري نٿو سگھجي.",
+       "title-invalid-characters": "صفحي جي ڄاڻايل عنوان ۾ ناقابلِڪار اکر شامل آهن: \"$1\".",
+       "title-invalid-leading-colon": "صفحي جي ڄاڻايل عنوان جي ابتدا ۾ ناقابلِڪار ڪالن شامل آهي.",
        "viewsource": "ڪوڊ ڏسو",
        "viewsource-title": "$1 جو ڪوڊ ڏسو",
-       "protectedpagetext": "هيءُ صفحو ترميمن کان تحفظيل آهي.",
-       "viewsourcetext": "توهان هن صفحي جو ڪوڊ ڏسي ۽ نقل ڪري سگھو ٿا:",
-       "namespaceprotected": "توهان کي نانءُ پولار '''$1''' جا صفحا سنوارڻ جا اختيار ناهن.",
+       "protectedpagetext": "هيءُ صفحو ترميمن ۽ ٻين عملن کان بچائڻ لاءِ تحفظيل آهي.",
+       "viewsourcetext": "توهان هن صفحي جو ڪوڊ ڏسي ۽ نقل ڪري سگھو ٿا.",
+       "namespaceprotected": "توهان کي نانءُپولار <strong>$1</strong> جا صفحا سنوارڻ جا اختيار ناهن.",
        "mycustomcssprotected": "توهان کي هيءُ CSS صفحو سنوارڻ جي اجازت نہ آهي.",
        "mycustomjsprotected": "توهان کي هيءُ جاوا اسڪرپٽ صفحو سنوارڻ جي اجازت حاصل ڪانهي.",
        "myprivateinfoprotected": "توهان کي پنهنجي ذاتي معلومات سنوارڻ جي اجازت حاصل نہ آهي.",
        "virus-unknownscanner": "اڻڄاتل نِس وائرس:",
        "cannotlogoutnow-title": "ھاڻي خارج نٿو ٿي سگھجي",
        "cannotlogoutnow-text": "$1 استعمال ڪرڻ دوران خارج ٿيڻ ممڪن نہ آھي.",
-       "welcomeuser": "ڀلي ڪري آيا، $1!",
+       "welcomeuser": "ڀليڪار، $1!",
        "yourname": "واپرائيندڙ-نانءُ:",
        "userlogin-yourname": "واپرائيندڙ-نانءُ",
        "userlogin-yourname-ph": "پنھنجو يوزرنانءُ ڄاڻايو",
        "nosuchusershort": "\"$1\" نالي ڪو بہ واپرائيندڙ ناهي.\nپنھنجي هِجي جي پڪ ڪندا.",
        "nouserspecified": "توهان کي ڪو واپرائيندڙ-نان‎ءُ ڄاڻائڻو پوندو.",
        "login-userblocked": "هيءُ واپرائيندڙ بندشيل آهي. داخل ٿيڻ جي اجازت نٿي ڏجي.",
-       "wrongpassword": "ڏنل ڳجھولفظ غير درست آهي. مھرباني ڪري ٻيھر ڪوشش ڪندا.",
+       "wrongpassword": "ڏنل واپرائيندڙ-نانءُ يا ڳجھولفظ غير درست آهي.\nمھرباني ڪري ٻيھر ڪوشش ڪندا.",
        "wrongpasswordempty": "ڏنل ڳجھولفظ خالي هو.\nمهرباني ڪري وري ڪوشش ڪندا.",
        "passwordtooshort": "ڳجھولفظ گھٽ ۾ گھٽ  {{PLURAL:$1|1 اکر|$1 اکرَن}} تي ٻڌل هوڻ گھرجي.",
        "passwordtoolong": "ڳجھولفظ {{PLURAL:$1|1 اکر|$1 اکرن}} کان وڏو نٿو ٿي سگھي.",
        "login-abort-generic": "توهان جو داخل ٿيڻ ناڪام ويو - بند ڪيل",
        "login-migrated-generic": "توهان جو کاتو لڏي چڪو آهي، ۽ هن وڪيءَ تي توهان جو واپرائيندڙ-نان‎ءُ هاڻي وجود نٿو رکي.",
        "loginlanguagelabel": "ٻولي: $1",
-       "createacct-another-realname-tip": "اصل نالو ڄاڻائڻ اختياري آهي. جيڪڏهن توهان اصل نالو ڄاڻايو ٿا، تہ اهو توهان کي توهان جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
+       "createacct-another-realname-tip": "اصل نالو ڄاڻائڻ اختياري آھي.\nجيڪڏھن توھان اھو ڄاڻائڻ چونڊيو ٿا، تہ اھو واپرائيندڙ کي انھن جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
        "pt-login": "داخل ٿيو",
        "pt-login-button": "داخل ٿيو",
        "pt-login-continue-button": "داخل ٿيڻ جاري رکو",
        "pt-createaccount": "کاتو کوليو",
        "pt-userlogout": "خارج ٿيو",
-       "php-mail-error-unknown": "پي ايڇ پي جي  ڪاڄ اندر اڻڄاتل چُڪَ.",
+       "php-mail-error-unknown": "پي ايڇ پي جي  ڪاڄ() اندر اڻڄاتل چُڪَ.",
        "user-mail-no-addy": "برقٽپال پتو ڄاڻائڻ کان سواءِ برقٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
        "changepassword": "ڳجھولفظ تبديل ڪريو",
        "resetpass_announce": "داخل ٿيڻ جو عمل پورو ڪرڻ لاءِ، توهان کي نئون ڳجھولفظ اختيار مقرر ڪرڻو پوندو.",
        "botpasswords-label-create": "سرجيو",
        "botpasswords-label-update": "تجديد",
        "botpasswords-label-cancel": "رد",
-       "botpasswords-label-delete": "ڊاهيو",
+       "botpasswords-label-delete": "ڊاھيو",
        "botpasswords-label-resetpassword": "ڳجھولفظ ٻيھر مقرر ڪريو",
        "botpasswords-label-grants-column": "منظور",
        "botpasswords-bad-appid": "بوٽ نانءُ \"$1\" قابلِڪار ناھي.",
        "passwordreset": "ڳجھولفظ مَٽايو",
        "passwordreset-text-one": "برقٽپال ذريعي عارضي ڳجھولفظ حاصل ڪرڻ لاءِ هيءُ فارم پُر ڪريو.",
        "passwordreset-disabled": "هن وڪيءَ تي ڳجھولفظ ٻيھر مقرر ڪرڻ وارو چارو غير فعال بڻايو ويو آهي.",
-       "passwordreset-emaildisabled": "هن وڪيءَ تي برق‌ٽپال واريون خصوصيتون غير فعال بڻايون ويون آهن.",
+       "passwordreset-emaildisabled": "ھن وڪيءَ تي برق‌ٽپال واريون خصوصيتون غير فعال بڻايون ويون آهن.",
        "passwordreset-username": "واپرائيندڙ-نانءُ:",
        "passwordreset-domain": "ميدان:",
        "passwordreset-email": "برقٽپال پتو:",
        "bold_sample": "گھري لکت",
        "bold_tip": "گھري لکت",
        "italic_sample": "ترڇي لکت",
-       "italic_tip": "ترڇي لکت",
+       "italic_tip": "ٽيڏي لکت",
        "link_sample": "ڳنڍڻي جو عنوان",
        "link_tip": "داخلي ڳنڍڻو",
        "extlink_sample": "http://www.example.com ڳنڍڻي جو عنوان",
        "showdiff": "تبديليون ڏيکاريو",
        "anoneditwarning": "<strong>چتاءُ:</strong> توھان داخل ٿيل نہ آھيو. توھان جو آءِپي پتو عوامي طور ظاھر ٿيندو جي توھان ڪي ترميمون ڪريو ٿا. جيڪڏھن توھان <strong>[$1 داخل ٿيو]</strong> ٿا يا <strong>[$2 کاتو کوليو]</strong> ٿا، تہ ٻين فائدن سان گڏ توھان جون ترميمون توھان جي يوزرنانءَ سان منسوب ڪيون وينديون.",
        "anonpreviewwarning": "توهان داخل ٿيل نہ آهيو. جيڪڏهن توهان صفحي ۾ تبديليون سانڍيون تہ اهڙين تبديلين ساڻ توهان جو آءِپي پتو درج ڪيو ويندو.",
-       "missingcommenttext": "براءِ مھرباني هيٺ پنهنجو تاثر درج ڪندا.",
+       "missingcommenttext": "براءِ مھرباني ڪو تاثر درج ڪندا.",
        "summary-preview": "تت جي پيش نگاھ:",
        "subject-preview": "موضوع جي پيش نگاھ:",
        "blockedtitle": "واپرائيندڙ بندشيل آهي",
        "editingsection": "ترميم ھيٺ $1 (سيڪشن)",
        "editingcomment": "ترميم هيٺ $1 (نئون سيڪشن)",
        "editconflict": "ترميمي تڪرار: $1",
-       "yourtext": "تÙ\88Ù\87اÙ\86 Ø¬Ù\88 Ù½Ù\8aڪسٽ",
+       "yourtext": "تÙ\88Ù\87اÙ\86 Ø¬Ù\88 Ù\85تÙ\86",
        "storedversion": "سانڍيل مسودو",
        "yourdiff": "تفاوت",
        "copyrightwarning": "ياد رکندا ته {{SITENAME}} لاءِ سموريون ڀاڱيداريون $2 تحت پڌريون ڪجن ٿيون (تفصيلن لاءِ $1 ڏسندا). اوهان جي تحرير کي {{SITENAME}} جي قائدن تحت ترميمي سگهجي ٿو. جيڪڏهن اوهان نه ٿا چاهيو ته اوهان جي لکڻين کي بي رحميءَ سان ترميميو وڃي يا ورهائي عام ڪيو وڃي ته پوءِ پنهنجي لکڻي هتي جمع نه ڪرايو. پنهنجو مواد هتي جمع ڪرڻ جو مطلب هوندو ته توهان کي جمع ڪرايل مواد جي مفت فراهمي ۽ کُليل تبديليءَ تي ڪو به اعتراز ناهي.<br />\nتوهان اهڙي پڪ ڏيڻ جا پابند پڻ آهيو ته توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن مفت وسيلي تان ڪاپي ڪيو آهي.\n'''تحفظيل حق ۽ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ کان سواءِ هتي جمع نه ڪريو.'''",
        "timezoneregion-europe": "يُورپ",
        "timezoneregion-indian": "سنڌي ساگر",
        "timezoneregion-pacific": "ماٺو ساگر",
-       "allowemail": "Ù»Ù\8aÙ\86 Ù\8aÙ\8fÙ\88زرس Ú©Ø§Ù\86 Ø§Ù\8aÙ\86دÚ\99 Ù½Ù¾Ø§Ù\84 Ø¨Ø­Ø§Ù\84 ÚªØ±يو",
+       "allowemail": "Ù»Ù\8aÙ\86 Ù\88اپرائÙ\8aÙ\86دÚ\99Ù\86 Ú©Ù\8a Ù\85Ù\88Ù\86 Ú\8fاÙ\86Ú¾Ù\86 Ø¨Ø±Ù\82ٽپاÙ\84 ÚªØ±Ú» Ø¬Ù\8a Ø§Ø¬Ø§Ø²Øª Ú\8fيو",
        "prefs-searchoptions": "ڳولا",
        "prefs-namespaces": "نانءُپولار",
        "default": "ڏنل",
        "rcfilters-quickfilters": "سانڍيل ڇاڻيون",
        "rcfilters-savedqueries-defaultlabel": "سانڍيل ڇاڻيون",
        "rcfilters-restore-default-filters": "ڏنل ڇاڻيون ريسٽور ڪريو",
-       "rcfilters-search-placeholder": "تازÙ\8aÙ\88Ù\86 ØªØ¨Ø¯Ù\8aÙ\84Ù\8aÙ\88Ù\86 Ú\87اڻÙ\8aÙ\88 (Ú\87اÙ\86Ú¯Ù\8aÙ\88 Ù\8aا Ù\84Ú©Ú» Ø´Ø±Ù\88ع ڪريو)",
+       "rcfilters-search-placeholder": "تبدÙ\8aÙ\84Ù\8aÙ\88Ù\86 Ú\87اڻÙ\8aÙ\88 (Ù\85Ù\8aÙ\86Ù\8aÙ\88 Ø§Ø³ØªØ¹Ù\85اÙ\84 ÚªØ±Ù\8aÙ\88 Ù\8aا Ú\87اڻÙ\8aØ¡Ù\8e Ø¬Ù\8a Ú³Ù\88Ù\84ا ڪريو)",
        "rcfilters-empty-filter": "ڪي بہ سرگرم ڇاڻيون ناھن. سڀ ڀاڱيداريون ڏيکاريل آھن.",
        "rcfilters-filterlist-title": "ڇاڻيون",
        "rcfilters-filterlist-whatsthis": "هي ڪيئن ڪم ڪن ٿا؟",
index 3f7ff5a..74f24b1 100644 (file)
        "imgmultipagenext": "ၼႃႈလိၵ်ႈတေမႃး",
        "imgmultigo": "ၵႂႃႇ!",
        "imgmultigoto": "ၵႂႃႇၸူး ၼႃႈလိၵ်ႈ $1",
+       "autosumm-new": "ၵေႃႇသၢင်ႈၼႃႈလိၵ်ႈဝႆႉ တင်း  \"$1\"",
        "watchlistedit-normal-title": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
        "watchlistedit-normal-legend": "ထွၼ်ပႅတ်ႈ ႁူဝ်ၶေႃႈ တမ်ႈတီႈ သဵၼ်ႈမၢႆမႂ်ႉတူၺ်း",
        "watchlistedit-normal-submit": "ထွၼ်ပႅတ်ႈ ႁူဝ်ၶေႃႈ",
index be42b72..22399b3 100644 (file)
        "specialpages": "خاص ورقے",
        "tag-filter": "[[Special:Tags|Tag]] نتارا:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ٹیگ|ٹیگز}}]]: $2)",
+       "tag-mw-undo": "واپس",
        "tags-active-yes": "ڄیا",
        "tags-active-no": "کو",
        "tags-hitcount": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
index 978fcdd..aa5b420 100644 (file)
        "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.",
        "rcfilters-filter-showlinkedfrom-label": "Pokaži spremembe na straneh, na katere se povezuje",
-       "rcfilters-filter-showlinkedfrom-option-label": "Pokaži spremembe na straneh, povezanih <strong>S</strong> strani",
-       "rcfilters-filter-showlinkedto-label": "Pokaži spremembe na straneh, povezane na",
-       "rcfilters-filter-showlinkedto-option-label": "Pokaži spremembe na straneh, povezanih <strong>NA</strong> stran",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Strani, na katere kaže</strong> izbrana stran",
+       "rcfilters-filter-showlinkedto-label": "Pokaži spremembe na straneh, ki kažejo na",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Strani, ki kažejo na</strong> izbrano stran",
        "rcfilters-target-page-placeholder": "Vnesite ime strani",
        "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",
        "tag-mw-replace-description": "Urejanja, ki odstranijo več kot 90 % vsebine strani",
        "tag-mw-rollback": "Vrnitev",
        "tag-mw-rollback-description": "Urejanja, ki vrnejo prejšnja urejanja s povezavo za vrnitev",
+       "tag-mw-undo": "Razveljavljeno",
+       "tag-mw-undo-description": "Urejanja, ki razveljavijo prejšnja urejanja z uporabo povezave za razveljavitev",
        "tags-title": "Etikete",
        "tags-intro": "Ta stran navaja etikete, s katerimi lahko programje označi urejanja, in njihov pomen.",
        "tags-tag": "Ime oznake",
index 54c1b2b..b9be5d7 100644 (file)
        "autosumm-blank": "Уклоњен целокупан садржај странице",
        "autosumm-replace": "Замењен садржај странице са „$1“",
        "autoredircomment": "Преусмерење на [[$1]]",
+       "autosumm-removed-redirect": "Уклоњено преусмјерење ка [[$1]]",
        "autosumm-new": "Нова страница: $1",
        "autosumm-newblank": "Направљена празна страница",
        "size-bytes": "$1 {{PLURAL:$1|бајт|бајта|бајтова}}",
        "tag-list-wrapper": "([[Special:Tags|$1 {{PLURAL:$1|ознака|ознаке|ознака}}]]: $2)",
        "tag-mw-contentmodelchange": "промена модела садржаја",
        "tag-mw-contentmodelchange-description": "Измене које мењају модел садржаја странице",
+       "tag-mw-new-redirect": "Ново преусмјерење",
+       "tag-mw-removed-redirect": "Уклоњено преусмјерење",
        "tag-mw-rollback": "Враћање",
        "tags-title": "Ознаке",
        "tags-intro": "На овој страници је наведен списак ознака с којима програм може да означи измене и његово значење.",
index 46ba7d1..a08cea1 100644 (file)
        "rcfilters-preference-label": "Dölj den förbättrade versionen av Senaste ändringar",
        "rcfilters-preference-help": "Stänger det nydesignade gränssnittet från 2017 och alla verktyg som lades till från och med då.",
        "rcfilters-filter-showlinkedfrom-label": "Visa ändringar på sidor som länkas från",
-       "rcfilters-filter-showlinkedfrom-option-label": "Visa ändringar på sidor som länkas <strong>FRÅN</strong> en sida",
-       "rcfilters-filter-showlinkedto-label": "Visa ändringar på sidor som länkas till",
-       "rcfilters-filter-showlinkedto-option-label": "Visa ändringar på sidor som länkas <strong>TILL</strong> en sida",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Sidor som länkas från</strong> den valda sidan",
+       "rcfilters-filter-showlinkedto-label": "Visa ändringar på sidor som länkar till",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Sidor som länkar till</strong> den valda sidan",
        "rcfilters-target-page-placeholder": "Ange namnet på en sida",
        "rcnotefrom": "Nedan visas {{PLURAL:$5|ändringen|ändringar}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
        "rclistfromreset": "Återställ datumval",
        "tag-mw-replace-description": "Redigeringar som tar bort mer än 90 % av innehållet",
        "tag-mw-rollback": "Tillbakarullning",
        "tag-mw-rollback-description": "Redigeringar som rullar tillbaka en tidigare redigering med tillbakarullningslänken",
+       "tag-mw-undo": "Ångra",
+       "tag-mw-undo-description": "Redigeringar som ångrar föregående redigeringar med ångralänken",
        "tags-title": "Märken",
        "tags-intro": "Denna sida listar de taggar som mjukvaran kan markera en redigering med, och deras betydelse.",
        "tags-tag": "Märkesnamn",
index cfb1ef8..bfe9af0 100644 (file)
        "import-logentry-upload-detail": "นำเข้า $1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}",
        "import-logentry-interwiki-detail": "นำเข้า $1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}จาก $2",
        "javascripttest": "การทดสอบจาวาสคริปต์",
+       "javascripttest-pagetext-unknownaction": "ปฏิบัติการที่ไม่รู้จัก: \"$1\"",
        "javascripttest-qunit-intro": "ดู[$1 เอกสารกำกับการทดสอบ]บน mediawiki.org",
        "tooltip-pt-userpage": "{{GENDER:|หน้าผู้ใช้}}ของคุณ",
        "tooltip-pt-anonuserpage": "หน้าผู้ใช้ของเลขที่อยู่ไอพีที่คุณกำลังใช้แก้ไข",
        "pageinfo-templates": "แม่แบบที่ใช้ ($1)",
        "pageinfo-toolboxlink": "สารสนเทศหน้า",
        "pageinfo-redirectsto": "เปลี่ยนทางไป",
+       "pageinfo-redirectsto-info": "สนเทศ",
        "pageinfo-contentpage": "นับเป็นหน้าเนื้อหา",
        "pageinfo-contentpage-yes": "ใช่",
        "pageinfo-protect-cascading": "การล็อกที่ต่อเรียงจากหน้านี้",
        "tag-mw-replace-description": "การแก้ไขซึ่งลบเนื้อหากว่า 90% ของหน้า",
        "tag-mw-rollback": "ย้อนกลับ",
        "tag-mw-rollback-description": "การแก้ไขซึ่งย้อนการแก้ไขก่อนหน้าโดยใช้ลิงก์ย้อนกลับฉุกเฉิน",
+       "tag-mw-undo": "ทำกลับ",
+       "tag-mw-undo-description": "การแก้ไขที่ทำกลับการแก้ไขก่อนหน้าโดยใช้ลิงก์ทำกลับ",
        "tags-title": "ป้ายระบุ",
        "tags-intro": "หน้านี้แสดงรายการและความหมายของป้ายระบุที่ซอฟต์แวร์อาจใช้ทำเครื่องหมายกำกับการแก้ไข",
        "tags-tag": "ชื่อป้ายกำกับ",
        "special-characters-group-canadianaboriginal": "แคนาดาพื้นเมืองดั้งเดิม",
        "special-characters-title-minus": "เครื่องหมายลบ",
        "mw-widgets-dateinput-no-date": "ไม่เลือกวันที่",
+       "date-range-from": "ตั้งแต่วันที่:",
+       "date-range-to": "ถึงวันที่:",
        "randomrootpage": "สุ่มหน้าราก",
        "log-action-filter-block": "ประเภทของการบล็อก:",
        "log-action-filter-contentmodel": "ประเภทของการเปลี่ยนตัวแบบเนื้อหา:",
index 94708e5..032787a 100644 (file)
@@ -97,7 +97,8 @@
                        "Alerque",
                        "Bulgu",
                        "Botansahin",
-                       "Catrope"
+                       "Catrope",
+                       "Hedda"
                ]
        },
        "tog-underline": "Bağlantıların altını çizme:",
        "rcfilters-empty-filter": "Etkin süzgeç bulunmuyor. Tüm katkıları gösteriliyor.",
        "rcfilters-filterlist-title": "Süzgeçler",
        "rcfilters-filterlist-whatsthis": "Bunlar nasıl çalışır?",
-       "rcfilters-filterlist-feedbacklink": "Bu (yeni) süzgeç araçları konusunda ne düşündüğünüzü bize aktarın",
+       "rcfilters-filterlist-feedbacklink": "Bu (yeni) süzgeç araçları konusunda ne düşündüğünüzü bize bildirin",
        "rcfilters-highlightbutton-title": "Sonuçları vurgula",
        "rcfilters-highlightmenu-title": "Bir renk seçin",
        "rcfilters-highlightmenu-help": "Bu özelliği vurgulamak için bir renk seçin",
        "rcfilters-filterlist-noresults": "Süzgeç bulunamadı",
-       "rcfilters-noresults-conflict": "Hiçbir sonuç bulunamadı çünkü arama kriterleri çelişkili",
+       "rcfilters-noresults-conflict": "Arama kriterleri çelişkili olduğu için hiçbir sonuç bulunamadı",
        "rcfilters-filtergroup-authorship": "Düzenleme sahipliği",
        "rcfilters-filter-editsbyself-label": "Senin değişiklikleriniz",
        "rcfilters-filter-editsbyself-description": "Kendi katkılarınız.",
index 0d2a97f..88b33ac 100644 (file)
@@ -72,7 +72,8 @@
                        "Bunyk",
                        "Choomaq",
                        "SimondR",
-                       "Renamerr"
+                       "Renamerr",
+                       "Avatar6"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "tagline": "Матеріал з {{grammar:genitive|{{SITENAME}}}}",
        "help": "Довідка",
        "search": "Пошук",
-       "search-ignored-headings": " #<!-- залиште цей рядок точно таким, яким він є --> <pre>\n# Заголовки, які будуть ігноруватися при пошуці.\n# Зміни, які набирають сили при індексуванні сторінки з заголовком.\n# Ви можете примусити переіндексувати сторінку з нульовим редагуванням.\n# Синтаксис наступний:\n#   * Усе, що починається з символу \"#\" до кінця рядка, є коментарем\n#   * Кожний непорожній рядок є точним заголовком для ігнорування\nПосилання\nЗовнішні посилання\nДив. також\n #</pre> <!-- залиште цей рядок точно таким, яким він є -->",
+       "search-ignored-headings": " #<!-- залиште цей рядок точно таким, яким він є --> <pre>\n# Заголовки, які будуть ігноруватися при пошуці.\n# Зміни, які набирають сили при індексуванні сторінки з заголовком.\n# Ви можете примусити переіндексувати сторінку з нульовим редагуванням.\n# Синтаксис наступний:\n#   * Усе, що починається з символу \"#\" до кінця рядка, є коментарем\n#   * Кожний непорожній рядок є точним заголовком для ігнорування\nПримітки\nПосилання\nДив. також\n #</pre> <!-- залиште цей рядок точно таким, яким він є -->",
        "searchbutton": "Пошук",
        "go": "Перейти",
        "searcharticle": "Перейти",
        "red-link-title": "$1 (такої сторінки не існує)",
        "sort-descending": "Сортувати за спаданням",
        "sort-ascending": "Сортувати за зростанням",
-       "nstab-main": "СÑ\82аÑ\82Ñ\82Ñ\8f",
+       "nstab-main": "СÑ\82оÑ\80Ñ\96нка",
        "nstab-user": "Сторінка користувача",
        "nstab-media": "Медіа-сторінка",
        "nstab-special": "Спеціальна сторінка",
        "ns-specialprotected": "Спеціальні сторінки не можна редагувати.",
        "titleprotected": "Створення сторінки з такою назвою було заборонене користувачем [[User:$1|$1]].\nЗазначена така причина: <em>$2</em>.",
        "filereadonlyerror": "Неможливо змінити файл «$1» тому, що файловий архів «$2» перебуває в режимі «лише для читання».\n\nАдміністратор, що заблокував його, залишив таке пояснення: «''$3''».",
-       "invalidtitle-knownnamespace": "Неприйнятна назва у просторі імен «$2» і текстом «$3»",
-       "invalidtitle-unknownnamespace": "Ð\9dепÑ\80авилÑ\8cний Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Ð· Ð½ÐµÐ²Ñ\96домим Ð½Ð¾Ð¼ÐµÑ\80ом Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 Ñ\96мен ($1) і текстом: «$2»",
+       "invalidtitle-knownnamespace": "Неприйнятна назва у просторі назв «$2» і текстом «$3»",
+       "invalidtitle-unknownnamespace": "Ð\9dевалÑ\96дний Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Ð· Ð½ÐµÐ²Ñ\96домим Ð½Ð¾Ð¼ÐµÑ\80ом Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 Ð½Ð°Ð·Ð² ($1) і текстом: «$2»",
        "exception-nologin": "Не виконано вхід",
        "exception-nologin-text": "Необхідно увійти, щоб мати доступ до цієї сторінки або дії.",
        "exception-nologin-text-manual": "Потрібно $1, щоб мати доступ до цієї сторінки або дії.",
        "cannotlogoutnow-title": "Неможливо вийти прямо зараз",
        "cannotlogoutnow-text": "Неможливо вийти із системи під час використання $1.",
        "welcomeuser": "Вітаємо, $1!",
-       "welcomecreation-msg": "Ваш обліковий запис створено.\nТепер маєте змогу за бажанням змінювати ваші [[Special:Preferences|налаштування у {{GRAMMAR:genitive|{{SITENAME}}}}]].",
+       "welcomecreation-msg": "Ваш обліковий запис створено.\nТепер є можливість за Вашим бажанням змінювати [[Special:Preferences|персональні налаштування у {{GRAMMAR:genitive|{{SITENAME}}}}]].",
        "yourname": "Ім'я користувача:",
        "userlogin-yourname": "Ім'я користувача",
        "userlogin-yourname-ph": "Введіть ім'я користувача",
        "nosuchusershort": "Користувача з іменем «$1» не існує.\nПеревірте правильність написання імені.",
        "nouserspecified": "Ви повинні зазначити ім'я користувача.",
        "login-userblocked": "Цей користувач заблокований. Вхід в систему не дозволений.",
-       "wrongpassword": "Ð\92и Ð²Ð²ÐµÐ»Ð¸ Ñ\85ибний Ð¿Ð°Ñ\80олÑ\8c. Ð¡Ð¿Ñ\80обÑ\83йÑ\82е Ñ\89е Ñ\80аз.",
+       "wrongpassword": "Ð\92и Ð²Ð²ÐµÐ»Ð¸ Ñ\85ибне Ñ\96м'Ñ\8f ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а Ð°Ð±Ð¾ Ð¿Ð°Ñ\80олÑ\8c. Ð\91Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ñ\81пÑ\80обÑ\83йÑ\82е Ð·Ð½Ð¾Ð²Ñ\83.",
        "wrongpasswordempty": "Ви не ввели пароль. Будь ласка, спробуйте ще раз.",
        "passwordtooshort": "Ваш пароль закороткий, він має містити принаймні $1 {{PLURAL:$1|символ|символи|символів}}.",
        "passwordtoolong": "Пароль не може бути довшим ніж {{PLURAL:$1|1 символ|$1 символи|$1 символів}}.",
        "botpasswords-insert-failed": "Не вдалось додати бота з іменем «$1». Можливо, він вже був доданий?",
        "botpasswords-update-failed": "Не вдалось оновити бота з іменем «$1». Можливо, він був видалений?",
        "botpasswords-created-title": "Пароль бота створено",
-       "botpasswords-created-body": "Пароль бота з ім'ям «$1» користувача «$2» було створено.",
+       "botpasswords-created-body": "Пароль бота з ім'ям «$1» {{GENDER:$2|користувача|користувачки}} «$2» було створено.",
        "botpasswords-updated-title": "Пароль бота оновлено",
-       "botpasswords-updated-body": "Пароль бота з ім'ям «$1» користувача «$2» було оновлено.",
+       "botpasswords-updated-body": "Пароль бота з ім'ям «$1» {{GENDER:$2|користувача|користувачки}} «$2» було оновлено.",
        "botpasswords-deleted-title": "Пароль бота видалено",
-       "botpasswords-deleted-body": "Пароль бота з ім'ям «$1» користувача «$2» було видалено",
+       "botpasswords-deleted-body": "Пароль бота з ім'ям «$1» {{GENDER:$2|користувача|користувачки}} «$2» було вилучено",
        "botpasswords-newpassword": "Новий пароль для входу під <strong>$1</strong> — <strong>$2</strong>. <em>Запишіть його для подальшого використання.</em> <br> (Для старих ботів, які вимагають, щоб логін був такий же, як і ім'я користувача, Ви також можете використовувати <strong>$3</strong> як ім'я користувача і <strong>$4</strong> як пароль.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider не доступний.",
        "botpasswords-restriction-failed": "Вхід не було здійснено через обмеження для паролю бота.",
        "extlink_tip": "Зовнішнє посилання (не забудьте про префікс http://)",
        "headline_sample": "Текст заголовка",
        "headline_tip": "Заголовок 2-го рівня",
-       "nowiki_sample": "Ð\92Ñ\81Ñ\82авиÑ\82и сюди неформатований текст.",
+       "nowiki_sample": "Ð\94одайÑ\82е сюди неформатований текст.",
        "nowiki_tip": "Ігнорувати вікі-форматування",
        "image_sample": "Example.jpg",
        "image_tip": "Файл",
        "cascadeprotectedwarning": "<strong>Попередження:</strong> Цю сторінку можуть редагувати лише користувачі зі [[Special:ListGroupRights|специфічними правами]], оскільки вона включена на {{PLURAL:$1|1=сторінці|сторінках}}, де встановлено каскадний захист:",
        "titleprotectedwarning": "'''Попередження. Ця сторінка була захищена так, що для її створення потрібні [[Special:ListGroupRights|особливі права]].'''\nОстанній запис журналу наведений нижче для довідки:",
        "templatesused": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} на цій сторінці:",
-       "templatesusedpreview": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} у цьому попередньому перегляді:",
+       "templatesusedpreview": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} в цьому попередньому перегляді:",
        "templatesusedsection": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} в цьому розділі:",
        "template-protected": "(захищено)",
        "template-semiprotected": "(частково захищено)",
        "diff-multi-sameuser": "(Не {{PLURAL:$1|показано одну проміжну версію|показані $1 проміжні версії|показано $1 проміжних версій}} цього користувача)",
        "diff-multi-otherusers": "(Не {{PLURAL:$1|показана $1 проміжна версія|показано $1 проміжні версії|показані $1 проміжних версій}} {{PLURAL:$2|ще одного користувача|$2 користувачів}})",
        "diff-multi-manyusers": "({{PLURAL:$1|не показана $1 проміжна версія|не показані $1 проміжні версії|не показано $1 проміжних версій}}, зроблених більш, ніж {{PLURAL:$2|1=$1 користувачем|$2 користувачами}})",
+       "diff-paragraph-moved-tonew": "Абзац було переміщено. Натисніть щоб перестрибнути до нового розташування.",
+       "diff-paragraph-moved-toold": "Абзац було переміщено. Натисніть щоб перестрибнути до старого розташування.",
        "difference-missing-revision": "{{PLURAL:$2|$2 версія|$2 версії|$2 версій}} для цього порівняння ($1) не {{PLURAL:$2|1=знайдена|знайдені}}.\n\nІмовірно, ви перейшли за застарілим посиланням на порівняння версій вилученої сторінки.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].",
        "searchresults": "Результати пошуку",
        "searchresults-title": "Результати пошуку для «$1»",
        "prefs-watchlist-days-max": "Максимум $1 {{PLURAL:$1|день|дні|днів}}",
        "prefs-watchlist-edits": "Максимальна кількість змін, яку можна виводити у списку спостереження:",
        "prefs-watchlist-edits-max": "Максимально: 1000",
-       "prefs-watchlist-token": "Ð\9cÑ\96Ñ\82ка списку спостереження:",
+       "prefs-watchlist-token": "Токен списку спостереження:",
        "prefs-misc": "Інші налаштування",
        "prefs-resetpass": "Змінити пароль",
        "prefs-changeemail": "Змінити або вилучити адресу електронної пошти",
        "timezoneregion-indian": "Індійський океан",
        "timezoneregion-pacific": "Тихий океан",
        "allowemail": "Дозволити електронну пошту від інших користувачів",
+       "email-allow-new-users-label": "Дозволити електронні листи від новозареєстрованих користувачів.",
        "email-blacklist-label": "Заборонити цим користувачам надсилати мені електронну пошту:",
        "prefs-searchoptions": "Пошук",
        "prefs-namespaces": "Простори назв",
        "right-siteadmin": "Блокування і розблокування бази даних",
        "right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5",
        "right-sendemail": "надсилання електронної пошти іншим користувачам",
+       "right-sendemail-new-users": "надсилати електронні листи до користувачів без логованих дій",
        "right-managechangetags": "створення та (де)активування [[Special:Tags|міток]]",
        "right-applychangetags": "додавання [[Special:Tags|міток]] разом зі змінами",
        "right-changetags": "додавання або вилучення будь-яких [[Special:Tags|міток]] для певних версій сторінок або записів журналів",
        "recentchanges-summary": "Відстеження останніх змін на сторінках {{grammar:genitive|{{SITENAME}}}}.",
        "recentchanges-noresult": "Немає змін за даний період, що відповідають цим критеріям.",
        "recentchanges-timeout": "Час, відведений на цей пошук, вичерпано. Можливо, Ви захочете спробувати інші пошукові параметри.",
+       "recentchanges-network": "Через технічну помилку не вдалось завантажити результати. Будь ласка, спробуйте перезавантажити сторінку.",
+       "recentchanges-notargetpage": "Щоб побачити зміни пов'язані зі сторінкою, уведіть її назву вище.",
        "recentchanges-feed-description": "Відстежувати останні зміни у вікі в цьому потоці.",
        "recentchanges-label-newpage": "Цим редагуванням створена нова сторінка",
        "recentchanges-label-minor": "Це незначна зміна",
        "rcfilters-savedqueries-apply-and-setdefault-label": "Створити стандартний фільтр",
        "rcfilters-savedqueries-cancel-label": "Скасувати",
        "rcfilters-savedqueries-add-new-title": "Зберегти поточні налаштування фільтрів",
+       "rcfilters-savedqueries-already-saved": "Ці фільтри вже збережено. Змініть свої налаштування щоб створити новий Збережений фільтр.",
        "rcfilters-restore-default-filters": "Відновити стандартні фільтри",
        "rcfilters-clear-all-filters": "Очистити фільтри",
        "rcfilters-show-new-changes": "Переглянути найновіші зміни",
-       "rcfilters-search-placeholder": "Фільтруйте нові редагування (перегляньте або почніть вводити)",
+       "rcfilters-search-placeholder": "Фільтруйте редагування (використовуйте меню, або скористайтесь пошуком фільтру за назвою)",
        "rcfilters-invalid-filter": "Недійсний фільтр",
        "rcfilters-empty-filter": "Без фільтрів. Показано всі зміни.",
        "rcfilters-filterlist-title": "Фільтри",
        "rcfilters-watchlist-showupdated": "Зміни до сторінок, які Ви не відвідували з моменту здійснення змін, виділені <strong>жирним</strong>, із цілісними маркерами.",
        "rcfilters-preference-label": "Приховати покращену версію Нових редагувань",
        "rcfilters-preference-help": "Скасовує зміну дизайну 2017 року та всі інструменти, додані тоді й пізніше.",
+       "rcfilters-filter-showlinkedfrom-label": "Показати зміни на сторінках, на які звідси посилання",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Сторінки, на які є посилання з</strong> обраної сторінки",
+       "rcfilters-filter-showlinkedto-label": "Показати зміни на сторінках, що посилаються сюди",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Сторінки, що посилаються на</strong> обрану сторінку",
+       "rcfilters-target-page-placeholder": "Уведіть назву сторінки",
        "rcnotefrom": "Нижче знаходяться {{PLURAL:$5|редагування}} з <strong>$3, $4</strong> (відображено до <strong>$1</strong>).",
        "rclistfromreset": "Скинути вибір дати",
        "rclistfrom": "Показати редагування починаючи з $3 $2.",
        "recentchangeslinked-feed": "Пов'язані редгування",
        "recentchangeslinked-toolbox": "Пов'язані редагування",
        "recentchangeslinked-title": "Пов'язані редагування для «$1»",
-       "recentchangeslinked-summary": "Це Ñ\81пиÑ\81ок Ð½ÐµÑ\89одавнÑ\96Ñ\85 Ð·Ð¼Ñ\96н Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85, Ð½Ð° Ñ\8fкÑ\96 Ð¿Ð¾Ñ\81илаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð·Ð°Ð·Ð½Ð°Ñ\87ена Ñ\81Ñ\82оÑ\80Ñ\96нка (або Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85, Ñ\89о Ð¼Ñ\96Ñ\81Ñ\82Ñ\8fÑ\82Ñ\8cÑ\81Ñ\8f Ð² Ñ\86Ñ\96й ÐºÐ°Ñ\82егоÑ\80Ñ\96Ñ\97).\nСÑ\82оÑ\80Ñ\96нки Ð· [[Special:Watchlist|Ð\92аÑ\88ого Ñ\81пиÑ\81кÑ\83 Ñ\81поÑ\81Ñ\82еÑ\80еженнÑ\8f]] Ð²Ð¸Ð´Ñ\96лено '''жиÑ\80ним Ñ\88Ñ\80иÑ\84Ñ\82ом'''.",
+       "recentchangeslinked-summary": "УведÑ\96Ñ\82Ñ\8c Ð½Ð°Ð·Ð²Ñ\83 Ñ\81Ñ\82оÑ\80Ñ\96нки Ñ\89об Ð¿Ð¾Ð±Ð°Ñ\87иÑ\82и Ð·Ð¼Ñ\96ни Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85 Ñ\8fкÑ\96 Ð¿Ð¾Ñ\81илаÑ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° Ð½ÐµÑ\97, Ð°Ð±Ð¾ Ð½Ð° Ñ\8fкÑ\96 Ð²Ð¾Ð½Ð° Ñ\81ама Ð¿Ð¾Ñ\81илаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f. (Ð\94лÑ\8f Ð¿ÐµÑ\80еглÑ\8fдÑ\83 Ñ\87ленÑ\96в ÐºÐ°Ñ\82егоÑ\80Ñ\96Ñ\97 Ð²Ð²Ð¾Ð´Ñ\8cÑ\82е {{ns:14}}:Ð\9dазва ÐºÐ°Ñ\82егоÑ\80Ñ\96Ñ\97). Ð\97мÑ\96ни Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85 Ð· [[Special:Watchlist|Ð\92аÑ\88ого Ð¡Ð¿Ð¸Ñ\81кÑ\83 Ñ\81поÑ\81Ñ\82еÑ\80еженнÑ\8f]] Ð²Ð¸Ð´Ñ\96ленÑ\96 <strong>жиÑ\80ним</strong>.",
        "recentchangeslinked-page": "Назва сторінки:",
        "recentchangeslinked-to": "Показати зміни на сторінках, пов'язаних з даною",
        "recentchanges-page-added-to-category": "[[:$1]] Додано до категорії",
        "uploadstash-refresh": "Оновити список файлів",
        "uploadstash-thumbnail": "перегляд мініатюри",
        "uploadstash-exception": "Не вдалося зберегти завантаження у сховку ($1): «$2».",
+       "uploadstash-bad-path": "Шлях не існує.",
+       "uploadstash-bad-path-invalid": "Неправильний шлях.",
+       "uploadstash-bad-path-unknown-type": "Невідомий тип «$1»",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Нерозпізнана назва мініатюри.",
+       "uploadstash-bad-path-no-handler": "Не знайдено обробник для mime-типу «$1» файлу «$2».",
+       "uploadstash-bad-path-bad-format": "Ключ «$1» в неправильному форматі.",
+       "uploadstash-file-not-found": "Ключ «$1» не знайдено у тимчасовому сховищі.",
+       "uploadstash-file-not-found-no-thumb": "Не вдалось отримати мініатюру.",
+       "uploadstash-file-not-found-no-local-path": "Немає локального шляху для масштабованого елементу.",
+       "uploadstash-file-not-found-no-object": "Не вдалось створити локальний об'єкт файлу для мініатюри.",
+       "uploadstash-file-not-found-no-remote-thumb": "Отримання мініатюри не вдалось: $1\nURL = $2",
+       "uploadstash-file-not-found-missing-content-type": "Відсутній заголовок content-type.",
+       "uploadstash-file-not-found-not-exists": "Не вдалось отримати шлях, або не простий файл.",
+       "uploadstash-file-too-large": "Не вдалось подати файл більший за $1 {{PLURAL:$1|байт|байти|байтів}}.",
+       "uploadstash-not-logged-in": "Немає користувачів, що увійшли до системи, файли повинні належати користувачам.",
+       "uploadstash-wrong-owner": "Цей файл ($1) не належить поточному користувачу.",
+       "uploadstash-no-such-key": "Немає такого файлу ($1), неможливо вилучити.",
+       "uploadstash-no-extension": "Розширення є порожнім.",
+       "uploadstash-zero-length": "Файл нульової довжини.",
        "invalid-chunk-offset": "Неприпустимий зсув фрагмента",
        "img-auth-accessdenied": "Відмовлено в доступі",
        "img-auth-nopathinfo": "Відсутній PATH_INFO.\nВаш сервер не налаштовано для передачі цих даних.\nМожливо, він працює на основі CGI та не підтримує img_auth.\nПерегляньте [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Відкриття доступу до зображень]",
        "import-mapping-namespace": "Імпортувати до простору назв:",
        "import-mapping-subpage": "Імпортувати як підсторінки такої сторінки:",
        "import-upload-filename": "Назва файлу:",
+       "import-upload-username-prefix": "Інтервікі-префікс:",
+       "import-assign-known-users": "Призначити редагування до локальних користувачів де користувачі з такими іменами існують локально.",
        "import-comment": "Примітка:",
        "importtext": "Будь ласка, експортуйте сторінку з іншої вікі, використовуючи [[Special:Export|засіб експорту]], збережіть файл, а потім завантажте його сюди.",
        "importstart": "Імпорт сторінок…",
        "imported-log-entries": "{{PLURAL:$1|Заімпортований $1 запис журналу|Заімпортовані $1 записи журналу|Заімпортовані $1 записів журналу}}.",
        "importfailed": "Не вдалося імпортувати: $1",
        "importunknownsource": "Невідомий тип імпортованої сторінки",
+       "importnoprefix": "Не вказано інтервікі-префікс",
        "importcantopen": "Неможливо відкрити файл імпорту",
        "importbadinterwiki": "Невірне інтервікі-посилання",
        "importsuccess": "Імпорт виконано!",
        "autosumm-blank": "Сторінка очищена",
        "autosumm-replace": "Замінено вміст на «$1»",
        "autoredircomment": "Перенаправлено на [[$1]]",
+       "autosumm-removed-redirect": "Вилучено перенаправлення на [[$1]]",
+       "autosumm-changed-redirect-target": "Змінено ціль перенаправлення з [[$1]] на [[$2]]",
        "autosumm-new": "Створена сторінка: $1",
        "autosumm-newblank": "Створити порожню сторінку",
        "size-bytes": "$1 {{PLURAL:$1|байт|байти|байтів}}",
        "tag-filter": "Фільтр&nbsp;[[Special:Tags|міток]]:",
        "tag-filter-submit": "Відфільтрувати",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Мітка|Мітки}}]]: $2)",
-       "tag-mw-contentmodelchange": "зміна контентної моделі",
-       "tag-mw-contentmodelchange-description": "Редагування, якими була здійснена [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel зміна контентної моделі] сторінки",
+       "tag-mw-contentmodelchange": "зміна моделі вмісту",
+       "tag-mw-contentmodelchange-description": "Редагування, які змінюють [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel модель вмісту] сторінки",
+       "tag-mw-new-redirect": "Нове перенаправлення",
+       "tag-mw-new-redirect-description": "Редагування, що створюють нове перенаправлення, або заміняють сторінку перенаправленням",
+       "tag-mw-removed-redirect": "Вилучено перенаправлення",
+       "tag-mw-removed-redirect-description": "Редагування, що змінюють дійсне перенаправлення на не-перенаправлення",
+       "tag-mw-changed-redirect-target": "Змінено ціль перенаправлення",
+       "tag-mw-changed-redirect-target-description": "Редагування, що змінюють ціль перенаправлення",
+       "tag-mw-blank": "Очищення",
+       "tag-mw-blank-description": "Редагування, що очищують сторінку",
+       "tag-mw-replace": "Замінено",
+       "tag-mw-replace-description": "Редагування, що вилучають понад 90% вмісту сторінки",
+       "tag-mw-rollback": "Відкіт",
+       "tag-mw-rollback-description": "Редагування, що відкидають попередні правки використовуючи посилання відкоту",
+       "tag-mw-undo": "Скасування",
+       "tag-mw-undo-description": "Редагування, що скасовують попередні правки використовуючи посилання скасування",
        "tags-title": "Мітки",
        "tags-intro": "На цій сторінці наведений список міток, якими програмне забезпечення помічає редагування, а також значення цих міток.",
        "tags-tag": "Назва мітки",
index 8eada44..aa8d509 100644 (file)
        "rev-deleted-diff-view": "اس فرق کی کسی ایک ترمیم کو <strong>حذف کر دیا گیا ہے</strong>۔\nآپ اس فرق کو دیکھ سکتے ہیں؛ مزید تفصیلات [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} نوشتہ حذف شدگی] میں دیکھی جا سکتی ہیں۔",
        "rev-suppressed-diff-view": "اس فرق کی کسی ایک ترمیم کو <strong>پوشیدہ کر دیا گیا ہے</strong>۔\nآپ اس فرق کو دیکھ سکتے ہیں؛ مزید تفصیلات [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} نوشتہ پوشیدگی] میں دیکھی جا سکتی ہیں۔",
        "rev-delundel": "مرئیت تبدیل کریں",
-       "rev-showdeleted": "دکھاؤ",
+       "rev-showdeleted": "دکھائÛ\8cÚº",
        "revisiondelete": "نظرثانی حذف کریں/واپس لائیں",
        "revdelete-nooldid-title": "ناقص مقصود نظرثانی",
        "revdelete-nooldid-text": "اس فنکشن کو جس نسخے پر انجام دینا ہے اسے آپ نے منتخب نہیں کیا، یا منتخب کردہ نسخہ موجود نہیں، یا آپ موجودہ نسخہ کو پوشیدہ کرنے کی کوشش کر رہے ہیں۔",
        "difference-multipage": "(فرق مابین صفحات)",
        "lineno": "سطر $1:",
        "compareselectedversions": "منتخب متـن کا موازنہ",
-       "showhideselectedversions": "منتخب نسخوں کی مرئیت تبدیل کریں",
+       "showhideselectedversions": "منتخب نسخوں کی رویت تبدیل کریں",
        "editundo": "رد ترمیم",
        "diff-empty": "(کوئی فرق نہیں)",
        "diff-multi-sameuser": "(ایک ہی صارف کا {{PLURAL: $1 |ایک درمیانی نسخہ نہیں دکھایا گیا| $1 درمیانی نسخے نہیں دکھائے گئے}})",
        "userrights-reason": "وجہ:",
        "userrights-no-interwiki": "دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.",
        "userrights-nodatabase": "ڈیٹابیس $1 موجود نہیں یا مقامی نہیں۔",
-       "userrights-changeable-col": "مجموعات جو آپ تبدیل کرسکتے ہیں",
-       "userrights-unchangeable-col": "مجموعات جو آپ تبدیل نہیں کرسکتے",
+       "userrights-changeable-col": "جن حلقوں کو آپ تبدیل کر سکتے ہیں",
+       "userrights-unchangeable-col": "جن حلقوں کو آپ تبدیل نہیں کر سکتے",
        "userrights-expiry-current": "وقت اختتام $1",
        "userrights-expiry-none": "لامحدود",
        "userrights-expiry": "اختتام:",
        "undeleterevision-duplicate-revid": "{{PLURAL:$1|ایک نسخہ بحال نہیں کیا جا سکا|$1 نسخے بحال نہیں کیے جا سکے}}، کیونکہ {{PLURAL:$1|اس کا|ان کے}} <code>rev_id</code> زیر استعمال ہے۔",
        "undelete-nodiff": "کوئی پرانا نسخہ نہیں ملا۔",
        "undeletebtn": "بحال",
-       "undeletelink": "دیکھو/بحال کرو",
+       "undeletelink": "دیکھیں/بحال کریں",
        "undeleteviewlink": "دکھاؤ",
        "undeleteinvert": "انتخاب بالعکس",
        "undeletecomment": "وجہ:",
        "newtitle": "نـیــا عـنــوان:",
        "move-watch": "اصل اور ہدف صفحہ کو زیر نظر کریں",
        "movepagebtn": "مـنـتـقـل",
-       "pagemovedsub": "انتقال کامیاب",
+       "pagemovedsub": "منتقلی کامیاب",
        "movepage-moved": "<strong>\"$1\" کو \"$2\" کی جانب منتقل کر دیا گیا</strong>",
        "movepage-moved-redirect": "رجوع مکرر تخلیق کر دیا گیا۔",
        "movepage-moved-noredirect": "رجوع مکرر کو بننے سے روک دیا گیا ہے۔",
        "autosumm-replace": "\"$1\" سے مواد کی تبدیلی",
        "autoredircomment": "[[$1]] سے رجوع مکرر",
        "autosumm-removed-redirect": "[[$1]] سے رجوع مکرر ہٹایا",
+       "autosumm-changed-redirect-target": "رجوع مکرر [[$1]] کو [[$2]] سے تبدیل کیا",
        "autosumm-new": "«$1» مواد پر مشتمل نیا صفحہ بنایا",
        "autosumm-newblank": "خالی صفحہ بنایا",
        "size-bytes": "$1 بائٹ",
        "tag-mw-contentmodelchange-description": "ترامیم جو صفحہ کے [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel مواد کے ماڈل کو تبدیل کرتی ہیں]",
        "tag-mw-new-redirect": "نیا رجوع مکرر",
        "tag-mw-removed-redirect": "رجوع مکرر ہٹایا",
-       "tag-mw-blank": "خالیٔ صفحہ",
+       "tag-mw-changed-redirect-target": "ہدف رجوع مکرر کی تبدیلی",
+       "tag-mw-blank": "صفحہ سے تمام مواد حذف",
        "tag-mw-replace": "مواد کی تبدیلی",
        "tag-mw-rollback": "استرجع",
        "tags-title": "ٹیگ",
        "htmlform-title-not-exists": "$1 موجود نہیں ہے۔",
        "htmlform-user-not-exists": "<strong>$1</strong> موجود نہیں ہے۔",
        "htmlform-user-not-valid": "<strong>$1</strong> درست صارف نام نہیں ہے۔",
-       "logentry-delete-delete": "$1 {{GENDER:$2|حذف کیا گیا}} صفحہ $3",
+       "logentry-delete-delete": "$1 نے صفحہ $3 {{GENDER:$2|حذف کیا}}",
        "logentry-delete-delete_redir": "$1 نے بر تحریر کرتے ہوئے $3 رجوع مکرر کو {{GENDER:$2|حذف کیا}}",
        "logentry-delete-restore": "$1 نے صفحہ $3 کو {{GENDER:$2|بحال کیا}}",
        "logentry-delete-restore-nocount": "$1 نے صفحہ $3 کو {{GENDER:$2|بحال کیا}}",
index 14ac649..5262c8c 100644 (file)
        "rcfilters-preference-label": "隐藏改进的最近更改版本",
        "rcfilters-preference-help": "返回到2017年界面重新设计版,并重新添加这以后新增的工具。",
        "rcfilters-filter-showlinkedfrom-label": "显示链接自该页面的页面上的更改",
-       "rcfilters-filter-showlinkedfrom-option-label": "显示链接<strong>自</strong>某一页面的页面上的更改",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>链接自</strong>选定页面的页面",
        "rcfilters-filter-showlinkedto-label": "显示链接到该页面的页面上的更改",
-       "rcfilters-filter-showlinkedto-option-label": "显示链接<strong>到</strong>某一页面的页面上的更改",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>链接到</strong>选定页面的页面",
        "rcfilters-target-page-placeholder": "输入页面名称",
        "rcnotefrom": "下面{{PLURAL:$5|是}}<strong>$3 $4</strong>之后的更改(最多显示<strong>$1</strong>个)。",
        "rclistfromreset": "重置时间选择",
index 254f368..707f4b3 100644 (file)
@@ -77,6 +77,9 @@ abstract class DumpIterator extends Maintenance {
 
                $importer->setRevisionCallback(
                        [ $this, 'handleRevision' ] );
+               $importer->setNoticeCallback( function ( $msg, $params ) {
+                       echo wfMessage( $msg, $params )->text() . "\n";
+               } );
 
                $this->from = $this->getOption( 'from', null );
                $this->count = 0;
index 2923b38..918c1ab 100644 (file)
@@ -322,6 +322,9 @@ TEXT
                        $this->pageCount = $nthPage - 1;
                }
                $importer->setPageCallback( [ $this, 'reportPage' ] );
+               $importer->setNoticeCallback( function ( $msg, $params ) {
+                       echo wfMessage( $msg, $params )->text() . "\n";
+               } );
                $this->importCallback = $importer->setRevisionCallback(
                        [ $this, 'handleRevision' ] );
                $this->uploadCallback = $importer->setUploadCallback(
index 6b471b0..62a2f4f 100644 (file)
@@ -24,7 +24,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.mwuser_default_user_id BEFORE INSERT ON &mw_prefix.mwuser
+CREATE TRIGGER &mw_prefix.mwuser_seq_trg BEFORE INSERT ON &mw_prefix.mwuser
        FOR EACH ROW WHEN (new.user_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(user_user_id_seq.nextval, :new.user_id);
@@ -32,7 +32,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.page_default_page_id BEFORE INSERT ON &mw_prefix.page
+CREATE TRIGGER &mw_prefix.page_seq_trg BEFORE INSERT ON &mw_prefix.page
        FOR EACH ROW WHEN (new.page_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(page_page_id_seq.nextval, :new.page_id);
@@ -40,7 +40,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.revision_default_rev_id BEFORE INSERT ON &mw_prefix.revision
+CREATE TRIGGER &mw_prefix.revision_seq_trg BEFORE INSERT ON &mw_prefix.revision
        FOR EACH ROW WHEN (new.rev_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(revision_rev_id_seq.nextval, :new.rev_id);
@@ -48,7 +48,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.text_default_old_id BEFORE INSERT ON &mw_prefix.text
+CREATE TRIGGER &mw_prefix.pagecontent_seq_trg BEFORE INSERT ON &mw_prefix.pagecontent
        FOR EACH ROW WHEN (new.old_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(text_old_id_seq.nextval, :new.old_id);
@@ -56,7 +56,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.archive_default_ar_id BEFORE INSERT ON &mw_prefix.archive
+CREATE TRIGGER &mw_prefix.archive_seq_trg BEFORE INSERT ON &mw_prefix.archive
        FOR EACH ROW WHEN (new.ar_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(archive_ar_id_seq.nextval, :new.ar_id);
@@ -64,7 +64,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.category_default_cat_id BEFORE INSERT ON &mw_prefix.category
+CREATE TRIGGER &mw_prefix.category_seq_trg BEFORE INSERT ON &mw_prefix.category
        FOR EACH ROW WHEN (new.cat_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(category_cat_id_seq.nextval, :new.cat_id);
@@ -72,7 +72,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.externallinks_default_el_id BEFORE INSERT ON &mw_prefix.externallinks
+CREATE TRIGGER &mw_prefix.externallinks_seq_trg BEFORE INSERT ON &mw_prefix.externallinks
        FOR EACH ROW WHEN (new.el_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(externallinks_el_id_seq.nextval, :new.el_id);
@@ -80,7 +80,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.ipblocks_default_ipb_id BEFORE INSERT ON &mw_prefix.ipblocks
+CREATE TRIGGER &mw_prefix.ipblocks_seq_trg BEFORE INSERT ON &mw_prefix.ipblocks
        FOR EACH ROW WHEN (new.ipb_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(ipblocks_ipb_id_seq.nextval, :new.ipb_id);
@@ -88,7 +88,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.filearchive_default_fa_id BEFORE INSERT ON &mw_prefix.filearchive
+CREATE TRIGGER &mw_prefix.filearchive_seq_trg BEFORE INSERT ON &mw_prefix.filearchive
        FOR EACH ROW WHEN (new.fa_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(filearchive_fa_id_seq.nextval, :new.fa_id);
@@ -96,7 +96,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.uploadstash_default_us_id BEFORE INSERT ON &mw_prefix.uploadstash
+CREATE TRIGGER &mw_prefix.uploadstash_seq_trg BEFORE INSERT ON &mw_prefix.uploadstash
        FOR EACH ROW WHEN (new.us_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(uploadstash_us_id_seq.nextval, :new.us_id);
@@ -104,7 +104,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.recentchanges_default_rc_id BEFORE INSERT ON &mw_prefix.recentchanges
+CREATE TRIGGER &mw_prefix.recentchanges_seq_trg BEFORE INSERT ON &mw_prefix.recentchanges
        FOR EACH ROW WHEN (new.rc_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(recentchanges_rc_id_seq.nextval, :new.rc_id);
@@ -112,7 +112,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.logging_default_log_id BEFORE INSERT ON &mw_prefix.logging
+CREATE TRIGGER &mw_prefix.logging_seq_trg BEFORE INSERT ON &mw_prefix.logging
        FOR EACH ROW WHEN (new.log_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(logging_log_id_seq.nextval, :new.log_id);
@@ -120,7 +120,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.job_default_job_id BEFORE INSERT ON &mw_prefix.job
+CREATE TRIGGER &mw_prefix.job_seq_trg BEFORE INSERT ON &mw_prefix.job
        FOR EACH ROW WHEN (new.job_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(job_job_id_seq.nextval, :new.job_id);
@@ -128,7 +128,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.page_restrictions_default_pr_id BEFORE INSERT ON &mw_prefix.page_restrictions
+CREATE TRIGGER &mw_prefix.page_restrictions_seq_trg BEFORE INSERT ON &mw_prefix.page_restrictions
        FOR EACH ROW WHEN (new.pr_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(page_restrictions_pr_id_seq.nextval, :new.pr_id);
@@ -136,7 +136,7 @@ END;
 /*$mw$*/
 
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.sites_default_site_id BEFORE INSERT ON &mw_prefix.sites
+CREATE TRIGGER &mw_prefix.sites_seq_trg BEFORE INSERT ON &mw_prefix.sites
        FOR EACH ROW WHEN (new.site_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(sites_site_id_seq.nextval, :new.site_id);
index c4b906d..39680ef 100644 (file)
@@ -1,5 +1,5 @@
 define mw_prefix='{$wgDBprefix}';
 
-ALTER TABLE &mw_prefix.externallinks ADD el_index_60 VARBINARY(60) NOT NULL DEFAULT '';
+ALTER TABLE &mw_prefix.externallinks ADD el_index_60 VARCHAR2(60);
 CREATE INDEX &mw_prefix.externallinks_i04 ON &mw_prefix.externallinks (el_index_60, el_id);
 CREATE INDEX &mw_prefix.externallinks_i05 ON &mw_prefix.externallinks (el_from, el_index_60, el_id);
index e6e2e56..d588e3a 100644 (file)
@@ -48,7 +48,7 @@ CREATE UNIQUE INDEX &mw_prefix.mwuser_u01 ON &mw_prefix.mwuser (user_name);
 CREATE INDEX &mw_prefix.mwuser_i01 ON &mw_prefix.mwuser (user_email_token);
 CREATE INDEX &mw_prefix.mwuser_i02 ON &mw_prefix.mwuser (user_email, user_name);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.mwuser_default_user_id BEFORE INSERT ON &mw_prefix.mwuser
+CREATE TRIGGER &mw_prefix.mwuser_seq_trg BEFORE INSERT ON &mw_prefix.mwuser
        FOR EACH ROW WHEN (new.user_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(user_user_id_seq.nextval, :new.user_id);
@@ -116,7 +116,7 @@ CREATE INDEX &mw_prefix.page_i01 ON &mw_prefix.page (page_random);
 CREATE INDEX &mw_prefix.page_i02 ON &mw_prefix.page (page_len);
 CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_namespace, page_len);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.page_default_page_id BEFORE INSERT ON &mw_prefix.page
+CREATE TRIGGER &mw_prefix.page_seq_trg BEFORE INSERT ON &mw_prefix.page
        FOR EACH ROW WHEN (new.page_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(page_page_id_seq.nextval, :new.page_id);
@@ -162,7 +162,7 @@ CREATE INDEX &mw_prefix.revision_i03 ON &mw_prefix.revision (rev_user,rev_timest
 CREATE INDEX &mw_prefix.revision_i04 ON &mw_prefix.revision (rev_user_text,rev_timestamp);
 CREATE INDEX &mw_prefix.revision_i05 ON &mw_prefix.revision (rev_page,rev_user,rev_timestamp);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.revision_default_rev_id BEFORE INSERT ON &mw_prefix.revision
+CREATE TRIGGER &mw_prefix.revision_seq_trg BEFORE INSERT ON &mw_prefix.revision
        FOR EACH ROW WHEN (new.rev_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(revision_rev_id_seq.nextval, :new.rev_id);
@@ -177,7 +177,7 @@ CREATE TABLE &mw_prefix.pagecontent ( -- replaces reserved word 'text'
 );
 ALTER TABLE &mw_prefix.pagecontent ADD CONSTRAINT &mw_prefix.pagecontent_pk PRIMARY KEY (old_id);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.text_default_old_id BEFORE INSERT ON &mw_prefix.text
+CREATE TRIGGER &mw_prefix.pagecontent_seq_trg BEFORE INSERT ON &mw_prefix.pagecontent
        FOR EACH ROW WHEN (new.old_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(text_old_id_seq.nextval, :new.old_id);
@@ -212,7 +212,7 @@ CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title
 CREATE INDEX &mw_prefix.archive_i02 ON &mw_prefix.archive (ar_user_text,ar_timestamp);
 CREATE INDEX &mw_prefix.archive_i03 ON &mw_prefix.archive (ar_rev_id);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.archive_default_ar_id BEFORE INSERT ON &mw_prefix.archive
+CREATE TRIGGER &mw_prefix.archive_seq_trg BEFORE INSERT ON &mw_prefix.archive
        FOR EACH ROW WHEN (new.ar_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(archive_ar_id_seq.nextval, :new.ar_id);
@@ -273,7 +273,7 @@ ALTER TABLE &mw_prefix.category ADD CONSTRAINT &mw_prefix.category_pk PRIMARY KE
 CREATE UNIQUE INDEX &mw_prefix.category_u01 ON &mw_prefix.category (cat_title);
 CREATE INDEX &mw_prefix.category_i01 ON &mw_prefix.category (cat_pages);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.category_default_cat_id BEFORE INSERT ON &mw_prefix.category
+CREATE TRIGGER &mw_prefix.category_seq_trg BEFORE INSERT ON &mw_prefix.category
        FOR EACH ROW WHEN (new.cat_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(category_cat_id_seq.nextval, :new.cat_id);
@@ -286,7 +286,7 @@ CREATE TABLE &mw_prefix.externallinks (
   el_from   NUMBER  NOT NULL,
   el_to     VARCHAR2(2048) NOT NULL,
   el_index  VARCHAR2(2048) NOT NULL,
-  el_index_60  VARBINARY(60) NOT NULL DEFAULT ''
+  el_index_60  VARCHAR2(60)
 );
 ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id);
 ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
@@ -296,7 +296,7 @@ CREATE INDEX &mw_prefix.externallinks_i03 ON &mw_prefix.externallinks (el_index)
 CREATE INDEX &mw_prefix.externallinks_i04 ON &mw_prefix.externallinks (el_index_60, el_id);
 CREATE INDEX &mw_prefix.externallinks_i05 ON &mw_prefix.externallinks (el_from, el_index_60, el_id);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.externallinks_default_el_id BEFORE INSERT ON &mw_prefix.externallinks
+CREATE TRIGGER &mw_prefix.externallinks_seq_trg BEFORE INSERT ON &mw_prefix.externallinks
        FOR EACH ROW WHEN (new.el_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(externallinks_el_id_seq.nextval, :new.el_id);
@@ -361,7 +361,7 @@ CREATE INDEX &mw_prefix.ipblocks_i03 ON &mw_prefix.ipblocks (ipb_timestamp);
 CREATE INDEX &mw_prefix.ipblocks_i04 ON &mw_prefix.ipblocks (ipb_expiry);
 CREATE INDEX &mw_prefix.ipblocks_i05 ON &mw_prefix.ipblocks (ipb_parent_block_id);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.ipblocks_default_ipb_id BEFORE INSERT ON &mw_prefix.ipblocks
+CREATE TRIGGER &mw_prefix.ipblocks_seq_trg BEFORE INSERT ON &mw_prefix.ipblocks
        FOR EACH ROW WHEN (new.ipb_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(ipblocks_ipb_id_seq.nextval, :new.ipb_id);
@@ -452,7 +452,7 @@ CREATE INDEX &mw_prefix.filearchive_i03 ON &mw_prefix.filearchive (fa_deleted_ti
 CREATE INDEX &mw_prefix.filearchive_i04 ON &mw_prefix.filearchive (fa_user_text,fa_timestamp);
 CREATE INDEX &mw_prefix.filearchive_i05 ON &mw_prefix.filearchive (fa_sha1);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.filearchive_default_fa_id BEFORE INSERT ON &mw_prefix.filearchive
+CREATE TRIGGER &mw_prefix.filearchive_seq_trg BEFORE INSERT ON &mw_prefix.filearchive
        FOR EACH ROW WHEN (new.fa_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(filearchive_fa_id_seq.nextval, :new.fa_id);
@@ -485,7 +485,7 @@ CREATE INDEX &mw_prefix.uploadstash_i01 ON &mw_prefix.uploadstash (us_user);
 CREATE INDEX &mw_prefix.uploadstash_i02 ON &mw_prefix.uploadstash (us_timestamp);
 CREATE UNIQUE INDEX &mw_prefix.uploadstash_u01 ON &mw_prefix.uploadstash (us_key);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.uploadstash_default_us_id BEFORE INSERT ON &mw_prefix.uploadstash
+CREATE TRIGGER &mw_prefix.uploadstash_seq_trg BEFORE INSERT ON &mw_prefix.uploadstash
        FOR EACH ROW WHEN (new.us_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(uploadstash_us_id_seq.nextval, :new.us_id);
@@ -532,7 +532,7 @@ CREATE INDEX &mw_prefix.recentchanges_i06 ON &mw_prefix.recentchanges (rc_namesp
 CREATE INDEX &mw_prefix.recentchanges_i07 ON &mw_prefix.recentchanges (rc_user_text, rc_timestamp);
 CREATE INDEX &mw_prefix.recentchanges_i08 ON &mw_prefix.recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.recentchanges_default_rc_id BEFORE INSERT ON &mw_prefix.recentchanges
+CREATE TRIGGER &mw_prefix.recentchanges_seq_trg BEFORE INSERT ON &mw_prefix.recentchanges
        FOR EACH ROW WHEN (new.rc_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(recentchanges_rc_id_seq.nextval, :new.rc_id);
@@ -617,7 +617,7 @@ CREATE INDEX &mw_prefix.logging_i05 ON &mw_prefix.logging (log_type, log_action,
 CREATE INDEX &mw_prefix.logging_i06 ON &mw_prefix.logging (log_user_text, log_type, log_timestamp);
 CREATE INDEX &mw_prefix.logging_i07 ON &mw_prefix.logging (log_user_text, log_timestamp);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.logging_default_log_id BEFORE INSERT ON &mw_prefix.logging
+CREATE TRIGGER &mw_prefix.logging_seq_trg BEFORE INSERT ON &mw_prefix.logging
        FOR EACH ROW WHEN (new.log_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(logging_log_id_seq.nextval, :new.log_id);
@@ -654,7 +654,7 @@ CREATE INDEX &mw_prefix.job_i03 ON &mw_prefix.job (job_sha1);
 CREATE INDEX &mw_prefix.job_i04 ON &mw_prefix.job (job_cmd,job_token,job_random);
 CREATE INDEX &mw_prefix.job_i05 ON &mw_prefix.job (job_attempts);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.job_default_job_id BEFORE INSERT ON &mw_prefix.job
+CREATE TRIGGER &mw_prefix.job_seq_trg BEFORE INSERT ON &mw_prefix.job
        FOR EACH ROW WHEN (new.job_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(job_job_id_seq.nextval, :new.job_id);
@@ -706,7 +706,7 @@ CREATE INDEX &mw_prefix.page_restrictions_i01 ON &mw_prefix.page_restrictions (p
 CREATE INDEX &mw_prefix.page_restrictions_i02 ON &mw_prefix.page_restrictions (pr_level);
 CREATE INDEX &mw_prefix.page_restrictions_i03 ON &mw_prefix.page_restrictions (pr_cascade);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.page_restrictions_default_pr_id BEFORE INSERT ON &mw_prefix.page_restrictions
+CREATE TRIGGER &mw_prefix.page_restrictions_seq_trg BEFORE INSERT ON &mw_prefix.page_restrictions
        FOR EACH ROW WHEN (new.pr_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(page_restrictions_pr_id_seq.nextval, :new.pr_id);
@@ -821,7 +821,7 @@ CREATE INDEX &mw_prefix.sites_i05 ON &mw_prefix.sites (site_protocol);
 CREATE INDEX &mw_prefix.sites_i06 ON &mw_prefix.sites (site_domain);
 CREATE INDEX &mw_prefix.sites_i07 ON &mw_prefix.sites (site_forward);
 /*$mw$*/
-CREATE TRIGGER &mw_prefix.sites_default_site_id BEFORE INSERT ON &mw_prefix.sites
+CREATE TRIGGER &mw_prefix.sites_seq_trg BEFORE INSERT ON &mw_prefix.sites
        FOR EACH ROW WHEN (new.site_id IS NULL)
 BEGIN
        &mw_prefix.lastval_pkg.setLastval(sites_site_id_seq.nextval, :new.site_id);
index 57688ea..0a36ac4 100644 (file)
@@ -14,3 +14,5 @@ grant create synonym to &wiki_user.;
 grant create table to &wiki_user.;
 grant create sequence to &wiki_user.;
 grant create trigger to &wiki_user.;
+grant create type to &wiki_user.;
+grant create procedure to &wiki_user.;
index 68a371c..458556f 100644 (file)
@@ -66,6 +66,9 @@ class DumpRenderer extends Maintenance {
 
                $importer->setRevisionCallback(
                        [ $this, 'handleRevision' ] );
+               $importer->setNoticeCallback( function ( $msg, $params ) {
+                       echo wfMessage( $msg, $params )->text() . "\n";
+               } );
 
                $importer->doImport();
 
index 6348e96..8f55b88 100644 (file)
@@ -493,6 +493,9 @@ class CheckStorage {
                        MediaWikiServices::getInstance()->getMainConfig()
                );
                $importer->setRevisionCallback( [ $this, 'importRevision' ] );
+               $importer->setNoticeCallback( function ( $msg, $params ) {
+                       echo wfMessage( $msg, $params )->text() . "\n";
+               } );
                $importer->doImport();
        }
 
index b494429..7d37b50 100644 (file)
@@ -1842,9 +1842,13 @@ return [
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.LiveUpdateButtonWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RcTopSectionWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RclToOrFromWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RclTargetPageWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less',
                ],
                'skinStyles' => [
+                       'vector' => [
+                               'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.vector.less',
+                       ],
                        'monobook' => [
                                'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less',
                                'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less',
index 0675dc5..5e1332c 100644 (file)
@@ -1,10 +1,9 @@
-# Chosen, a Select Box Enhancer for jQuery and Protoype
-## by Patrick Filler for [Harvest](http://getharvest.com)
+#### Chosen
+- by Patrick Filler for [Harvest](http://getharvest.com)
+- Copyright (c) 2011-2016 by Harvest
 
 Available for use under the [MIT License](http://en.wikipedia.org/wiki/MIT_License)
 
-Copyright (c) 2011-2013 by Harvest
-
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
diff --git a/resources/lib/jquery.chosen/README.md b/resources/lib/jquery.chosen/README.md
new file mode 100644 (file)
index 0000000..5b21256
--- /dev/null
@@ -0,0 +1,48 @@
+# Chosen
+
+Chosen is a library for making long, unwieldy select boxes more user friendly.
+
+- jQuery support: 1.7+
+- Prototype support: 1.7+
+
+For **documentation**, usage, and examples, see:
+http://harvesthq.github.io/chosen/
+
+For **downloads**, see:
+https://github.com/harvesthq/chosen/releases/
+
+### Package managers
+
+Chosen is available through [Bower](https://bower.io/) and [npm](https://www.npmjs.com),
+_however, the package names are not the same_.
+
+To install with Bower:
+
+```
+bower install chosen
+```
+
+To install with npm:
+
+```
+npm install chosen-js
+```
+
+The compiled files for these packages are automatically generated and stored in a [2nd Chosen repository](https://github.com/harvesthq/chosen-package). No pull requests will be accepted to that repository.
+
+### Contributing to this project
+
+We welcome all to participate in making Chosen the best software it can be. The repository is maintained by only a few people, but has accepted contributions from over 50 authors after reviewing hundreds of pull requests related to thousands of issues. You can help reduce the maintainers' workload (and increase your chance of having an accepted contribution to Chosen) by following the
+[guidelines for contributing](contributing.md).
+
+* [Bug reports](contributing.md#bugs)
+* [Feature requests](contributing.md#features)
+* [Pull requests](contributing.md#pull-requests)
+
+### Chosen Credits
+
+- Concept and development by [Patrick Filler](http://patrickfiller.com) for [Harvest](http://getharvest.com/).
+- Design and CSS by [Matthew Lettini](http://matthewlettini.com/)
+- Repository maintained by [@pfiller](http://github.com/pfiller), [@kenearley](http://github.com/kenearley), [@stof](http://github.com/stof), [@koenpunt](http://github.com/koenpunt), and [@tjschuck](http://github.com/tjschuck).
+- Chosen includes [contributions by many fine folks](https://github.com/harvesthq/chosen/contributors).
+
index 3611ae4..c57da70 100644 (file)
Binary files a/resources/lib/jquery.chosen/chosen-sprite.png and b/resources/lib/jquery.chosen/chosen-sprite.png differ
index bd61d96..6b50545 100644 (file)
Binary files a/resources/lib/jquery.chosen/chosen-sprite@2x.png and b/resources/lib/jquery.chosen/chosen-sprite@2x.png differ
index 17793ed..d4219b4 100644 (file)
+/*!
+Chosen, a Select Box Enhancer for jQuery and Prototype
+by Patrick Filler for Harvest, http://getharvest.com
+
+Version 1.8.2
+Full source at https://github.com/harvesthq/chosen
+Copyright (c) 2011-2017 Harvest http://getharvest.com
+
+MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+This file is generated by `grunt build`, do not edit it by hand.
+*/
+
 /* @group Base */
-.chzn-container {
-  font-size: 13px;
+.chosen-container {
   position: relative;
   display: inline-block;
   vertical-align: middle;
-  zoom: 1;
-  *display: inline;
+  font-size: 13px;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
 }
-.chzn-container .chzn-drop {
-  background: #fff;
-  border: 1px solid #aaa;
-  border-top: 0;
+
+.chosen-container * {
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.chosen-container .chosen-drop {
   position: absolute;
   top: 100%;
-  left: -9999px;
-  -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
-  -moz-box-shadow   : 0 4px 5px rgba(0,0,0,.15);
-  box-shadow        : 0 4px 5px rgba(0,0,0,.15);
   z-index: 1010;
   width: 100%;
-  -moz-box-sizing   : border-box;
-  -ms-box-sizing    : border-box;
-  -webkit-box-sizing: border-box;
-  -khtml-box-sizing : border-box;
-  box-sizing        : border-box;
+  border: 1px solid #aaa;
+  border-top: 0;
+  background: #fff;
+  -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
+          box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
+  clip: rect(0, 0, 0, 0);
 }
 
-.chzn-container.chzn-with-drop .chzn-drop {
-  left: 0;
+.chosen-container.chosen-with-drop .chosen-drop {
+  clip: auto;
 }
 
-/* @end */
+.chosen-container a {
+  cursor: pointer;
+}
 
-/* @group Single Chosen */
-.chzn-container-single .chzn-single {
-  background-color: #ffffff;
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );   
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
-  background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
-  background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
-  background-image: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 
-  -webkit-border-radius: 5px;
-  -moz-border-radius   : 5px;
-  border-radius        : 5px;
-  -moz-background-clip   : padding;
-  -webkit-background-clip: padding-box;
-  background-clip        : padding-box;
-  border: 1px solid #aaaaaa;
-  -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
-  -moz-box-shadow   : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
-  box-shadow        : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
-  display: block;
+.chosen-container .search-choice .group-name, .chosen-container .chosen-single .group-name {
+  margin-right: 4px;
   overflow: hidden;
   white-space: nowrap;
+  text-overflow: ellipsis;
+  font-weight: normal;
+  color: #999999;
+}
+
+.chosen-container .search-choice .group-name:after, .chosen-container .chosen-single .group-name:after {
+  content: ":";
+  padding-left: 2px;
+  vertical-align: top;
+}
+
+/* @end */
+/* @group Single Chosen */
+.chosen-container-single .chosen-single {
   position: relative;
-  height: 23px;
-  line-height: 24px;
+  display: block;
+  overflow: hidden;
   padding: 0 0 0 8px;
-  color: #444444;
+  height: 25px;
+  border: 1px solid #aaa;
+  border-radius: 5px;
+  background-color: #fff;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #fff), color-stop(50%, #f6f6f6), color-stop(52%, #eee), to(#f4f4f4));
+  background: linear-gradient(#fff 20%, #f6f6f6 50%, #eee 52%, #f4f4f4 100%);
+  background-clip: padding-box;
+  -webkit-box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, 0.1);
+  color: #444;
   text-decoration: none;
+  white-space: nowrap;
+  line-height: 24px;
 }
-.chzn-container-single .chzn-default {
+
+.chosen-container-single .chosen-default {
   color: #999;
 }
-.chzn-container-single .chzn-single span {
-  margin-right: 26px;
+
+.chosen-container-single .chosen-single span {
   display: block;
   overflow: hidden;
-  white-space: nowrap;
-  -o-text-overflow: ellipsis;
-  -ms-text-overflow: ellipsis;
+  margin-right: 26px;
   text-overflow: ellipsis;
+  white-space: nowrap;
 }
-.chzn-container-single .chzn-single abbr {
-  display: block;
+
+.chosen-container-single .chosen-single-with-deselect span {
+  margin-right: 38px;
+}
+
+.chosen-container-single .chosen-single abbr {
   position: absolute;
-  right: 26px;
   top: 6px;
+  right: 26px;
+  display: block;
   width: 12px;
   height: 12px;
+  background: url("chosen-sprite.png") -42px 1px no-repeat;
   font-size: 1px;
-  background: url('chosen-sprite.png') -42px 1px no-repeat;
 }
-.chzn-container-single .chzn-single abbr:hover {
+
+.chosen-container-single .chosen-single abbr:hover {
   background-position: -42px -10px;
 }
-.chzn-container-single.chzn-disabled .chzn-single abbr:hover {
+
+.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
   background-position: -42px -10px;
 }
-.chzn-container-single .chzn-single div {
+
+.chosen-container-single .chosen-single div {
   position: absolute;
-  right: 0;
   top: 0;
+  right: 0;
   display: block;
-  height: 100%;
   width: 18px;
+  height: 100%;
 }
-.chzn-container-single .chzn-single div b {
-  background: url('chosen-sprite.png') no-repeat 0px 2px;
+
+.chosen-container-single .chosen-single div b {
   display: block;
   width: 100%;
   height: 100%;
+  background: url("chosen-sprite.png") no-repeat 0px 2px;
 }
-.chzn-container-single .chzn-search {
-  padding: 3px 4px;
+
+.chosen-container-single .chosen-search {
   position: relative;
+  z-index: 1010;
   margin: 0;
+  padding: 3px 4px;
   white-space: nowrap;
-  z-index: 1010;
 }
-.chzn-container-single .chzn-search input {
-  background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
-  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
-  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+
+.chosen-container-single .chosen-search input[type="text"] {
   margin: 1px 0;
   padding: 4px 20px 4px 5px;
+  width: 100%;
+  height: auto;
   outline: 0;
   border: 1px solid #aaa;
-  font-family: sans-serif;
+  background: url("chosen-sprite.png") no-repeat 100% -20px;
   font-size: 1em;
-  width: 100%;
-  -moz-box-sizing   : border-box;
-  -ms-box-sizing    : border-box;
-  -webkit-box-sizing: border-box;
-  -khtml-box-sizing : border-box;
-  box-sizing        : border-box;
+  font-family: sans-serif;
+  line-height: normal;
+  border-radius: 0;
 }
-.chzn-container-single .chzn-drop {
+
+.chosen-container-single .chosen-drop {
   margin-top: -1px;
-  -webkit-border-radius: 0 0 4px 4px;
-  -moz-border-radius   : 0 0 4px 4px;
-  border-radius        : 0 0 4px 4px;
-  -moz-background-clip   : padding;
-  -webkit-background-clip: padding-box;
-  background-clip        : padding-box;
-}
-.chzn-container-single-nosearch .chzn-search {
+  border-radius: 0 0 4px 4px;
+  background-clip: padding-box;
+}
+
+.chosen-container-single.chosen-container-single-nosearch .chosen-search {
   position: absolute;
-  left: -9999px;
+  clip: rect(0, 0, 0, 0);
 }
+
 /* @end */
+/* @group Results */
+.chosen-container .chosen-results {
+  color: #444;
+  position: relative;
+  overflow-x: hidden;
+  overflow-y: auto;
+  margin: 0 4px 4px 0;
+  padding: 0 0 0 4px;
+  max-height: 240px;
+  -webkit-overflow-scrolling: touch;
+}
 
-/* @group Multi Chosen */
-.chzn-container-multi .chzn-choices {
-  background-color: #fff;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
-  border: 1px solid #aaa;
+.chosen-container .chosen-results li {
+  display: none;
   margin: 0;
-  padding: 0;
-  cursor: text;
-  overflow: hidden;
-  height: auto !important;
-  height: 1%;
+  padding: 5px 6px;
+  list-style: none;
+  line-height: 15px;
+  word-wrap: break-word;
+  -webkit-touch-callout: none;
+}
+
+.chosen-container .chosen-results li.active-result {
+  display: list-item;
+  cursor: pointer;
+}
+
+.chosen-container .chosen-results li.disabled-result {
+  display: list-item;
+  color: #ccc;
+  cursor: default;
+}
+
+.chosen-container .chosen-results li.highlighted {
+  background-color: #3875d7;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+  background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
+  color: #fff;
+}
+
+.chosen-container .chosen-results li.no-results {
+  color: #777;
+  display: list-item;
+  background: #f4f4f4;
+}
+
+.chosen-container .chosen-results li.group-result {
+  display: list-item;
+  font-weight: bold;
+  cursor: default;
+}
+
+.chosen-container .chosen-results li.group-option {
+  padding-left: 15px;
+}
+
+.chosen-container .chosen-results li em {
+  font-style: normal;
+  text-decoration: underline;
+}
+
+/* @end */
+/* @group Multi Chosen */
+.chosen-container-multi .chosen-choices {
   position: relative;
+  overflow: hidden;
+  margin: 0;
+  padding: 0 5px;
   width: 100%;
-  -moz-box-sizing   : border-box;
-  -ms-box-sizing    : border-box;
-  -webkit-box-sizing: border-box;
-  -khtml-box-sizing : border-box;
-  box-sizing        : border-box;
+  height: auto;
+  border: 1px solid #aaa;
+  background-color: #fff;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #eee), color-stop(15%, #fff));
+  background-image: linear-gradient(#eee 1%, #fff 15%);
+  cursor: text;
 }
-.chzn-container-multi .chzn-choices li {
+
+.chosen-container-multi .chosen-choices li {
   float: left;
   list-style: none;
 }
-.chzn-container-multi .chzn-choices .search-field {
-  white-space: nowrap;
+
+.chosen-container-multi .chosen-choices li.search-field {
   margin: 0;
   padding: 0;
+  white-space: nowrap;
 }
-.chzn-container-multi .chzn-choices .search-field input {
-  color: #666;
-  background: transparent !important;
-  border: 0 !important;
-  font-family: sans-serif;
-  font-size: 100%;
-  height: 15px;
-  padding: 5px;
+
+.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
   margin: 1px 0;
+  padding: 0;
+  height: 25px;
   outline: 0;
+  border: 0 !important;
+  background: transparent !important;
   -webkit-box-shadow: none;
-  -moz-box-shadow   : none;
-  box-shadow        : none;
-}
-.chzn-container-multi .chzn-choices .search-field .default {
+          box-shadow: none;
   color: #999;
+  font-size: 100%;
+  font-family: sans-serif;
+  line-height: normal;
+  border-radius: 0;
+  width: 25px;
 }
-.chzn-container-multi .chzn-choices .search-choice {
-  -webkit-border-radius: 3px;
-  -moz-border-radius   : 3px;
-  border-radius        : 3px;
-  -moz-background-clip   : padding;
-  -webkit-background-clip: padding-box;
-  background-clip        : padding-box;
-  background-color: #e4e4e4;
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); 
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
-  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 
-  -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
-  -moz-box-shadow   : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
-  box-shadow        : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+
+.chosen-container-multi .chosen-choices li.search-choice {
+  position: relative;
+  margin: 3px 5px 3px 0;
+  padding: 3px 20px 3px 5px;
+  border: 1px solid #aaa;
+  max-width: 100%;
+  border-radius: 3px;
+  background-color: #eeeeee;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), to(#eee));
+  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
+  background-size: 100% 19px;
+  background-repeat: repeat-x;
+  background-clip: padding-box;
+  -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+          box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
   color: #333;
-  border: 1px solid #aaaaaa;
   line-height: 13px;
-  padding: 3px 20px 3px 5px;
-  margin: 3px 0 3px 5px;
-  position: relative;
   cursor: default;
 }
-.chzn-container-multi .chzn-choices .search-choice.search-choice-disabled {
-  background-color: #e4e4e4;
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
-  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
-  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  color: #666;
-  border: 1px solid #cccccc;
-  padding-right: 5px;
-}
-.chzn-container-multi .chzn-choices .search-choice-focus {
-  background: #d4d4d4;
+
+.chosen-container-multi .chosen-choices li.search-choice span {
+  word-wrap: break-word;
 }
-.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
-  display: block;
+
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
   position: absolute;
-  right: 3px;
   top: 4px;
+  right: 3px;
+  display: block;
   width: 12px;
   height: 12px;
+  background: url("chosen-sprite.png") -42px 1px no-repeat;
   font-size: 1px;
-  background: url('chosen-sprite.png') -42px 1px no-repeat;
 }
-.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
+
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
   background-position: -42px -10px;
 }
-.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
-  background-position: -42px -10px;
+
+.chosen-container-multi .chosen-choices li.search-choice-disabled {
+  padding-right: 5px;
+  border: 1px solid #ccc;
+  background-color: #e4e4e4;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), to(#eee));
+  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
+  color: #666;
 }
-/* @end */
 
-/* @group Results */
-.chzn-container .chzn-results {
-  margin: 0 4px 4px 0;
-  max-height: 240px;
-  padding: 0 0 0 4px;
-  position: relative;
-  overflow-x: hidden;
-  overflow-y: auto;
-  -webkit-overflow-scrolling: touch;
+.chosen-container-multi .chosen-choices li.search-choice-focus {
+  background: #d4d4d4;
 }
-.chzn-container-multi .chzn-results {
-  margin: 0;
-  padding: 0;
+
+.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
+  background-position: -42px -10px;
 }
-.chzn-container .chzn-results li {
-  display: none;
-  line-height: 15px;
-  padding: 5px 6px;
+
+.chosen-container-multi .chosen-results {
   margin: 0;
-  list-style: none;
-}
-.chzn-container .chzn-results .active-result {
-  cursor: pointer;
-  display: list-item;
-}
-.chzn-container .chzn-results .highlighted {
-  background-color: #3875d7;
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );  
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
-  background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
-  background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
-  background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
-  background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
-  color: #fff;
-}
-.chzn-container .chzn-results li em {
-  background: #feffde;
-  font-style: normal;
-}
-.chzn-container .chzn-results .highlighted em {
-  background: transparent;
+  padding: 0;
 }
-.chzn-container .chzn-results .no-results {
-  background: #f4f4f4;
+
+.chosen-container-multi .chosen-drop .result-selected {
   display: list-item;
-}
-.chzn-container .chzn-results .group-result {
+  color: #ccc;
   cursor: default;
-  color: #999;
-  font-weight: bold;
-}
-.chzn-container .chzn-results .group-option {
-  padding-left: 15px;
-}
-.chzn-container-multi .chzn-drop .result-selected {
-  display: none;
-}
-.chzn-container .chzn-results-scroll {
-  background: white;
-  margin: 0 4px;
-  position: absolute;
-  text-align: center;
-  width: 321px; /* This should by dynamic with js */
-  z-index: 1;
-}
-.chzn-container .chzn-results-scroll span {
-  display: inline-block;
-  height: 17px;
-  text-indent: -5000px;
-  width: 9px;
-}
-.chzn-container .chzn-results-scroll-down {
-  bottom: 0;
-}
-.chzn-container .chzn-results-scroll-down span {
-  background: url('chosen-sprite.png') no-repeat -4px -3px;
-}
-.chzn-container .chzn-results-scroll-up span {
-  background: url('chosen-sprite.png') no-repeat -22px -3px;
 }
-/* @end */
 
+/* @end */
 /* @group Active  */
-.chzn-container-active .chzn-single {
-  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
-  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
-  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+.chosen-container-active .chosen-single {
   border: 1px solid #5897fb;
+  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
 }
-.chzn-container-active.chzn-with-drop .chzn-single {
+
+.chosen-container-active.chosen-with-drop .chosen-single {
   border: 1px solid #aaa;
-  -webkit-box-shadow: 0 1px 0 #fff inset;
-  -moz-box-shadow   : 0 1px 0 #fff inset;
-  box-shadow        : 0 1px 0 #fff inset;
-  background-color: #eee;
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
-  background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
-  background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
-  background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
-  -webkit-border-bottom-left-radius : 0;
-  -webkit-border-bottom-right-radius: 0;
-  -moz-border-radius-bottomleft : 0;
-  -moz-border-radius-bottomright: 0;
-  border-bottom-left-radius : 0;
   border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #eee), color-stop(80%, #fff));
+  background-image: linear-gradient(#eee 20%, #fff 80%);
+  -webkit-box-shadow: 0 1px 0 #fff inset;
+          box-shadow: 0 1px 0 #fff inset;
 }
-.chzn-container-active.chzn-with-drop .chzn-single div {
-  background: transparent;
+
+.chosen-container-active.chosen-with-drop .chosen-single div {
   border-left: none;
+  background: transparent;
 }
-.chzn-container-active.chzn-with-drop .chzn-single div b {
+
+.chosen-container-active.chosen-with-drop .chosen-single div b {
   background-position: -18px 2px;
 }
-.chzn-container-active .chzn-choices {
-  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
-  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
-  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+
+.chosen-container-active .chosen-choices {
   border: 1px solid #5897fb;
+  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
 }
-.chzn-container-active .chzn-choices .search-field input {
-  color: #111 !important;
+
+.chosen-container-active .chosen-choices li.search-field input[type="text"] {
+  color: #222 !important;
 }
-/* @end */
 
+/* @end */
 /* @group Disabled Support */
-.chzn-disabled {
+.chosen-disabled {
+  opacity: 0.5 !important;
   cursor: default;
-  opacity:0.5 !important;
 }
-.chzn-disabled .chzn-single {
+
+.chosen-disabled .chosen-single {
   cursor: default;
 }
-.chzn-disabled .chzn-choices .search-choice .search-choice-close {
+
+.chosen-disabled .chosen-choices .search-choice .search-choice-close {
   cursor: default;
 }
 
+/* @end */
 /* @group Right to Left */
-.chzn-rtl { text-align: right; }
-.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
-.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
+.chosen-rtl {
+  text-align: right;
+}
+
+.chosen-rtl .chosen-single {
+  overflow: visible;
+  padding: 0 8px 0 0;
+}
 
-.chzn-rtl .chzn-single div { left: 3px; right: auto; }
-.chzn-rtl .chzn-single abbr {
+.chosen-rtl .chosen-single span {
+  margin-right: 0;
+  margin-left: 26px;
+  direction: rtl;
+}
+
+.chosen-rtl .chosen-single-with-deselect span {
+  margin-left: 38px;
+}
+
+.chosen-rtl .chosen-single div {
+  right: auto;
+  left: 3px;
+}
+
+.chosen-rtl .chosen-single abbr {
+  right: auto;
   left: 26px;
+}
+
+.chosen-rtl .chosen-choices li {
+  float: right;
+}
+
+.chosen-rtl .chosen-choices li.search-field input[type="text"] {
+  direction: rtl;
+}
+
+.chosen-rtl .chosen-choices li.search-choice {
+  margin: 3px 5px 3px 0;
+  padding: 3px 5px 3px 19px;
+}
+
+.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
   right: auto;
+  left: 4px;
+}
+
+.chosen-rtl.chosen-container-single .chosen-results {
+  margin: 0 0 4px 4px;
+  padding: 0 4px 0 0;
+}
+
+.chosen-rtl .chosen-results li.group-option {
+  padding-right: 15px;
+  padding-left: 0;
 }
-.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
-.chzn-rtl .chzn-choices li { float: right; }
-.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
-.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; }
-.chzn-rtl .chzn-search { left: 9999px; }
-.chzn-rtl.chzn-with-drop .chzn-search { left: 0px; }
-.chzn-rtl .chzn-drop { left: 9999px; }
-.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
-.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
-.chzn-rtl.chzn-container-active.chzn-with-drop .chzn-single div { border-right: none; }
-.chzn-rtl .chzn-search input {
-  background: #fff url('chosen-sprite.png') no-repeat -30px -20px;
-  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
-  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);  
-  background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+
+.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
+  border-right: none;
+}
+
+.chosen-rtl .chosen-search input[type="text"] {
   padding: 4px 5px 4px 20px;
+  background: url("chosen-sprite.png") no-repeat -30px -20px;
   direction: rtl;
 }
-.chzn-container-single.chzn-rtl .chzn-single div b {
+
+.chosen-rtl.chosen-container-single .chosen-single div b {
   background-position: 6px 2px;
 }
-.chzn-container-single.chzn-rtl.chzn-with-drop .chzn-single div b {
+
+.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
   background-position: -12px 2px;
 }
-/* @end */
 
+/* @end */
 /* @group Retina compatibility */
-@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi)  {
-  .chzn-rtl .chzn-search input, .chzn-container-single .chzn-single abbr, .chzn-container-single .chzn-single div b, .chzn-container-single .chzn-search input, .chzn-container-multi .chzn-choices .search-choice .search-choice-close, .chzn-container .chzn-results-scroll-down span, .chzn-container .chzn-results-scroll-up span {
-      background-image: url('chosen-sprite@2x.png') !important;
-      background-repeat: no-repeat !important;
-      background-size: 52px 37px !important;
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi), only screen and (min-resolution: 1.5dppx) {
+  .chosen-rtl .chosen-search input[type="text"],
+  .chosen-container-single .chosen-single abbr,
+  .chosen-container-single .chosen-single div b,
+  .chosen-container-single .chosen-search input[type="text"],
+  .chosen-container-multi .chosen-choices .search-choice .search-choice-close,
+  .chosen-container .chosen-results-scroll-down span,
+  .chosen-container .chosen-results-scroll-up span {
+    background-image: url("chosen-sprite@2x.png") !important;
+    background-size: 52px 37px !important;
+    background-repeat: no-repeat !important;
   }
 }
+
 /* @end */
index 745174f..b8e20eb 100644 (file)
@@ -1,17 +1,22 @@
-// Chosen, a Select Box Enhancer for jQuery and Protoype
-// by Patrick Filler for Harvest, http://getharvest.com
-//
-// Version 0.9.14
-// Full source at https://github.com/harvesthq/chosen
-// Copyright (c) 2011 Harvest http://getharvest.com
-
-// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
-// This file is generated by `cake build`, do not edit it by hand.
+/*!
+Chosen, a Select Box Enhancer for jQuery and Prototype
+by Patrick Filler for Harvest, http://getharvest.com
+
+Version 1.8.2
+Full source at https://github.com/harvesthq/chosen
+Copyright (c) 2011-2017 Harvest http://getharvest.com
+
+MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+This file is generated by `grunt build`, do not edit it by hand.
+*/
+
 (function() {
-  var SelectParser;
+  var $, AbstractChosen, Chosen, SelectParser,
+    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
+    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+    hasProp = {}.hasOwnProperty;
 
   SelectParser = (function() {
-
     function SelectParser() {
       this.options_index = 0;
       this.parsed = [];
     };
 
     SelectParser.prototype.add_group = function(group) {
-      var group_position, option, _i, _len, _ref, _results;
+      var group_position, i, len, option, ref, results1;
       group_position = this.parsed.length;
       this.parsed.push({
         array_index: group_position,
         group: true,
         label: group.label,
+        title: group.title ? group.title : void 0,
         children: 0,
-        disabled: group.disabled
+        disabled: group.disabled,
+        classes: group.className
       });
-      _ref = group.childNodes;
-      _results = [];
-      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-        option = _ref[_i];
-        _results.push(this.add_option(option, group_position, group.disabled));
+      ref = group.childNodes;
+      results1 = [];
+      for (i = 0, len = ref.length; i < len; i++) {
+        option = ref[i];
+        results1.push(this.add_option(option, group_position, group.disabled));
       }
-      return _results;
+      return results1;
     };
 
     SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
             value: option.value,
             text: option.text,
             html: option.innerHTML,
+            title: option.title ? option.title : void 0,
             selected: option.selected,
             disabled: group_disabled === true ? group_disabled : option.disabled,
             group_array_index: group_position,
+            group_label: group_position != null ? this.parsed[group_position].label : null,
             classes: option.className,
             style: option.style.cssText
           });
   })();
 
   SelectParser.select_to_array = function(select) {
-    var child, parser, _i, _len, _ref;
+    var child, i, len, parser, ref;
     parser = new SelectParser();
-    _ref = select.childNodes;
-    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-      child = _ref[_i];
+    ref = select.childNodes;
+    for (i = 0, len = ref.length; i < len; i++) {
+      child = ref[i];
       parser.add_node(child);
     }
     return parser.parsed;
   };
 
-  this.SelectParser = SelectParser;
-
-}).call(this);
-
-/*
-Chosen source: generate output using 'cake build'
-Copyright (c) 2011 by Harvest
-*/
-
-
-(function() {
-  var AbstractChosen, root;
-
-  root = this;
-
   AbstractChosen = (function() {
-
-    function AbstractChosen(form_field, options) {
+    function AbstractChosen(form_field, options1) {
       this.form_field = form_field;
-      this.options = options != null ? options : {};
+      this.options = options1 != null ? options1 : {};
+      this.label_click_handler = bind(this.label_click_handler, this);
       if (!AbstractChosen.browser_is_supported()) {
         return;
       }
@@ -117,31 +111,40 @@ Copyright (c) 2011 by Harvest
       this.setup();
       this.set_up_html();
       this.register_observers();
-      this.finish_setup();
+      this.on_ready();
     }
 
     AbstractChosen.prototype.set_default_values = function() {
-      var _this = this;
-      this.click_test_action = function(evt) {
-        return _this.test_active_click(evt);
-      };
-      this.activate_action = function(evt) {
-        return _this.activate_field(evt);
-      };
+      this.click_test_action = (function(_this) {
+        return function(evt) {
+          return _this.test_active_click(evt);
+        };
+      })(this);
+      this.activate_action = (function(_this) {
+        return function(evt) {
+          return _this.activate_field(evt);
+        };
+      })(this);
       this.active_field = false;
       this.mouse_on_container = false;
       this.results_showing = false;
       this.result_highlighted = null;
-      this.result_single_selected = null;
+      this.is_rtl = this.options.rtl || /\bchosen-rtl\b/.test(this.form_field.className);
       this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
       this.disable_search_threshold = this.options.disable_search_threshold || 0;
       this.disable_search = this.options.disable_search || false;
       this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
+      this.group_search = this.options.group_search != null ? this.options.group_search : true;
       this.search_contains = this.options.search_contains || false;
-      this.choices = 0;
-      this.single_backstroke_delete = this.options.single_backstroke_delete || false;
+      this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
       this.max_selected_options = this.options.max_selected_options || Infinity;
-      return this.inherit_select_classes = this.options.inherit_select_classes || false;
+      this.inherit_select_classes = this.options.inherit_select_classes || false;
+      this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
+      this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
+      this.include_group_label_in_selected = this.options.include_group_label_in_selected || false;
+      this.max_shown_results = this.options.max_shown_results || Number.POSITIVE_INFINITY;
+      this.case_sensitive_search = this.options.case_sensitive_search || false;
+      return this.hide_results_on_select = this.options.hide_results_on_select != null ? this.options.hide_results_on_select : true;
     };
 
     AbstractChosen.prototype.set_default_text = function() {
@@ -152,9 +155,18 @@ Copyright (c) 2011 by Harvest
       } else {
         this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
       }
+      this.default_text = this.escape_html(this.default_text);
       return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
     };
 
+    AbstractChosen.prototype.choice_label = function(item) {
+      if (this.include_group_label_in_selected && (item.group_label != null)) {
+        return "<b class='group-name'>" + item.group_label + "</b>" + item.html;
+      } else {
+        return item.html;
+      }
+    };
+
     AbstractChosen.prototype.mouse_enter = function() {
       return this.mouse_on_container = true;
     };
@@ -164,12 +176,13 @@ Copyright (c) 2011 by Harvest
     };
 
     AbstractChosen.prototype.input_focus = function(evt) {
-      var _this = this;
       if (this.is_multiple) {
         if (!this.active_field) {
-          return setTimeout((function() {
-            return _this.container_mousedown();
-          }), 50);
+          return setTimeout(((function(_this) {
+            return function() {
+              return _this.container_mousedown();
+            };
+          })(this)), 50);
         }
       } else {
         if (!this.active_field) {
@@ -179,34 +192,110 @@ Copyright (c) 2011 by Harvest
     };
 
     AbstractChosen.prototype.input_blur = function(evt) {
-      var _this = this;
       if (!this.mouse_on_container) {
         this.active_field = false;
-        return setTimeout((function() {
-          return _this.blur_test();
-        }), 100);
+        return setTimeout(((function(_this) {
+          return function() {
+            return _this.blur_test();
+          };
+        })(this)), 100);
       }
     };
 
-    AbstractChosen.prototype.result_add_option = function(option) {
-      var classes, style;
-      if (!option.disabled) {
-        option.dom_id = this.container_id + "_o_" + option.array_index;
-        classes = option.selected && this.is_multiple ? [] : ["active-result"];
-        if (option.selected) {
-          classes.push("result-selected");
+    AbstractChosen.prototype.label_click_handler = function(evt) {
+      if (this.is_multiple) {
+        return this.container_mousedown(evt);
+      } else {
+        return this.activate_field();
+      }
+    };
+
+    AbstractChosen.prototype.results_option_build = function(options) {
+      var content, data, data_content, i, len, ref, shown_results;
+      content = '';
+      shown_results = 0;
+      ref = this.results_data;
+      for (i = 0, len = ref.length; i < len; i++) {
+        data = ref[i];
+        data_content = '';
+        if (data.group) {
+          data_content = this.result_add_group(data);
+        } else {
+          data_content = this.result_add_option(data);
+        }
+        if (data_content !== '') {
+          shown_results++;
+          content += data_content;
         }
-        if (option.group_array_index != null) {
-          classes.push("group-option");
+        if (options != null ? options.first : void 0) {
+          if (data.selected && this.is_multiple) {
+            this.choice_build(data);
+          } else if (data.selected && !this.is_multiple) {
+            this.single_set_selected_text(this.choice_label(data));
+          }
         }
-        if (option.classes !== "") {
-          classes.push(option.classes);
+        if (shown_results >= this.max_shown_results) {
+          break;
         }
-        style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
-        return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
-      } else {
-        return "";
       }
+      return content;
+    };
+
+    AbstractChosen.prototype.result_add_option = function(option) {
+      var classes, option_el;
+      if (!option.search_match) {
+        return '';
+      }
+      if (!this.include_option_in_results(option)) {
+        return '';
+      }
+      classes = [];
+      if (!option.disabled && !(option.selected && this.is_multiple)) {
+        classes.push("active-result");
+      }
+      if (option.disabled && !(option.selected && this.is_multiple)) {
+        classes.push("disabled-result");
+      }
+      if (option.selected) {
+        classes.push("result-selected");
+      }
+      if (option.group_array_index != null) {
+        classes.push("group-option");
+      }
+      if (option.classes !== "") {
+        classes.push(option.classes);
+      }
+      option_el = document.createElement("li");
+      option_el.className = classes.join(" ");
+      option_el.style.cssText = option.style;
+      option_el.setAttribute("data-option-array-index", option.array_index);
+      option_el.innerHTML = option.highlighted_html || option.html;
+      if (option.title) {
+        option_el.title = option.title;
+      }
+      return this.outerHTML(option_el);
+    };
+
+    AbstractChosen.prototype.result_add_group = function(group) {
+      var classes, group_el;
+      if (!(group.search_match || group.group_match)) {
+        return '';
+      }
+      if (!(group.active_options > 0)) {
+        return '';
+      }
+      classes = [];
+      classes.push("group-result");
+      if (group.classes) {
+        classes.push(group.classes);
+      }
+      group_el = document.createElement("li");
+      group_el.className = classes.join(" ");
+      group_el.innerHTML = group.highlighted_html || this.escape_html(group.label);
+      if (group.title) {
+        group_el.title = group.title;
+      }
+      return this.outerHTML(group_el);
     };
 
     AbstractChosen.prototype.results_update_field = function() {
@@ -215,8 +304,25 @@ Copyright (c) 2011 by Harvest
         this.results_reset_cleanup();
       }
       this.result_clear_highlight();
-      this.result_single_selected = null;
-      return this.results_build();
+      this.results_build();
+      if (this.results_showing) {
+        return this.winnow_results();
+      }
+    };
+
+    AbstractChosen.prototype.reset_single_select_options = function() {
+      var i, len, ref, result, results1;
+      ref = this.results_data;
+      results1 = [];
+      for (i = 0, len = ref.length; i < len; i++) {
+        result = ref[i];
+        if (result.selected) {
+          results1.push(result.selected = false);
+        } else {
+          results1.push(void 0);
+        }
+      }
+      return results1;
     };
 
     AbstractChosen.prototype.results_toggle = function() {
@@ -235,106 +341,279 @@ Copyright (c) 2011 by Harvest
       }
     };
 
+    AbstractChosen.prototype.winnow_results = function() {
+      var escapedQuery, fix, i, len, option, prefix, query, ref, regex, results, results_group, search_match, startpos, suffix, text;
+      this.no_results_clear();
+      results = 0;
+      query = this.get_search_text();
+      escapedQuery = query.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+      regex = this.get_search_regex(escapedQuery);
+      ref = this.results_data;
+      for (i = 0, len = ref.length; i < len; i++) {
+        option = ref[i];
+        option.search_match = false;
+        results_group = null;
+        search_match = null;
+        option.highlighted_html = '';
+        if (this.include_option_in_results(option)) {
+          if (option.group) {
+            option.group_match = false;
+            option.active_options = 0;
+          }
+          if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
+            results_group = this.results_data[option.group_array_index];
+            if (results_group.active_options === 0 && results_group.search_match) {
+              results += 1;
+            }
+            results_group.active_options += 1;
+          }
+          text = option.group ? option.label : option.text;
+          if (!(option.group && !this.group_search)) {
+            search_match = this.search_string_match(text, regex);
+            option.search_match = search_match != null;
+            if (option.search_match && !option.group) {
+              results += 1;
+            }
+            if (option.search_match) {
+              if (query.length) {
+                startpos = search_match.index;
+                prefix = text.slice(0, startpos);
+                fix = text.slice(startpos, startpos + query.length);
+                suffix = text.slice(startpos + query.length);
+                option.highlighted_html = (this.escape_html(prefix)) + "<em>" + (this.escape_html(fix)) + "</em>" + (this.escape_html(suffix));
+              }
+              if (results_group != null) {
+                results_group.group_match = true;
+              }
+            } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
+              option.search_match = true;
+            }
+          }
+        }
+      }
+      this.result_clear_highlight();
+      if (results < 1 && query.length) {
+        this.update_results_content("");
+        return this.no_results(query);
+      } else {
+        this.update_results_content(this.results_option_build());
+        return this.winnow_results_set_highlight();
+      }
+    };
+
+    AbstractChosen.prototype.get_search_regex = function(escaped_search_string) {
+      var regex_flag, regex_string;
+      regex_string = this.search_contains ? escaped_search_string : "(^|\\s|\\b)" + escaped_search_string + "[^\\s]*";
+      if (!(this.enable_split_word_search || this.search_contains)) {
+        regex_string = "^" + regex_string;
+      }
+      regex_flag = this.case_sensitive_search ? "" : "i";
+      return new RegExp(regex_string, regex_flag);
+    };
+
+    AbstractChosen.prototype.search_string_match = function(search_string, regex) {
+      var match;
+      match = regex.exec(search_string);
+      if (!this.search_contains && (match != null ? match[1] : void 0)) {
+        match.index += 1;
+      }
+      return match;
+    };
+
+    AbstractChosen.prototype.choices_count = function() {
+      var i, len, option, ref;
+      if (this.selected_option_count != null) {
+        return this.selected_option_count;
+      }
+      this.selected_option_count = 0;
+      ref = this.form_field.options;
+      for (i = 0, len = ref.length; i < len; i++) {
+        option = ref[i];
+        if (option.selected) {
+          this.selected_option_count += 1;
+        }
+      }
+      return this.selected_option_count;
+    };
+
     AbstractChosen.prototype.choices_click = function(evt) {
       evt.preventDefault();
-      if (!this.results_showing) {
+      this.activate_field();
+      if (!(this.results_showing || this.is_disabled)) {
         return this.results_show();
       }
     };
 
+    AbstractChosen.prototype.keydown_checker = function(evt) {
+      var ref, stroke;
+      stroke = (ref = evt.which) != null ? ref : evt.keyCode;
+      this.search_field_scale();
+      if (stroke !== 8 && this.pending_backstroke) {
+        this.clear_backstroke();
+      }
+      switch (stroke) {
+        case 8:
+          this.backstroke_length = this.get_search_field_value().length;
+          break;
+        case 9:
+          if (this.results_showing && !this.is_multiple) {
+            this.result_select(evt);
+          }
+          this.mouse_on_container = false;
+          break;
+        case 13:
+          if (this.results_showing) {
+            evt.preventDefault();
+          }
+          break;
+        case 27:
+          if (this.results_showing) {
+            evt.preventDefault();
+          }
+          break;
+        case 32:
+          if (this.disable_search) {
+            evt.preventDefault();
+          }
+          break;
+        case 38:
+          evt.preventDefault();
+          this.keyup_arrow();
+          break;
+        case 40:
+          evt.preventDefault();
+          this.keydown_arrow();
+          break;
+      }
+    };
+
     AbstractChosen.prototype.keyup_checker = function(evt) {
-      var stroke, _ref;
-      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+      var ref, stroke;
+      stroke = (ref = evt.which) != null ? ref : evt.keyCode;
       this.search_field_scale();
       switch (stroke) {
         case 8:
-          if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
-            return this.keydown_backstroke();
+          if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {
+            this.keydown_backstroke();
           } else if (!this.pending_backstroke) {
             this.result_clear_highlight();
-            return this.results_search();
+            this.results_search();
           }
           break;
         case 13:
           evt.preventDefault();
           if (this.results_showing) {
-            return this.result_select(evt);
+            this.result_select(evt);
           }
           break;
         case 27:
           if (this.results_showing) {
             this.results_hide();
           }
-          return true;
+          break;
         case 9:
+        case 16:
+        case 17:
+        case 18:
         case 38:
         case 40:
-        case 16:
         case 91:
-        case 17:
           break;
         default:
-          return this.results_search();
+          this.results_search();
+          break;
       }
     };
 
-    AbstractChosen.prototype.generate_field_id = function() {
-      var new_id;
-      new_id = this.generate_random_id();
-      this.form_field.id = new_id;
-      return new_id;
-    };
-
-    AbstractChosen.prototype.generate_random_char = function() {
-      var chars, newchar, rand;
-      chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-      rand = Math.floor(Math.random() * chars.length);
-      return newchar = chars.substring(rand, rand + 1);
+    AbstractChosen.prototype.clipboard_event_checker = function(evt) {
+      if (this.is_disabled) {
+        return;
+      }
+      return setTimeout(((function(_this) {
+        return function() {
+          return _this.results_search();
+        };
+      })(this)), 50);
     };
 
     AbstractChosen.prototype.container_width = function() {
-      var width;
       if (this.options.width != null) {
         return this.options.width;
+      } else {
+        return this.form_field.offsetWidth + "px";
       }
-      width = window.getComputedStyle != null ? parseFloat(window.getComputedStyle(this.form_field).getPropertyValue('width')) : (typeof jQuery !== "undefined" && jQuery !== null) && (this.form_field_jq != null) ? this.form_field_jq.outerWidth() : this.form_field.getWidth();
-      return width + "px";
     };
 
-    AbstractChosen.browser_is_supported = function() {
-      var _ref;
-      if (window.navigator.appName === "Microsoft Internet Explorer") {
-        return (null !== (_ref = document.documentMode) && _ref >= 8);
+    AbstractChosen.prototype.include_option_in_results = function(option) {
+      if (this.is_multiple && (!this.display_selected_options && option.selected)) {
+        return false;
+      }
+      if (!this.display_disabled_options && option.disabled) {
+        return false;
+      }
+      if (option.empty) {
+        return false;
       }
       return true;
     };
 
-    AbstractChosen.default_multiple_text = "Select Some Options";
+    AbstractChosen.prototype.search_results_touchstart = function(evt) {
+      this.touch_started = true;
+      return this.search_results_mouseover(evt);
+    };
 
-    AbstractChosen.default_single_text = "Select an Option";
+    AbstractChosen.prototype.search_results_touchmove = function(evt) {
+      this.touch_started = false;
+      return this.search_results_mouseout(evt);
+    };
 
-    AbstractChosen.default_no_result_text = "No results match";
+    AbstractChosen.prototype.search_results_touchend = function(evt) {
+      if (this.touch_started) {
+        return this.search_results_mouseup(evt);
+      }
+    };
 
-    return AbstractChosen;
+    AbstractChosen.prototype.outerHTML = function(element) {
+      var tmp;
+      if (element.outerHTML) {
+        return element.outerHTML;
+      }
+      tmp = document.createElement("div");
+      tmp.appendChild(element);
+      return tmp.innerHTML;
+    };
 
-  })();
+    AbstractChosen.prototype.get_single_html = function() {
+      return "<a class=\"chosen-single chosen-default\">\n  <span>" + this.default_text + "</span>\n  <div><b></b></div>\n</a>\n<div class=\"chosen-drop\">\n  <div class=\"chosen-search\">\n    <input class=\"chosen-search-input\" type=\"text\" autocomplete=\"off\" />\n  </div>\n  <ul class=\"chosen-results\"></ul>\n</div>";
+    };
 
-  root.AbstractChosen = AbstractChosen;
+    AbstractChosen.prototype.get_multi_html = function() {
+      return "<ul class=\"chosen-choices\">\n  <li class=\"search-field\">\n    <input class=\"chosen-search-input\" type=\"text\" autocomplete=\"off\" value=\"" + this.default_text + "\" />\n  </li>\n</ul>\n<div class=\"chosen-drop\">\n  <ul class=\"chosen-results\"></ul>\n</div>";
+    };
 
-}).call(this);
+    AbstractChosen.prototype.get_no_results_html = function(terms) {
+      return "<li class=\"no-results\">\n  " + this.results_none_found + " <span>" + (this.escape_html(terms)) + "</span>\n</li>";
+    };
 
-/*
-Chosen source: generate output using 'cake build'
-Copyright (c) 2011 by Harvest
-*/
+    AbstractChosen.browser_is_supported = function() {
+      if ("Microsoft Internet Explorer" === window.navigator.appName) {
+        return document.documentMode >= 8;
+      }
+      if (/iP(od|hone)/i.test(window.navigator.userAgent) || /IEMobile/i.test(window.navigator.userAgent) || /Windows Phone/i.test(window.navigator.userAgent) || /BlackBerry/i.test(window.navigator.userAgent) || /BB10/i.test(window.navigator.userAgent) || /Android.*Mobile/i.test(window.navigator.userAgent)) {
+        return false;
+      }
+      return true;
+    };
 
+    AbstractChosen.default_multiple_text = "Select Some Options";
 
-(function() {
-  var $, Chosen, root,
-    __hasProp = {}.hasOwnProperty,
-    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+    AbstractChosen.default_single_text = "Select an Option";
 
-  root = this;
+    AbstractChosen.default_no_result_text = "No results match";
+
+    return AbstractChosen;
+
+  })();
 
   $ = jQuery;
 
@@ -344,18 +623,24 @@ Copyright (c) 2011 by Harvest
         return this;
       }
       return this.each(function(input_field) {
-        var $this;
+        var $this, chosen;
         $this = $(this);
-        if (!$this.hasClass("chzn-done")) {
-          return $this.data('chosen', new Chosen(this, options));
+        chosen = $this.data('chosen');
+        if (options === 'destroy') {
+          if (chosen instanceof Chosen) {
+            chosen.destroy();
+          }
+          return;
+        }
+        if (!(chosen instanceof Chosen)) {
+          $this.data('chosen', new Chosen(this, options));
         }
       });
     }
   });
 
-  Chosen = (function(_super) {
-
-    __extends(Chosen, _super);
+  Chosen = (function(superClass) {
+    extend(Chosen, superClass);
 
     function Chosen() {
       return Chosen.__super__.constructor.apply(this, arguments);
@@ -363,153 +648,233 @@ Copyright (c) 2011 by Harvest
 
     Chosen.prototype.setup = function() {
       this.form_field_jq = $(this.form_field);
-      this.current_selectedIndex = this.form_field.selectedIndex;
-      return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
-    };
-
-    Chosen.prototype.finish_setup = function() {
-      return this.form_field_jq.addClass("chzn-done");
+      return this.current_selectedIndex = this.form_field.selectedIndex;
     };
 
     Chosen.prototype.set_up_html = function() {
       var container_classes, container_props;
-      this.container_id = this.form_field.id.length ? this.form_field.id.replace(/[^\w]/g, '_') : this.generate_field_id();
-      this.container_id += "_chzn";
-      container_classes = ["chzn-container"];
-      container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+      container_classes = ["chosen-container"];
+      container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single"));
       if (this.inherit_select_classes && this.form_field.className) {
         container_classes.push(this.form_field.className);
       }
       if (this.is_rtl) {
-        container_classes.push("chzn-rtl");
+        container_classes.push("chosen-rtl");
       }
       container_props = {
-        'id': this.container_id,
         'class': container_classes.join(' '),
-        'style': "width: " + (this.container_width()) + ";",
         'title': this.form_field.title
       };
+      if (this.form_field.id.length) {
+        container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
+      }
       this.container = $("<div />", container_props);
+      this.container.width(this.container_width());
       if (this.is_multiple) {
-        this.container.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:auto;" /></li></ul><div class="chzn-drop"><ul class="chzn-results"></ul></div>');
+        this.container.html(this.get_multi_html());
       } else {
-        this.container.html('<a href="javascript:void(0)" class="chzn-single chzn-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
+        this.container.html(this.get_single_html());
       }
       this.form_field_jq.hide().after(this.container);
-      this.dropdown = this.container.find('div.chzn-drop').first();
+      this.dropdown = this.container.find('div.chosen-drop').first();
       this.search_field = this.container.find('input').first();
-      this.search_results = this.container.find('ul.chzn-results').first();
+      this.search_results = this.container.find('ul.chosen-results').first();
       this.search_field_scale();
       this.search_no_results = this.container.find('li.no-results').first();
       if (this.is_multiple) {
-        this.search_choices = this.container.find('ul.chzn-choices').first();
+        this.search_choices = this.container.find('ul.chosen-choices').first();
         this.search_container = this.container.find('li.search-field').first();
       } else {
-        this.search_container = this.container.find('div.chzn-search').first();
-        this.selected_item = this.container.find('.chzn-single').first();
+        this.search_container = this.container.find('div.chosen-search').first();
+        this.selected_item = this.container.find('.chosen-single').first();
       }
       this.results_build();
       this.set_tab_index();
-      this.set_label_behavior();
-      return this.form_field_jq.trigger("liszt:ready", {
+      return this.set_label_behavior();
+    };
+
+    Chosen.prototype.on_ready = function() {
+      return this.form_field_jq.trigger("chosen:ready", {
         chosen: this
       });
     };
 
     Chosen.prototype.register_observers = function() {
-      var _this = this;
-      this.container.mousedown(function(evt) {
-        _this.container_mousedown(evt);
-      });
-      this.container.mouseup(function(evt) {
-        _this.container_mouseup(evt);
-      });
-      this.container.mouseenter(function(evt) {
-        _this.mouse_enter(evt);
-      });
-      this.container.mouseleave(function(evt) {
-        _this.mouse_leave(evt);
-      });
-      this.search_results.mouseup(function(evt) {
-        _this.search_results_mouseup(evt);
-      });
-      this.search_results.mouseover(function(evt) {
-        _this.search_results_mouseover(evt);
-      });
-      this.search_results.mouseout(function(evt) {
-        _this.search_results_mouseout(evt);
-      });
-      this.search_results.bind('mousewheel DOMMouseScroll', function(evt) {
-        _this.search_results_mousewheel(evt);
-      });
-      this.form_field_jq.bind("liszt:updated", function(evt) {
-        _this.results_update_field(evt);
-      });
-      this.form_field_jq.bind("liszt:activate", function(evt) {
-        _this.activate_field(evt);
-      });
-      this.form_field_jq.bind("liszt:open", function(evt) {
-        _this.container_mousedown(evt);
-      });
-      this.search_field.blur(function(evt) {
-        _this.input_blur(evt);
-      });
-      this.search_field.keyup(function(evt) {
-        _this.keyup_checker(evt);
-      });
-      this.search_field.keydown(function(evt) {
-        _this.keydown_checker(evt);
-      });
-      this.search_field.focus(function(evt) {
-        _this.input_focus(evt);
-      });
+      this.container.on('touchstart.chosen', (function(_this) {
+        return function(evt) {
+          _this.container_mousedown(evt);
+        };
+      })(this));
+      this.container.on('touchend.chosen', (function(_this) {
+        return function(evt) {
+          _this.container_mouseup(evt);
+        };
+      })(this));
+      this.container.on('mousedown.chosen', (function(_this) {
+        return function(evt) {
+          _this.container_mousedown(evt);
+        };
+      })(this));
+      this.container.on('mouseup.chosen', (function(_this) {
+        return function(evt) {
+          _this.container_mouseup(evt);
+        };
+      })(this));
+      this.container.on('mouseenter.chosen', (function(_this) {
+        return function(evt) {
+          _this.mouse_enter(evt);
+        };
+      })(this));
+      this.container.on('mouseleave.chosen', (function(_this) {
+        return function(evt) {
+          _this.mouse_leave(evt);
+        };
+      })(this));
+      this.search_results.on('mouseup.chosen', (function(_this) {
+        return function(evt) {
+          _this.search_results_mouseup(evt);
+        };
+      })(this));
+      this.search_results.on('mouseover.chosen', (function(_this) {
+        return function(evt) {
+          _this.search_results_mouseover(evt);
+        };
+      })(this));
+      this.search_results.on('mouseout.chosen', (function(_this) {
+        return function(evt) {
+          _this.search_results_mouseout(evt);
+        };
+      })(this));
+      this.search_results.on('mousewheel.chosen DOMMouseScroll.chosen', (function(_this) {
+        return function(evt) {
+          _this.search_results_mousewheel(evt);
+        };
+      })(this));
+      this.search_results.on('touchstart.chosen', (function(_this) {
+        return function(evt) {
+          _this.search_results_touchstart(evt);
+        };
+      })(this));
+      this.search_results.on('touchmove.chosen', (function(_this) {
+        return function(evt) {
+          _this.search_results_touchmove(evt);
+        };
+      })(this));
+      this.search_results.on('touchend.chosen', (function(_this) {
+        return function(evt) {
+          _this.search_results_touchend(evt);
+        };
+      })(this));
+      this.form_field_jq.on("chosen:updated.chosen", (function(_this) {
+        return function(evt) {
+          _this.results_update_field(evt);
+        };
+      })(this));
+      this.form_field_jq.on("chosen:activate.chosen", (function(_this) {
+        return function(evt) {
+          _this.activate_field(evt);
+        };
+      })(this));
+      this.form_field_jq.on("chosen:open.chosen", (function(_this) {
+        return function(evt) {
+          _this.container_mousedown(evt);
+        };
+      })(this));
+      this.form_field_jq.on("chosen:close.chosen", (function(_this) {
+        return function(evt) {
+          _this.close_field(evt);
+        };
+      })(this));
+      this.search_field.on('blur.chosen', (function(_this) {
+        return function(evt) {
+          _this.input_blur(evt);
+        };
+      })(this));
+      this.search_field.on('keyup.chosen', (function(_this) {
+        return function(evt) {
+          _this.keyup_checker(evt);
+        };
+      })(this));
+      this.search_field.on('keydown.chosen', (function(_this) {
+        return function(evt) {
+          _this.keydown_checker(evt);
+        };
+      })(this));
+      this.search_field.on('focus.chosen', (function(_this) {
+        return function(evt) {
+          _this.input_focus(evt);
+        };
+      })(this));
+      this.search_field.on('cut.chosen', (function(_this) {
+        return function(evt) {
+          _this.clipboard_event_checker(evt);
+        };
+      })(this));
+      this.search_field.on('paste.chosen', (function(_this) {
+        return function(evt) {
+          _this.clipboard_event_checker(evt);
+        };
+      })(this));
       if (this.is_multiple) {
-        return this.search_choices.click(function(evt) {
-          _this.choices_click(evt);
-        });
+        return this.search_choices.on('click.chosen', (function(_this) {
+          return function(evt) {
+            _this.choices_click(evt);
+          };
+        })(this));
       } else {
-        return this.container.click(function(evt) {
+        return this.container.on('click.chosen', function(evt) {
           evt.preventDefault();
         });
       }
     };
 
+    Chosen.prototype.destroy = function() {
+      $(this.container[0].ownerDocument).off('click.chosen', this.click_test_action);
+      if (this.form_field_label.length > 0) {
+        this.form_field_label.off('click.chosen');
+      }
+      if (this.search_field[0].tabIndex) {
+        this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;
+      }
+      this.container.remove();
+      this.form_field_jq.removeData('chosen');
+      return this.form_field_jq.show();
+    };
+
     Chosen.prototype.search_field_disabled = function() {
-      this.is_disabled = this.form_field_jq[0].disabled;
+      this.is_disabled = this.form_field.disabled || this.form_field_jq.parents('fieldset').is(':disabled');
+      this.container.toggleClass('chosen-disabled', this.is_disabled);
+      this.search_field[0].disabled = this.is_disabled;
+      if (!this.is_multiple) {
+        this.selected_item.off('focus.chosen', this.activate_field);
+      }
       if (this.is_disabled) {
-        this.container.addClass('chzn-disabled');
-        this.search_field[0].disabled = true;
-        if (!this.is_multiple) {
-          this.selected_item.unbind("focus", this.activate_action);
-        }
         return this.close_field();
-      } else {
-        this.container.removeClass('chzn-disabled');
-        this.search_field[0].disabled = false;
-        if (!this.is_multiple) {
-          return this.selected_item.bind("focus", this.activate_action);
-        }
+      } else if (!this.is_multiple) {
+        return this.selected_item.on('focus.chosen', this.activate_field);
       }
     };
 
     Chosen.prototype.container_mousedown = function(evt) {
-      if (!this.is_disabled) {
-        if (evt && evt.type === "mousedown" && !this.results_showing) {
-          evt.preventDefault();
-        }
-        if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
-          if (!this.active_field) {
-            if (this.is_multiple) {
-              this.search_field.val("");
-            }
-            $(document).click(this.click_test_action);
-            this.results_show();
-          } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) {
-            evt.preventDefault();
-            this.results_toggle();
+      var ref;
+      if (this.is_disabled) {
+        return;
+      }
+      if (evt && ((ref = evt.type) === 'mousedown' || ref === 'touchstart') && !this.results_showing) {
+        evt.preventDefault();
+      }
+      if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
+        if (!this.active_field) {
+          if (this.is_multiple) {
+            this.search_field.val("");
           }
-          return this.activate_field();
+          $(this.container[0].ownerDocument).on('click.chosen', this.click_test_action);
+          this.results_show();
+        } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) {
+          evt.preventDefault();
+          this.results_toggle();
         }
+        return this.activate_field();
       }
     };
 
@@ -520,8 +885,10 @@ Copyright (c) 2011 by Harvest
     };
 
     Chosen.prototype.search_results_mousewheel = function(evt) {
-      var delta, _ref, _ref1;
-      delta = -((_ref = evt.originalEvent) != null ? _ref.wheelDelta : void 0) || ((_ref1 = evt.originialEvent) != null ? _ref1.detail : void 0);
+      var delta;
+      if (evt.originalEvent) {
+        delta = evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail;
+      }
       if (delta != null) {
         evt.preventDefault();
         if (evt.type === 'DOMMouseScroll') {
@@ -532,31 +899,36 @@ Copyright (c) 2011 by Harvest
     };
 
     Chosen.prototype.blur_test = function(evt) {
-      if (!this.active_field && this.container.hasClass("chzn-container-active")) {
+      if (!this.active_field && this.container.hasClass("chosen-container-active")) {
         return this.close_field();
       }
     };
 
     Chosen.prototype.close_field = function() {
-      $(document).unbind("click", this.click_test_action);
+      $(this.container[0].ownerDocument).off("click.chosen", this.click_test_action);
       this.active_field = false;
       this.results_hide();
-      this.container.removeClass("chzn-container-active");
-      this.winnow_results_clear();
+      this.container.removeClass("chosen-container-active");
       this.clear_backstroke();
       this.show_search_field_default();
-      return this.search_field_scale();
+      this.search_field_scale();
+      return this.search_field.blur();
     };
 
     Chosen.prototype.activate_field = function() {
-      this.container.addClass("chzn-container-active");
+      if (this.is_disabled) {
+        return;
+      }
+      this.container.addClass("chosen-container-active");
       this.active_field = true;
       this.search_field.val(this.search_field.val());
       return this.search_field.focus();
     };
 
     Chosen.prototype.test_active_click = function(evt) {
-      if ($(evt.target).parents('#' + this.container_id).length) {
+      var active_container;
+      active_container = $(evt.target).closest('.chosen-container');
+      if (active_container.length && this.container[0] === active_container[0]) {
         return this.active_field = true;
       } else {
         return this.close_field();
@@ -564,54 +936,30 @@ Copyright (c) 2011 by Harvest
     };
 
     Chosen.prototype.results_build = function() {
-      var content, data, _i, _len, _ref;
       this.parsing = true;
-      this.results_data = root.SelectParser.select_to_array(this.form_field);
-      if (this.is_multiple && this.choices > 0) {
+      this.selected_option_count = null;
+      this.results_data = SelectParser.select_to_array(this.form_field);
+      if (this.is_multiple) {
         this.search_choices.find("li.search-choice").remove();
-        this.choices = 0;
       } else if (!this.is_multiple) {
-        this.selected_item.addClass("chzn-default").find("span").text(this.default_text);
+        this.single_set_selected_text();
         if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
-          this.container.addClass("chzn-container-single-nosearch");
+          this.search_field[0].readOnly = true;
+          this.container.addClass("chosen-container-single-nosearch");
         } else {
-          this.container.removeClass("chzn-container-single-nosearch");
-        }
-      }
-      content = '';
-      _ref = this.results_data;
-      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-        data = _ref[_i];
-        if (data.group) {
-          content += this.result_add_group(data);
-        } else if (!data.empty) {
-          content += this.result_add_option(data);
-          if (data.selected && this.is_multiple) {
-            this.choice_build(data);
-          } else if (data.selected && !this.is_multiple) {
-            this.selected_item.removeClass("chzn-default").find("span").text(data.text);
-            if (this.allow_single_deselect) {
-              this.single_deselect_control_build();
-            }
-          }
+          this.search_field[0].readOnly = false;
+          this.container.removeClass("chosen-container-single-nosearch");
         }
       }
+      this.update_results_content(this.results_option_build({
+        first: true
+      }));
       this.search_field_disabled();
       this.show_search_field_default();
       this.search_field_scale();
-      this.search_results.html(content);
       return this.parsing = false;
     };
 
-    Chosen.prototype.result_add_group = function(group) {
-      if (!group.disabled) {
-        group.dom_id = this.container_id + "_g_" + group.array_index;
-        return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
-      } else {
-        return "";
-      }
-    };
-
     Chosen.prototype.result_do_highlight = function(el) {
       var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
       if (el.length) {
@@ -639,61 +987,58 @@ Copyright (c) 2011 by Harvest
     };
 
     Chosen.prototype.results_show = function() {
-      if (this.result_single_selected != null) {
-        this.result_do_highlight(this.result_single_selected);
-      } else if (this.is_multiple && this.max_selected_options <= this.choices) {
-        this.form_field_jq.trigger("liszt:maxselected", {
+      if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
+        this.form_field_jq.trigger("chosen:maxselected", {
           chosen: this
         });
         return false;
       }
-      this.container.addClass("chzn-with-drop");
-      this.form_field_jq.trigger("liszt:showing_dropdown", {
-        chosen: this
-      });
+      this.container.addClass("chosen-with-drop");
       this.results_showing = true;
       this.search_field.focus();
-      this.search_field.val(this.search_field.val());
-      return this.winnow_results();
+      this.search_field.val(this.get_search_field_value());
+      this.winnow_results();
+      return this.form_field_jq.trigger("chosen:showing_dropdown", {
+        chosen: this
+      });
+    };
+
+    Chosen.prototype.update_results_content = function(content) {
+      return this.search_results.html(content);
     };
 
     Chosen.prototype.results_hide = function() {
-      this.result_clear_highlight();
-      this.container.removeClass("chzn-with-drop");
-      this.form_field_jq.trigger("liszt:hiding_dropdown", {
-        chosen: this
-      });
+      if (this.results_showing) {
+        this.result_clear_highlight();
+        this.container.removeClass("chosen-with-drop");
+        this.form_field_jq.trigger("chosen:hiding_dropdown", {
+          chosen: this
+        });
+      }
       return this.results_showing = false;
     };
 
     Chosen.prototype.set_tab_index = function(el) {
       var ti;
-      if (this.form_field_jq.attr("tabindex")) {
-        ti = this.form_field_jq.attr("tabindex");
-        this.form_field_jq.attr("tabindex", -1);
-        return this.search_field.attr("tabindex", ti);
+      if (this.form_field.tabIndex) {
+        ti = this.form_field.tabIndex;
+        this.form_field.tabIndex = -1;
+        return this.search_field[0].tabIndex = ti;
       }
     };
 
     Chosen.prototype.set_label_behavior = function() {
-      var _this = this;
       this.form_field_label = this.form_field_jq.parents("label");
       if (!this.form_field_label.length && this.form_field.id.length) {
-        this.form_field_label = $("label[for=" + this.form_field.id + "]");
+        this.form_field_label = $("label[for='" + this.form_field.id + "']");
       }
       if (this.form_field_label.length > 0) {
-        return this.form_field_label.click(function(evt) {
-          if (_this.is_multiple) {
-            return _this.container_mousedown(evt);
-          } else {
-            return _this.activate_field();
-          }
-        });
+        return this.form_field_label.on('click.chosen', this.label_click_handler);
       }
     };
 
     Chosen.prototype.show_search_field_default = function() {
-      if (this.is_multiple && this.choices < 1 && !this.active_field) {
+      if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {
         this.search_field.val(this.default_text);
         return this.search_field.addClass("default");
       } else {
@@ -721,32 +1066,31 @@ Copyright (c) 2011 by Harvest
     };
 
     Chosen.prototype.search_results_mouseout = function(evt) {
-      if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
+      if ($(evt.target).hasClass("active-result") || $(evt.target).parents('.active-result').first()) {
         return this.result_clear_highlight();
       }
     };
 
     Chosen.prototype.choice_build = function(item) {
-      var choice_id, html, link,
-        _this = this;
-      if (this.is_multiple && this.max_selected_options <= this.choices) {
-        this.form_field_jq.trigger("liszt:maxselected", {
-          chosen: this
-        });
-        return false;
-      }
-      choice_id = this.container_id + "_c_" + item.array_index;
-      this.choices += 1;
+      var choice, close_link;
+      choice = $('<li />', {
+        "class": "search-choice"
+      }).html("<span>" + (this.choice_label(item)) + "</span>");
       if (item.disabled) {
-        html = '<li class="search-choice search-choice-disabled" id="' + choice_id + '"><span>' + item.html + '</span></li>';
+        choice.addClass('search-choice-disabled');
       } else {
-        html = '<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>';
+        close_link = $('<a />', {
+          "class": 'search-choice-close',
+          'data-option-array-index': item.array_index
+        });
+        close_link.on('click.chosen', (function(_this) {
+          return function(evt) {
+            return _this.choice_destroy_link_click(evt);
+          };
+        })(this));
+        choice.append(close_link);
       }
-      this.search_container.before(html);
-      link = $('#' + choice_id).find("a").first();
-      return link.click(function(evt) {
-        return _this.choice_destroy_link_click(evt);
-      });
+      return this.search_container.before(choice);
     };
 
     Chosen.prototype.choice_destroy_link_click = function(evt) {
@@ -758,10 +1102,13 @@ Copyright (c) 2011 by Harvest
     };
 
     Chosen.prototype.choice_destroy = function(link) {
-      if (this.result_deselect(link.attr("rel"))) {
-        this.choices -= 1;
-        this.show_search_field_default();
-        if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
+      if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) {
+        if (this.active_field) {
+          this.search_field.focus();
+        } else {
+          this.show_search_field_default();
+        }
+        if (this.is_multiple && this.choices_count() > 0 && this.get_search_field_value().length < 1) {
           this.results_hide();
         }
         link.parents('li').first().remove();
@@ -770,14 +1117,12 @@ Copyright (c) 2011 by Harvest
     };
 
     Chosen.prototype.results_reset = function() {
+      this.reset_single_select_options();
       this.form_field.options[0].selected = true;
-      this.selected_item.find("span").text(this.default_text);
-      if (!this.is_multiple) {
-        this.selected_item.addClass("chzn-default");
-      }
+      this.single_set_selected_text();
       this.show_search_field_default();
       this.results_reset_cleanup();
-      this.form_field_jq.trigger("change");
+      this.trigger_form_field_change();
       if (this.active_field) {
         return this.results_hide();
       }
@@ -789,64 +1134,74 @@ Copyright (c) 2011 by Harvest
     };
 
     Chosen.prototype.result_select = function(evt) {
-      var high, high_id, item, position;
+      var high, item;
       if (this.result_highlight) {
         high = this.result_highlight;
-        high_id = high.attr("id");
         this.result_clear_highlight();
+        if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
+          this.form_field_jq.trigger("chosen:maxselected", {
+            chosen: this
+          });
+          return false;
+        }
         if (this.is_multiple) {
-          this.result_deactivate(high);
+          high.removeClass("active-result");
         } else {
-          this.search_results.find(".result-selected").removeClass("result-selected");
-          this.result_single_selected = high;
-          this.selected_item.removeClass("chzn-default");
+          this.reset_single_select_options();
         }
         high.addClass("result-selected");
-        position = high_id.substr(high_id.lastIndexOf("_") + 1);
-        item = this.results_data[position];
+        item = this.results_data[high[0].getAttribute("data-option-array-index")];
         item.selected = true;
         this.form_field.options[item.options_index].selected = true;
+        this.selected_option_count = null;
+        this.search_field.val("");
         if (this.is_multiple) {
           this.choice_build(item);
         } else {
-          this.selected_item.find("span").first().text(item.text);
-          if (this.allow_single_deselect) {
-            this.single_deselect_control_build();
-          }
+          this.single_set_selected_text(this.choice_label(item));
         }
-        if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
+        if (this.is_multiple && (!this.hide_results_on_select || (evt.metaKey || evt.ctrlKey))) {
+          this.winnow_results();
+        } else {
           this.results_hide();
+          this.show_search_field_default();
         }
-        this.search_field.val("");
         if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
-          this.form_field_jq.trigger("change", {
-            'selected': this.form_field.options[item.options_index].value
+          this.trigger_form_field_change({
+            selected: this.form_field.options[item.options_index].value
           });
         }
         this.current_selectedIndex = this.form_field.selectedIndex;
+        evt.preventDefault();
         return this.search_field_scale();
       }
     };
 
-    Chosen.prototype.result_activate = function(el) {
-      return el.addClass("active-result");
-    };
-
-    Chosen.prototype.result_deactivate = function(el) {
-      return el.removeClass("active-result");
+    Chosen.prototype.single_set_selected_text = function(text) {
+      if (text == null) {
+        text = this.default_text;
+      }
+      if (text === this.default_text) {
+        this.selected_item.addClass("chosen-default");
+      } else {
+        this.single_deselect_control_build();
+        this.selected_item.removeClass("chosen-default");
+      }
+      return this.selected_item.find("span").html(text);
     };
 
     Chosen.prototype.result_deselect = function(pos) {
-      var result, result_data;
+      var result_data;
       result_data = this.results_data[pos];
       if (!this.form_field.options[result_data.options_index].disabled) {
         result_data.selected = false;
         this.form_field.options[result_data.options_index].selected = false;
-        result = $("#" + this.container_id + "_o_" + pos);
-        result.removeClass("result-selected").addClass("active-result").show();
+        this.selected_option_count = null;
         this.result_clear_highlight();
-        this.winnow_results();
-        this.form_field_jq.trigger("change", {
+        if (this.results_showing) {
+          this.winnow_results();
+        }
+        this.trigger_form_field_change({
           deselected: this.form_field.options[result_data.options_index].value
         });
         this.search_field_scale();
@@ -857,108 +1212,43 @@ Copyright (c) 2011 by Harvest
     };
 
     Chosen.prototype.single_deselect_control_build = function() {
-      if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) {
-        return this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
+      if (!this.allow_single_deselect) {
+        return;
+      }
+      if (!this.selected_item.find("abbr").length) {
+        this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
       }
+      return this.selected_item.addClass("chosen-single-with-deselect");
     };
 
-    Chosen.prototype.winnow_results = function() {
-      var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref;
-      this.no_results_clear();
-      results = 0;
-      searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
-      regexAnchor = this.search_contains ? "" : "^";
-      regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
-      zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
-      _ref = this.results_data;
-      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-        option = _ref[_i];
-        if (!option.disabled && !option.empty) {
-          if (option.group) {
-            $('#' + option.dom_id).css('display', 'none');
-          } else if (!(this.is_multiple && option.selected)) {
-            found = false;
-            result_id = option.dom_id;
-            result = $("#" + result_id);
-            if (regex.test(option.html)) {
-              found = true;
-              results += 1;
-            } else if (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) {
-              parts = option.html.replace(/\[|\]/g, "").split(" ");
-              if (parts.length) {
-                for (_j = 0, _len1 = parts.length; _j < _len1; _j++) {
-                  part = parts[_j];
-                  if (regex.test(part)) {
-                    found = true;
-                    results += 1;
-                  }
-                }
-              }
-            }
-            if (found) {
-              if (searchText.length) {
-                startpos = option.html.search(zregex);
-                text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
-                text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
-              } else {
-                text = option.html;
-              }
-              result.html(text);
-              this.result_activate(result);
-              if (option.group_array_index != null) {
-                $("#" + this.results_data[option.group_array_index].dom_id).css('display', 'list-item');
-              }
-            } else {
-              if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
-                this.result_clear_highlight();
-              }
-              this.result_deactivate(result);
-            }
-          }
-        }
-      }
-      if (results < 1 && searchText.length) {
-        return this.no_results(searchText);
-      } else {
-        return this.winnow_results_set_highlight();
-      }
+    Chosen.prototype.get_search_field_value = function() {
+      return this.search_field.val();
     };
 
-    Chosen.prototype.winnow_results_clear = function() {
-      var li, lis, _i, _len, _results;
-      this.search_field.val("");
-      lis = this.search_results.find("li");
-      _results = [];
-      for (_i = 0, _len = lis.length; _i < _len; _i++) {
-        li = lis[_i];
-        li = $(li);
-        if (li.hasClass("group-result")) {
-          _results.push(li.css('display', 'auto'));
-        } else if (!this.is_multiple || !li.hasClass("result-selected")) {
-          _results.push(this.result_activate(li));
-        } else {
-          _results.push(void 0);
-        }
-      }
-      return _results;
+    Chosen.prototype.get_search_text = function() {
+      return $.trim(this.get_search_field_value());
+    };
+
+    Chosen.prototype.escape_html = function(text) {
+      return $('<div/>').text(text).html();
     };
 
     Chosen.prototype.winnow_results_set_highlight = function() {
       var do_high, selected_results;
-      if (!this.result_highlight) {
-        selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
-        do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
-        if (do_high != null) {
-          return this.result_do_highlight(do_high);
-        }
+      selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
+      do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
+      if (do_high != null) {
+        return this.result_do_highlight(do_high);
       }
     };
 
     Chosen.prototype.no_results = function(terms) {
       var no_results_html;
-      no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
-      no_results_html.find("span").first().html(terms);
-      return this.search_results.append(no_results_html);
+      no_results_html = this.get_no_results_html(terms);
+      this.search_results.append(no_results_html);
+      return this.form_field_jq.trigger("chosen:no_results", {
+        chosen: this
+      });
     };
 
     Chosen.prototype.no_results_clear = function() {
@@ -966,19 +1256,13 @@ Copyright (c) 2011 by Harvest
     };
 
     Chosen.prototype.keydown_arrow = function() {
-      var first_active, next_sib;
-      if (!this.result_highlight) {
-        first_active = this.search_results.find("li.active-result").first();
-        if (first_active) {
-          this.result_do_highlight($(first_active));
-        }
-      } else if (this.results_showing) {
+      var next_sib;
+      if (this.results_showing && this.result_highlight) {
         next_sib = this.result_highlight.nextAll("li.active-result").first();
         if (next_sib) {
-          this.result_do_highlight(next_sib);
+          return this.result_do_highlight(next_sib);
         }
-      }
-      if (!this.results_showing) {
+      } else {
         return this.results_show();
       }
     };
@@ -992,7 +1276,7 @@ Copyright (c) 2011 by Harvest
         if (prev_sibs.length) {
           return this.result_do_highlight(prev_sibs.first());
         } else {
-          if (this.choices > 0) {
+          if (this.choices_count() > 0) {
             this.results_hide();
           }
           return this.result_clear_highlight();
@@ -1025,79 +1309,41 @@ Copyright (c) 2011 by Harvest
       return this.pending_backstroke = null;
     };
 
-    Chosen.prototype.keydown_checker = function(evt) {
-      var stroke, _ref;
-      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
-      this.search_field_scale();
-      if (stroke !== 8 && this.pending_backstroke) {
-        this.clear_backstroke();
+    Chosen.prototype.search_field_scale = function() {
+      var div, i, len, style, style_block, styles, width;
+      if (!this.is_multiple) {
+        return;
       }
-      switch (stroke) {
-        case 8:
-          this.backstroke_length = this.search_field.val().length;
-          break;
-        case 9:
-          if (this.results_showing && !this.is_multiple) {
-            this.result_select(evt);
-          }
-          this.mouse_on_container = false;
-          break;
-        case 13:
-          evt.preventDefault();
-          break;
-        case 38:
-          evt.preventDefault();
-          this.keyup_arrow();
-          break;
-        case 40:
-          this.keydown_arrow();
-          break;
+      style_block = {
+        position: 'absolute',
+        left: '-1000px',
+        top: '-1000px',
+        display: 'none',
+        whiteSpace: 'pre'
+      };
+      styles = ['fontSize', 'fontStyle', 'fontWeight', 'fontFamily', 'lineHeight', 'textTransform', 'letterSpacing'];
+      for (i = 0, len = styles.length; i < len; i++) {
+        style = styles[i];
+        style_block[style] = this.search_field.css(style);
       }
-    };
-
-    Chosen.prototype.search_field_scale = function() {
-      var div, h, style, style_block, styles, w, _i, _len;
-      if (this.is_multiple) {
-        h = 0;
-        w = 0;
-        style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
-        styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
-        for (_i = 0, _len = styles.length; _i < _len; _i++) {
-          style = styles[_i];
-          style_block += style + ":" + this.search_field.css(style) + ";";
-        }
-        div = $('<div />', {
-          'style': style_block
-        });
-        div.text(this.search_field.val());
-        $('body').append(div);
-        w = div.width() + 25;
-        div.remove();
-        if (!this.f_width) {
-          this.f_width = this.container.outerWidth();
-        }
-        if (w > this.f_width - 10) {
-          w = this.f_width - 10;
-        }
-        return this.search_field.css({
-          'width': w + 'px'
-        });
+      div = $('<div />').css(style_block);
+      div.text(this.get_search_field_value());
+      $('body').append(div);
+      width = div.width() + 25;
+      div.remove();
+      if (this.container.is(':visible')) {
+        width = Math.min(this.container.outerWidth() - 10, width);
       }
+      return this.search_field.width(width);
     };
 
-    Chosen.prototype.generate_random_id = function() {
-      var string;
-      string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();
-      while ($("#" + string).length > 0) {
-        string += this.generate_random_char();
-      }
-      return string;
+    Chosen.prototype.trigger_form_field_change = function(extra) {
+      this.form_field_jq.trigger("input", extra);
+      return this.form_field_jq.trigger("change", extra);
     };
 
     return Chosen;
 
   })(AbstractChosen);
 
-  root.Chosen = Chosen;
-
 }).call(this);
index 11f472e..ce24b0d 100644 (file)
@@ -2,18 +2,20 @@
 
 /* Table Sorting */
 
-table.jquery-tablesorter th.headerSort {
-       .background-image-svg( 'images/sort_both.svg', 'images/sort_both.png' );
-       cursor: pointer;
-       background-repeat: no-repeat;
-       background-position: center right;
-       padding-right: 21px;
-}
+table.jquery-tablesorter {
+       th.headerSort {
+               .background-image-svg( 'images/sort_both.svg', 'images/sort_both.png' );
+               cursor: pointer;
+               background-repeat: no-repeat;
+               background-position: center right;
+               padding-right: 21px;
+       }
 
-table.jquery-tablesorter th.headerSortUp {
-       .background-image-svg( 'images/sort_up.svg', 'images/sort_up.png' );
-}
+       th.headerSortUp {
+               .background-image-svg( 'images/sort_up.svg', 'images/sort_up.png' );
+       }
 
-table.jquery-tablesorter th.headerSortDown {
-       .background-image-svg( 'images/sort_down.svg', 'images/sort_down.png' );
+       th.headerSortDown {
+               .background-image-svg( 'images/sort_down.svg', 'images/sort_down.png' );
+       }
 }
index 1d578e4..e4443f6 100644 (file)
        .editOptions {
                border-radius: 0 0 2px 2px;
        }
+
+       .editButtons .oo-ui-buttonInputWidget,
+       .cancelLink,
+       .editHelp {
+               margin-top: 0.5em;
+       }
+
+       .cancelLink,
+       .editHelp {
+               display: inline-block;
+               vertical-align: middle;
+       }
+
+       // FIXME: Remove CSS magic together with DOM element in T183672
+       .mw-editButtons-pipe-separator {
+               display: inline-block;
+               padding-top: 0.625em;
+               padding-bottom: 0.546875em;
+               line-height: 1.172em;
+               vertical-align: middle;
+       }
 }
index f0a86ff..1c9294c 100644 (file)
                        "◌ֿ",
                        "ֿ"
                ],
+               [
+                       "◌ֽ",
+                       "ֽ"
+               ],
                [
                        "◌׀",
                        "׀"
index f4cdae3..bb29b36 100644 (file)
@@ -34,6 +34,7 @@
         * @cfg {string} [whatsThis.body] The body of the whatsThis popup message
         * @cfg {string} [whatsThis.url] The url for the link in the whatsThis popup message
         * @cfg {string} [whatsThis.linkMessage] The text for the link in the whatsThis popup message
+        * @cfg {boolean} [visible=true] The visibility of the group
         */
        mw.rcfilters.dm.FilterGroup = function MwRcfiltersDmFilterGroup( name, config ) {
                config = config || {};
@@ -52,6 +53,7 @@
                this.numericRange = config.range;
                this.separator = config.separator || '|';
                this.labelPrefixKey = config.labelPrefixKey;
+               this.visible = config.visible === undefined ? true : !!config.visible;
 
                this.currSelected = null;
                this.active = !!config.active;
 
                return value;
        };
+
+       /**
+        * Toggle the visibility of this group
+        *
+        * @param {boolean} [isVisible] Item is visible
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.toggleVisible = function ( isVisible ) {
+               isVisible = isVisible === undefined ? !this.visible : isVisible;
+
+               if ( this.visible !== isVisible ) {
+                       this.visible = isVisible;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Check whether the group is visible
+        *
+        * @return {boolean} Group is visible
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.isVisible = function () {
+               return this.visible;
+       };
+
+       /**
+        * Set the visibility of the items under this group by the given items array
+        *
+        * @param {mw.rcfilters.dm.ItemModel[]} visibleItems An array of visible items
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.setVisibleItems = function ( visibleItems ) {
+               this.getItems().forEach( function ( itemModel ) {
+                       itemModel.toggleVisible( visibleItems.indexOf( itemModel ) !== -1 );
+               } );
+       };
 }( mediaWiki ) );
index 4e2079d..682a937 100644 (file)
@@ -12,6 +12,7 @@
         *  selected, makes inactive.
         * @cfg {string[]} [subset] Defining the names of filters that are a subset of this filter
         * @cfg {Object} [conflicts] Defines the conflicts for this filter
+        * @cfg {boolean} [visible=true] The visibility of the group
         */
        mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( param, groupModel, config ) {
                config = config || {};
@@ -29,6 +30,7 @@
                this.subset = config.subset || [];
                this.conflicts = config.conflicts || {};
                this.superset = [];
+               this.visible = config.visible === undefined ? true : !!config.visible;
 
                // Interaction states
                this.included = false;
                        this.emit( 'update' );
                }
        };
+
+       /**
+        * Toggle the visibility of this item
+        *
+        * @param {boolean} [isVisible] Item is visible
+        */
+       mw.rcfilters.dm.FilterItem.prototype.toggleVisible = function ( isVisible ) {
+               isVisible = isVisible === undefined ? !this.visible : !!isVisible;
+
+               if ( this.visible !== isVisible ) {
+                       this.visible = isVisible;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Check whether the item is visible
+        *
+        * @return {boolean} Item is visible
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isVisible = function () {
+               return this.visible;
+       };
+
 }( mediaWiki ) );
index 8d22c23..bbc1d7e 100644 (file)
@@ -20,6 +20,7 @@
 
                this.views = {};
                this.currentView = 'default';
+               this.searchQuery = null;
 
                // Events
                this.aggregate( { update: 'filterItemUpdate' } );
                        }
                } );
 
-               this.currentView = 'default';
+               this.setSearch( '' );
 
                this.updateHighlightedState();
 
 
                $.each( this.groups, function ( name, model ) {
                        if ( model.isSticky() ) {
-                               $.extend( true, result, model.getDefaultParams() );
+                               $.extend( true, result, model.getParamRepresentation() );
                        }
                } );
 
                return allSelected;
        };
 
-       /**
-        * Switch the current view
-        *
-        * @param {string} view View name
-        * @fires update
-        */
-       mw.rcfilters.dm.FiltersViewModel.prototype.switchView = function ( view ) {
-               if ( this.views[ view ] && this.currentView !== view ) {
-                       this.currentView = view;
-                       this.emit( 'update' );
-               }
-       };
-
        /**
         * Get the current view
         *
                return result;
        };
 
+       /**
+        * Return a version of the given string that is without any
+        * view triggers.
+        *
+        * @param {string} str Given string
+        * @return {string} Result
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.removeViewTriggers = function ( str ) {
+               if ( this.getViewFromString( str ) !== 'default' ) {
+                       str = str.substr( 1 );
+               }
+
+               return str;
+       };
+
+       /**
+        * Get the view from the given string by a trigger, if it exists
+        *
+        * @param {string} str Given string
+        * @return {string} View name
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getViewFromString = function ( str ) {
+               return this.getViewByTrigger( str.substr( 0, 1 ) );
+       };
+
+       /**
+        * Set the current search for the system.
+        * This also dictates what items and groups are visible according
+        * to the search in #findMatches
+        *
+        * @param {string} searchQuery Search query, including triggers
+        * @fires searchChange
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.setSearch = function ( searchQuery ) {
+               var visibleGroups, visibleGroupNames;
+
+               if ( this.searchQuery !== searchQuery ) {
+                       // Check if the view changed
+                       this.switchView( this.getViewFromString( searchQuery ) );
+
+                       visibleGroups = this.findMatches( searchQuery );
+                       visibleGroupNames = Object.keys( visibleGroups );
+
+                       // Update visibility of items and groups
+                       $.each( this.getFilterGroups(), function ( groupName, groupModel ) {
+                               // Check if the group is visible at all
+                               groupModel.toggleVisible( visibleGroupNames.indexOf( groupName ) !== -1 );
+                               groupModel.setVisibleItems( visibleGroups[ groupName ] || [] );
+                       } );
+
+                       this.searchQuery = searchQuery;
+                       this.emit( 'searchChange', this.searchQuery );
+               }
+       };
+
+       /**
+        * Get the current search
+        *
+        * @return {string} Current search query
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getSearch = function () {
+               return this.searchQuery;
+       };
+
+       /**
+        * Switch the current view
+        *
+        * @private
+        * @param {string} view View name
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.switchView = function ( view ) {
+               if ( this.views[ view ] && this.currentView !== view ) {
+                       this.currentView = view;
+               }
+       };
+
        /**
         * Toggle the highlight feature on and off.
         * Propagate the change to filter items.
                this.getItemByName( filterName ).clearHighlightColor();
        };
 
-       /**
-        * Return a version of the given string that is without any
-        * view triggers.
-        *
-        * @param {string} str Given string
-        * @return {string} Result
-        */
-       mw.rcfilters.dm.FiltersViewModel.prototype.removeViewTriggers = function ( str ) {
-               if ( this.getViewByTrigger( str.substr( 0, 1 ) ) !== 'default' ) {
-                       str = str.substr( 1 );
-               }
-
-               return str;
-       };
 }( mediaWiki, jQuery ) );
index 79546b4..cec570c 100644 (file)
                } );
        };
 
-       /**
-        * Switch the view of the filters model
-        *
-        * @param {string} view Requested view
-        */
-       mw.rcfilters.Controller.prototype.switchView = function ( view ) {
-               this.filtersModel.switchView( view );
-       };
-
        /**
         * Reset to default filters
         */
                        this.updateChangesList( null, 'markSeen' );
                }.bind( this ) );
        };
+
+       /**
+        * Set the current search for the system.
+        *
+        * @param {string} searchQuery Search query, including triggers
+        */
+       mw.rcfilters.Controller.prototype.setSearch = function ( searchQuery ) {
+               this.filtersModel.setSearch( searchQuery );
+       };
+
+       /**
+        * Switch the view by changing the search query trigger
+        * without changing the search term
+        *
+        * @param  {string} view View to change to
+        */
+       mw.rcfilters.Controller.prototype.switchView = function ( view ) {
+               this.setSearch(
+                       this.filtersModel.getViewTrigger( view ) +
+                       this.filtersModel.removeViewTriggers( this.filtersModel.getSearch() )
+               );
+       };
+
+       /**
+        * Reset the search for a specific view. This means we null the search query
+        * and replace it with the relevant trigger for the requested view
+        *
+        * @param  {string} [view='default'] View to change to
+        */
+       mw.rcfilters.Controller.prototype.resetSearchForView = function ( view ) {
+               view = view || 'default';
+
+               this.setSearch(
+                       this.filtersModel.getViewTrigger( view )
+               );
+       };
 }( mediaWiki, jQuery ) );
index 100fa0b..fe8bcf4 100644 (file)
@@ -44,7 +44,7 @@
                                                        type: 'any_value',
                                                        title: '',
                                                        hidden: true,
-                                                       isSticky: false,
+                                                       sticky: true,
                                                        filters: [
                                                                {
                                                                        name: 'target',
@@ -57,7 +57,7 @@
                                                        type: 'boolean',
                                                        title: '',
                                                        hidden: true,
-                                                       isSticky: false,
+                                                       sticky: true,
                                                        filters: [
                                                                {
                                                                        name: 'showlinkedto',
                                conditionalViews
                        );
 
+                       mainWrapperWidget.initFormWidget( specialPage );
+
                        $( 'a.mw-helplink' ).attr(
                                'href',
                                'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review'
index 7dd78e7..0906d68 100644 (file)
        }
 
        &-noresults {
-               display: none;
                padding: 0.5em;
                color: @colorGray5;
-
-               .oo-ui-menuSelectWidget-invisible & {
-                       display: inline-block;
-               }
        }
 
        &-body {
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.vector.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.vector.less
new file mode 100644 (file)
index 0000000..528707b
--- /dev/null
@@ -0,0 +1,4 @@
+// Fix z-index for the overlay in Vector, see T183442
+.mw-rcfilters-ui-overlay {
+       z-index: 101;
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RclTargetPageWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.RclTargetPageWidget.less
new file mode 100644 (file)
index 0000000..2d92e27
--- /dev/null
@@ -0,0 +1,3 @@
+.mw-rcfilters-ui-rclTargetPageWidget {
+       min-width: 400px;
+}
index af01f68..d63f35b 100644 (file)
@@ -1,6 +1,4 @@
 .mw-rcfilters-ui-rclToOrFromWidget {
-       min-width: 340px;
-
        // need to be very specific to override bg-color
        &.oo-ui-dropdownWidget.oo-ui-widget-enabled {
                .oo-ui-dropdownWidget-handle {
index dceb132..c047e83 100644 (file)
                        .connect( this, { click: 'onInvertNamespacesButtonClick' } );
                this.model.connect( this, {
                        highlightChange: 'onModelHighlightChange',
-                       update: 'onModelUpdate',
+                       searchChange: 'onModelSearchChange',
                        initialize: 'onModelInitialize'
                } );
+               this.view = this.model.getCurrentView();
 
                // Initialize
                this.$element
        /**
         * Respond to model update event
         */
-       mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onModelUpdate = function () {
+       mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onModelSearchChange = function () {
                var currentView = this.model.getCurrentView();
 
-               this.setLabel( this.model.getViewTitle( currentView ) );
+               if ( this.view !== currentView ) {
+                       this.setLabel( this.model.getViewTitle( currentView ) );
 
-               this.invertNamespacesButton.toggle( currentView === 'namespaces' );
-               this.backButton.toggle( currentView !== 'default' );
-               this.helpIcon.toggle( currentView === 'tags' );
+                       this.invertNamespacesButton.toggle( currentView === 'namespaces' );
+                       this.backButton.toggle( currentView !== 'default' );
+                       this.helpIcon.toggle( currentView === 'tags' );
+                       this.view = currentView;
+               }
        };
 
        /**
index e053914..20bf73f 100644 (file)
                }
 
                // Events
-               this.model.connect( this, { update: 'onModelUpdate' } );
+               this.model.connect( this, { update: 'updateUiBasedOnState' } );
 
                // Initialize
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget' )
                        .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget-name-' + this.model.getName() )
                        .append( $header );
+               this.updateUiBasedOnState();
        };
 
        /* Initialize */
        /**
         * Respond to model update event
         */
-       mw.rcfilters.ui.FilterMenuSectionOptionWidget.prototype.onModelUpdate = function () {
+       mw.rcfilters.ui.FilterMenuSectionOptionWidget.prototype.updateUiBasedOnState = function () {
                this.$element.toggleClass(
                        'mw-rcfilters-ui-filterMenuSectionOptionWidget-active',
                        this.model.isActive()
                );
+               this.toggle( this.model.isVisible() );
        };
 
        /**
index 91a2d5f..3f47df2 100644 (file)
@@ -41,6 +41,8 @@
                        allowReordering: false,
                        $overlay: this.$overlay,
                        menu: {
+                               // Our filtering is done through the model
+                               filterFromInput: false,
                                hideWhenOutOfView: false,
                                hideOnChoose: false,
                                width: 650,
                this.model.connect( this, {
                        initialize: 'onModelInitialize',
                        update: 'onModelUpdate',
+                       searchChange: 'onModelSearchChange',
                        itemUpdate: 'onModelItemUpdate',
                        highlightChange: 'onModelHighlightChange'
                } );
                this.focus();
        };
 
+       /**
+        * Respond to model search change event
+        *
+        * @param {string} value Search value
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onModelSearchChange = function ( value ) {
+               this.input.setValue( value );
+       };
+
        /**
         * Respond to input change event
         *
         * @param {string} value Value of the input
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onInputChange = function ( value ) {
-               var view;
-
-               value = value.trim();
-
-               view = this.model.getViewByTrigger( value.substr( 0, 1 ) );
-
-               this.controller.switchView( view );
+               this.controller.setSearch( value );
        };
+
        /**
         * Respond to query button click
         */
                        // Clear selection
                        this.selectTag( null );
 
-                       // Clear input if the only thing in the input is the prefix
-                       if (
-                               this.input.getValue().trim() === this.model.getViewTrigger( this.model.getCurrentView() )
-                       ) {
-                               // Clear the input
-                               this.input.setValue( '' );
-                       }
+                       // Clear the search
+                       this.controller.setSearch( '' );
 
                        // Log filter grouping
                        this.controller.trackFilterGroupings( 'filtermenu' );
         * @inheritdoc
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onTagSelect = function ( tagItem ) {
-               var widget = this,
-                       menuOption = this.menu.getItemFromModel( tagItem.getModel() ),
-                       oldInputValue = this.input.getValue().trim();
+               var menuOption = this.menu.getItemFromModel( tagItem.getModel() );
 
                this.menu.setUserSelecting( true );
-
-               // Reset input
-               this.input.setValue( '' );
-
-               // Switch view
-               this.controller.switchView( tagItem.getView() );
-
                // Parent method
                mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onTagSelect.call( this, tagItem );
 
-               this.menu.selectItem( menuOption );
-               this.selectTag( tagItem );
+               // Switch view
+               this.controller.resetSearchForView( tagItem.getView() );
 
-               // Scroll to the item
-               if ( this.model.removeViewTriggers( oldInputValue ) ) {
-                       // We're binding a 'once' to the itemVisibilityChange event
-                       // so this happens when the menu is ready after the items
-                       // are visible again, in case this is done right after the
-                       // user filtered the results
-                       this.getMenu().once(
-                               'itemVisibilityChange',
-                               function () {
-                                       widget.scrollToTop( menuOption.$element );
-                                       widget.menu.setUserSelecting( false );
-                               }
-                       );
-               } else {
-                       this.scrollToTop( menuOption.$element );
-                       this.menu.setUserSelecting( false );
-               }
+               this.selectTag( tagItem );
+               this.scrollToTop( menuOption.$element );
 
+               this.menu.setUserSelecting( false );
        };
 
        /**
                return new mw.rcfilters.ui.MenuSelectWidget(
                        this.controller,
                        this.model,
-                       $.extend( {
-                               filterFromInput: true
-                       }, menuConfig )
+                       menuConfig
                );
        };
 
index 51fc9bc..1508510 100644 (file)
 
                        this.$element.addClass( classes.join( ' ' ) );
                }
+
+               this.updateUiBasedOnState();
        };
 
        /* Initialization */
                        this.itemModel.isSelected() &&
                        this.invertModel.isSelected()
                );
+               this.toggle( this.itemModel.isVisible() );
        };
 
        /**
index e64ffd8..8002045 100644 (file)
@@ -61,7 +61,6 @@
                $( 'body' )
                        .append( this.$overlay )
                        .addClass( 'mw-rcfilters-ui-initialized' );
-               this.initFormWidget();
        };
 
        /* Initialization */
index 98acab0..07d8c88 100644 (file)
@@ -33,7 +33,6 @@
                this.userSelecting = false;
 
                this.menuInitialized = false;
-               this.inputValue = '';
                this.$overlay = config.$overlay || this.$element;
                this.$body = $( '<div>' ).addClass( 'mw-rcfilters-ui-menuSelectWidget-body' );
                this.footers = [];
@@ -41,7 +40,9 @@
                // Parent
                mw.rcfilters.ui.MenuSelectWidget.parent.call( this, $.extend( {
                        $autoCloseIgnore: this.$overlay,
-                       width: 650
+                       width: 650,
+                       // Our filtering is done through the model
+                       filterFromInput: false
                }, config ) );
                this.setGroupElement(
                        $( '<div>' )
@@ -65,8 +66,8 @@
 
                // Events
                this.model.connect( this, {
-                       update: 'onModelUpdate',
-                       initialize: 'onModelInitialize'
+                       initialize: 'onModelInitialize',
+                       searchChange: 'onModelSearchChange'
                } );
 
                // Initialization
                }.bind( this ) );
 
                // Switch to the correct view
-               this.switchView( this.model.getCurrentView() );
+               this.updateView();
        };
 
        /* Initialize */
 
        /* Events */
 
-       /**
-        * @event itemVisibilityChange
-        *
-        * Item visibility has changed
-        */
-
        /* Methods */
-
-       /**
-        * Respond to model update event
-        */
-       mw.rcfilters.ui.MenuSelectWidget.prototype.onModelUpdate = function () {
-               // Change view
-               this.switchView( this.model.getCurrentView() );
+       mw.rcfilters.ui.MenuSelectWidget.prototype.onModelSearchChange = function () {
+               this.updateView();
        };
 
        /**
         */
        mw.rcfilters.ui.MenuSelectWidget.prototype.lazyMenuCreation = function () {
                var widget = this,
+                       items = [],
                        viewGroupCount = {},
                        groups = this.model.getFilterGroups();
 
                }
 
                this.menuInitialized = true;
-               // Reset
-               this.clearItems();
 
                // Count groups per view
                $.each( groups, function ( groupName, groupModel ) {
                                // without rebuilding the widgets each time
                                widget.views[ view ] = widget.views[ view ] || [];
                                widget.views[ view ] = widget.views[ view ].concat( currentItems );
+                               items = items.concat( currentItems );
                        }
                } );
 
-               this.switchView( this.model.getCurrentView() );
+               this.addItems( items );
+               this.updateView();
        };
 
        /**
        };
 
        /**
-        * Switch view
-        *
-        * @param {string} [viewName] View name. If not given, default is used.
+        * Update view
         */
-       mw.rcfilters.ui.MenuSelectWidget.prototype.switchView = function ( viewName ) {
-               viewName = viewName || 'default';
+       mw.rcfilters.ui.MenuSelectWidget.prototype.updateView = function () {
+               var viewName = this.model.getCurrentView();
 
                if ( this.views[ viewName ] && this.currentView !== viewName ) {
-                       this.clearItems();
-                       this.addItems( this.views[ viewName ] );
                        this.updateFooterVisibility( viewName );
 
                        this.$element
 
                        this.currentView = viewName;
                        this.scrollToTop();
-                       this.clip();
                }
+
+               this.postProcessItems();
+               this.clip();
        };
 
        /**
        };
 
        /**
-        * @fires itemVisibilityChange
-        * @inheritdoc
+        * Post-process items after the visibility changed. Make sure
+        * that we always have an item selected, and that the no-results
+        * widget appears if the menu is empty.
         */
-       mw.rcfilters.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
+       mw.rcfilters.ui.MenuSelectWidget.prototype.postProcessItems = function () {
                var i,
                        itemWasSelected = false,
-                       inputVal = this.$input.val(),
                        items = this.getItems();
 
-               // Since the method hides/shows items, we don't want to
-               // call it unless the input actually changed
-               if (
-                       !this.userSelecting &&
-                       this.inputValue !== inputVal
-               ) {
-                       // Parent method
-                       mw.rcfilters.ui.MenuSelectWidget.parent.prototype.updateItemVisibility.call( this );
-
+               // If we are not already selecting an item, always make sure
+               // that the top item is selected
+               if ( !this.userSelecting ) {
                        // Select the first item in the list
                        for ( i = 0; i < items.length; i++ ) {
                                if (
                        if ( !itemWasSelected ) {
                                this.selectItem( null );
                        }
-
-                       // Cache value
-                       this.inputValue = inputVal;
-
-                       this.emit( 'itemVisibilityChange' );
                }
 
                this.noResults.toggle( !this.getItems().some( function ( item ) {
                } )[ 0 ];
        };
 
-       /**
-        * Override the item matcher to use the model's match process
-        *
-        * @inheritdoc
-        */
-       mw.rcfilters.ui.MenuSelectWidget.prototype.getItemMatcher = function ( s ) {
-               var results = this.model.findMatches( s, true );
-
-               return function ( item ) {
-                       return results.indexOf( item.getModel() ) > -1;
-               };
-       };
-
        /**
         * @inheritdoc
         */
index d5c5e26..527d790 100644 (file)
@@ -71,7 +71,9 @@
         * Respond to the model being updated
         */
        mw.rcfilters.ui.RclTargetPageWidget.prototype.updateUiBasedOnModel = function () {
-               var title = mw.Title.newFromText( this.model.getValue() );
-               this.titleSearch.setValue( title ? title.toText() : this.model.getValue() );
+               var title = mw.Title.newFromText( this.model.getValue() ),
+                       text = title ? title.toText() : this.model.getValue();
+               this.titleSearch.setValue( text );
+               this.titleSearch.setTitle( text );
        };
 }( mediaWiki ) );
index bb837e0..f546d97 100644 (file)
@@ -26,7 +26,6 @@
                mw.rcfilters.ui.SaveFiltersPopupButtonWidget.parent.call( this, $.extend( {
                        framed: false,
                        icon: 'unClip',
-                       $overlay: this.$overlay,
                        title: mw.msg( 'rcfilters-savedqueries-add-new-title' ),
                        popup: {
                                classes: [ 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup' ],
index 58fd500..19f3553 100644 (file)
@@ -205,11 +205,7 @@ tt,
 kbd,
 samp,
 .mw-code {
-       /*
-        * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
-        * Specifying any valid, second value will trigger correct behavior without forcing a different font.
-        * See T176636
-        */
+       /* Support: Blink, Gecko, Webkit; enable unified font sizes for monospace font. T176636 */
        font-family: monospace, monospace;
 }
 
index 00faf84..a56e459 100644 (file)
@@ -92,7 +92,7 @@ a.mw-debug-panelabel:visited {
        height: 300px;
        overflow: scroll;
        display: none;
-       font-family: monospace;
+       font-family: monospace, monospace;
        font-size: 11px;
        background-color: #e1eff2;
        box-sizing: border-box;
index 6228030..fe7f324 100644 (file)
@@ -1,6 +1,6 @@
 /* Edit font preference */
 .mw-editfont-monospace {
-       font-family: monospace;
+       font-family: monospace, monospace;
 }
 
 .mw-editfont-sans-serif {
 .mw-editfont-serif {
        font-family: serif;
 }
+
+/* Standardize font size for edit areas using edit-fonts T182320 */
+.mw-editfont-monospace,
+.mw-editfont-sans-serif,
+.mw-editfont-serif {
+       font-size: 13px;
+}
index 2d55094..bfd5c06 100644 (file)
@@ -83,8 +83,7 @@
 
        /**
         * Respond to dialog submit event. If the information was
-        * submitted, either successfully or with an error, open
-        * a MessageDialog to thank the user.
+        * submitted successfully, open a MessageDialog to thank the user.
         *
         * @param {string} [status] A status of the end of operation
         *  of the main feedback dialog. Empty if the dialog was
         *  to the external task reporting site.
         */
        mw.Feedback.prototype.onDialogSubmit = function ( status ) {
-               var dialogConfig = {};
-               switch ( status ) {
-                       case 'submitted':
-                               dialogConfig = {
-                                       title: mw.msg( 'feedback-thanks-title' ),
-                                       message: $( '<span>' ).msg(
-                                               'feedback-thanks',
-                                               this.feedbackPageTitle.getNameText(),
-                                               $( '<a>' ).attr( {
-                                                       target: '_blank',
-                                                       href: this.feedbackPageTitle.getUrl()
-                                               } )
-                                       ),
-                                       actions: [
-                                               {
-                                                       action: 'accept',
-                                                       label: mw.msg( 'feedback-close' ),
-                                                       flags: 'primary'
-                                               }
-                                       ]
-                               };
-                               break;
+               var dialogConfig;
+
+               if ( status !== 'submitted' ) {
+                       return;
                }
 
+               dialogConfig = {
+                       title: mw.msg( 'feedback-thanks-title' ),
+                       message: $( '<span>' ).msg(
+                               'feedback-thanks',
+                               this.feedbackPageTitle.getNameText(),
+                               $( '<a>' ).attr( {
+                                       target: '_blank',
+                                       href: this.feedbackPageTitle.getUrl()
+                               } )
+                       ),
+                       actions: [
+                               {
+                                       action: 'accept',
+                                       label: mw.msg( 'feedback-close' ),
+                                       flags: 'primary'
+                               }
+                       ]
+               };
+
                // Show the message dialog
-               if ( !$.isEmptyObject( dialogConfig ) ) {
-                       this.constructor.static.windowManager.openWindow(
-                               this.thankYouDialog,
-                               dialogConfig
-                       );
-               }
+               this.constructor.static.windowManager.openWindow(
+                       this.thankYouDialog,
+                       dialogConfig
+               );
        };
 
        /**
         * @return {OO.ui.Error}
         */
        mw.Feedback.Dialog.prototype.getErrorMessage = function () {
-               switch ( this.status ) {
-                       case 'error1':
-                       case 'error2':
-                       case 'error3':
-                       case 'error4':
-                               // Messages: feedback-error1, feedback-error2, feedback-error3, feedback-error4
-                               return new OO.ui.Error( mw.msg( 'feedback-' + this.status ) );
-               }
+               // Messages: feedback-error1, feedback-error2, feedback-error3, feedback-error4
+               return new OO.ui.Error( mw.msg( 'feedback-' + this.status ) );
        };
 
        /**
index 44a00a8..e07d4a0 100644 (file)
@@ -708,15 +708,15 @@ class ParserTestRunner {
        public function meetsRequirements( $requirements ) {
                foreach ( $requirements as $requirement ) {
                        switch ( $requirement['type'] ) {
-                       case 'hook':
-                               $ok = $this->requireHook( $requirement['name'] );
-                               break;
-                       case 'functionHook':
-                               $ok = $this->requireFunctionHook( $requirement['name'] );
-                               break;
-                       case 'transparentHook':
-                               $ok = $this->requireTransparentHook( $requirement['name'] );
-                               break;
+                               case 'hook':
+                                       $ok = $this->requireHook( $requirement['name'] );
+                                       break;
+                               case 'functionHook':
+                                       $ok = $this->requireFunctionHook( $requirement['name'] );
+                                       break;
+                               case 'transparentHook':
+                                       $ok = $this->requireTransparentHook( $requirement['name'] );
+                                       break;
                        }
                        if ( !$ok ) {
                                return false;
index 7f64671..1bee31e 100644 (file)
@@ -162,18 +162,18 @@ class TestFileEditor {
                                if ( isset( $changes[$sectionName] ) ) {
                                        $change = $changes[$sectionName];
                                        switch ( $change['op'] ) {
-                                       case 'rename':
-                                               $test[$i]['name'] = $change['value'];
-                                               $test[$i]['headingLine'] = "!! {$change['value']}";
-                                               break;
-                                       case 'update':
-                                               $test[$i]['contents'] = $change['value'];
-                                               break;
-                                       case 'delete':
-                                               $test[$i]['deleted'] = true;
-                                               break;
-                                       default:
-                                               throw new Exception( "Unknown op: ${change['op']}" );
+                                               case 'rename':
+                                                       $test[$i]['name'] = $change['value'];
+                                                       $test[$i]['headingLine'] = "!! {$change['value']}";
+                                                       break;
+                                               case 'update':
+                                                       $test[$i]['contents'] = $change['value'];
+                                                       break;
+                                               case 'delete':
+                                                       $test[$i]['deleted'] = true;
+                                                       break;
+                                               default:
+                                                       throw new Exception( "Unknown op: ${change['op']}" );
                                        }
                                        // Acknowledge
                                        // Note that we use the old section name for the rename op
index 4d3c37b..9f2e5f9 100644 (file)
@@ -1008,10 +1008,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $user = static::getTestSysop()->getUser();
                $comment = __METHOD__ . ': Sample page for unit test.';
 
-               // Avoid memory leak...?
-               // LinkCache::singleton()->clear();
-               // Maybe.  But doing this absolutely breaks $title->isRedirect() when called during unit tests....
-
                $page = WikiPage::factory( $title );
                $page->doEditContent( ContentHandler::makeContent( $text, $title ), $comment, 0, false, $user );
 
index d961e41..9d56150 100644 (file)
@@ -752,6 +752,9 @@ class GlobalTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers ::wfMemcKey
+        */
        public function testWfMemcKey() {
                $cache = ObjectCache::getLocalClusterInstance();
                $this->assertEquals(
@@ -760,6 +763,9 @@ class GlobalTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers ::wfForeignMemcKey
+        */
        public function testWfForeignMemcKey() {
                $cache = ObjectCache::getLocalClusterInstance();
                $keyspace = $this->readAttribute( $cache, 'keyspace' );
@@ -769,6 +775,9 @@ class GlobalTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers ::wfGlobalCacheKey
+        */
        public function testWfGlobalCacheKey() {
                $cache = ObjectCache::getLocalClusterInstance();
                $this->assertEquals(
index e867f5e..7e32770 100644 (file)
@@ -386,6 +386,9 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers Html::namespaceSelector
+        */
        public function testCanFilterOutNamespaces() {
                $this->assertEquals(
                        '<select id="namespace" name="namespace">' . "\n" .
@@ -408,6 +411,9 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers Html::namespaceSelector
+        */
        public function testCanDisableANamespaces() {
                $this->assertEquals(
                        '<select id="namespace" name="namespace">' . "\n" .
@@ -678,6 +684,9 @@ class HtmlTest extends MediaWikiTestCase {
                return $ret;
        }
 
+       /**
+        * @covers Html::input
+        */
        public function testWrapperInput() {
                $this->assertEquals(
                        '<input type="radio" value="testval" name="testname"/>',
@@ -691,6 +700,9 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers Html::check
+        */
        public function testWrapperCheck() {
                $this->assertEquals(
                        '<input type="checkbox" value="1" name="testname"/>',
@@ -709,6 +721,9 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers Html::radio
+        */
        public function testWrapperRadio() {
                $this->assertEquals(
                        '<input type="radio" value="1" name="testname"/>',
@@ -727,6 +742,9 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers Html::label
+        */
        public function testWrapperLabel() {
                $this->assertEquals(
                        '<label for="testid">testlabel</label>',
index ed4958f..51b54d2 100644 (file)
@@ -3,6 +3,7 @@
 use Wikimedia\Rdbms\LikeMatch;
 
 /**
+ * @covers LinkFilter
  * @group Database
  */
 class LinkFilterTest extends MediaWikiLangTestCase {
index 4d39f7b..dbb7799 100644 (file)
@@ -8,7 +8,9 @@ use MediaWiki\Services\SalvageableService;
 use MediaWiki\Services\ServiceDisabledException;
 use MediaWiki\Shell\CommandFactory;
 use MediaWiki\Storage\BlobStore;
+use MediaWiki\Storage\BlobStoreFactory;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SqlBlobStore;
 
 /**
  * @covers MediaWiki\MediaWikiServices
@@ -333,7 +335,9 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'LocalServerObjectCache' => [ 'LocalServerObjectCache', BagOStuff::class ],
                        'VirtualRESTServiceClient' => [ 'VirtualRESTServiceClient', VirtualRESTServiceClient::class ],
                        'ShellCommandFactory' => [ 'ShellCommandFactory', CommandFactory::class ],
+                       'BlobStoreFactory' => [ 'BlobStoreFactory', BlobStoreFactory::class ],
                        'BlobStore' => [ 'BlobStore', BlobStore::class ],
+                       '_SqlBlobStore' => [ '_SqlBlobStore', SqlBlobStore::class ],
                        'RevisionStore' => [ 'RevisionStore', RevisionStore::class ],
                ];
        }
index d5948ed..c348834 100644 (file)
@@ -525,7 +525,7 @@ class OutputPageTest extends MediaWikiTestCase {
                $this->assertTrue( $outputPage->haveCacheVaryCookies() );
        }
 
-       /*
+       /**
         * @covers OutputPage::addCategoryLinks
         * @covers OutputPage::getCategories
         */
index 6420c39..15b26c2 100644 (file)
@@ -11,8 +11,9 @@
  * ^--- important, causes tests not to fail with timeout
  */
 class PageArchiveTest extends MediaWikiTestCase {
+
        /**
-        * @var WikiPage $archivedPage
+        * @var PageArchive $archivedPage
         */
        private $archivedPage;
 
@@ -78,6 +79,7 @@ class PageArchiveTest extends MediaWikiTestCase {
 
        /**
         * @covers PageArchive::undelete
+        * @covers PageArchive::undeleteRevisions
         */
        public function testUndeleteRevisions() {
                // First make sure old revisions are archived
@@ -107,4 +109,134 @@ class PageArchiveTest extends MediaWikiTestCase {
                $row = $res->fetchObject();
                $this->assertEquals( IP::toHex( $this->ipEditor ), $row->ipc_hex );
        }
+
+       /**
+        * @covers PageArchive::listRevisions
+        */
+       public function testListRevisions() {
+               $revisions = $this->archivedPage->listRevisions();
+               $this->assertEquals( 2, $revisions->numRows() );
+
+               // Get the rows as arrays
+               $row1 = (array)$revisions->current();
+               $row2 = (array)$revisions->next();
+               // Unset the timestamps (we assume they will be right...
+               $this->assertInternalType( 'string', $row1['ar_timestamp'] );
+               $this->assertInternalType( 'string', $row2['ar_timestamp'] );
+               unset( $row1['ar_timestamp'] );
+               unset( $row2['ar_timestamp'] );
+
+               $this->assertEquals(
+                       [
+                               'ar_minor_edit' => '0',
+                               'ar_user' => '0',
+                               'ar_user_text' => '2600:387:ed7:947e:8c16:a1ad:dd34:1dd7',
+                               'ar_len' => '11',
+                               'ar_deleted' => '0',
+                               'ar_rev_id' => '3',
+                               'ar_sha1' => '0qdrpxl537ivfnx4gcpnzz0285yxryy',
+                               'ar_page_id' => '2',
+                               'ar_comment_text' => 'just a test',
+                               'ar_comment_data' => null,
+                               'ar_comment_cid' => null,
+                               'ar_content_format' => null,
+                               'ar_content_model' => null,
+                               'ts_tags' => null,
+                               'ar_id' => '2',
+                               'ar_namespace' => '0',
+                               'ar_title' => 'PageArchiveTest_thePage',
+                               'ar_text' => '',
+                               'ar_text_id' => '3',
+                               'ar_parent_id' => '2',
+                       ],
+                       $row1
+               );
+               $this->assertEquals(
+                       [
+                               'ar_minor_edit' => '0',
+                               'ar_user' => '0',
+                               'ar_user_text' => '127.0.0.1',
+                               'ar_len' => '7',
+                               'ar_deleted' => '0',
+                               'ar_rev_id' => '2',
+                               'ar_sha1' => 'pr0s8e18148pxhgjfa0gjrvpy8fiyxc',
+                               'ar_page_id' => '2',
+                               'ar_comment_text' => 'testing',
+                               'ar_comment_data' => null,
+                               'ar_comment_cid' => null,
+                               'ar_content_format' => null,
+                               'ar_content_model' => null,
+                               'ts_tags' => null,
+                               'ar_id' => '1',
+                               'ar_namespace' => '0',
+                               'ar_title' => 'PageArchiveTest_thePage',
+                               'ar_text' => '',
+                               'ar_text_id' => '2',
+                               'ar_parent_id' => '0',
+                       ],
+                       $row2
+               );
+       }
+
+       /**
+        * @covers PageArchive::listPagesBySearch
+        */
+       public function testListPagesBySearch() {
+               $pages = PageArchive::listPagesBySearch( 'PageArchiveTest_thePage' );
+               $this->assertSame( 1, $pages->numRows() );
+
+               $page = (array)$pages->current();
+
+               $this->assertSame(
+                       [
+                               'ar_namespace' => '0',
+                               'ar_title' => 'PageArchiveTest_thePage',
+                               'count' => '2',
+                       ],
+                       $page
+               );
+       }
+
+       /**
+        * @covers PageArchive::listPagesBySearch
+        */
+       public function testListPagesByPrefix() {
+               $pages = PageArchive::listPagesByPrefix( 'PageArchiveTest' );
+               $this->assertSame( 1, $pages->numRows() );
+
+               $page = (array)$pages->current();
+
+               $this->assertSame(
+                       [
+                               'ar_namespace' => '0',
+                               'ar_title' => 'PageArchiveTest_thePage',
+                               'count' => '2',
+                       ],
+                       $page
+               );
+       }
+
+       /**
+        * @covers PageArchive::getTextFromRow
+        */
+       public function testGetTextFromRow() {
+               $row = (object)[ 'ar_text_id' => 2 ];
+               $text = $this->archivedPage->getTextFromRow( $row );
+               $this->assertSame( 'testing', $text );
+       }
+
+       /**
+        * @covers PageArchive::getLastRevisionText
+        */
+       public function testGetLastRevisionText() {
+               $text = $this->archivedPage->getLastRevisionText();
+               $this->assertSame( 'Lorem Ipsum', $text );
+       }
+
+       /**
+        * @covers PageArchive::isDeleted
+        */
+       public function testIsDeleted() {
+               $this->assertTrue( $this->archivedPage->isDeleted() );
+       }
 }
index c96d987..f602cda 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 
 /**
+ * @covers PageProps
+ *
  * @group Database
  *     ^--- tell jenkins this test needs the database
  *
index 9ab76c8..94f8fba 100644 (file)
@@ -649,6 +649,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
        }
 
        /**
+        * @covers Revision::userWasLastToEdit
         * @dataProvider provideUserWasLastToEdit
         */
        public function testUserWasLastToEdit( $sinceIdx, $expectedLast ) {
index b7f1a47..0db76ff 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\Storage\BlobStoreFactory;
 use MediaWiki\Storage\RevisionStore;
 use MediaWiki\Storage\SqlBlobStore;
 use Wikimedia\Rdbms\IDatabase;
@@ -42,7 +43,7 @@ class RevisionTest extends MediaWikiTestCase {
                        ->method( 'getPrefixedText' )
                        ->will( $this->returnValue( 'RevisionTest' ) );
                $mock->expects( $this->any() )
-                       ->method( 'getDBKey' )
+                       ->method( 'getDBkey' )
                        ->will( $this->returnValue( 'RevisionTest' ) );
                $mock->expects( $this->any() )
                        ->method( 'getArticleID' )
@@ -57,7 +58,7 @@ class RevisionTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideConstructFromArray
         * @covers Revision::__construct
-        * @covers Revision::constructFromRowArray
+        * @covers \MediaWiki\Storage\RevisionStore::newMutableRevisionFromArray
         */
        public function testConstructFromArray( $rowArray ) {
                $rev = new Revision( $rowArray, 0, $this->getMockTitle() );
@@ -68,7 +69,7 @@ class RevisionTest extends MediaWikiTestCase {
 
        /**
         * @covers Revision::__construct
-        * @covers Revision::constructFromRowArray
+        * @covers \MediaWiki\Storage\RevisionStore::newMutableRevisionFromArray
         */
        public function testConstructFromEmptyArray() {
                $rev = new Revision( [], 0, $this->getMockTitle() );
@@ -106,7 +107,7 @@ class RevisionTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideConstructFromArray_userSetAsExpected
         * @covers Revision::__construct
-        * @covers Revision::constructFromRowArray
+        * @covers \MediaWiki\Storage\RevisionStore::newMutableRevisionFromArray
         *
         * @param array $rowArray
         * @param mixed $expectedUserId null to expect the current wgUser ID
@@ -166,7 +167,7 @@ class RevisionTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideConstructFromArrayThrowsExceptions
         * @covers Revision::__construct
-        * @covers RevisionStore::newMutableRevisionFromArray
+        * @covers \MediaWiki\Storage\RevisionStore::newMutableRevisionFromArray
         */
        public function testConstructFromArrayThrowsExceptions( $rowArray, Exception $expectedException ) {
                $this->setExpectedException(
@@ -179,7 +180,7 @@ class RevisionTest extends MediaWikiTestCase {
 
        /**
         * @covers Revision::__construct
-        * @covers RevisionStore::newMutableRevisionFromArray
+        * @covers \MediaWiki\Storage\RevisionStore::newMutableRevisionFromArray
         */
        public function testConstructFromNothing() {
                $this->setExpectedException(
@@ -265,7 +266,7 @@ class RevisionTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideConstructFromRow
         * @covers Revision::__construct
-        * @covers RevisionStore::newRevisionFromRow
+        * @covers \MediaWiki\Storage\RevisionStore::newMutableRevisionFromArray
         */
        public function testConstructFromRow( array $arrayData, $assertions ) {
                $data = 'Hello goat.'; // needs to match model and format
@@ -289,7 +290,7 @@ class RevisionTest extends MediaWikiTestCase {
                        ) );
 
                // Note override internal service, so RevisionStore uses it as well.
-               $this->setService( '_SqlBlobStore', $blobStore );
+               $this->setService( 'BlobStoreFactory', $this->mockBlobStoreFactory( $blobStore ) );
 
                $row = (object)$arrayData;
                $rev = new Revision( $row, 0, $this->getMockTitle() );
@@ -435,6 +436,20 @@ class RevisionTest extends MediaWikiTestCase {
                return $blobStore;
        }
 
+       private function mockBlobStoreFactory( $blobStore ) {
+               /** @var LoadBalancer $lb */
+               $factory = $this->getMockBuilder( BlobStoreFactory::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $factory->expects( $this->any() )
+                       ->method( 'newBlobStore' )
+                       ->willReturn( $blobStore );
+               $factory->expects( $this->any() )
+                       ->method( 'newSqlBlobStore' )
+                       ->willReturn( $blobStore );
+               return $factory;
+       }
+
        /**
         * @return RevisionStore
         */
@@ -478,7 +493,7 @@ class RevisionTest extends MediaWikiTestCase {
        public function testGetRevisionWithLegacyEncoding( $expected, $lang, $encoding, $rowData ) {
                $blobStore = $this->getBlobStore();
                $blobStore->setLegacyEncoding( $encoding, Language::factory( $lang ) );
-               $this->setService( 'BlobStore', $blobStore );
+               $this->setService( 'BlobStoreFactory', $this->mockBlobStoreFactory( $blobStore ) );
 
                $this->testGetRevisionText( $expected, $rowData );
        }
@@ -518,7 +533,7 @@ class RevisionTest extends MediaWikiTestCase {
 
                $blobStore = $this->getBlobStore();
                $blobStore->setLegacyEncoding( $encoding, Language::factory( $lang ) );
-               $this->setService( 'BlobStore', $blobStore );
+               $this->setService( 'BlobStoreFactory', $this->mockBlobStoreFactory( $blobStore ) );
 
                $this->testGetRevisionText( $expected, $rowData );
        }
@@ -548,7 +563,7 @@ class RevisionTest extends MediaWikiTestCase {
 
                $blobStore = $this->getBlobStore();
                $blobStore->setCompressBlobs( true );
-               $this->setService( 'BlobStore', $blobStore );
+               $this->setService( 'BlobStoreFactory', $this->mockBlobStoreFactory( $blobStore ) );
 
                $row = new stdClass;
                $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
@@ -693,7 +708,7 @@ class RevisionTest extends MediaWikiTestCase {
                        $blobStore->setLegacyEncoding( $legacyEncoding, Language::factory( 'en' ) );
                }
 
-               $this->setService( 'BlobStore', $blobStore );
+               $this->setService( 'BlobStoreFactory', $this->mockBlobStoreFactory( $blobStore ) );
                $this->assertSame(
                        $expected,
                        Revision::decompressRevisionText( $text, $flags )
@@ -802,7 +817,7 @@ class RevisionTest extends MediaWikiTestCase {
                        ->getMock();
 
                $blobStore = new SqlBlobStore( $lb, $cache );
-               $this->setService( 'BlobStore', $blobStore );
+               $this->setService( 'BlobStoreFactory', $this->mockBlobStoreFactory( $blobStore ) );
 
                $this->assertSame(
                        'AAAABBAAA',
diff --git a/tests/phpunit/includes/Storage/BlobStoreFactoryTest.php b/tests/phpunit/includes/Storage/BlobStoreFactoryTest.php
new file mode 100644 (file)
index 0000000..46ba7a5
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+namespace MediaWiki\Tests\Storage;
+
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\BlobStore;
+use MediaWiki\Storage\SqlBlobStore;
+use MediaWikiTestCase;
+use Wikimedia\TestingAccessWrapper;
+
+/**
+ * @covers MediaWiki\Storage\BlobStore
+ */
+class BlobStoreFactoryTest extends MediaWikiTestCase {
+
+       public function provideWikiIds() {
+               yield [ false ];
+               yield [ 'someWiki' ];
+       }
+
+       /**
+        * @dataProvider provideWikiIds
+        */
+       public function testNewBlobStore( $wikiId ) {
+               $factory = MediaWikiServices::getInstance()->getBlobStoreFactory();
+               $store = $factory->newBlobStore( $wikiId );
+               $this->assertInstanceOf( BlobStore::class, $store );
+
+               // This only works as we currently know this is a SqlBlobStore object
+               $wrapper = TestingAccessWrapper::newFromObject( $store );
+               $this->assertEquals( $wikiId, $wrapper->wikiId );
+       }
+
+       /**
+        * @dataProvider provideWikiIds
+        */
+       public function testNewSqlBlobStore( $wikiId ) {
+               $factory = MediaWikiServices::getInstance()->getBlobStoreFactory();
+               $store = $factory->newSqlBlobStore( $wikiId );
+               $this->assertInstanceOf( SqlBlobStore::class, $store );
+
+               $wrapper = TestingAccessWrapper::newFromObject( $store );
+               $this->assertEquals( $wikiId, $wrapper->wikiId );
+       }
+
+}
diff --git a/tests/phpunit/includes/Storage/RevisionRecordTest.php b/tests/phpunit/includes/Storage/RevisionRecordTest.php
deleted file mode 100644 (file)
index ea5f209..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace MediaWiki\Tests\Storage;
-
-use MediaWikiTestCase;
-
-/**
- * @covers \MediaWiki\Storage\RevisionRecord
- */
-class RevisionRecordTest extends MediaWikiTestCase {
-
-       public function testUserCanBitfield() {
-       }
-
-}
index 695a6b3..ee8fdc7 100644 (file)
@@ -340,6 +340,9 @@ class RevisionStoreDbTest extends MediaWikiTestCase {
                $this->assertSame( 0, $result );
        }
 
+       /**
+        * @covers \MediaWiki\Storage\RevisionStore::getRecentChange
+        */
        public function testGetRecentChange() {
                $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
                $content = new WikitextContent( __METHOD__ );
index efad1b1..18dbc25 100644 (file)
@@ -213,6 +213,7 @@ class RevisionStoreTest extends MediaWikiTestCase {
        public function testGetQueryInfo( $contentHandlerUseDb, $options, $expected ) {
                $store = $this->getRevisionStore();
                $store->setContentHandlerUseDB( $contentHandlerUseDb );
+               $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_OLD );
                $this->assertEquals( $expected, $store->getQueryInfo( $options ) );
        }
 
@@ -242,6 +243,7 @@ class RevisionStoreTest extends MediaWikiTestCase {
        public function testGetArchiveQueryInfo_contentHandlerDb() {
                $store = $this->getRevisionStore();
                $store->setContentHandlerUseDB( true );
+               $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_OLD );
                $this->assertEquals(
                        [
                                'tables' => [
@@ -269,6 +271,7 @@ class RevisionStoreTest extends MediaWikiTestCase {
        public function testGetArchiveQueryInfo_noContentHandlerDb() {
                $store = $this->getRevisionStore();
                $store->setContentHandlerUseDB( false );
+               $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_OLD );
                $this->assertEquals(
                        [
                                'tables' => [
index b760c22..54cdbe2 100644 (file)
@@ -325,6 +325,9 @@ class TitleMethodsTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $title->getOtherPage()->getPrefixedText() );
        }
 
+       /**
+        * @covers Title::clearCaches
+        */
        public function testClearCaches() {
                $linkCache = LinkCache::singleton();
 
index 75e0c3e..d12e4b8 100644 (file)
@@ -552,6 +552,7 @@ class TitleTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers Title::newFromTitleValue
         * @dataProvider provideNewFromTitleValue
         */
        public function testNewFromTitleValue( TitleValue $value ) {
@@ -572,6 +573,7 @@ class TitleTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers Title::getTitleValue
         * @dataProvider provideGetTitleValue
         */
        public function testGetTitleValue( $text ) {
@@ -603,6 +605,7 @@ class TitleTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers Title::getFragment
         * @dataProvider provideGetFragment
         *
         * @param string $full
@@ -913,6 +916,7 @@ class TitleTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers Title::getFragmentForURL
         * @dataProvider provideGetFragmentForURL
         *
         * @param string $titleStr
index 4d4fa7b..4a280da 100644 (file)
@@ -141,6 +141,57 @@ class XmlTest extends MediaWikiTestCase {
                $this->assertEquals( '</element>', Xml::closeElement( 'element' ), 'closeElement() shortcut' );
        }
 
+       public function provideMonthSelector() {
+               global $wgLang;
+
+               $header = '<select name="month" id="month" class="mw-month-selector">';
+               $header2 = '<select name="month" id="monthSelector" class="mw-month-selector">';
+               $monthsString = '';
+               for ( $i = 1; $i < 13; $i++ ) {
+                       $monthName = $wgLang->getMonthName( $i );
+                       $monthsString .= "<option value=\"{$i}\">{$monthName}</option>";
+                       if ( $i !== 12 ) {
+                               $monthsString .= "\n";
+                       }
+               }
+               $monthsString2 = str_replace(
+                       '<option value="12">December</option>',
+                       '<option value="12" selected="">December</option>',
+                       $monthsString
+               );
+               $end = '</select>';
+
+               $allMonths = "<option value=\"AllMonths\">all</option>\n";
+               return [
+                       [ $header . $monthsString . $end, '', null, 'month' ],
+                       [ $header . $monthsString2 . $end, 12, null, 'month' ],
+                       [ $header2 . $monthsString . $end, '', null, 'monthSelector' ],
+                       [ $header . $allMonths . $monthsString . $end, '', 'AllMonths', 'month' ],
+
+               ];
+       }
+
+       /**
+        * @covers Xml::monthSelector
+        * @dataProvider provideMonthSelector
+        */
+       public function testMonthSelector( $expected, $selected, $allmonths, $id ) {
+               $this->assertEquals(
+                       $expected,
+                       Xml::monthSelector( $selected, $allmonths, $id )
+               );
+       }
+
+       /**
+        * @covers Xml::span
+        */
+       public function testSpan() {
+               $this->assertEquals(
+                       '<span class="foo" id="testSpan">element</span>',
+                       Xml::span( 'element', 'foo', [ 'id' => 'testSpan' ] )
+               );
+       }
+
        /**
         * @covers Xml::dateMenu
         */
@@ -533,4 +584,34 @@ class XmlTest extends MediaWikiTestCase {
                        'Entire element with legend and attributes'
                );
        }
+
+       /**
+        * @covers Xml::buildTable
+        */
+       public function testBuildTable() {
+               $firstRow = [ 'foo', 'bar' ];
+               $secondRow = [ 'Berlin', 'Tehran' ];
+               $headers = [ 'header1', 'header2' ];
+               $expected = '<table id="testTable"><thead id="testTable"><th>header1</th>' .
+                       '<th>header2</th></thead><tr><td>foo</td><td>bar</td></tr><tr><td>Berlin</td>' .
+                       '<td>Tehran</td></tr></table>';
+               $this->assertEquals(
+                       $expected,
+                       Xml::buildTable(
+                               [ $firstRow, $secondRow ],
+                               [ 'id' => 'testTable' ],
+                               $headers
+                       )
+               );
+       }
+
+       /**
+        * @covers Xml::buildTableRow
+        */
+       public function testBuildTableRow() {
+               $this->assertEquals(
+                       '<tr id="testRow"><td>foo</td><td>bar</td></tr>',
+                       Xml::buildTableRow( [ 'id' => 'testRow' ], [ 'foo', 'bar' ] )
+               );
+       }
 }
index 989d6bb..9399ef8 100644 (file)
@@ -29,7 +29,7 @@ class ApiComparePagesTest extends ApiTestCase {
                $status = $page->doEditContent(
                        $content, 'Test for ApiComparePagesTest: ' . $text, 0, false, $user
                );
-               if ( !$status->isOk() ) {
+               if ( !$status->isOK() ) {
                        $this->fail( "Failed to create $title: " . $status->getWikiText( false, false, 'en' ) );
                }
                return $status->value['revision']->getId();
index 07bf299..e236437 100644 (file)
@@ -21,7 +21,7 @@ class ApiParseTest extends ApiTestCase {
                        ContentHandler::makeContent( 'Test for revdel', $title, CONTENT_MODEL_WIKITEXT ),
                        __METHOD__ . ' Test for revdel', 0, false, $user
                );
-               if ( !$status->isOk() ) {
+               if ( !$status->isOK() ) {
                        $this->fail( "Failed to create $title: " . $status->getWikiText( false, false, 'en' ) );
                }
                self::$pageId = $status->value['revision']->getPage();
@@ -31,7 +31,7 @@ class ApiParseTest extends ApiTestCase {
                        ContentHandler::makeContent( 'Test for oldid', $title, CONTENT_MODEL_WIKITEXT ),
                        __METHOD__ . ' Test for oldid', 0, false, $user
                );
-               if ( !$status->isOk() ) {
+               if ( !$status->isOK() ) {
                        $this->fail( "Failed to edit $title: " . $status->getWikiText( false, false, 'en' ) );
                }
                self::$revIds['oldid'] = $status->value['revision']->getId();
@@ -40,7 +40,7 @@ class ApiParseTest extends ApiTestCase {
                        ContentHandler::makeContent( 'Test for latest', $title, CONTENT_MODEL_WIKITEXT ),
                        __METHOD__ . ' Test for latest', 0, false, $user
                );
-               if ( !$status->isOk() ) {
+               if ( !$status->isOK() ) {
                        $this->fail( "Failed to edit $title: " . $status->getWikiText( false, false, 'en' ) );
                }
                self::$revIds['latest'] = $status->value['revision']->getId();
diff --git a/tests/phpunit/includes/api/ApiQueryRecentChangesIntegrationTest.php b/tests/phpunit/includes/api/ApiQueryRecentChangesIntegrationTest.php
new file mode 100644 (file)
index 0000000..19f66fa
--- /dev/null
@@ -0,0 +1,973 @@
+<?php
+
+use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ *
+ * @covers ApiQueryRecentChanges
+ */
+class ApiQueryRecentChangesIntegrationTest extends ApiTestCase {
+
+       public function __construct( $name = null, array $data = [], $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed[] = 'recentchanges';
+               $this->tablesUsed[] = 'page';
+       }
+
+       protected function setUp() {
+               parent::setUp();
+
+               self::$users['ApiQueryRecentChangesIntegrationTestUser'] = $this->getMutableTestUser();
+               $this->doLogin( 'ApiQueryRecentChangesIntegrationTestUser' );
+               wfGetDB( DB_MASTER )->delete( 'recentchanges', '*', __METHOD__ );
+       }
+
+       private function getLoggedInTestUser() {
+               return self::$users['ApiQueryRecentChangesIntegrationTestUser']->getUser();
+       }
+
+       private function doPageEdit( User $user, LinkTarget $target, $summary ) {
+               static $i = 0;
+
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $page->doEditContent(
+                       ContentHandler::makeContent( __CLASS__ . $i++, $title ),
+                       $summary,
+                       0,
+                       false,
+                       $user
+               );
+       }
+
+       private function doMinorPageEdit( User $user, LinkTarget $target, $summary ) {
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $page->doEditContent(
+                       ContentHandler::makeContent( __CLASS__, $title ),
+                       $summary,
+                       EDIT_MINOR,
+                       false,
+                       $user
+               );
+       }
+
+       private function doBotPageEdit( User $user, LinkTarget $target, $summary ) {
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $page->doEditContent(
+                       ContentHandler::makeContent( __CLASS__, $title ),
+                       $summary,
+                       EDIT_FORCE_BOT,
+                       false,
+                       $user
+               );
+       }
+
+       private function doAnonPageEdit( LinkTarget $target, $summary ) {
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $page->doEditContent(
+                       ContentHandler::makeContent( __CLASS__, $title ),
+                       $summary,
+                       0,
+                       false,
+                       User::newFromId( 0 )
+               );
+       }
+
+       private function deletePage( LinkTarget $target, $reason ) {
+               $title = Title::newFromLinkTarget( $target );
+               $page = WikiPage::factory( $title );
+               $page->doDeleteArticleReal( $reason );
+       }
+
+       /**
+        * Performs a batch of page edits as a specified user
+        * @param User $user
+        * @param array $editData associative array, keys:
+        *                        - target    => LinkTarget page to edit
+        *                        - summary   => string edit summary
+        *                        - minorEdit => bool mark as minor edit if true (defaults to false)
+        *                        - botEdit   => bool mark as bot edit if true (defaults to false)
+        */
+       private function doPageEdits( User $user, array $editData ) {
+               foreach ( $editData as $singleEditData ) {
+                       if ( array_key_exists( 'minorEdit', $singleEditData ) && $singleEditData['minorEdit'] ) {
+                               $this->doMinorPageEdit(
+                                       $user,
+                                       $singleEditData['target'],
+                                       $singleEditData['summary']
+                               );
+                               continue;
+                       }
+                       if ( array_key_exists( 'botEdit', $singleEditData ) && $singleEditData['botEdit'] ) {
+                               $this->doBotPageEdit(
+                                       $user,
+                                       $singleEditData['target'],
+                                       $singleEditData['summary']
+                               );
+                               continue;
+                       }
+                       $this->doPageEdit(
+                               $user,
+                               $singleEditData['target'],
+                               $singleEditData['summary']
+                       );
+               }
+       }
+
+       private function doListRecentChangesRequest( array $params = [] ) {
+               return $this->doApiRequest(
+                       array_merge(
+                               [ 'action' => 'query', 'list' => 'recentchanges' ],
+                               $params
+                       ),
+                       null,
+                       false
+               );
+       }
+
+       private function doGeneratorRecentChangesRequest( array $params = [] ) {
+               return $this->doApiRequest(
+                       array_merge(
+                               [ 'action' => 'query', 'generator' => 'recentchanges' ],
+                               $params
+                       )
+               );
+       }
+
+       private function getItemsFromApiResponse( array $response ) {
+               return $response[0]['query']['recentchanges'];
+       }
+
+       private function getTitleFormatter() {
+               return new MediaWikiTitleCodec(
+                       Language::factory( 'en' ),
+                       MediaWikiServices::getInstance()->getGenderCache()
+               );
+       }
+
+       private function getPrefixedText( LinkTarget $target ) {
+               $formatter = $this->getTitleFormatter();
+               return $formatter->getPrefixedText( $target );
+       }
+
+       public function testListRecentChanges_returnsRCInfo() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
+
+               $result = $this->doListRecentChangesRequest();
+
+               $this->assertArrayHasKey( 'query', $result[0] );
+               $this->assertArrayHasKey( 'recentchanges', $result[0]['query'] );
+
+               $items = $this->getItemsFromApiResponse( $result );
+               $this->assertCount( 1, $items );
+               $item = $items[0];
+               $this->assertArraySubset(
+                       [
+                               'type' => 'new',
+                               'ns' => $target->getNamespace(),
+                               'title' => $this->getPrefixedText( $target ),
+                       ],
+                       $item
+               );
+               $this->assertArrayNotHasKey( 'bot', $item );
+               $this->assertArrayNotHasKey( 'new', $item );
+               $this->assertArrayNotHasKey( 'minor', $item );
+               $this->assertArrayHasKey( 'pageid', $item );
+               $this->assertArrayHasKey( 'revid', $item );
+               $this->assertArrayHasKey( 'old_revid', $item );
+       }
+
+       public function testIdsPropParameter() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'ids', ] );
+               $items = $this->getItemsFromApiResponse( $result );
+
+               $this->assertCount( 1, $items );
+               $this->assertArrayHasKey( 'pageid', $items[0] );
+               $this->assertArrayHasKey( 'revid', $items[0] );
+               $this->assertArrayHasKey( 'old_revid', $items[0] );
+               $this->assertEquals( 'new', $items[0]['type'] );
+       }
+
+       public function testTitlePropParameter() {
+               $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdits(
+                       $this->getLoggedInTestUser(),
+                       [
+                               [
+                                       'target' => $subjectTarget,
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $talkTarget,
+                                       'summary' => 'Create Talk page',
+                               ],
+                       ]
+               );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $talkTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $talkTarget ),
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testFlagsPropParameter() {
+               $normalEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $minorEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageM' );
+               $botEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageB' );
+               $this->doPageEdits(
+                       $this->getLoggedInTestUser(),
+                       [
+                               [
+                                       'target' => $normalEditTarget,
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $minorEditTarget,
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $minorEditTarget,
+                                       'summary' => 'Change content',
+                                       'minorEdit' => true,
+                               ],
+                               [
+                                       'target' => $botEditTarget,
+                                       'summary' => 'Create the page with a bot',
+                                       'botEdit' => true,
+                               ],
+                       ]
+               );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'flags', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'new' => true,
+                                       'minor' => false,
+                                       'bot' => true,
+                               ],
+                               [
+                                       'type' => 'edit',
+                                       'new' => false,
+                                       'minor' => true,
+                                       'bot' => false,
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'new' => true,
+                                       'minor' => false,
+                                       'bot' => false,
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'new' => true,
+                                       'minor' => false,
+                                       'bot' => false,
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testUserPropParameter() {
+               $userEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $anonEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageA' );
+               $this->doPageEdit( $this->getLoggedInTestUser(), $userEditTarget, 'Create the page' );
+               $this->doAnonPageEdit( $anonEditTarget, 'Create the page' );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'user', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'anon' => true,
+                                       'user' => User::newFromId( 0 )->getName(),
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'user' => $this->getLoggedInTestUser()->getName(),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testUserIdPropParameter() {
+               $user = $this->getLoggedInTestUser();
+               $userEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $anonEditTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPageA' );
+               $this->doPageEdit( $user, $userEditTarget, 'Create the page' );
+               $this->doAnonPageEdit( $anonEditTarget, 'Create the page' );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'userid', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'anon' => true,
+                                       'userid' => 0,
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'userid' => $user->getId(),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testCommentPropParameter() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the <b>page</b>' );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'comment', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'comment' => 'Create the <b>page</b>',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testParsedCommentPropParameter() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the <b>page</b>' );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'parsedcomment', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'parsedcomment' => 'Create the &lt;b&gt;page&lt;/b&gt;',
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testTimestampPropParameter() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'timestamp', ] );
+               $items = $this->getItemsFromApiResponse( $result );
+
+               $this->assertCount( 1, $items );
+               $this->assertArrayHasKey( 'timestamp', $items[0] );
+               $this->assertInternalType( 'string', $items[0]['timestamp'] );
+       }
+
+       public function testSizesPropParameter() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'sizes', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'oldlen' => 0,
+                                       'newlen' => 38,
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       private function createPageAndDeleteIt( LinkTarget $target ) {
+               $this->doPageEdit( $this->getLoggedInTestUser(),
+                       $target,
+                       'Create the page that will be deleted'
+               );
+               $this->deletePage( $target, 'Important Reason' );
+       }
+
+       public function testLoginfoPropParameter() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->createPageAndDeleteIt( $target );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'loginfo', ] );
+
+               $items = $this->getItemsFromApiResponse( $result );
+               $this->assertCount( 1, $items );
+               $this->assertArraySubset(
+                       [
+                               'type' => 'log',
+                               'logtype' => 'delete',
+                               'logaction' => 'delete',
+                               'logparams' => [],
+                       ],
+                       $items[0]
+               );
+               $this->assertArrayHasKey( 'logid', $items[0] );
+       }
+
+       public function testEmptyPropParameter() {
+               $user = $this->getLoggedInTestUser();
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdit( $user, $target, 'Create the page' );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => '', ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testNamespaceParam() {
+               $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdits(
+                       $this->getLoggedInTestUser(),
+                       [
+                               [
+                                       'target' => $subjectTarget,
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $talkTarget,
+                                       'summary' => 'Create the talk page',
+                               ],
+                       ]
+               );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcnamespace' => '0', ] );
+
+               $items = $this->getItemsFromApiResponse( $result );
+               $this->assertCount( 1, $items );
+               $this->assertArraySubset(
+                       [
+                               'ns' => 0,
+                               'title' => $this->getPrefixedText( $subjectTarget ),
+                       ],
+                       $items[0]
+               );
+       }
+
+       public function testShowAnonParams() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doAnonPageEdit( $target, 'Create the page' );
+
+               $resultAnon = $this->doListRecentChangesRequest( [
+                       'rcprop' => 'user',
+                       'rcshow' => WatchedItemQueryService::FILTER_ANON
+               ] );
+               $resultNotAnon = $this->doListRecentChangesRequest( [
+                       'rcprop' => 'user',
+                       'rcshow' => WatchedItemQueryService::FILTER_NOT_ANON
+               ] );
+
+               $items = $this->getItemsFromApiResponse( $resultAnon );
+               $this->assertCount( 1, $items );
+               $this->assertArraySubset( [ 'anon' => true ], $items[0] );
+               $this->assertEmpty( $this->getItemsFromApiResponse( $resultNotAnon ) );
+       }
+
+       public function testNewAndEditTypeParameters() {
+               $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdits(
+                       $this->getLoggedInTestUser(),
+                       [
+                               [
+                                       'target' => $subjectTarget,
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $subjectTarget,
+                                       'summary' => 'Change the content',
+                               ],
+                               [
+                                       'target' => $talkTarget,
+                                       'summary' => 'Create Talk page',
+                               ],
+                       ]
+               );
+
+               $resultNew = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'new' ] );
+               $resultEdit = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'edit' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $talkTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $talkTarget ),
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultNew )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'edit',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultEdit )
+               );
+       }
+
+       public function testLogTypeParameters() {
+               $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->createPageAndDeleteIt( $subjectTarget );
+               $this->doPageEdit( $this->getLoggedInTestUser(), $talkTarget, 'Create Talk page' );
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'log' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'log',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       private function getExternalRC( LinkTarget $target ) {
+               $title = Title::newFromLinkTarget( $target );
+
+               $rc = new RecentChange;
+               $rc->mTitle = $title;
+               $rc->mAttribs = [
+                       'rc_timestamp' => wfTimestamp( TS_MW ),
+                       'rc_namespace' => $title->getNamespace(),
+                       'rc_title' => $title->getDBkey(),
+                       'rc_type' => RC_EXTERNAL,
+                       'rc_source' => 'foo',
+                       'rc_minor' => 0,
+                       'rc_cur_id' => $title->getArticleID(),
+                       'rc_user' => 0,
+                       'rc_user_text' => 'External User',
+                       'rc_comment' => '',
+                       'rc_comment_text' => '',
+                       'rc_comment_data' => null,
+                       'rc_this_oldid' => $title->getLatestRevID(),
+                       'rc_last_oldid' => $title->getLatestRevID(),
+                       'rc_bot' => 0,
+                       'rc_ip' => '',
+                       'rc_patrolled' => 0,
+                       'rc_new' => 0,
+                       'rc_old_len' => $title->getLength(),
+                       'rc_new_len' => $title->getLength(),
+                       'rc_deleted' => 0,
+                       'rc_logid' => 0,
+                       'rc_log_type' => null,
+                       'rc_log_action' => '',
+                       'rc_params' => '',
+               ];
+               $rc->mExtra = [
+                       'prefixedDBkey' => $title->getPrefixedDBkey(),
+                       'lastTimestamp' => 0,
+                       'oldSize' => $title->getLength(),
+                       'newSize' => $title->getLength(),
+                       'pageStatus' => 'changed'
+               ];
+
+               return $rc;
+       }
+
+       public function testExternalTypeParameters() {
+               $user = $this->getLoggedInTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdit( $user, $subjectTarget, 'Create the page' );
+               $this->doPageEdit( $user, $talkTarget, 'Create Talk page' );
+
+               $rc = $this->getExternalRC( $subjectTarget );
+               $rc->save();
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'external' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'external',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testCategorizeTypeParameter() {
+               $user = $this->getLoggedInTestUser();
+               $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $categoryTarget = new TitleValue( NS_CATEGORY, 'ApiQueryRecentChangesIntegrationTestCategory' );
+               $this->doPageEdits(
+                       $user,
+                       [
+                               [
+                                       'target' => $categoryTarget,
+                                       'summary' => 'Create the category',
+                               ],
+                               [
+                                       'target' => $subjectTarget,
+                                       'summary' => 'Create the page and add it to the category',
+                               ],
+                       ]
+               );
+               $title = Title::newFromLinkTarget( $subjectTarget );
+               $revision = Revision::newFromTitle( $title );
+
+               $rc = RecentChange::newForCategorization(
+                       $revision->getTimestamp(),
+                       Title::newFromLinkTarget( $categoryTarget ),
+                       $user,
+                       $revision->getComment(),
+                       $title,
+                       0,
+                       $revision->getId(),
+                       null,
+                       false
+               );
+               $rc->save();
+
+               $result = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rctype' => 'categorize' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'categorize',
+                                       'ns' => $categoryTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $categoryTarget ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $result )
+               );
+       }
+
+       public function testLimitParam() {
+               $target1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $target2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $target3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage2' );
+               $this->doPageEdits(
+                       $this->getLoggedInTestUser(),
+                       [
+                               [
+                                       'target' => $target1,
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $target2,
+                                       'summary' => 'Create Talk page',
+                               ],
+                               [
+                                       'target' => $target3,
+                                       'summary' => 'Create the page',
+                               ],
+                       ]
+               );
+
+               $resultWithoutLimit = $this->doListRecentChangesRequest( [ 'rcprop' => 'title' ] );
+               $resultWithLimit = $this->doListRecentChangesRequest( [ 'rclimit' => 2, 'rcprop' => 'title' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target3->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target3 )
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target2->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target2 )
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target1->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target1 )
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultWithoutLimit )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target3->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target3 )
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target2->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target2 )
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultWithLimit )
+               );
+               $this->assertArrayHasKey( 'continue', $resultWithLimit[0] );
+               $this->assertArrayHasKey( 'rccontinue', $resultWithLimit[0]['continue'] );
+       }
+
+       public function testAllRevParam() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdits(
+                       $this->getLoggedInTestUser(),
+                       [
+                               [
+                                       'target' => $target,
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $target,
+                                       'summary' => 'Change the content',
+                               ],
+                       ]
+               );
+
+               $resultAllRev = $this->doListRecentChangesRequest( [ 'rcprop' => 'title', 'rcallrev' => '', ] );
+               $resultNoAllRev = $this->doListRecentChangesRequest( [ 'rcprop' => 'title' ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'edit',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultNoAllRev )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'edit',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultAllRev )
+               );
+       }
+
+       public function testDirParams() {
+               $subjectTarget = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $talkTarget = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdits(
+                       $this->getLoggedInTestUser(),
+                       [
+                               [
+                                       'target' => $subjectTarget,
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $talkTarget,
+                                       'summary' => 'Create Talk page',
+                               ],
+                       ]
+               );
+
+               $resultDirOlder = $this->doListRecentChangesRequest(
+                       [ 'rcdir' => 'older', 'rcprop' => 'title' ]
+               );
+               $resultDirNewer = $this->doListRecentChangesRequest(
+                       [ 'rcdir' => 'newer', 'rcprop' => 'title' ]
+               );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $talkTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $talkTarget )
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget )
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultDirOlder )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $subjectTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $subjectTarget )
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $talkTarget->getNamespace(),
+                                       'title' => $this->getPrefixedText( $talkTarget )
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $resultDirNewer )
+               );
+       }
+
+       public function testStartEndParams() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
+
+               $resultStart = $this->doListRecentChangesRequest( [
+                       'rcstart' => '20010115000000',
+                       'rcdir' => 'newer',
+                       'rcprop' => 'title',
+               ] );
+               $resultEnd = $this->doListRecentChangesRequest( [
+                       'rcend' => '20010115000000',
+                       'rcdir' => 'newer',
+                       'rcprop' => 'title',
+               ] );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target ),
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $resultStart )
+               );
+               $this->assertEmpty( $this->getItemsFromApiResponse( $resultEnd ) );
+       }
+
+       public function testContinueParam() {
+               $target1 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $target2 = new TitleValue( 1, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $target3 = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage2' );
+               $this->doPageEdits(
+                       $this->getLoggedInTestUser(),
+                       [
+                               [
+                                       'target' => $target1,
+                                       'summary' => 'Create the page',
+                               ],
+                               [
+                                       'target' => $target2,
+                                       'summary' => 'Create Talk page',
+                               ],
+                               [
+                                       'target' => $target3,
+                                       'summary' => 'Create the page',
+                               ],
+                       ]
+               );
+
+               $firstResult = $this->doListRecentChangesRequest( [ 'rclimit' => 2, 'rcprop' => 'title' ] );
+               $this->assertArrayHasKey( 'continue', $firstResult[0] );
+               $this->assertArrayHasKey( 'rccontinue', $firstResult[0]['continue'] );
+
+               $continuationParam = $firstResult[0]['continue']['rccontinue'];
+
+               $continuedResult = $this->doListRecentChangesRequest(
+                       [ 'rccontinue' => $continuationParam, 'rcprop' => 'title' ]
+               );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target3->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target3 ),
+                               ],
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target2->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target2 ),
+                               ],
+                       ],
+                       $this->getItemsFromApiResponse( $firstResult )
+               );
+               $this->assertEquals(
+                       [
+                               [
+                                       'type' => 'new',
+                                       'ns' => $target1->getNamespace(),
+                                       'title' => $this->getPrefixedText( $target1 )
+                               ]
+                       ],
+                       $this->getItemsFromApiResponse( $continuedResult )
+               );
+       }
+
+       public function testGeneratorRecentChangesPropInfo_returnsRCPages() {
+               $target = new TitleValue( 0, 'ApiQueryRecentChangesIntegrationTestPage' );
+               $this->doPageEdit( $this->getLoggedInTestUser(), $target, 'Create the page' );
+
+               $result = $this->doGeneratorRecentChangesRequest( [ 'prop' => 'info' ] );
+
+               $this->assertArrayHasKey( 'query', $result[0] );
+               $this->assertArrayHasKey( 'pages', $result[0]['query'] );
+
+               // $result[0]['query']['pages'] uses page ids as keys. Page ids don't matter here, so drop them
+               $pages = array_values( $result[0]['query']['pages'] );
+
+               $this->assertCount( 1, $pages );
+               $this->assertArraySubset(
+                       [
+                               'ns' => $target->getNamespace(),
+                               'title' => $this->getPrefixedText( $target ),
+                               'new' => true,
+                       ],
+                       $pages[0]
+               );
+       }
+
+}
index 53a4f7b..f745541 100644 (file)
@@ -1,4 +1,8 @@
 <?php
+
+/**
+ * @covers CollationFa
+ */
 class CollationFaTest extends MediaWikiTestCase {
 
        /*
@@ -9,9 +13,7 @@ class CollationFaTest extends MediaWikiTestCase {
 
        public function setUp() {
                parent::setUp();
-               if ( !extension_loaded( 'intl' ) ) {
-                       $this->markTestSkipped( "PHP extension 'intl' is not loaded, skipping." );
-               }
+               $this->checkPHPExtension( 'intl' );
        }
 
        /**
index 5d5317b..d688928 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers CustomUppercaseCollation
+ */
 class CustomUppercaseCollationTest extends MediaWikiTestCase {
 
        public function setUp() {
index 1bd2eb0..1462c36 100644 (file)
@@ -332,7 +332,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
                }
        }
 
-       /*
+       /**
+        * @covers ContentHandler::getAutosummary
+        *
         * Test if we become a "Created blank page" summary from getAutoSummary if no Content added to
         * page.
         */
@@ -374,11 +376,17 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
        */
 
+       /**
+        * @covers ContentHandler::supportsCategories
+        */
        public function testSupportsCategories() {
                $handler = new DummyContentHandlerForTesting( CONTENT_MODEL_WIKITEXT );
                $this->assertTrue( $handler->supportsCategories(), 'content model supports categories' );
        }
 
+       /**
+        * @covers ContentHandler::supportsDirectEditing
+        */
        public function testSupportsDirectEditing() {
                $handler = new DummyContentHandlerForTesting( CONTENT_MODEL_JSON );
                $this->assertFalse( $handler->supportsDirectEditing(), 'direct editing is not supported' );
@@ -407,6 +415,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers ContentHandler::getForModelID
         * @dataProvider provideGetModelForID
         */
        public function testGetModelForID( $modelId, $handlerClass ) {
@@ -415,6 +424,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertInstanceOf( $handlerClass, $handler );
        }
 
+       /**
+        * @covers ContentHandler::getFieldsForSearchIndex
+        */
        public function testGetFieldsForSearchIndex() {
                $searchEngine = $this->newSearchEngine();
 
index d2078d7..1e82fdd 100644 (file)
@@ -83,6 +83,7 @@ class CssContentTest extends JavaScriptContentTest {
        }
 
        /**
+        * @covers CssContent::getRedirectTarget
         * @dataProvider provideGetRedirectTarget
         */
        public function testGetRedirectTarget( $title, $text ) {
index 65efcc9..ad9d419 100644 (file)
@@ -2,6 +2,8 @@
 
 /**
  * @group ContentHandler
+ *
+ * @covers FileContentHandler
  */
 class FileContentHandlerTest extends MediaWikiLangTestCase {
        /**
index 1c746bc..434e17c 100644 (file)
@@ -294,6 +294,7 @@ class JavaScriptContentTest extends TextContentTest {
        }
 
        /**
+        * @covers JavaScriptContent::getRedirectTarget
         * @dataProvider provideGetRedirectTarget
         */
        public function testGetRedirectTarget( $title, $text ) {
index 7d9f74e..a85215b 100644 (file)
@@ -4,6 +4,9 @@
  * @group ContentHandler
  */
 class TextContentHandlerTest extends MediaWikiLangTestCase {
+       /**
+        * @covers TextContentHandler::supportsDirectEditing
+        */
        public function testSupportsDirectEditing() {
                $handler = new TextContentHandler();
                $this->assertTrue( $handler->supportsDirectEditing(), 'direct editing is supported' );
index 77cfb92..02f82f4 100644 (file)
@@ -115,6 +115,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $this->assertEquals( $supported, $this->handler->isSupportedFormat( $format ) );
        }
 
+       /**
+        * @covers WikitextContentHandler::supportsDirectEditing
+        */
        public function testSupportsDirectEditing() {
                $handler = new WikiTextContentHandler();
                $this->assertTrue( $handler->supportsDirectEditing(), 'direct editing is supported' );
@@ -349,6 +352,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
        }
        */
 
+       /**
+        * @covers WikitextContentHandler::getDataForSearchIndex
+        */
        public function testDataIndexFieldsFile() {
                $mockEngine = $this->createMock( 'SearchEngine' );
                $title = Title::newFromText( 'Somefile.jpg', NS_FILE );
index f1b54f6..1bdbe01 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers WikiTextStructure
+ */
 class WikitextStructureTest extends MediaWikiLangTestCase {
 
        private function getMockTitle() {
index f8ab7f4..a8e7f89 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\DBError;
+use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\LoadBalancer;
 
 /**
@@ -24,7 +26,7 @@ use Wikimedia\Rdbms\LoadBalancer;
  * @file
  */
 class LoadBalancerTest extends MediaWikiTestCase {
-       public function testLBSimpleServer() {
+       public function testWithoutReplica() {
                global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
 
                $servers = [
@@ -48,10 +50,11 @@ class LoadBalancerTest extends MediaWikiTestCase {
                $dbw = $lb->getConnection( DB_MASTER );
                $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
                $this->assertTrue( $dbw->getFlag( $dbw::DBO_TRX ), "DBO_TRX set on master" );
+               $this->assertWriteAllowed( $dbw );
 
                $dbr = $lb->getConnection( DB_REPLICA );
                $this->assertTrue( $dbr->getLBInfo( 'master' ), 'DB_REPLICA also gets the master' );
-               $this->assertTrue( $dbw->getFlag( $dbw::DBO_TRX ), "DBO_TRX set on replica" );
+               $this->assertTrue( $dbr->getFlag( $dbw::DBO_TRX ), "DBO_TRX set on replica" );
 
                $dbwAuto = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTO );
                $this->assertFalse( $dbwAuto->getFlag( $dbw::DBO_TRX ), "No DBO_TRX with CONN_TRX_AUTO" );
@@ -69,7 +72,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
                $lb->closeAll();
        }
 
-       public function testLBSimpleServers() {
+       public function testWithReplica() {
                global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
 
                $servers = [
@@ -83,7 +86,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
                                'load'        => 0,
                                'flags'       => DBO_TRX // REPEATABLE-READ for consistency
                        ],
-                       [ // emulated slave
+                       [ // emulated replica
                                'host'        => $wgDBserver,
                                'dbname'      => $wgDBname,
                                'user'        => $wgDBuser,
@@ -108,14 +111,16 @@ class LoadBalancerTest extends MediaWikiTestCase {
                        $dbw->getLBInfo( 'clusterMasterHost' ),
                        'cluster master set' );
                $this->assertTrue( $dbw->getFlag( $dbw::DBO_TRX ), "DBO_TRX set on master" );
+               $this->assertWriteAllowed( $dbw );
 
                $dbr = $lb->getConnection( DB_REPLICA );
-               $this->assertTrue( $dbr->getLBInfo( 'replica' ), 'slave shows as slave' );
+               $this->assertTrue( $dbr->getLBInfo( 'replica' ), 'replica shows as replica' );
                $this->assertEquals(
                        ( $wgDBserver != '' ) ? $wgDBserver : 'localhost',
                        $dbr->getLBInfo( 'clusterMasterHost' ),
                        'cluster master set' );
-               $this->assertTrue( $dbw->getFlag( $dbw::DBO_TRX ), "DBO_TRX set on replica" );
+               $this->assertTrue( $dbr->getFlag( $dbw::DBO_TRX ), "DBO_TRX set on replica" );
+               $this->assertWriteForbidden( $dbr );
 
                $dbwAuto = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTO );
                $this->assertFalse( $dbwAuto->getFlag( $dbw::DBO_TRX ), "No DBO_TRX with CONN_TRX_AUTO" );
@@ -132,4 +137,30 @@ class LoadBalancerTest extends MediaWikiTestCase {
 
                $lb->closeAll();
        }
+
+       private function assertWriteForbidden( IDatabase $db ) {
+               try {
+                       $db->delete( 'user', [ 'user_id' => 57634126 ], 'TEST' );
+                       $this->fail( 'Write operation should have failed!' );
+               } catch ( DBError $ex ) {
+                       // check that the exception message contains "Write operation"
+                       $constraint = new PHPUnit_Framework_Constraint_StringContains( 'Write operation' );
+
+                       if ( !$constraint->evaluate( $ex->getMessage(), '', true ) ) {
+                               // re-throw original error, to preserve stack trace
+                               throw $ex;
+                       }
+               } finally {
+                       $db->rollback( __METHOD__, 'flush' );
+               }
+       }
+
+       private function assertWriteAllowed( IDatabase $db ) {
+               try {
+                       $this->assertNotSame( false, $db->delete( 'user', [ 'user_id' => 57634126 ] ) );
+               } finally {
+                       $db->rollback( __METHOD__, 'flush' );
+               }
+       }
+
 }
index 938397a..915a186 100644 (file)
@@ -23,6 +23,9 @@ namespace MediaWiki\Logger\Monolog;
 use MediaWikiTestCase;
 use PHPUnit_Framework_Error_Notice;
 
+/**
+ * @covers \MediaWiki\Logger\Monolog\AvroFormatter
+ */
 class AvroFormatterTest extends MediaWikiTestCase {
 
        protected function setUp() {
index 88cd2dd..a69b0bf 100644 (file)
@@ -24,6 +24,9 @@ use MediaWikiTestCase;
 use Monolog\Logger;
 use Wikimedia\TestingAccessWrapper;
 
+/**
+ * @covers \MediaWiki\Logger\Monolog\KafkaHandler
+ */
 class KafkaHandlerTest extends MediaWikiTestCase {
 
        protected function setUp() {
index 4c0a5fa..ddc0798 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @covers LinksUpdate
  * @group LinksUpdate
  * @group Database
  * ^--- make sure temporary tables are used.
diff --git a/tests/phpunit/includes/editpage/TextboxBuilderTest.php b/tests/phpunit/includes/editpage/TextboxBuilderTest.php
new file mode 100644 (file)
index 0000000..668badd
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Copyright (C) 2017 Kunal Mehta <legoktm@member.fsf.org>
+ *
+ * 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.
+ *
+ */
+
+namespace MediaWiki\Tests\EditPage;
+
+use Language;
+use MediaWiki\EditPage\TextboxBuilder;
+use MediaWikiTestCase;
+use Title;
+use User;
+
+/**
+ * @covers \MediaWiki\EditPage\TextboxBuilder
+ */
+class TextboxBuilderTest extends MediaWikiTestCase {
+
+       public function provideAddNewLineAtEnd() {
+               return [
+                       [ '', '' ],
+                       [ 'foo', "foo\n" ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideAddNewLineAtEnd
+        */
+       public function testAddNewLineAtEnd( $input, $expected ) {
+               $builder = new TextboxBuilder();
+               $this->assertSame( $expected, $builder->addNewLineAtEnd( $input ) );
+       }
+
+       public function testBuildTextboxAttribs() {
+               $user = new User();
+               $user->setOption( 'editfont', 'monospace' );
+
+               $title = $this->getMockBuilder( Title::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $title->expects( $this->any() )
+                       ->method( 'getPageLanguage' )
+                       ->will( $this->returnValue( Language::factory( 'en' ) ) );
+
+               $builder = new TextboxBuilder();
+               $attribs = $builder->buildTextboxAttribs(
+                       'mw-textbox1',
+                       [ 'class' => 'foo bar', 'data-foo' => '123', 'rows' => 30 ],
+                       $user,
+                       $title
+               );
+
+               $this->assertInternalType( 'array', $attribs );
+               // custom attrib showed up
+               $this->assertArrayHasKey( 'data-foo', $attribs );
+               // classes merged properly (string)
+               $this->assertSame( 'foo bar mw-editfont-monospace', $attribs['class'] );
+               // overrides in custom attrib worked
+               $this->assertSame( 30, $attribs['rows'] );
+               $this->assertSame( 'en', $attribs['lang'] );
+
+               $attribs2 = $builder->buildTextboxAttribs(
+                       'mw-textbox2', [ 'class' => [ 'foo', 'bar' ] ], $user, $title
+               );
+               // classes merged properly (array)
+               $this->assertSame( [ 'foo', 'bar', 'mw-editfont-monospace' ], $attribs2['class'] );
+
+               $attribs3 = $builder->buildTextboxAttribs(
+                       'mw-textbox3', [], $user, $title
+               );
+               // classes ok when nothing to be merged
+               $this->assertSame( 'mw-editfont-monospace', $attribs3['class'] );
+       }
+}
index 800c2fc..205df9c 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers MigrateFileRepoLayout
+ */
 class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
        protected $tmpPrefix;
        protected $migratorMock;
index 82ff12e..6f04c66 100644 (file)
@@ -1,4 +1,8 @@
 <?php
+
+/**
+ * @covers RepoGroup
+ */
 class RepoGroupTest extends MediaWikiTestCase {
 
        function testHasForeignRepoNegative() {
index 5b5f1b0..62e1026 100644 (file)
@@ -6,6 +6,7 @@ class FileTest extends MediaWikiMediaTestCase {
         * @param string $filename
         * @param bool $expected
         * @dataProvider providerCanAnimate
+        * @covers File::canAnimateThumbIfAppropriate
         */
        function testCanAnimateThumbIfAppropriate( $filename, $expected ) {
                $this->setMwGlobals( 'wgMaxAnimatedGifArea', 9000 );
index b7e0053..98511ca 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 
-
+/**
+ * @covers HTMLForm
+ */
 class HTMLFormTest extends MediaWikiTestCase {
        public function testGetHTML_empty() {
                $form = new HTMLForm( [] );
index 3790e3a..2d73bac 100644 (file)
@@ -497,9 +497,7 @@ class HttpTest extends MediaWikiTestCase {
         * @dataProvider provideCurlConstants
         */
        public function testCurlConstants( $value ) {
-               if ( !extension_loaded( 'curl' ) ) {
-                       $this->markTestSkipped( "PHP extension 'curl' is not loaded, skipping." );
-               }
+               $this->checkPHPExtension( 'curl' );
 
                $this->assertTrue( defined( $value ), $value . ' not defined' );
        }
index 43d626d..f874f6d 100644 (file)
@@ -16,6 +16,7 @@ class RefreshLinksPartitionTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_backlinks
+        * @covers BacklinkJobUtils::partitionBacklinkJob
         */
        public function testRefreshLinks( $ns, $dbKey, $pages ) {
                $title = Title::makeTitle( $ns, $dbKey );
index ca12f6c..12b2c04 100644 (file)
@@ -59,6 +59,20 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
                        [ "0xFF.\nx;", "0xFF.x;" ],
                        [ "5.3.\nx;", "5.3.x;" ],
 
+                       // Cover failure case for incomplete hex literal
+                       [ "0x;", false, false ],
+
+                       // Cover failure case for number with no digits after E
+                       [ "1.4E", false, false ],
+
+                       // Cover failure case for number with several E
+                       [ "1.4EE2", false, false ],
+                       [ "1.4EE", false, false ],
+
+                       // Cover failure case for number with several E (nonconsecutive)
+                       // FIXME: This is invalid, but currently tolerated
+                       [ "1.4E2E3", "1.4E2 E3", false ],
+
                        // Semicolon insertion between an expression having an inline
                        // comment after it, and a statement on the next line (T29046).
                        [
@@ -138,6 +152,7 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
                        [ "var a = 5.;", "var a=5.;" ],
                        [ "5.0.toString();", "5.0.toString();" ],
                        [ "5..toString();", "5..toString();" ],
+                       // Cover failure case for too many decimal points
                        [ "5...toString();", false ],
                        [ "5.\n.toString();", '5..toString();' ],
 
@@ -153,8 +168,9 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
        /**
         * @dataProvider provideCases
         * @covers JavaScriptMinifier::minify
+        * @covers JavaScriptMinifier::parseError
         */
-       public function testJavaScriptMinifierOutput( $code, $expectedOutput, $expectedValid = true ) {
+       public function testMinifyOutput( $code, $expectedOutput, $expectedValid = true ) {
                $minified = JavaScriptMinifier::minify( $code );
 
                // JSMin+'s parser will throw an exception if output is not valid JS.
index f2fe07d..4320d80 100644 (file)
@@ -163,6 +163,9 @@ class BagOStuffTest extends MediaWikiTestCase {
                $this->assertTrue( $this->cache->add( $key, 'test' ) );
        }
 
+       /**
+        * @covers BagOStuff::get
+        */
        public function testGet() {
                $value = [ 'this' => 'is', 'a' => 'test' ];
 
index 4158ea2..03671ac 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers BlockLogFormatter
+ */
 class BlockLogFormatterTest extends LogFormatterTestCase {
 
        /**
index 2337899..0e6855d 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers DeleteLogFormatter
+ */
 class DeleteLogFormatterTest extends LogFormatterTestCase {
 
        /**
index ec12078..80e4c0b 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers ImportLogFormatter
+ */
 class ImportLogFormatterTest extends LogFormatterTestCase {
 
        /**
index 8b9abe4..1978f1b 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers MergeLogFormatter
+ */
 class MergeLogFormatterTest extends LogFormatterTestCase {
 
        /**
index 3433a6a..ebda46b 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers MoveLogFormatter
+ */
 class MoveLogFormatterTest extends LogFormatterTestCase {
 
        /**
index 333fd88..8317e91 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @covers NewUsersLogFormatter
  * @group Database
  */
 class NewUsersLogFormatterTest extends LogFormatterTestCase {
index 2156bdb..0819015 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers PageLangLogFormatter
+ */
 class PageLangLogFormatterTest extends LogFormatterTestCase {
 
        protected function setUp() {
index b680454..0d78ed9 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers PatrolLogFormatter
+ */
 class PatrolLogFormatterTest extends LogFormatterTestCase {
 
        /**
index 1fa7fc2..1c076ca 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers ProtectLogFormatter
+ */
 class ProtectLogFormatterTest extends LogFormatterTestCase {
 
        /**
index f48507d..d081c61 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers RightsLogFormatter
+ */
 class RightsLogFormatterTest extends LogFormatterTestCase {
 
        /**
index 00d93d1..2b4067f 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @covers UploadLogFormatter
+ */
 class UploadLogFormatterTest extends LogFormatterTestCase {
 
        /**
index aaa3ac4..7cd9caf 100644 (file)
@@ -153,6 +153,7 @@ class GIFHandlerTest extends MediaWikiMediaTestCase {
         * @param string $filename
         * @param float $expectedLength
         * @dataProvider provideGetLength
+        * @covers GIFHandler::getLength
         */
        public function testGetLength( $filename, $expectedLength ) {
                $file = $this->dataFile( $filename, 'image/gif' );
index 32d54df..4933f32 100644 (file)
@@ -142,6 +142,7 @@ class PNGHandlerTest extends MediaWikiMediaTestCase {
         * @param string $filename
         * @param float $expectedLength
         * @dataProvider provideGetLength
+        * @covers PNGHandler::getLength
         */
        public function testGetLength( $filename, $expectedLength ) {
                $file = $this->dataFile( $filename, 'image/png' );
index b8dadaf..ea06bbb 100644 (file)
@@ -1,4 +1,8 @@
 <?php
+
+/**
+ * @covers WebPHandler
+ */
 class WebPHandlerTest extends MediaWikiTestCase {
        public function setUp() {
                parent::setUp();
index 9cb2f94..7eb5582 100644 (file)
@@ -70,6 +70,7 @@ class MemcachedBagOStuffTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider validKeyProvider
+        * @covers MemcachedBagOStuff::validateKeyEncoding
         */
        public function testValidateKeyEncoding( $key ) {
                $this->assertSame( $key, $this->cache->validateKeyEncoding( $key ) );
@@ -86,6 +87,7 @@ class MemcachedBagOStuffTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider invalidKeyProvider
+        * @covers MemcachedBagOStuff::validateKeyEncoding
         */
        public function testValidateKeyEncodingThrowsException( $key ) {
                $this->setExpectedException( 'Exception' );
index f722fe1..4ef4aab 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 /**
  * @group BagOStuff
+ *
+ * @covers RESTBagOStuff
  */
 class RESTBagOStuffTest extends MediaWikiTestCase {
 
index 48c4392..4faace2 100644 (file)
@@ -28,6 +28,7 @@ class ImagePage404Test extends MediaWikiMediaTestCase {
        }
 
        /**
+        * @covers ImagePage::getThumbSizes
         * @dataProvider providerGetThumbSizes
         * @param string $filename
         * @param int $expectedNumberThumbs How many thumbnails to show
index 2b30cfa..8e49bf9 100644 (file)
@@ -21,6 +21,7 @@ class ImagePageTest extends MediaWikiMediaTestCase {
        }
 
        /**
+        * @covers ImagePage::getDisplayWidthHeight
         * @dataProvider providerGetDisplayWidthHeight
         * @param array $dim Array [maxWidth, maxHeight, width, height]
         * @param array $expected Array [width, height] The width and height we expect to display at
@@ -65,6 +66,7 @@ class ImagePageTest extends MediaWikiMediaTestCase {
        }
 
        /**
+        * @covers ImagePage::getThumbSizes
         * @dataProvider providerGetThumbSizes
         * @param string $filename
         * @param int $expectedNumberThumbs How many thumbnails to show
index ad899bd..93ab35c 100644 (file)
@@ -3,6 +3,9 @@
 use Wikimedia\TestingAccessWrapper;
 use Wikimedia\ScopedCallback;
 
+/**
+ * @covers ParserOptions
+ */
 class ParserOptionsTest extends MediaWikiTestCase {
 
        private static function clearCache() {
index d7e72e1..2cf9553 100644 (file)
@@ -406,6 +406,7 @@ class SanitizerTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideIsReservedDataAttribute
+        * @covers Sanitizer::isReservedDataAttribute
         */
        public function testIsReservedDataAttribute( $attr, $expected ) {
                $this->assertSame( $expected, Sanitizer::isReservedDataAttribute( $attr ) );
index d57ad04..6caf3e5 100644 (file)
@@ -9,6 +9,9 @@ abstract class PoolCounterAbstractMock extends PoolCounter {
        }
 }
 
+/**
+ * @covers PoolCounter
+ */
 class PoolCounterTest extends MediaWikiTestCase {
        public function testConstruct() {
                $poolCounterConfig = [
index c9db74f..7d6d7f8 100644 (file)
@@ -29,38 +29,39 @@ class FirejailCommandTest extends PHPUnit_Framework_TestCase {
                // @codingStandardsIgnoreStart
                $env = "'MW_INCLUDE_STDERR=;MW_CPU_LIMIT=180; MW_CGROUP='\'''\''; MW_MEM_LIMIT=307200; MW_FILE_SIZE_LIMIT=102400; MW_WALL_CLOCK_LIMIT=180; MW_USE_LOG_PIPE=yes'";
                // @codingStandardsIgnoreEnd
-               $limit = "$IP/includes/shell/limit.sh";
+               $limit = "/bin/bash '$IP/includes/shell/limit.sh'";
                $profile = "--profile=$IP/includes/shell/firejail.profile";
-               $default = '--noroot --seccomp=@default --private-dev';
+               $blacklist = '--blacklist=' . realpath( MW_CONFIG_FILE );
+               $default = "$blacklist --noroot --seccomp=@default --private-dev";
                return [
                        [
                                'No restrictions',
-                               'ls', 0, "/bin/bash '$limit' ''\''ls'\''' $env"
+                               'ls', 0, "$limit ''\''ls'\''' $env"
                        ],
                        [
                                'default restriction',
                                'ls', Shell::RESTRICT_DEFAULT,
-                               "firejail --quiet $profile $default -- /bin/bash '$limit' ''\''ls'\''' $env"
+                               "$limit 'firejail --quiet $profile $default -- '\''ls'\''' $env"
                        ],
                        [
                                'no network',
                                'ls', Shell::NO_NETWORK,
-                               "firejail --quiet $profile --net=none -- /bin/bash '$limit' ''\''ls'\''' $env"
+                               "$limit 'firejail --quiet $profile --net=none -- '\''ls'\''' $env"
                        ],
                        [
                                'default restriction & no network',
                                'ls', Shell::RESTRICT_DEFAULT | Shell::NO_NETWORK,
-                               "firejail --quiet $profile $default --net=none -- /bin/bash '$limit' ''\''ls'\''' $env"
+                               "$limit 'firejail --quiet $profile $default --net=none -- '\''ls'\''' $env"
                        ],
                        [
                                'seccomp',
                                'ls', Shell::SECCOMP,
-                               "firejail --quiet $profile --seccomp=@default -- /bin/bash '$limit' ''\''ls'\''' $env"
+                               "$limit 'firejail --quiet $profile --seccomp=@default -- '\''ls'\''' $env"
                        ],
                        [
                                'seccomp & no execve',
                                'ls', Shell::SECCOMP | Shell::NO_EXECVE,
-                               "firejail --quiet $profile --seccomp=@default,execve -- /bin/bash '$limit' ''\''ls'\''' $env"
+                               "$limit 'firejail --quiet $profile --shell=none --seccomp=@default,execve -- '\''ls'\''' $env"
                        ],
                ];
        }
@@ -75,7 +76,7 @@ class FirejailCommandTest extends PHPUnit_Framework_TestCase {
                        ->params( $params )
                        ->restrict( $flags );
                $wrapper = TestingAccessWrapper::newFromObject( $command );
-               $output = $wrapper->buildFinalCommand();
+               $output = $wrapper->buildFinalCommand( $wrapper->command );
                $this->assertEquals( $expected, $output[0], $desc );
        }
 
index 9366282..1147805 100644 (file)
@@ -18,6 +18,7 @@ class ContribsPagerTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers ContribsPager::processDateFilter
         * @dataProvider dateFilterOptionProcessingProvider
         * @param array $inputOpts Input options
         * @param array $expectedOpts Expected options
index ede2791..a845938 100644 (file)
@@ -3,6 +3,9 @@
  * @group Database
  */
 
+/**
+ * @covers MIMEsearchPage
+ */
 class SpecialMIMESearchTest extends MediaWikiTestCase {
 
        /** @var MIMEsearchPage */
index 64e78f2..2ecef79 100644 (file)
@@ -5,6 +5,7 @@
 class UncategorizedCategoriesPageTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideTestGetQueryInfoData
+        * @covers UncategorizedCategoriesPage::getQueryInfo
         */
        public function testGetQueryInfo( $msgContent, $expected ) {
                $msg = new RawMessage( $msgContent );
index dd68cdc..bc7493d 100644 (file)
@@ -103,6 +103,8 @@ class UploadBaseTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers UploadBase::verifyUpload
+        *
         * test uploading a 100 bytes file with $wgMaxUploadSize = 100
         *
         * This method should be abstracted so we can test different settings.
@@ -126,6 +128,7 @@ class UploadBaseTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers UploadBase::checkSvgScriptCallback
         * @dataProvider provideCheckSvgScriptCallback
         */
        public function testCheckSvgScriptCallback( $svg, $wellFormed, $filterMatch, $message ) {
@@ -512,6 +515,7 @@ class UploadBaseTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers UploadBase::detectScriptInSvg
         * @dataProvider provideDetectScriptInSvg
         */
        public function testDetectScriptInSvg( $svg, $expected, $message ) {
@@ -552,6 +556,7 @@ class UploadBaseTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers UploadBase::checkXMLEncodingMissmatch
         * @dataProvider provideCheckXMLEncodingMissmatch
         */
        public function testCheckXMLEncodingMissmatch( $fileContents, $evil ) {
index 68b7959..1f578ab 100644 (file)
@@ -3,6 +3,7 @@
 use MediaWiki\Auth\AuthManager;
 
 /**
+ * @covers PasswordReset
  * @group Database
  */
 class PasswordResetTest extends MediaWikiTestCase {
index 2721c18..f004e79 100644 (file)
@@ -903,6 +903,9 @@ class UserTest extends MediaWikiTestCase {
                $block->delete();
        }
 
+       /**
+        * @covers User::isPingLimitable
+        */
        public function testIsPingLimitable() {
                $request = new FauxRequest();
                $request->setIP( '1.2.3.4' );
@@ -939,6 +942,7 @@ class UserTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers User::getExperienceLevel
         * @dataProvider provideExperienceLevel
         */
        public function testExperienceLevel( $editCount, $memberSince, $expLevel ) {
@@ -968,6 +972,9 @@ class UserTest extends MediaWikiTestCase {
                $this->assertEquals( $expLevel, $user->getExperienceLevel() );
        }
 
+       /**
+        * @covers User::getExperienceLevel
+        */
        public function testExperienceLevelAnon() {
                $user = User::newFromName( '10.11.12.13', false );
 
index 017e97d..d80a61c 100644 (file)
@@ -4,6 +4,10 @@
  * Tests for BatchRowUpdate and its components
  *
  * @group db
+ *
+ * @covers BatchRowUpdate
+ * @covers BatchRowIterator
+ * @covers BatchRowWriter
  */
 class BatchRowUpdateTest extends MediaWikiTestCase {
 
index 86c19ae..ac638c6 100644 (file)
@@ -4,6 +4,10 @@
  * @group HKDF
  */
 
+/**
+ * @covers CryptHKDF
+ * @covers MWCryptHKDF
+ */
 class MWCryptHKDFTest extends MediaWikiTestCase {
 
        protected function setUp() {
index ec2746e..b51c14c 100644 (file)
@@ -1,5 +1,9 @@
 <?php
 
+/**
+ * @covers CategoriesRdf
+ * @covers DumpCategoriesAsRdf
+ */
 class CategoriesRdfTest extends MediaWikiLangTestCase {
        public function getCategoryIterator() {
                return [
index bb27626..1730575 100644 (file)
                assert.equal( href, '/wiki/#Fragment', 'empty title with fragment' );
 
                href = util.getUrl( '#Fragment', { action: 'edit' } );
-               assert.equal( href, '/w/index.php?action=edit#Fragment', 'epmty title with query string and fragment' );
+               assert.equal( href, '/w/index.php?action=edit#Fragment', 'empty title with query string and fragment' );
 
                href = util.getUrl( 'Foo:Sandbox \xC4#Fragment \xC4', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Foo:Sandbox_%C3%84&action=edit#Fragment_.C3.84', 'title with query string, fragment, and special characters' );
index 59e1878..26881eb 100644 (file)
@@ -1,5 +1,3 @@
-/* eslint no-undef: "error" */
-/* eslint-env node */
 'use strict';
 const merge = require( 'deepmerge' ),
        password = 'testpass',
index cf9da0c..5eba0e0 100644 (file)
@@ -1,6 +1,3 @@
-/* eslint-env node */
-/* eslint no-undef: "error" */
-/* eslint-disable no-console, comma-dangle */
 'use strict';
 
 const password = 'vagrant',
@@ -51,7 +48,7 @@ exports.config = {
                relPath( './tests/selenium/specs/**/*.js' ),
                relPath( './extensions/*/tests/selenium/specs/**/*.js' ),
                relPath( './extensions/VisualEditor/modules/ve-mw/tests/selenium/specs/**/*.js' ),
-               relPath( './skins/*/tests/selenium/specs/**/*.js' ),
+               relPath( './skins/*/tests/selenium/specs/**/*.js' )
        ],
        // Patterns to exclude.
        exclude: [
@@ -233,7 +230,7 @@ exports.config = {
                // save screenshot
                browser.saveScreenshot( filePath );
                console.log( '\n\tScreenshot location:', filePath, '\n' );
-       },
+       }
        //
        // Hook that gets executed after the suite has ended
        // afterSuite: function (suite) {