Merge "Display both subject and talk subpages for Special:MovePage"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 16 Oct 2016 02:40:49 +0000 (02:40 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 16 Oct 2016 02:40:49 +0000 (02:40 +0000)
187 files changed:
CREDITS
RELEASE-NOTES-1.28
autoload.php
docs/hooks.txt
includes/Block.php
includes/Defines.php
includes/EditPage.php
includes/ForkController.php
includes/MWGrants.php [new file with mode: 0644]
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/MimeMagic.php
includes/Revision.php
includes/ServiceWiring.php
includes/TemplatesOnThisPageFormatter.php
includes/actions/InfoAction.php
includes/api/ApiImageRotate.php
includes/api/ApiLogin.php
includes/api/ApiPageSet.php
includes/api/ApiParse.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/i18n/bg.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/it.json
includes/api/i18n/ko.json
includes/api/i18n/lb.json
includes/api/i18n/pl.json
includes/api/i18n/pt.json
includes/api/i18n/sv.json
includes/auth/AuthManager.php
includes/cache/MessageCache.php
includes/content/ContentHandler.php
includes/content/WikiTextStructure.php
includes/deferred/DeferredUpdates.php
includes/diff/DifferenceEngine.php
includes/htmlform/fields/HTMLDateTimeField.php
includes/installer/MysqlUpdater.php
includes/installer/i18n/bg.json
includes/installer/i18n/fi.json
includes/installer/i18n/ko.json
includes/installer/i18n/lt.json
includes/installer/i18n/nb.json
includes/installer/i18n/ne.json
includes/installer/i18n/nn.json
includes/installer/i18n/vi.json
includes/libs/IEContentAnalyzer.php [deleted file]
includes/libs/XmlTypeCheck.php [deleted file]
includes/libs/mime/IEContentAnalyzer.php [new file with mode: 0644]
includes/libs/mime/MimeAnalyzer.php [new file with mode: 0644]
includes/libs/mime/XmlTypeCheck.php [new file with mode: 0644]
includes/libs/mime/defines.php [new file with mode: 0644]
includes/libs/mime/mime.info [new file with mode: 0644]
includes/libs/mime/mime.types [new file with mode: 0644]
includes/libs/objectcache/WANObjectCache.php
includes/libs/rdbms/TransactionProfiler.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php
includes/mime.info [deleted file]
includes/mime.types [deleted file]
includes/objectcache/ObjectCache.php
includes/page/Article.php
includes/page/WikiPage.php
includes/parser/Parser.php
includes/resourceloader/ResourceLoader.php
includes/session/SessionBackend.php
includes/skins/BaseTemplate.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialConfirmemail.php
includes/specials/SpecialEmailInvalidate.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialWatchlist.php
includes/tidy/Balancer.php
includes/utils/MWGrants.php [deleted file]
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageIu.php
languages/classes/LanguageRu.php
languages/classes/LanguageShi.php
languages/classes/LanguageTr.php
languages/data/Names.php
languages/i18n/an.json
languages/i18n/ar.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/crh-cyrl.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dty.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/hak.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/ia.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lij.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mhr.json
languages/i18n/ml.json
languages/i18n/myv.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/olo.json
languages/i18n/or.json
languages/i18n/pl.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sd.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sv.json
languages/i18n/te.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/vi.json
languages/i18n/vro.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesKn.php
languages/messages/MessagesNn.php
maintenance/Doxyfile
maintenance/addRFCandPMIDInterwiki.php
maintenance/archives/patch-rc_ip_modify.sql [new file with mode: 0644]
maintenance/dev/includes/router.php
resources/Resources.php
resources/src/jquery/jquery.makeCollapsible.js
resources/src/mediawiki.action/mediawiki.action.view.metadata.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.special/mediawiki.special.apisandbox.css
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki.ui/components/anchors.less
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki/mediawiki.experiments.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.toc.js
resources/src/mediawiki/page/gallery-slideshow.js
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MimeMagicTest.php [deleted file]
tests/phpunit/includes/XmlSelectTest.php
tests/phpunit/includes/api/ApiLoginTest.php
tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
tests/phpunit/languages/classes/LanguageTrTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js

diff --git a/CREDITS b/CREDITS
index dca597e..46d5c9c 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -33,6 +33,7 @@ following names for their contribution to the product.
 * David McCabe
 * Derk-Jan Hartman
 * Domas Mituzas
+* Ed Sanders
 * Emufarmers
 * Fran Rogers
 * Greg Sabino Mullane
@@ -51,6 +52,7 @@ following names for their contribution to the product.
 * John Du Hart
 * Jon Harald Søby
 * Juliano F. Ravasi
+* JuneHyeon Bae
 * Leo Koppelkamm
 * Leon Weber
 * Leslie Hoare
@@ -157,7 +159,6 @@ following names for their contribution to the product.
 * Jimmy Xu
 * John N
 * Jonathan Wiltshire
-* JuneHyeon Bae
 * Jure Kajzer
 * Karun Dambiec
 * Katie Filbert
index a31fa49..75fc139 100644 (file)
@@ -119,6 +119,8 @@ production.
   module without listing them all explicitly.
 * (T146770) It is now possible to assert that the current user is a specific
   named user, using the 'assertuser' parameter.
+* (T141963) Added a 'known' property when missing-but-known titles (e.g. from
+  the 'TitleIsAlwaysKnown' hook) are output in various modules.
 
 === Action API internal changes in 1.28 ===
 * Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
@@ -173,7 +175,8 @@ changes to languages because of Phabricator reports.
   BASAbali, M. Adiputra, Naval Scene, Nemo bis, NoiX180, and 아라.
 * (T135867) shn (Shan), thanks to translators Khun Sar, Piangpha,
   Saiddzone Saimawnkham, Saosukham, and Sengwan.
-* Czech (cs) and Slovak (sk) set as reciprocal fallbacks
+* Czech (cs) and Slovak (sk) set as reciprocal fallbacks.
+* (T146744) Livvi-Karelian (olo) namespace messages created thanks to translator Ilja.mos.
 
 === Other changes in 1.28 ===
 * (T128697) Improved handling of large diffs.
@@ -224,8 +227,8 @@ changes to languages because of Phabricator reports.
   migrate to using the same functions on a ProxyLookup instance, obtainable from
   MediaWikiServices.
 * The ArticleAfterFetchContent, ArticleInsertComplete, ArticleSave, ArticleSaveComplete,
-  ArticleViewCustom, EditPageGetDiffText, EditPageGetPreviewText and ShowRawCssJs hooks
-  will now emit deprecation warnings if used.
+  ArticleViewCustom, EditFilterMerged, EditPageGetDiffText, EditPageGetPreviewText and
+  ShowRawCssJs hooks will now emit deprecation warnings if used.
 
 == Compatibility ==
 
index 748d954..636cb59 100644 (file)
@@ -586,7 +586,7 @@ $wgAutoloadLocalClasses = [
        'IContextSource' => __DIR__ . '/includes/context/IContextSource.php',
        'IDBAccessObject' => __DIR__ . '/includes/dao/IDBAccessObject.php',
        'IDatabase' => __DIR__ . '/includes/libs/rdbms/database/IDatabase.php',
-       'IEContentAnalyzer' => __DIR__ . '/includes/libs/IEContentAnalyzer.php',
+       'IEContentAnalyzer' => __DIR__ . '/includes/libs/mime/IEContentAnalyzer.php',
        'IEUrlExtension' => __DIR__ . '/includes/libs/IEUrlExtension.php',
        'IExpiringStore' => __DIR__ . '/includes/libs/objectcache/IExpiringStore.php',
        'IJobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
@@ -781,7 +781,7 @@ $wgAutoloadLocalClasses = [
        'MWExceptionHandler' => __DIR__ . '/includes/exception/MWExceptionHandler.php',
        'MWExceptionRenderer' => __DIR__ . '/includes/exception/MWExceptionRenderer.php',
        'MWFileProps' => __DIR__ . '/includes/utils/MWFileProps.php',
-       'MWGrants' => __DIR__ . '/includes/utils/MWGrants.php',
+       'MWGrants' => __DIR__ . '/includes/MWGrants.php',
        'MWHttpRequest' => __DIR__ . '/includes/http/MWHttpRequest.php',
        'MWLBFactory' => __DIR__ . '/includes/db/MWLBFactory.php',
        'MWMemcached' => __DIR__ . '/includes/compat/MemcachedClientCompat.php',
@@ -943,6 +943,7 @@ $wgAutoloadLocalClasses = [
        'MessageSpecifier' => __DIR__ . '/includes/libs/MessageSpecifier.php',
        'MigrateFileRepoLayout' => __DIR__ . '/maintenance/migrateFileRepoLayout.php',
        'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php',
+       'MimeAnalyzer' => __DIR__ . '/includes/libs/mime/MimeAnalyzer.php',
        'MimeMagic' => __DIR__ . '/includes/MimeMagic.php',
        'MinifyScript' => __DIR__ . '/maintenance/minify.php',
        'MostcategoriesPage' => __DIR__ . '/includes/specials/SpecialMostcategories.php',
@@ -1580,7 +1581,7 @@ $wgAutoloadLocalClasses = [
        'XmlDumpWriter' => __DIR__ . '/includes/export/XmlDumpWriter.php',
        'XmlJsCode' => __DIR__ . '/includes/Xml.php',
        'XmlSelect' => __DIR__ . '/includes/XmlSelect.php',
-       'XmlTypeCheck' => __DIR__ . '/includes/libs/XmlTypeCheck.php',
+       'XmlTypeCheck' => __DIR__ . '/includes/libs/mime/XmlTypeCheck.php',
        'ZhConverter' => __DIR__ . '/languages/classes/LanguageZh.php',
        'ZipDirectoryReader' => __DIR__ . '/includes/utils/ZipDirectoryReader.php',
        'ZipDirectoryReaderError' => __DIR__ . '/includes/utils/ZipDirectoryReader.php',
index 3b3741a..562d7b4 100644 (file)
@@ -3791,6 +3791,10 @@ $content: the Content to generate updates for (or null, if the Content could not
 due to an error)
 &$updates: the array of DataUpdate objects. Hook function may want to add to it.
 
+'WikiPageFactory': Override WikiPage class used for a title
+$title: Title of the page
+&$page: Variable to set the created WikiPage to.
+
 'XmlDumpWriterOpenPage': Called at the end of XmlDumpWriter::openPage, to allow
 extra metadata to be added.
 $obj: The XmlDumpWriter object.
index 098d51c..a11ba26 100644 (file)
@@ -692,11 +692,13 @@ class Block {
        public static function isWhitelistedFromAutoblocks( $ip ) {
                // Try to get the autoblock_whitelist from the cache, as it's faster
                // than getting the msg raw and explode()'ing it.
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                $lines = $cache->getWithSetCallback(
                        wfMemcKey( 'ipb', 'autoblock', 'whitelist' ),
                        $cache::TTL_DAY,
-                       function () {
+                       function ( $curValue, &$ttl, array &$setOpts ) {
+                               $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) );
+
                                return explode( "\n",
                                        wfMessage( 'autoblock_whitelist' )->inContentLanguage()->plain() );
                        }
index 02930ea..0616898 100644 (file)
@@ -97,32 +97,7 @@ define( 'CACHE_MEMCACHED', 2 );  // MemCached, must specify servers in $wgMemCac
 define( 'CACHE_ACCEL', 3 );      // APC, XCache or WinCache
 /**@}*/
 
-/**@{
- * Media types.
- * This defines constants for the value returned by File::getMediaType()
- */
-// unknown format
-define( 'MEDIATYPE_UNKNOWN', 'UNKNOWN' );
-// some bitmap image or image source (like psd, etc). Can't scale up.
-define( 'MEDIATYPE_BITMAP', 'BITMAP' );
-// some vector drawing (SVG, WMF, PS, ...) or image source (oo-draw, etc). Can scale up.
-define( 'MEDIATYPE_DRAWING', 'DRAWING' );
-// simple audio file (ogg, mp3, wav, midi, whatever)
-define( 'MEDIATYPE_AUDIO', 'AUDIO' );
-// simple video file (ogg, mpg, etc;
-// no not include formats here that may contain executable sections or scripts!)
-define( 'MEDIATYPE_VIDEO', 'VIDEO' );
-// Scriptable Multimedia (flash, advanced video container formats, etc)
-define( 'MEDIATYPE_MULTIMEDIA', 'MULTIMEDIA' );
-// Office Documents, Spreadsheets (office formats possibly containing apples, scripts, etc)
-define( 'MEDIATYPE_OFFICE', 'OFFICE' );
-// Plain text (possibly containing program code or scripts)
-define( 'MEDIATYPE_TEXT', 'TEXT' );
-// binary executable
-define( 'MEDIATYPE_EXECUTABLE', 'EXECUTABLE' );
-// archive file (zip, tar, etc)
-define( 'MEDIATYPE_ARCHIVE', 'ARCHIVE' );
-/**@}*/
+require_once __DIR__ . '/libs/mime/defines.php';
 
 /**@{
  * Antivirus result codes, for use in $wgAntivirusSetup.
index 8226da5..1c13d56 100644 (file)
@@ -1613,7 +1613,8 @@ class EditPage {
        protected function runPostMergeFilters( Content $content, Status $status, User $user ) {
                // Run old style post-section-merge edit filter
                if ( !ContentHandler::runLegacyHooks( 'EditFilterMerged',
-                       [ $this, $content, &$this->hookError, $this->summary ]
+                       [ $this, $content, &$this->hookError, $this->summary ],
+                       '1.21'
                ) ) {
                        # Error messages etc. could be handled within the hook...
                        $status->fatal( 'hookaborted' );
@@ -1639,7 +1640,7 @@ class EditPage {
                                // being set. This is used by ConfirmEdit to display a captcha
                                // without any error message cruft.
                        } else {
-                               $this->hookError = $status->getWikiText();
+                               $this->hookError = $this->formatStatusErrors( $status );
                        }
                        // Use the existing $status->value if the hook set it
                        if ( !$status->value ) {
@@ -1649,7 +1650,7 @@ class EditPage {
                } elseif ( !$status->isOK() ) {
                        # ...or the hook could be expecting us to produce an error
                        // FIXME this sucks, we should just use the Status object throughout
-                       $this->hookError = $status->getWikiText();
+                       $this->hookError = $this->formatStatusErrors( $status );
                        $status->fatal( 'hookaborted' );
                        $status->value = self::AS_HOOK_ERROR_EXPECTED;
                        return false;
@@ -1658,6 +1659,26 @@ class EditPage {
                return true;
        }
 
+       /**
+        * Wrap status errors in an errorbox for increased visiblity
+        *
+        * @param Status $status
+        * @return string
+        */
+       private function formatStatusErrors( Status $status ) {
+               $errmsg = $status->getHTML(
+                       'edit-error-short',
+                       'edit-error-long',
+                       $this->context->getLanguage()
+               );
+               return <<<ERROR
+<div class="errorbox">
+{$errmsg}
+</div>
+<br clear="all" />
+ERROR;
+       }
+
        /**
         * Return the summary to be used for a new section.
         *
index 2725753..2dde17b 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class for managing forking command line scripts.
@@ -150,7 +151,7 @@ class ForkController {
        protected function prepareEnvironment() {
                global $wgMemc;
                // Don't share DB, storage, or memcached connections
-               wfGetLBFactory()->destroyInstance();
+               MediaWikiServices::resetChildProcessServices();
                FileBackendGroup::destroySingleton();
                LockManagerGroup::destroySingletons();
                JobQueueGroup::destroySingletons();
diff --git a/includes/MWGrants.php b/includes/MWGrants.php
new file mode 100644 (file)
index 0000000..58efdc7
--- /dev/null
@@ -0,0 +1,214 @@
+<?php
+/**
+ * Functions and constants to deal with grants
+ *
+ * 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
+ */
+
+/**
+ * A collection of public static functions to deal with grants.
+ */
+class MWGrants {
+
+       /**
+        * List all known grants.
+        * @return array
+        */
+       public static function getValidGrants() {
+               global $wgGrantPermissions;
+
+               return array_keys( $wgGrantPermissions );
+       }
+
+       /**
+        * Map all grants to corresponding user rights.
+        * @return array grant => array of rights
+        */
+       public static function getRightsByGrant() {
+               global $wgGrantPermissions;
+
+               $res = [];
+               foreach ( $wgGrantPermissions as $grant => $rights ) {
+                       $res[$grant] = array_keys( array_filter( $rights ) );
+               }
+               return $res;
+       }
+
+       /**
+        * Fetch the display name of the grant
+        * @param string $grant
+        * @param Language|string|null $lang
+        * @return string Grant description
+        */
+       public static function grantName( $grant, $lang = null ) {
+               // Give grep a chance to find the usages:
+               // grant-blockusers, grant-createeditmovepage, grant-delete,
+               // grant-editinterface, grant-editmycssjs, grant-editmywatchlist,
+               // grant-editpage, grant-editprotected, grant-highvolume,
+               // grant-oversight, grant-patrol, grant-protect, grant-rollback,
+               // grant-sendemail, grant-uploadeditmovefile, grant-uploadfile,
+               // grant-basic, grant-viewdeleted, grant-viewmywatchlist,
+               // grant-createaccount
+               $msg = wfMessage( "grant-$grant" );
+               if ( $lang !== null ) {
+                       if ( is_string( $lang ) ) {
+                               $lang = Language::factory( $lang );
+                       }
+                       $msg->inLanguage( $lang );
+               }
+               if ( !$msg->exists() ) {
+                       $msg = wfMessage( 'grant-generic', $grant );
+                       if ( $lang ) {
+                               $msg->inLanguage( $lang );
+                       }
+               }
+               return $msg->text();
+       }
+
+       /**
+        * Fetch the display names for the grants.
+        * @param string[] $grants
+        * @param Language|string|null $lang
+        * @return string[] Corresponding grant descriptions
+        */
+       public static function grantNames( array $grants, $lang = null ) {
+               if ( $lang !== null ) {
+                       if ( is_string( $lang ) ) {
+                               $lang = Language::factory( $lang );
+                       }
+               }
+
+               $ret = [];
+               foreach ( $grants as $grant ) {
+                       $ret[] = self::grantName( $grant, $lang );
+               }
+               return $ret;
+       }
+
+       /**
+        * Fetch the rights allowed by a set of grants.
+        * @param string[]|string $grants
+        * @return string[]
+        */
+       public static function getGrantRights( $grants ) {
+               global $wgGrantPermissions;
+
+               $rights = [];
+               foreach ( (array)$grants as $grant ) {
+                       if ( isset( $wgGrantPermissions[$grant] ) ) {
+                               $rights = array_merge( $rights, array_keys( array_filter( $wgGrantPermissions[$grant] ) ) );
+                       }
+               }
+               return array_unique( $rights );
+       }
+
+       /**
+        * Test that all grants in the list are known.
+        * @param string[] $grants
+        * @return bool
+        */
+       public static function grantsAreValid( array $grants ) {
+               return array_diff( $grants, self::getValidGrants() ) === [];
+       }
+
+       /**
+        * Divide the grants into groups.
+        * @param string[]|null $grantsFilter
+        * @return array Map of (group => (grant list))
+        */
+       public static function getGrantGroups( $grantsFilter = null ) {
+               global $wgGrantPermissions, $wgGrantPermissionGroups;
+
+               if ( is_array( $grantsFilter ) ) {
+                       $grantsFilter = array_flip( $grantsFilter );
+               }
+
+               $groups = [];
+               foreach ( $wgGrantPermissions as $grant => $rights ) {
+                       if ( $grantsFilter !== null && !isset( $grantsFilter[$grant] ) ) {
+                               continue;
+                       }
+                       if ( isset( $wgGrantPermissionGroups[$grant] ) ) {
+                               $groups[$wgGrantPermissionGroups[$grant]][] = $grant;
+                       } else {
+                               $groups['other'][] = $grant;
+                       }
+               }
+
+               return $groups;
+       }
+
+       /**
+        * Get the list of grants that are hidden and should always be granted
+        * @return string[]
+        */
+       public static function getHiddenGrants() {
+               global $wgGrantPermissionGroups;
+
+               $grants = [];
+               foreach ( $wgGrantPermissionGroups as $grant => $group ) {
+                       if ( $group === 'hidden' ) {
+                               $grants[] = $grant;
+                       }
+               }
+               return $grants;
+       }
+
+       /**
+        * Generate a link to Special:ListGrants for a particular grant name.
+        *
+        * This should be used to link end users to a full description of what
+        * rights they are giving when they authorize a grant.
+        *
+        * @param string $grant the grant name
+        * @param Language|string|null $lang
+        * @return string (proto-relative) HTML link
+        */
+       public static function getGrantsLink( $grant, $lang = null ) {
+               return \Linker::linkKnown(
+                       \SpecialPage::getTitleFor( 'Listgrants', false, $grant ),
+                       htmlspecialchars( self::grantName( $grant, $lang ) )
+               );
+       }
+
+       /**
+        * Generate wikitext to display a list of grants
+        * @param string[]|null $grantsFilter If non-null, only display these grants.
+        * @param Language|string|null $lang
+        * @return string Wikitext
+        */
+       public static function getGrantsWikiText( $grantsFilter, $lang = null ) {
+               global $wgContLang;
+
+               if ( is_string( $lang ) ) {
+                       $lang = Language::factory( $lang );
+               } elseif ( $lang === null ) {
+                       $lang = $wgContLang;
+               }
+
+               $s = '';
+               foreach ( self::getGrantGroups( $grantsFilter ) as $group => $grants ) {
+                       if ( $group === 'hidden' ) {
+                               continue; // implicitly granted
+                       }
+                       $s .= "*<span class=\"mw-grantgroup\">" .
+                               wfMessage( "grant-group-$group" )->inLanguage( $lang )->text() . "</span>\n";
+                       $s .= ":" . $lang->semicolonList( self::grantNames( $grants, $lang ) ) . "\n";
+               }
+               return "$s\n";
+       }
+
+}
index 8cf009f..f21128e 100644 (file)
@@ -678,7 +678,7 @@ class MediaWiki {
         * @param IContextSource $context
         * @return string|bool Either "local" or "remote" if in the farm, false otherwise
         */
-       private function getUrlDomainDistance( $url, IContextSource $context ) {
+       private static function getUrlDomainDistance( $url, IContextSource $context ) {
                static $relevantKeys = [ 'host' => true, 'port' => true ];
 
                $infoCandidate = wfParseUrl( $url );
@@ -899,6 +899,7 @@ class MediaWiki {
 
                // Do any deferred jobs
                DeferredUpdates::doUpdates( 'enqueue' );
+               DeferredUpdates::setImmediateMode( true );
 
                // Make sure any lazy jobs are pushed
                JobQueueGroup::pushLazyJobs();
index f91bbae..7f94ced 100644 (file)
@@ -19,6 +19,7 @@ use MediaWiki\Services\SalvageableService;
 use MediaWiki\Services\ServiceContainer;
 use MediaWiki\Services\NoSuchServiceException;
 use MWException;
+use MimeAnalyzer;
 use ObjectCache;
 use ProxyLookup;
 use SearchEngine;
@@ -539,6 +540,14 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'MediaHandlerFactory' );
        }
 
+       /**
+        * @since 1.28
+        * @return MimeAnalyzer
+        */
+       public function getMimeAnalyzer() {
+               return $this->getService( 'MimeAnalyzer' );
+       }
+
        /**
         * @since 1.28
         * @return ProxyLookup
index 54d58d2..c03bce7 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Module defining helper functions for detecting and dealing with MIME types.
- *
  * 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
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Logger\LoggerFactory;
 
-/**
- * Defines a set of well known MIME types
- * This is used as a fallback to mime.types files.
- * An extensive list of well known MIME types is provided by
- * the file mime.types in the includes directory.
- *
- * This list concatenated with mime.types is used to create a MIME <-> ext
- * map. Each line contains a MIME type followed by a space separated list of
- * extensions. If multiple extensions for a single MIME type exist or if
- * multiple MIME types exist for a single extension then in most cases
- * MediaWiki assumes that the first extension following the MIME type is the
- * canonical extension, and the first time a MIME type appears for a certain
- * extension is considered the canonical MIME type.
- *
- * (Note that appending $wgMimeTypeFile to the end of MM_WELL_KNOWN_MIME_TYPES
- * sucks because you can't redefine canonical types. This could be fixed by
- * appending MM_WELL_KNOWN_MIME_TYPES behind $wgMimeTypeFile, but who knows
- * what will break? In practice this probably isn't a problem anyway -- Bryan)
- */
-define( 'MM_WELL_KNOWN_MIME_TYPES', <<<END_STRING
-application/ogg ogx ogg ogm ogv oga spx
-application/pdf pdf
-application/vnd.oasis.opendocument.chart odc
-application/vnd.oasis.opendocument.chart-template otc
-application/vnd.oasis.opendocument.database odb
-application/vnd.oasis.opendocument.formula odf
-application/vnd.oasis.opendocument.formula-template otf
-application/vnd.oasis.opendocument.graphics odg
-application/vnd.oasis.opendocument.graphics-template otg
-application/vnd.oasis.opendocument.image odi
-application/vnd.oasis.opendocument.image-template oti
-application/vnd.oasis.opendocument.presentation odp
-application/vnd.oasis.opendocument.presentation-template otp
-application/vnd.oasis.opendocument.spreadsheet ods
-application/vnd.oasis.opendocument.spreadsheet-template ots
-application/vnd.oasis.opendocument.text odt
-application/vnd.oasis.opendocument.text-master otm
-application/vnd.oasis.opendocument.text-template ott
-application/vnd.oasis.opendocument.text-web oth
-application/javascript js
-application/x-shockwave-flash swf
-audio/midi mid midi kar
-audio/mpeg mpga mpa mp2 mp3
-audio/x-aiff aif aiff aifc
-audio/x-wav wav
-audio/ogg oga spx ogg
-image/x-bmp bmp
-image/gif gif
-image/jpeg jpeg jpg jpe
-image/png png
-image/svg+xml svg
-image/svg svg
-image/tiff tiff tif
-image/vnd.djvu djvu
-image/x.djvu djvu
-image/x-djvu djvu
-image/x-portable-pixmap ppm
-image/x-xcf xcf
-text/plain txt
-text/html html htm
-video/ogg ogv ogm ogg
-video/mpeg mpg mpeg
-END_STRING
-);
-
-/**
- * Defines a set of well known MIME info entries
- * This is used as a fallback to mime.info files.
- * An extensive list of well known MIME types is provided by
- * the file mime.info in the includes directory.
- */
-define( 'MM_WELL_KNOWN_MIME_INFO', <<<END_STRING
-application/pdf [OFFICE]
-application/vnd.oasis.opendocument.chart [OFFICE]
-application/vnd.oasis.opendocument.chart-template [OFFICE]
-application/vnd.oasis.opendocument.database [OFFICE]
-application/vnd.oasis.opendocument.formula [OFFICE]
-application/vnd.oasis.opendocument.formula-template [OFFICE]
-application/vnd.oasis.opendocument.graphics [OFFICE]
-application/vnd.oasis.opendocument.graphics-template [OFFICE]
-application/vnd.oasis.opendocument.image [OFFICE]
-application/vnd.oasis.opendocument.image-template [OFFICE]
-application/vnd.oasis.opendocument.presentation [OFFICE]
-application/vnd.oasis.opendocument.presentation-template [OFFICE]
-application/vnd.oasis.opendocument.spreadsheet [OFFICE]
-application/vnd.oasis.opendocument.spreadsheet-template [OFFICE]
-application/vnd.oasis.opendocument.text [OFFICE]
-application/vnd.oasis.opendocument.text-template [OFFICE]
-application/vnd.oasis.opendocument.text-master [OFFICE]
-application/vnd.oasis.opendocument.text-web [OFFICE]
-application/javascript text/javascript application/x-javascript [EXECUTABLE]
-application/x-shockwave-flash [MULTIMEDIA]
-audio/midi [AUDIO]
-audio/x-aiff [AUDIO]
-audio/x-wav [AUDIO]
-audio/mp3 audio/mpeg [AUDIO]
-application/ogg audio/ogg video/ogg [MULTIMEDIA]
-image/x-bmp image/x-ms-bmp image/bmp [BITMAP]
-image/gif [BITMAP]
-image/jpeg [BITMAP]
-image/png [BITMAP]
-image/svg+xml [DRAWING]
-image/tiff [BITMAP]
-image/vnd.djvu [BITMAP]
-image/x-xcf [BITMAP]
-image/x-portable-pixmap [BITMAP]
-text/plain [TEXT]
-text/html [TEXT]
-video/ogg [VIDEO]
-video/mpeg [VIDEO]
-unknown/unknown application/octet-stream application/x-empty [UNKNOWN]
-END_STRING
-);
-
-/**
- * Implements functions related to MIME types such as detection and mapping to
- * file extension.
- *
- * Instances of this class are stateless, there only needs to be one global instance
- * of MimeMagic. Please use MimeMagic::singleton() to get that instance.
- */
-class MimeMagic {
-       /**
-        * @var array Mapping of media types to arrays of MIME types.
-        * This is used by findMediaType and getMediaType, respectively
-        */
-       protected $mMediaTypes = null;
-
-       /** @var array Map of MIME type aliases
-        */
-       protected $mMimeTypeAliases = null;
-
-       /** @var array Map of MIME types to file extensions (as a space separated list)
-        */
-       protected $mMimeToExt = null;
-
-       /** @var array Map of file extensions types to MIME types (as a space separated list)
-        */
-       public $mExtToMime = null;
-
-       /** @var IEContentAnalyzer
-        */
-       protected $mIEAnalyzer;
-
-       /** @var string Extra MIME types, set for example by media handling extensions
-        */
-       private $mExtraTypes = '';
-
-       /** @var string Extra MIME info, set for example by media handling extensions
-        */
-       private $mExtraInfo = '';
-
-       /** @var Config */
-       private $mConfig;
-
-       /** @var MimeMagic The singleton instance
-        */
-       private static $instance = null;
-
-       /** Initializes the MimeMagic object. This is called by MimeMagic::singleton().
-        *
-        * This constructor parses the mime.types and mime.info files and build internal mappings.
-        *
-        * @todo Make this constructor private once everything uses the singleton instance
-        * @param Config $config
-        */
-       function __construct( Config $config = null ) {
-               if ( !$config ) {
-                       wfDebug( __METHOD__ . ' called with no Config instance passed to it' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
-               }
-               $this->mConfig = $config;
-
-               /**
-                *   --- load mime.types ---
-                */
-
-               global $IP;
-
-               # Allow media handling extensions adding MIME-types and MIME-info
-               Hooks::run( 'MimeMagicInit', [ $this ] );
-
-               $types = MM_WELL_KNOWN_MIME_TYPES;
-
-               $mimeTypeFile = $this->mConfig->get( 'MimeTypeFile' );
-               if ( $mimeTypeFile == 'includes/mime.types' ) {
-                       $mimeTypeFile = "$IP/$mimeTypeFile";
-               }
-
-               if ( $mimeTypeFile ) {
-                       if ( is_file( $mimeTypeFile ) && is_readable( $mimeTypeFile ) ) {
-                               wfDebug( __METHOD__ . ": loading mime types from $mimeTypeFile\n" );
-                               $types .= "\n";
-                               $types .= file_get_contents( $mimeTypeFile );
-                       } else {
-                               wfDebug( __METHOD__ . ": can't load mime types from $mimeTypeFile\n" );
-                       }
-               } else {
-                       wfDebug( __METHOD__ . ": no mime types file defined, using built-ins only.\n" );
-               }
-
-               $types .= "\n" . $this->mExtraTypes;
-
-               $types = str_replace( [ "\r\n", "\n\r", "\n\n", "\r\r", "\r" ], "\n", $types );
-               $types = str_replace( "\t", " ", $types );
-
-               $this->mMimeToExt = [];
-               $this->mExtToMime = [];
-
-               $lines = explode( "\n", $types );
-               foreach ( $lines as $s ) {
-                       $s = trim( $s );
-                       if ( empty( $s ) ) {
-                               continue;
-                       }
-                       if ( strpos( $s, '#' ) === 0 ) {
-                               continue;
-                       }
-
-                       $s = strtolower( $s );
-                       $i = strpos( $s, ' ' );
-
-                       if ( $i === false ) {
-                               continue;
-                       }
-
-                       $mime = substr( $s, 0, $i );
-                       $ext = trim( substr( $s, $i + 1 ) );
-
-                       if ( empty( $ext ) ) {
-                               continue;
-                       }
-
-                       if ( !empty( $this->mMimeToExt[$mime] ) ) {
-                               $this->mMimeToExt[$mime] .= ' ' . $ext;
-                       } else {
-                               $this->mMimeToExt[$mime] = $ext;
-                       }
-
-                       $extensions = explode( ' ', $ext );
-
-                       foreach ( $extensions as $e ) {
-                               $e = trim( $e );
-                               if ( empty( $e ) ) {
-                                       continue;
-                               }
-
-                               if ( !empty( $this->mExtToMime[$e] ) ) {
-                                       $this->mExtToMime[$e] .= ' ' . $mime;
-                               } else {
-                                       $this->mExtToMime[$e] = $mime;
-                               }
-                       }
-               }
-
-               /**
-                *   --- load mime.info ---
-                */
-
-               $mimeInfoFile = $this->mConfig->get( 'MimeInfoFile' );
-               if ( $mimeInfoFile == 'includes/mime.info' ) {
-                       $mimeInfoFile = "$IP/$mimeInfoFile";
-               }
-
-               $info = MM_WELL_KNOWN_MIME_INFO;
-
-               if ( $mimeInfoFile ) {
-                       if ( is_file( $mimeInfoFile ) && is_readable( $mimeInfoFile ) ) {
-                               wfDebug( __METHOD__ . ": loading mime info from $mimeInfoFile\n" );
-                               $info .= "\n";
-                               $info .= file_get_contents( $mimeInfoFile );
-                       } else {
-                               wfDebug( __METHOD__ . ": can't load mime info from $mimeInfoFile\n" );
-                       }
-               } else {
-                       wfDebug( __METHOD__ . ": no mime info file defined, using built-ins only.\n" );
-               }
-
-               $info .= "\n" . $this->mExtraInfo;
-
-               $info = str_replace( [ "\r\n", "\n\r", "\n\n", "\r\r", "\r" ], "\n", $info );
-               $info = str_replace( "\t", " ", $info );
-
-               $this->mMimeTypeAliases = [];
-               $this->mMediaTypes = [];
-
-               $lines = explode( "\n", $info );
-               foreach ( $lines as $s ) {
-                       $s = trim( $s );
-                       if ( empty( $s ) ) {
-                               continue;
-                       }
-                       if ( strpos( $s, '#' ) === 0 ) {
-                               continue;
-                       }
-
-                       $s = strtolower( $s );
-                       $i = strpos( $s, ' ' );
-
-                       if ( $i === false ) {
-                               continue;
-                       }
-
-                       # print "processing MIME INFO line $s<br>";
-
-                       $match = [];
-                       if ( preg_match( '!\[\s*(\w+)\s*\]!', $s, $match ) ) {
-                               $s = preg_replace( '!\[\s*(\w+)\s*\]!', '', $s );
-                               $mtype = trim( strtoupper( $match[1] ) );
-                       } else {
-                               $mtype = MEDIATYPE_UNKNOWN;
-                       }
-
-                       $m = explode( ' ', $s );
-
-                       if ( !isset( $this->mMediaTypes[$mtype] ) ) {
-                               $this->mMediaTypes[$mtype] = [];
-                       }
-
-                       foreach ( $m as $mime ) {
-                               $mime = trim( $mime );
-                               if ( empty( $mime ) ) {
-                                       continue;
-                               }
-
-                               $this->mMediaTypes[$mtype][] = $mime;
-                       }
-
-                       if ( count( $m ) > 1 ) {
-                               $main = $m[0];
-                               $mCount = count( $m );
-                               for ( $i = 1; $i < $mCount; $i += 1 ) {
-                                       $mime = $m[$i];
-                                       $this->mMimeTypeAliases[$mime] = $main;
-                               }
-                       }
-               }
-       }
-
+class MimeMagic extends MimeAnalyzer {
        /**
         * Get an instance of this class
         * @return MimeMagic
+        * @deprecated since 1.28
         */
        public static function singleton() {
-               if ( self::$instance === null ) {
-                       self::$instance = new MimeMagic(
-                               ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
-                       );
-               }
-               return self::$instance;
-       }
-
-       /**
-        * Adds to the list mapping MIME to file extensions.
-        * As an extension author, you are encouraged to submit patches to
-        * MediaWiki's core to add new MIME types to mime.types.
-        * @param string $types
-        */
-       public function addExtraTypes( $types ) {
-               $this->mExtraTypes .= "\n" . $types;
-       }
-
-       /**
-        * Adds to the list mapping MIME to media type.
-        * As an extension author, you are encouraged to submit patches to
-        * MediaWiki's core to add new MIME info to mime.info.
-        * @param string $info
-        */
-       public function addExtraInfo( $info ) {
-               $this->mExtraInfo .= "\n" . $info;
-       }
-
-       /**
-        * Returns a list of file extensions for a given MIME type as a space
-        * separated string or null if the MIME type was unrecognized. Resolves
-        * MIME type aliases.
-        *
-        * @param string $mime
-        * @return string|null
-        */
-       public function getExtensionsForType( $mime ) {
-               $mime = strtolower( $mime );
-
-               // Check the mime-to-ext map
-               if ( isset( $this->mMimeToExt[$mime] ) ) {
-                       return $this->mMimeToExt[$mime];
-               }
-
-               // Resolve the MIME type to the canonical type
-               if ( isset( $this->mMimeTypeAliases[$mime] ) ) {
-                       $mime = $this->mMimeTypeAliases[$mime];
-                       if ( isset( $this->mMimeToExt[$mime] ) ) {
-                               return $this->mMimeToExt[$mime];
-                       }
-               }
-
-               return null;
+               return MediaWikiServices::getInstance()->getMIMEAnalyzer();
        }
 
        /**
-        * Returns a list of MIME types for a given file extension as a space
-        * separated string or null if the extension was unrecognized.
-        *
-        * @param string $ext
-        * @return string|null
-        */
-       public function getTypesForExtension( $ext ) {
-               $ext = strtolower( $ext );
-
-               $r = isset( $this->mExtToMime[$ext] ) ? $this->mExtToMime[$ext] : null;
-               return $r;
-       }
-
-       /**
-        * Returns a single MIME type for a given file extension or null if unknown.
-        * This is always the first type from the list returned by getTypesForExtension($ext).
-        *
-        * @param string $ext
-        * @return string|null
-        */
-       public function guessTypesForExtension( $ext ) {
-               $m = $this->getTypesForExtension( $ext );
-               if ( is_null( $m ) ) {
-                       return null;
-               }
-
-               // TODO: Check if this is needed; strtok( $m, ' ' ) should be sufficient
-               $m = trim( $m );
-               $m = preg_replace( '/\s.*$/', '', $m );
-
-               return $m;
-       }
-
-       /**
-        * Tests if the extension matches the given MIME type. Returns true if a
-        * match was found, null if the MIME type is unknown, and false if the
-        * MIME type is known but no matches where found.
-        *
-        * @param string $extension
-        * @param string $mime
-        * @return bool|null
-        */
-       public function isMatchingExtension( $extension, $mime ) {
-               $ext = $this->getExtensionsForType( $mime );
-
-               if ( !$ext ) {
-                       return null; // Unknown MIME type
-               }
-
-               $ext = explode( ' ', $ext );
-
-               $extension = strtolower( $extension );
-               return in_array( $extension, $ext );
-       }
-
-       /**
-        * Returns true if the MIME type is known to represent an image format
-        * supported by the PHP GD library.
-        *
-        * @param string $mime
-        *
-        * @return bool
-        */
-       public function isPHPImageType( $mime ) {
-               // As defined by imagegetsize and image_type_to_mime
-               static $types = [
-                       'image/gif', 'image/jpeg', 'image/png',
-                       'image/x-bmp', 'image/xbm', 'image/tiff',
-                       'image/jp2', 'image/jpeg2000', 'image/iff',
-                       'image/xbm', 'image/x-xbitmap',
-                       'image/vnd.wap.wbmp', 'image/vnd.xiff',
-                       'image/x-photoshop',
-                       'application/x-shockwave-flash',
-               ];
-
-               return in_array( $mime, $types );
-       }
-
-       /**
-        * Returns true if the extension represents a type which can
-        * be reliably detected from its content. Use this to determine
-        * whether strict content checks should be applied to reject
-        * invalid uploads; if we can't identify the type we won't
-        * be able to say if it's invalid.
-        *
-        * @todo Be more accurate when using fancy MIME detector plugins;
-        *       right now this is the bare minimum getimagesize() list.
-        * @param string $extension
-        * @return bool
-        */
-       function isRecognizableExtension( $extension ) {
-               static $types = [
-                       // Types recognized by getimagesize()
-                       'gif', 'jpeg', 'jpg', 'png', 'swf', 'psd',
-                       'bmp', 'tiff', 'tif', 'jpc', 'jp2',
-                       'jpx', 'jb2', 'swc', 'iff', 'wbmp',
-                       'xbm',
-
-                       // Formats we recognize magic numbers for
-                       'djvu', 'ogx', 'ogg', 'ogv', 'oga', 'spx',
-                       'mid', 'pdf', 'wmf', 'xcf', 'webm', 'mkv', 'mka',
-                       'webp',
-
-                       // XML formats we sure hope we recognize reliably
-                       'svg',
-               ];
-               return in_array( strtolower( $extension ), $types );
-       }
-
-       /**
-        * Improves a MIME type using the file extension. Some file formats are very generic,
-        * so their MIME type is not very meaningful. A more useful MIME type can be derived
-        * by looking at the file extension. Typically, this method would be called on the
-        * result of guessMimeType().
-        *
-        * @param string $mime The MIME type, typically guessed from a file's content.
-        * @param string $ext The file extension, as taken from the file name
-        *
-        * @return string The MIME type
-        */
-       public function improveTypeFromExtension( $mime, $ext ) {
-               if ( $mime === 'unknown/unknown' ) {
-                       if ( $this->isRecognizableExtension( $ext ) ) {
-                               wfDebug( __METHOD__ . ': refusing to guess mime type for .' .
-                                       "$ext file, we should have recognized it\n" );
-                       } else {
-                               // Not something we can detect, so simply
-                               // trust the file extension
-                               $mime = $this->guessTypesForExtension( $ext );
-                       }
-               } elseif ( $mime === 'application/x-opc+zip' ) {
-                       if ( $this->isMatchingExtension( $ext, $mime ) ) {
-                               // A known file extension for an OPC file,
-                               // find the proper MIME type for that file extension
-                               $mime = $this->guessTypesForExtension( $ext );
-                       } else {
-                               wfDebug( __METHOD__ . ": refusing to guess better type for $mime file, " .
-                                       ".$ext is not a known OPC extension.\n" );
-                               $mime = 'application/zip';
-                       }
-               } elseif ( $mime === 'text/plain' && $this->findMediaType( ".$ext" ) === MEDIATYPE_TEXT ) {
-                       // Textual types are sometimes not recognized properly.
-                       // If detected as text/plain, and has an extension which is textual
-                       // improve to the extension's type. For example, csv and json are often
-                       // misdetected as text/plain.
-                       $mime = $this->guessTypesForExtension( $ext );
-               }
-
-               # Media handling extensions can improve the MIME detected
-               Hooks::run( 'MimeMagicImproveFromExtension', [ $this, $ext, &$mime ] );
-
-               if ( isset( $this->mMimeTypeAliases[$mime] ) ) {
-                       $mime = $this->mMimeTypeAliases[$mime];
-               }
-
-               wfDebug( __METHOD__ . ": improved mime type for .$ext: $mime\n" );
-               return $mime;
-       }
-
-       /**
-        * MIME type detection. This uses detectMimeType to detect the MIME type
-        * of the file, but applies additional checks to determine some well known
-        * file formats that may be missed or misinterpreted by the default MIME
-        * detection (namely XML based formats like XHTML or SVG, as well as ZIP
-        * based formats like OPC/ODF files).
-        *
-        * @param string $file The file to check
-        * @param string|bool $ext The file extension, or true (default) to extract it from the filename.
-        *   Set it to false to ignore the extension. DEPRECATED! Set to false, use
-        *   improveTypeFromExtension($mime, $ext) later to improve MIME type.
-        *
-        * @return string The MIME type of $file
-        */
-       public function guessMimeType( $file, $ext = true ) {
-               if ( $ext ) { // TODO: make $ext default to false. Or better, remove it.
-                       wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. " .
-                               "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
-               }
-
-               $mime = $this->doGuessMimeType( $file, $ext );
-
-               if ( !$mime ) {
-                       wfDebug( __METHOD__ . ": internal type detection failed for $file (.$ext)...\n" );
-                       $mime = $this->detectMimeType( $file, $ext );
-               }
-
-               if ( isset( $this->mMimeTypeAliases[$mime] ) ) {
-                       $mime = $this->mMimeTypeAliases[$mime];
-               }
-
-               wfDebug( __METHOD__ . ": guessed mime type of $file: $mime\n" );
-               return $mime;
-       }
-
-       /**
-        * Guess the MIME type from the file contents.
-        *
-        * @todo Remove $ext param
-        *
-        * @param string $file
-        * @param mixed $ext
-        * @return bool|string
-        * @throws MWException
+        * @param array $params
+        * @param Config $mainConfig
+        * @return array
         */
-       private function doGuessMimeType( $file, $ext ) {
-               // Read a chunk of the file
-               MediaWiki\suppressWarnings();
-               $f = fopen( $file, 'rb' );
-               MediaWiki\restoreWarnings();
-
-               if ( !$f ) {
-                       return 'unknown/unknown';
-               }
-
-               $fsize = filesize( $file );
-               if ( $fsize === false ) {
-                       return 'unknown/unknown';
-               }
-
-               $head = fread( $f, 1024 );
-               $tailLength = min( 65558, $fsize ); // 65558 = maximum size of a zip EOCDR
-               if ( fseek( $f, -1 * $tailLength, SEEK_END ) === -1 ) {
-                       throw new MWException(
-                               "Seeking $tailLength bytes from EOF failed in " . __METHOD__ );
-               }
-               $tail = $tailLength ? fread( $f, $tailLength ) : '';
-               fclose( $f );
-
-               wfDebug( __METHOD__ . ": analyzing head and tail of $file for magic numbers.\n" );
-
-               // Hardcode a few magic number checks...
-               $headers = [
-                       // Multimedia...
-                       'MThd'             => 'audio/midi',
-                       'OggS'             => 'application/ogg',
-
-                       // Image formats...
-                       // Note that WMF may have a bare header, no magic number.
-                       "\x01\x00\x09\x00" => 'application/x-msmetafile', // Possibly prone to false positives?
-                       "\xd7\xcd\xc6\x9a" => 'application/x-msmetafile',
-                       '%PDF'             => 'application/pdf',
-                       'gimp xcf'         => 'image/x-xcf',
-
-                       // Some forbidden fruit...
-                       'MZ'               => 'application/octet-stream', // DOS/Windows executable
-                       "\xca\xfe\xba\xbe" => 'application/octet-stream', // Mach-O binary
-                       "\x7fELF"          => 'application/octet-stream', // ELF binary
-               ];
-
-               foreach ( $headers as $magic => $candidate ) {
-                       if ( strncmp( $head, $magic, strlen( $magic ) ) == 0 ) {
-                               wfDebug( __METHOD__ . ": magic header in $file recognized as $candidate\n" );
-                               return $candidate;
-                       }
-               }
-
-               /* Look for WebM and Matroska files */
-               if ( strncmp( $head, pack( "C4", 0x1a, 0x45, 0xdf, 0xa3 ), 4 ) == 0 ) {
-                       $doctype = strpos( $head, "\x42\x82" );
-                       if ( $doctype ) {
-                               // Next byte is datasize, then data (sizes larger than 1 byte are very stupid muxers)
-                               $data = substr( $head, $doctype + 3, 8 );
-                               if ( strncmp( $data, "matroska", 8 ) == 0 ) {
-                                       wfDebug( __METHOD__ . ": recognized file as video/x-matroska\n" );
-                                       return "video/x-matroska";
-                               } elseif ( strncmp( $data, "webm", 4 ) == 0 ) {
-                                       wfDebug( __METHOD__ . ": recognized file as video/webm\n" );
-                                       return "video/webm";
-                               }
-                       }
-                       wfDebug( __METHOD__ . ": unknown EBML file\n" );
-                       return "unknown/unknown";
-               }
-
-               /* Look for WebP */
-               if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 7 ), "WEBPVP8", 7 ) == 0 ) {
-                       wfDebug( __METHOD__ . ": recognized file as image/webp\n" );
-                       return "image/webp";
-               }
-
-               /**
-                * Look for PHP.  Check for this before HTML/XML...  Warning: this is a
-                * heuristic, and won't match a file with a lot of non-PHP before.  It
-                * will also match text files which could be PHP. :)
-                *
-                * @todo FIXME: For this reason, the check is probably useless -- an attacker
-                * could almost certainly just pad the file with a lot of nonsense to
-                * circumvent the check in any case where it would be a security
-                * problem.  On the other hand, it causes harmful false positives (bug
-                * 16583).  The heuristic has been cut down to exclude three-character
-                * strings like "<? ", but should it be axed completely?
-                */
-               if ( ( strpos( $head, '<?php' ) !== false ) ||
-                       ( strpos( $head, "<\x00?\x00p\x00h\x00p" ) !== false ) ||
-                       ( strpos( $head, "<\x00?\x00 " ) !== false ) ||
-                       ( strpos( $head, "<\x00?\x00\n" ) !== false ) ||
-                       ( strpos( $head, "<\x00?\x00\t" ) !== false ) ||
-                       ( strpos( $head, "<\x00?\x00=" ) !== false ) ) {
-
-                       wfDebug( __METHOD__ . ": recognized $file as application/x-php\n" );
-                       return 'application/x-php';
-               }
-
-               /**
-                * look for XML formats (XHTML and SVG)
-                */
-               $xml = new XmlTypeCheck( $file );
-               if ( $xml->wellFormed ) {
-                       $xmlMimeTypes = $this->mConfig->get( 'XMLMimeTypes' );
-                       if ( isset( $xmlMimeTypes[$xml->getRootElement()] ) ) {
-                               return $xmlMimeTypes[$xml->getRootElement()];
-                       } else {
-                               return 'application/xml';
-                       }
-               }
-
-               /**
-                * look for shell scripts
-                */
-               $script_type = null;
-
-               # detect by shebang
-               if ( substr( $head, 0, 2 ) == "#!" ) {
-                       $script_type = "ASCII";
-               } elseif ( substr( $head, 0, 5 ) == "\xef\xbb\xbf#!" ) {
-                       $script_type = "UTF-8";
-               } elseif ( substr( $head, 0, 7 ) == "\xfe\xff\x00#\x00!" ) {
-                       $script_type = "UTF-16BE";
-               } elseif ( substr( $head, 0, 7 ) == "\xff\xfe#\x00!" ) {
-                       $script_type = "UTF-16LE";
-               }
-
-               if ( $script_type ) {
-                       if ( $script_type !== "UTF-8" && $script_type !== "ASCII" ) {
-                               // Quick and dirty fold down to ASCII!
-                               $pack = [ 'UTF-16BE' => 'n*', 'UTF-16LE' => 'v*' ];
-                               $chars = unpack( $pack[$script_type], substr( $head, 2 ) );
-                               $head = '';
-                               foreach ( $chars as $codepoint ) {
-                                       if ( $codepoint < 128 ) {
-                                               $head .= chr( $codepoint );
-                                       } else {
-                                               $head .= '?';
+       public static function applyDefaultParameters( array $params, Config $mainConfig ) {
+               $logger = LoggerFactory::getInstance( 'Mime' );
+               $params += [
+                       'typeFile' => $mainConfig->get( 'MimeTypeFile' ),
+                       'infoFile' => $mainConfig->get( 'MimeInfoFile' ),
+                       'xmlTypes' => $mainConfig->get( 'XMLMimeTypes' ),
+                       'guessCallback' =>
+                               function ( $mimeAnalyzer, &$head, &$tail, $file, &$mime ) use ( $logger ) {
+                                       // Also test DjVu
+                                       $deja = new DjVuImage( $file );
+                                       if ( $deja->isValid() ) {
+                                               $logger->info( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
+                                               $mime = 'image/vnd.djvu';
+
+                                               return;
                                        }
-                               }
-                       }
-
-                       $match = [];
-
-                       if ( preg_match( '%/?([^\s]+/)(\w+)%', $head, $match ) ) {
-                               $mime = "application/x-{$match[2]}";
-                               wfDebug( __METHOD__ . ": shell script recognized as $mime\n" );
-                               return $mime;
-                       }
-               }
-
-               // Check for ZIP variants (before getimagesize)
-               if ( strpos( $tail, "PK\x05\x06" ) !== false ) {
-                       wfDebug( __METHOD__ . ": ZIP header present in $file\n" );
-                       return $this->detectZipType( $head, $tail, $ext );
-               }
-
-               MediaWiki\suppressWarnings();
-               $gis = getimagesize( $file );
-               MediaWiki\restoreWarnings();
-
-               if ( $gis && isset( $gis['mime'] ) ) {
-                       $mime = $gis['mime'];
-                       wfDebug( __METHOD__ . ": getimagesize detected $file as $mime\n" );
-                       return $mime;
-               }
-
-               // Also test DjVu
-               $deja = new DjVuImage( $file );
-               if ( $deja->isValid() ) {
-                       wfDebug( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
-                       return 'image/vnd.djvu';
-               }
-
-               # Media handling extensions can guess the MIME by content
-               # It's intentionally here so that if core is wrong about a type (false positive),
-               # people will hopefully nag and submit patches :)
-               $mime = false;
-               # Some strings by reference for performance - assuming well-behaved hooks
-               Hooks::run(
-                       'MimeMagicGuessFromContent',
-                       [ $this, &$head, &$tail, $file, &$mime ]
-               );
-
-               return $mime;
-       }
-
-       /**
-        * Detect application-specific file type of a given ZIP file from its
-        * header data.  Currently works for OpenDocument and OpenXML types...
-        * If can't tell, returns 'application/zip'.
-        *
-        * @param string $header Some reasonably-sized chunk of file header
-        * @param string|null $tail The tail of the file
-        * @param string|bool $ext The file extension, or true to extract it from the filename.
-        *   Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
-        *   use improveTypeFromExtension($mime, $ext) later to improve MIME type.
-        *
-        * @return string
-        */
-       function detectZipType( $header, $tail = null, $ext = false ) {
-               if ( $ext ) { # TODO: remove $ext param
-                       wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. " .
-                               "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
-               }
-
-               $mime = 'application/zip';
-               $opendocTypes = [
-                       'chart-template',
-                       'chart',
-                       'formula-template',
-                       'formula',
-                       'graphics-template',
-                       'graphics',
-                       'image-template',
-                       'image',
-                       'presentation-template',
-                       'presentation',
-                       'spreadsheet-template',
-                       'spreadsheet',
-                       'text-template',
-                       'text-master',
-                       'text-web',
-                       'text' ];
-
-               // http://lists.oasis-open.org/archives/office/200505/msg00006.html
-               $types = '(?:' . implode( '|', $opendocTypes ) . ')';
-               $opendocRegex = "/^mimetype(application\/vnd\.oasis\.opendocument\.$types)/";
-
-               $openxmlRegex = "/^\[Content_Types\].xml/";
-
-               if ( preg_match( $opendocRegex, substr( $header, 30 ), $matches ) ) {
-                       $mime = $matches[1];
-                       wfDebug( __METHOD__ . ": detected $mime from ZIP archive\n" );
-               } elseif ( preg_match( $openxmlRegex, substr( $header, 30 ) ) ) {
-                       $mime = "application/x-opc+zip";
-                       # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
-                       if ( $ext !== true && $ext !== false ) {
-                               // These MIME's are stored in the database, where we don't really want
-                               // x-opc+zip, because we use it only for internal purposes
-                               if ( $this->isMatchingExtension( $ext, $mime ) ) {
-                                       /* A known file extension for an OPC file,
-                                        * find the proper mime type for that file extension
-                                        */
-                                       $mime = $this->guessTypesForExtension( $ext );
-                               } else {
-                                       $mime = "application/zip";
-                               }
-                       }
-                       wfDebug( __METHOD__ . ": detected an Open Packaging Conventions archive: $mime\n" );
-               } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
-                               ( $headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
-                               preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
-                       if ( substr( $header, 512, 4 ) == "\xEC\xA5\xC1\x00" ) {
-                               $mime = "application/msword";
-                       }
-                       switch ( substr( $header, 512, 6 ) ) {
-                               case "\xEC\xA5\xC1\x00\x0E\x00":
-                               case "\xEC\xA5\xC1\x00\x1C\x00":
-                               case "\xEC\xA5\xC1\x00\x43\x00":
-                                       $mime = "application/vnd.ms-powerpoint";
-                                       break;
-                               case "\xFD\xFF\xFF\xFF\x10\x00":
-                               case "\xFD\xFF\xFF\xFF\x1F\x00":
-                               case "\xFD\xFF\xFF\xFF\x22\x00":
-                               case "\xFD\xFF\xFF\xFF\x23\x00":
-                               case "\xFD\xFF\xFF\xFF\x28\x00":
-                               case "\xFD\xFF\xFF\xFF\x29\x00":
-                               case "\xFD\xFF\xFF\xFF\x10\x02":
-                               case "\xFD\xFF\xFF\xFF\x1F\x02":
-                               case "\xFD\xFF\xFF\xFF\x22\x02":
-                               case "\xFD\xFF\xFF\xFF\x23\x02":
-                               case "\xFD\xFF\xFF\xFF\x28\x02":
-                               case "\xFD\xFF\xFF\xFF\x29\x02":
-                                       $mime = "application/vnd.msexcel";
-                                       break;
-                       }
-
-                       wfDebug( __METHOD__ . ": detected a MS Office document with OPC trailer\n" );
-               } else {
-                       wfDebug( __METHOD__ . ": unable to identify type of ZIP archive\n" );
-               }
-               return $mime;
-       }
-
-       /**
-        * Internal MIME type detection. Detection is done using an external
-        * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo
-        * extension is tried if it is available. If detection fails and $ext
-        * is not false, the MIME type is guessed from the file extension,
-        * using guessTypesForExtension.
-        *
-        * If the MIME type is still unknown, getimagesize is used to detect the
-        * MIME type if the file is an image. If no MIME type can be determined,
-        * this function returns 'unknown/unknown'.
-        *
-        * @param string $file The file to check
-        * @param string|bool $ext The file extension, or true (default) to extract it from the filename.
-        *   Set it to false to ignore the extension. DEPRECATED! Set to false, use
-        *   improveTypeFromExtension($mime, $ext) later to improve MIME type.
-        *
-        * @return string The MIME type of $file
-        */
-       private function detectMimeType( $file, $ext = true ) {
-               /** @todo Make $ext default to false. Or better, remove it. */
-               if ( $ext ) {
-                       wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. "
-                               . "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
-               }
-
-               $mimeDetectorCommand = $this->mConfig->get( 'MimeDetectorCommand' );
-               $m = null;
-               if ( $mimeDetectorCommand ) {
-                       $args = wfEscapeShellArg( $file );
-                       $m = wfShellExec( "$mimeDetectorCommand $args" );
-               } elseif ( function_exists( "finfo_open" ) && function_exists( "finfo_file" ) ) {
-                       $mime_magic_resource = finfo_open( FILEINFO_MIME );
-
-                       if ( $mime_magic_resource ) {
-                               $m = finfo_file( $mime_magic_resource, $file );
-                               finfo_close( $mime_magic_resource );
-                       } else {
-                               wfDebug( __METHOD__ . ": finfo_open failed on " . FILEINFO_MIME . "!\n" );
-                       }
-               } else {
-                       wfDebug( __METHOD__ . ": no magic mime detector found!\n" );
-               }
-
-               if ( $m ) {
-                       # normalize
-                       $m = preg_replace( '![;, ].*$!', '', $m ); # strip charset, etc
-                       $m = trim( $m );
-                       $m = strtolower( $m );
-
-                       if ( strpos( $m, 'unknown' ) !== false ) {
-                               $m = null;
-                       } else {
-                               wfDebug( __METHOD__ . ": magic mime type of $file: $m\n" );
-                               return $m;
-                       }
-               }
-
-               // If desired, look at extension as a fallback.
-               if ( $ext === true ) {
-                       $i = strrpos( $file, '.' );
-                       $ext = strtolower( $i ? substr( $file, $i + 1 ) : '' );
-               }
-               if ( $ext ) {
-                       if ( $this->isRecognizableExtension( $ext ) ) {
-                               wfDebug( __METHOD__ . ": refusing to guess mime type for .$ext file, "
-                                       . "we should have recognized it\n" );
-                       } else {
-                               $m = $this->guessTypesForExtension( $ext );
-                               if ( $m ) {
-                                       wfDebug( __METHOD__ . ": extension mime type of $file: $m\n" );
-                                       return $m;
-                               }
-                       }
-               }
-
-               // Unknown type
-               wfDebug( __METHOD__ . ": failed to guess mime type for $file!\n" );
-               return 'unknown/unknown';
-       }
-
-       /**
-        * Determine the media type code for a file, using its MIME type, name and
-        * possibly its contents.
-        *
-        * This function relies on the findMediaType(), mapping extensions and MIME
-        * types to media types.
-        *
-        * @todo analyse file if need be
-        * @todo look at multiple extension, separately and together.
-        *
-        * @param string $path Full path to the image file, in case we have to look at the contents
-        *        (if null, only the MIME type is used to determine the media type code).
-        * @param string $mime MIME type. If null it will be guessed using guessMimeType.
-        *
-        * @return string A value to be used with the MEDIATYPE_xxx constants.
-        */
-       function getMediaType( $path = null, $mime = null ) {
-               if ( !$mime && !$path ) {
-                       return MEDIATYPE_UNKNOWN;
-               }
-
-               // If MIME type is unknown, guess it
-               if ( !$mime ) {
-                       $mime = $this->guessMimeType( $path, false );
-               }
-
-               // Special code for ogg - detect if it's video (theora),
-               // else label it as sound.
-               if ( $mime == 'application/ogg' && file_exists( $path ) ) {
-
-                       // Read a chunk of the file
-                       $f = fopen( $path, "rt" );
-                       if ( !$f ) {
-                               return MEDIATYPE_UNKNOWN;
-                       }
-                       $head = fread( $f, 256 );
-                       fclose( $f );
-
-                       $head = str_replace( 'ffmpeg2theora', '', strtolower( $head ) );
-
-                       // This is an UGLY HACK, file should be parsed correctly
-                       if ( strpos( $head, 'theora' ) !== false ) {
-                               return MEDIATYPE_VIDEO;
-                       } elseif ( strpos( $head, 'vorbis' ) !== false ) {
-                               return MEDIATYPE_AUDIO;
-                       } elseif ( strpos( $head, 'flac' ) !== false ) {
-                               return MEDIATYPE_AUDIO;
-                       } elseif ( strpos( $head, 'speex' ) !== false ) {
-                               return MEDIATYPE_AUDIO;
-                       } else {
-                               return MEDIATYPE_MULTIMEDIA;
-                       }
-               }
-
-               $type = null;
-               // Check for entry for full MIME type
-               if ( $mime ) {
-                       $type = $this->findMediaType( $mime );
-                       if ( $type !== MEDIATYPE_UNKNOWN ) {
-                               return $type;
-                       }
-               }
-
-               // Check for entry for file extension
-               if ( $path ) {
-                       $i = strrpos( $path, '.' );
-                       $e = strtolower( $i ? substr( $path, $i + 1 ) : '' );
-
-                       // TODO: look at multi-extension if this fails, parse from full path
-                       $type = $this->findMediaType( '.' . $e );
-                       if ( $type !== MEDIATYPE_UNKNOWN ) {
-                               return $type;
-                       }
-               }
-
-               // Check major MIME type
-               if ( $mime ) {
-                       $i = strpos( $mime, '/' );
-                       if ( $i !== false ) {
-                               $major = substr( $mime, 0, $i );
-                               $type = $this->findMediaType( $major );
-                               if ( $type !== MEDIATYPE_UNKNOWN ) {
-                                       return $type;
-                               }
-                       }
-               }
+                                       // Some strings by reference for performance - assuming well-behaved hooks
+                                       Hooks::run(
+                                               'MimeMagicGuessFromContent',
+                                               [ $mimeAnalyzer, &$head, &$tail, $file, &$mime ]
+                                       );
+                               },
+                       'extCallback' => function ( $mimeAnalyzer, $ext, &$mime ) {
+                               // Media handling extensions can improve the MIME detected
+                               Hooks::run( 'MimeMagicImproveFromExtension', [ $mimeAnalyzer, $ext, &$mime ] );
+                       },
+                       'initCallback' => function ( $mimeAnalyzer ) {
+                               // Allow media handling extensions adding MIME-types and MIME-info
+                               Hooks::run( 'MimeMagicInit', [ $mimeAnalyzer ] );
+                       },
+                       'logger' => $logger
+               ];
 
-               if ( !$type ) {
-                       $type = MEDIATYPE_UNKNOWN;
+               if ( $params['infoFile'] === 'includes/mime.info' ) {
+                       $params['infoFile'] = __DIR__ . "/libs/mime/mime.info";
                }
 
-               return $type;
-       }
-
-       /**
-        * Returns a media code matching the given MIME type or file extension.
-        * File extensions are represented by a string starting with a dot (.) to
-        * distinguish them from MIME types.
-        *
-        * This function relies on the mapping defined by $this->mMediaTypes
-        * @access private
-        * @param string $extMime
-        * @return int|string
-        */
-       function findMediaType( $extMime ) {
-               if ( strpos( $extMime, '.' ) === 0 ) {
-                       // If it's an extension, look up the MIME types
-                       $m = $this->getTypesForExtension( substr( $extMime, 1 ) );
-                       if ( !$m ) {
-                               return MEDIATYPE_UNKNOWN;
-                       }
-
-                       $m = explode( ' ', $m );
-               } else {
-                       // Normalize MIME type
-                       if ( isset( $this->mMimeTypeAliases[$extMime] ) ) {
-                               $extMime = $this->mMimeTypeAliases[$extMime];
-                       }
-
-                       $m = [ $extMime ];
+               if ( $params['typeFile'] === 'includes/mime.types' ) {
+                       $params['typeFile'] = __DIR__ . "/libs/mime/mime.types";
                }
 
-               foreach ( $m as $mime ) {
-                       foreach ( $this->mMediaTypes as $type => $codes ) {
-                               if ( in_array( $mime, $codes, true ) ) {
-                                       return $type;
-                               }
-                       }
+               $detectorCmd = $mainConfig->get( 'MimeDetectorCommand' );
+               if ( $detectorCmd ) {
+                       $params['detectCallback'] = function ( $file ) use ( $detectorCmd ) {
+                               return wfShellExec( "$detectorCmd " . wfEscapeShellArg( $file ) );
+                       };
                }
 
-               return MEDIATYPE_UNKNOWN;
-       }
-
-       /**
-        * Get the MIME types that various versions of Internet Explorer would
-        * detect from a chunk of the content.
-        *
-        * @param string $fileName The file name (unused at present)
-        * @param string $chunk The first 256 bytes of the file
-        * @param string $proposed The MIME type proposed by the server
-        * @return array
-        */
-       public function getIEMimeTypes( $fileName, $chunk, $proposed ) {
-               $ca = $this->getIEContentAnalyzer();
-               return $ca->getRealMimesFromData( $fileName, $chunk, $proposed );
-       }
-
-       /**
-        * Get a cached instance of IEContentAnalyzer
-        *
-        * @return IEContentAnalyzer
-        */
-       protected function getIEContentAnalyzer() {
-               if ( is_null( $this->mIEAnalyzer ) ) {
-                       $this->mIEAnalyzer = new IEContentAnalyzer;
-               }
-               return $this->mIEAnalyzer;
+               return $params;
        }
 }
index 208652f..8f337f9 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 
 /**
  * @todo document
@@ -1902,7 +1903,7 @@ class Revision implements IDBAccessObject {
         * @since 1.28
         */
        public static function newKnownCurrent( IDatabase $db, $pageId, $revId ) {
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                return $cache->getWithSetCallback(
                        // Page/rev IDs passed in from DB to reflect history merges
                        $cache->makeGlobalKey( 'revision', $db->getWikiID(), $pageId, $revId ),
index 42b75f0..49183e5 100644 (file)
@@ -190,6 +190,15 @@ return [
                );
        },
 
+       'MimeAnalyzer' => function( MediaWikiServices $services ) {
+               return new MimeMagic(
+                       MimeMagic::applyDefaultParameters(
+                               [],
+                               $services->getMainConfig()
+                       )
+               );
+       },
+
        'ProxyLookup' => function( MediaWikiServices $services ) {
                $mainConfig = $services->getMainConfig();
                return new ProxyLookup(
index c0ae374..494c7bf 100644 (file)
@@ -93,11 +93,11 @@ class TemplatesOnThisPageFormatter {
                }
 
                if ( $more instanceof LinkTarget ) {
-                       $outText .= Html::rawElement( 'li', $this->linkRenderer->makeLink(
+                       $outText .= Html::rawElement( 'li', [], $this->linkRenderer->makeLink(
                                $more, $this->context->msg( 'moredotdotdot' )->text() ) );
                } elseif ( $more ) {
                        // Documented as should already be escaped
-                       $outText .= Html::rawElement( 'li', $more );
+                       $outText .= Html::rawElement( 'li', [], $more );
                }
 
                $outText .= '</ul>';
index 4d80a1c..c039388 100644 (file)
@@ -690,7 +690,6 @@ class InfoAction extends FormlessAction {
 
                                $dbr = wfGetDB( DB_REPLICA );
                                $dbrWatchlist = wfGetDB( DB_REPLICA, 'watchlist' );
-
                                $setOpts += Database::getCacheSetOptions( $dbr, $dbrWatchlist );
 
                                $watchedItemStore = MediaWikiServices::getInstance()->getWatchedItemStore();
index 966bcbf..37cb80a 100644 (file)
 class ApiImageRotate extends ApiBase {
        private $mPageSet = null;
 
-       /**
-        * Add all items from $values into the result
-        * @param array $result Output
-        * @param array $values Values to add
-        * @param string $flag The name of the boolean flag to mark this element
-        * @param string $name If given, name of the value
-        */
-       private static function addValues( array &$result, $values, $flag = null, $name = null ) {
-               foreach ( $values as $val ) {
-                       if ( $val instanceof Title ) {
-                               $v = [];
-                               ApiQueryBase::addTitleInfo( $v, $val );
-                       } elseif ( $name !== null ) {
-                               $v = [ $name => $val ];
-                       } else {
-                               $v = $val;
-                       }
-                       if ( $flag !== null ) {
-                               $v[$flag] = true;
-                       }
-                       $result[] = $v;
-               }
-       }
-
        public function execute() {
                $this->useTransactionalTimeLimit();
 
@@ -62,11 +38,9 @@ class ApiImageRotate extends ApiBase {
 
                $result = [];
 
-               self::addValues( $result, $pageSet->getInvalidTitlesAndReasons(), 'invalid' );
-               self::addValues( $result, $pageSet->getSpecialTitles(), 'special', 'title' );
-               self::addValues( $result, $pageSet->getMissingPageIDs(), 'missing', 'pageid' );
-               self::addValues( $result, $pageSet->getMissingRevisionIDs(), 'missing', 'revid' );
-               self::addValues( $result, $pageSet->getInterwikiTitlesAsResult() );
+               $result = $pageSet->getInvalidTitlesAndRevisions( [
+                       'invalidTitles', 'special', 'missingIds', 'missingRevIds', 'interwikiTitles',
+               ] );
 
                foreach ( $pageSet->getTitles() as $title ) {
                        $r = [];
@@ -74,6 +48,9 @@ class ApiImageRotate extends ApiBase {
                        ApiQueryBase::addTitleInfo( $r, $title );
                        if ( !$title->exists() ) {
                                $r['missing'] = true;
+                               if ( $title->isKnown() ) {
+                                       $r['known'] = true;
+                               }
                        }
 
                        $file = wfFindFile( $title, [ 'latest' => true ] );
index 55edd99..6ac261d 100644 (file)
@@ -190,15 +190,6 @@ class ApiLogin extends ApiBase {
 
                                $result['lguserid'] = intval( $user->getId() );
                                $result['lgusername'] = $user->getName();
-
-                               // @todo: These are deprecated, and should be removed at some
-                               // point (1.28 at the earliest, and see T121527). They were ok
-                               // when the core cookie-based login was the only thing, but
-                               // CentralAuth broke that a while back and
-                               // SessionManager/AuthManager *really* break it.
-                               $result['lgtoken'] = $user->getToken();
-                               $result['cookieprefix'] = $this->getConfig()->get( 'CookiePrefix' );
-                               $result['sessionid'] = $session->getId();
                                break;
 
                        case 'NeedToken':
@@ -206,10 +197,6 @@ class ApiLogin extends ApiBase {
                                $this->setWarning( 'Fetching a token via action=login is deprecated. ' .
                                   'Use action=query&meta=tokens&type=login instead.' );
                                $this->logFeatureUsage( 'action=login&!lgtoken' );
-
-                               // @todo: See above about deprecation
-                               $result['cookieprefix'] = $this->getConfig()->get( 'CookiePrefix' );
-                               $result['sessionid'] = $session->getId();
                                break;
 
                        case 'WrongToken':
index 34c17c1..46c57b8 100644 (file)
@@ -86,10 +86,10 @@ class ApiPageSet extends ApiBase {
         * Add all items from $values into the result
         * @param array $result Output
         * @param array $values Values to add
-        * @param string $flag The name of the boolean flag to mark this element
+        * @param string[] $flags The names of boolean flags to mark this element
         * @param string $name If given, name of the value
         */
-       private static function addValues( array &$result, $values, $flag = null, $name = null ) {
+       private static function addValues( array &$result, $values, $flags = [], $name = null ) {
                foreach ( $values as $val ) {
                        if ( $val instanceof Title ) {
                                $v = [];
@@ -99,7 +99,7 @@ class ApiPageSet extends ApiBase {
                        } else {
                                $v = $val;
                        }
-                       if ( $flag !== null ) {
+                       foreach ( $flags as $flag ) {
                                $v[$flag] = true;
                        }
                        $result[] = $v;
@@ -309,8 +309,9 @@ class ApiPageSet extends ApiBase {
                        $pageFlds['page_lang'] = null;
                }
 
-               // only store non-default fields
-               $this->mRequestedPageFields = array_diff_key( $this->mRequestedPageFields, $pageFlds );
+               foreach ( LinkCache::getSelectFields() as $field ) {
+                       $pageFlds[$field] = null;
+               }
 
                $pageFlds = array_merge( $pageFlds, $this->mRequestedPageFields );
 
@@ -600,19 +601,39 @@ class ApiPageSet extends ApiBase {
        ) {
                $result = [];
                if ( in_array( 'invalidTitles', $invalidChecks ) ) {
-                       self::addValues( $result, $this->getInvalidTitlesAndReasons(), 'invalid' );
+                       self::addValues( $result, $this->getInvalidTitlesAndReasons(), [ 'invalid' ] );
                }
                if ( in_array( 'special', $invalidChecks ) ) {
-                       self::addValues( $result, $this->getSpecialTitles(), 'special', 'title' );
+                       $known = [];
+                       $unknown = [];
+                       foreach ( $this->getSpecialTitles() as $title ) {
+                               if ( $title->isKnown() ) {
+                                       $known[] = $title;
+                               } else {
+                                       $unknown[] = $title;
+                               }
+                       }
+                       self::addValues( $result, $unknown, [ 'special', 'missing' ] );
+                       self::addValues( $result, $known, [ 'special' ] );
                }
                if ( in_array( 'missingIds', $invalidChecks ) ) {
-                       self::addValues( $result, $this->getMissingPageIDs(), 'missing', 'pageid' );
+                       self::addValues( $result, $this->getMissingPageIDs(), [ 'missing' ], 'pageid' );
                }
                if ( in_array( 'missingRevIds', $invalidChecks ) ) {
-                       self::addValues( $result, $this->getMissingRevisionIDs(), 'missing', 'revid' );
+                       self::addValues( $result, $this->getMissingRevisionIDs(), [ 'missing' ], 'revid' );
                }
                if ( in_array( 'missingTitles', $invalidChecks ) ) {
-                       self::addValues( $result, $this->getMissingTitles(), 'missing' );
+                       $known = [];
+                       $unknown = [];
+                       foreach ( $this->getMissingTitles() as $title ) {
+                               if ( $title->isKnown() ) {
+                                       $known[] = $title;
+                               } else {
+                                       $unknown[] = $title;
+                               }
+                       }
+                       self::addValues( $result, $unknown, [ 'missing' ] );
+                       self::addValues( $result, $known, [ 'missing', 'known' ] );
                }
                if ( in_array( 'interwikiTitles', $invalidChecks ) ) {
                        self::addValues( $result, $this->getInterwikiTitlesAsResult() );
@@ -734,6 +755,8 @@ class ApiPageSet extends ApiBase {
                // Store Title object in various data structures
                $title = Title::newFromRow( $row );
 
+               LinkCache::singleton()->addGoodLinkObjFromRow( $title, $row );
+
                $pageId = intval( $row->page_id );
                $this->mAllPages[$row->page_namespace][$row->page_title] = $pageId;
                $this->mTitles[] = $title;
@@ -863,9 +886,11 @@ class ApiPageSet extends ApiBase {
                        // Any items left in the $remaining list are added as missing
                        if ( $processTitles ) {
                                // The remaining titles in $remaining are non-existent pages
+                               $linkCache = LinkCache::singleton();
                                foreach ( $remaining as $ns => $dbkeys ) {
                                        foreach ( array_keys( $dbkeys ) as $dbkey ) {
                                                $title = Title::makeTitle( $ns, $dbkey );
+                                               $linkCache->addBadLinkObj( $title );
                                                $this->mAllPages[$ns][$dbkey] = $this->mFakePageId;
                                                $this->mMissingPages[$ns][$dbkey] = $this->mFakePageId;
                                                $this->mGoodAndMissingPages[$ns][$dbkey] = $this->mFakePageId;
index 83b5d93..0cad5de 100644 (file)
@@ -641,6 +641,8 @@ class ApiParse extends ApiBase {
                        $hiddencats[$row->page_title] = isset( $row->pp_propname );
                }
 
+               $linkCache = LinkCache::singleton();
+
                foreach ( $links as $link => $sortkey ) {
                        $entry = [];
                        $entry['sortkey'] = $sortkey;
@@ -648,6 +650,14 @@ class ApiParse extends ApiBase {
                        ApiResult::setContentValue( $entry, 'category', (string)$link );
                        if ( !isset( $hiddencats[$link] ) ) {
                                $entry['missing'] = true;
+
+                               // We already know the link doesn't exist in the database, so
+                               // tell LinkCache that before calling $title->isKnown().
+                               $title = Title::makeTitle( NS_CATEGORY, $link );
+                               $linkCache->addBadLinkObj( $title );
+                               if ( $title->isKnown() ) {
+                                       $entry['known'] = true;
+                               }
                        } elseif ( $hiddencats[$link] ) {
                                $entry['hidden'] = true;
                        }
index 8bbd88d..8be523e 100644 (file)
@@ -103,6 +103,11 @@ class ApiPurge extends ApiBase {
                                                $updates = $content->getSecondaryDataUpdates(
                                                        $title, null, $forceRecursiveLinkUpdate, $p_result );
                                                foreach ( $updates as $update ) {
+                                                       # Some extensions, like EventBus, need to know the user
+                                                       # that performed the purge action, so set it here
+                                                       if ( $update instanceof LinksUpdate ) {
+                                                               $update->setTriggeringUser( $user );
+                                                       }
                                                        DeferredUpdates::addUpdate( $update, DeferredUpdates::PRESEND );
                                                }
 
index 2f53209..16bd725 100644 (file)
@@ -362,6 +362,9 @@ class ApiQuery extends ApiBase {
                        $vals = [];
                        ApiQueryBase::addTitleInfo( $vals, $title );
                        $vals['missing'] = true;
+                       if ( $title->isKnown() ) {
+                               $vals['known'] = true;
+                       }
                        $pages[$fakeId] = $vals;
                }
                // Report any invalid titles
@@ -372,7 +375,7 @@ class ApiQuery extends ApiBase {
                foreach ( $pageSet->getMissingPageIDs() as $pageid ) {
                        $pages[$pageid] = [
                                'pageid' => $pageid,
-                               'missing' => true
+                               'missing' => true,
                        ];
                }
                // Report special pages
@@ -381,13 +384,7 @@ class ApiQuery extends ApiBase {
                        $vals = [];
                        ApiQueryBase::addTitleInfo( $vals, $title );
                        $vals['special'] = true;
-                       if ( $title->isSpecialPage() &&
-                               !SpecialPageFactory::exists( $title->getDBkey() )
-                       ) {
-                               $vals['missing'] = true;
-                       } elseif ( $title->getNamespace() == NS_MEDIA &&
-                               !wfFindFile( $title )
-                       ) {
+                       if ( !$title->isKnown() ) {
                                $vals['missing'] = true;
                        }
                        $pages[$fakeId] = $vals;
index f335682..3412f38 100644 (file)
@@ -158,6 +158,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
                                        ];
                                        if ( !$title->exists() ) {
                                                $r['missing'] = true;
+                                               if ( $title->isKnown() ) {
+                                                       $r['known'] = true;
+                                               }
                                        }
                                        if ( isset( $timestamps[$ns] ) && array_key_exists( $dbkey, $timestamps[$ns] ) ) {
                                                $r['notificationtimestamp'] = '';
index 4156395..29c0605 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Vodnokon4e",
-                       "StanProg"
+                       "StanProg",
+                       "Spas.Z.Spasov"
                ]
        },
        "apihelp-main-param-action": "Кое действие да се извърши.",
@@ -30,7 +31,7 @@
        "apihelp-feedcontributions-param-year": "От година (и по-рано).",
        "apihelp-feedcontributions-param-month": "От месец (и по-рано).",
        "apihelp-feedcontributions-param-tagfilter": "Филтриране на приноси, които имат тези етикети.",
-       "apihelp-feedcontributions-param-deletedonly": "Покажи само изтритите редакции.",
+       "apihelp-feedcontributions-param-deletedonly": "Покажи само изтритите приноси.",
        "apihelp-feedcontributions-param-newonly": "Показване само на редакции за създаване на страници.",
        "apihelp-feedcontributions-param-hideminor": "Скриване на малки промени.",
        "apihelp-feedcontributions-param-showsizediff": "Показване на размера на разликите между версиите.",
index 41f1ff9..40243c1 100644 (file)
        "apihelp-emailuser-param-text": "E-Mail-Inhalt.",
        "apihelp-emailuser-param-ccme": "Eine Kopie dieser E-Mail an mich senden.",
        "apihelp-emailuser-example-email": "Eine E-Mail an den Benutzer <kbd>WikiSysop</kbd> mit dem Text <kbd>Content</kbd> senden.",
-       "apihelp-expandtemplates-description": "Alle Vorlagen im Wikitext expandieren.",
+       "apihelp-expandtemplates-description": "Alle Vorlagen innerhalb des Wikitextes expandieren.",
        "apihelp-expandtemplates-param-title": "Titel der Seite.",
        "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.",
        "apihelp-expandtemplates-param-revid": "Versionsnummer, die für die Anzeige von <nowiki>{{REVISIONID}}</nowiki> und ähnlichen Variablen verwendet wird.",
index 05f606d..c20ed5d 100644 (file)
        "apihelp-edit-param-tags": "Change tags to apply to the revision.",
        "apihelp-edit-param-minor": "Minor edit.",
        "apihelp-edit-param-notminor": "Non-minor edit.",
-       "apihelp-edit-param-bot": "Mark this edit as bot.",
+       "apihelp-edit-param-bot": "Mark this edit as a bot edit.",
        "apihelp-edit-param-basetimestamp": "Timestamp of the base revision, used to detect edit conflicts. May be obtained through [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Timestamp when the editing process began, used to detect edit conflicts. An appropriate value may be obtained using <var>[[Special:ApiHelp/main|curtimestamp]]</var> when beginning the edit process (e.g. when loading the page content to edit).",
        "apihelp-edit-param-recreate": "Override any errors about the page having been deleted in the meantime.",
        "apihelp-emailuser-param-ccme": "Send a copy of this mail to me.",
        "apihelp-emailuser-example-email": "Send an email to user <kbd>WikiSysop</kbd> with the text <kbd>Content</kbd>.",
 
-       "apihelp-expandtemplates-description": "Expands all templates in wikitext.",
+       "apihelp-expandtemplates-description": "Expands all templates within wikitext.",
        "apihelp-expandtemplates-param-title": "Title of page.",
        "apihelp-expandtemplates-param-text": "Wikitext to convert.",
        "apihelp-expandtemplates-param-revid": "Revision ID, for <nowiki>{{REVISIONID}}</nowiki> and similar variables.",
        "apihelp-feedcontributions-param-month": "From month (and earlier).",
        "apihelp-feedcontributions-param-tagfilter": "Filter contributions that have these tags.",
        "apihelp-feedcontributions-param-deletedonly": "Show only deleted contributions.",
-       "apihelp-feedcontributions-param-toponly": "Only show edits that are latest revisions.",
+       "apihelp-feedcontributions-param-toponly": "Only show edits that are the latest revisions.",
        "apihelp-feedcontributions-param-newonly": "Only show edits that are page creations.",
        "apihelp-feedcontributions-param-hideminor": "Hide minor edits.",
        "apihelp-feedcontributions-param-showsizediff": "Show the size difference between revisions.",
index d535a5d..321fb75 100644 (file)
@@ -37,7 +37,7 @@
        "apihelp-main-param-smaxage": "Fixer l’entête HTTP de contrôle de cache <code>s-maxage</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
        "apihelp-main-param-maxage": "Fixer l’entête HTTP de contrôle de cache <code>max-age</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
        "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si positionné à <kbd>user</kbd>, ou s'il a le droit d'un utilisateur robot si positionné à <kbd>bot</kbd>.",
-       "apihelp-main-param-assertuser": "Vérifier que l’utilisateur courant est l’utilisateur nommé.",
+       "apihelp-main-param-assertuser": "Vérifier que l’utilisateur actuel est l’utilisateur nommé.",
        "apihelp-main-param-requestid": "Toute valeur fournie ici sera incluse dans la réponse. Peut être utilisé pour distinguer des demandes.",
        "apihelp-main-param-servedby": "Inclure le nom d’hôte qui a renvoyé la requête dans les résultats.",
        "apihelp-main-param-curtimestamp": "Inclure l’horodatage actuel dans le résultat.",
        "apihelp-edit-param-tags": "Modifier les balises à appliquer à la version.",
        "apihelp-edit-param-minor": "Modification mineure.",
        "apihelp-edit-param-notminor": "Modification non mineure.",
-       "apihelp-edit-param-bot": "Marquer cette modification comme robot.",
+       "apihelp-edit-param-bot": "Marquer cette modification comme effectuée par un robot.",
        "apihelp-edit-param-basetimestamp": "Horodatage de la révision de base, utilisé pour détecter les conflits de modification. Peut être obtenu via [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "L'horodatage, lorsque le processus d'édition est démarré, est utilisé pour détecter les conflits de modification. Une valeur appropriée peut être obtenue en utilisant <var>[[Special:ApiHelp/main|curtimestamp]]</var> lors du démarrage du processus d'édition (par ex. en chargeant le contenu de la page à modifier).",
        "apihelp-edit-param-recreate": "Ignorer toutes les erreurs concernant la page \nqui a été supprimée entre-temps.",
        "apihelp-emailuser-param-text": "Corps du courriel.",
        "apihelp-emailuser-param-ccme": "M’envoyer une copie de ce courriel.",
        "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur <kbd>WikiSysop</kbd> avec le texte <kbd>Content</kbd>.",
-       "apihelp-expandtemplates-description": "Développe tous les modèles en wikitexte.",
+       "apihelp-expandtemplates-description": "Développe tous les modèles avec du wikitexte.",
        "apihelp-expandtemplates-param-title": "Titre de la page.",
        "apihelp-expandtemplates-param-text": "Wikitexte à convertir.",
        "apihelp-expandtemplates-param-revid": "ID de révision, pour <nowiki>{{REVISIONID}}</nowiki> et les variables semblables.",
index 9c8e67c..4c74147 100644 (file)
        "apihelp-emailuser-param-text": "Corpo do correo.",
        "apihelp-emailuser-param-ccme": "Enviarme unha copia deste correo.",
        "apihelp-emailuser-example-email": "Enviar un correo electrónico ó usuario <kbd>WikiSysop</kbd> co texto <kbd>Content</kbd>.",
-       "apihelp-expandtemplates-description": "Expandir tódolos modelos en wikitexto.",
+       "apihelp-expandtemplates-description": "Expandir tódolos modelos dentro do wikitexto.",
        "apihelp-expandtemplates-param-title": "Título da páxina.",
        "apihelp-expandtemplates-param-text": "Sintaxis wiki a converter.",
        "apihelp-expandtemplates-param-revid": "ID de revisión, para <nowiki>{{REVISIONID}}</nowiki> e variables similares.",
index 9786543..5f1d851 100644 (file)
@@ -90,7 +90,7 @@
        "apihelp-edit-param-tags": "Cambia i tag da applicare alla revisione.",
        "apihelp-edit-param-minor": "Modifica minore.",
        "apihelp-edit-param-notminor": "Modifica non minore.",
-       "apihelp-edit-param-bot": "Contrassegna questa modifica come bot.",
+       "apihelp-edit-param-bot": "Contrassegna questa modifica come eseguita da un bot.",
        "apihelp-edit-param-createonly": "Non modificare la pagina se già esiste.",
        "apihelp-edit-param-nocreate": "Genera un errore se la pagina non esiste.",
        "apihelp-edit-param-watch": "Aggiunge la pagina agli osservati speciali dell'utente attuale.",
        "apihelp-emailuser-param-text": "Testo dell'e-mail.",
        "apihelp-emailuser-param-ccme": "Mandami una copia di questa mail.",
        "apihelp-emailuser-example-email": "Manda una e-mail all'utente <kbd>WikiSysop</kbd> con il testo <kbd>Content</kbd>.",
-       "apihelp-expandtemplates-description": "Espandi tutti i template nel wikitesto.",
+       "apihelp-expandtemplates-description": "Espande tutti i template all'interno del wikitesto.",
        "apihelp-expandtemplates-param-title": "Titolo della pagina.",
        "apihelp-expandtemplates-param-text": "Wikitesto da convertire.",
        "apihelp-expandtemplates-param-prop": "Quale informazione ottenere.\n\nNota che se non è selezionato alcun valore, il risultato conterrà il codice wiki, ma l'output sarà in un formato obsoleto.",
index 5ae6c87..d4ff5d8 100644 (file)
@@ -88,7 +88,7 @@
        "apihelp-edit-param-tags": "이 판에 적용할 태그를 변경합니다.",
        "apihelp-edit-param-minor": "사소한 편집.",
        "apihelp-edit-param-notminor": "사소하지 않은 편집.",
-       "apihelp-edit-param-bot": "이 편집을 봇으로 표시.",
+       "apihelp-edit-param-bot": "이 편집을 봇 편집으로 표시.",
        "apihelp-edit-param-createonly": "이 페이지가 이미 존재하면 편집하지 않습니다.",
        "apihelp-edit-param-nocreate": "페이지가 존재하지 않으면 오류를 출력합니다.",
        "apihelp-edit-param-watch": "문서를 현재 사용자의 주시문서 목록에 추가합니다.",
index 041203e..47b79ab 100644 (file)
@@ -5,6 +5,7 @@
                        "Macofe"
                ]
        },
+       "apihelp-main-param-assertuser": "Iwwerpréifen ob den aktuelle Benotzer de Benotzer mat deem Numm ass.",
        "apihelp-main-param-curtimestamp": "Den aktuellen Zäitstempel an d'Resultat integréieren.",
        "apihelp-block-description": "E Benotzer spären.",
        "apihelp-block-param-user": "Benotzernumm, IP-Adress oder IP-Beräich deen Dir späre wëllt.",
@@ -30,7 +31,7 @@
        "apihelp-edit-param-text": "Säiteninhalt.",
        "apihelp-edit-param-minor": "Kleng Ännerung.",
        "apihelp-edit-param-notminor": "Keng kleng Ännerung",
-       "apihelp-edit-param-bot": "Dës Ännerung als Bot-Ännerung markéieren.",
+       "apihelp-edit-param-bot": "Dës Ännerung als eng Bot-Ännerung markéieren.",
        "apihelp-edit-param-createonly": "D'Säit net ännere wann et se scho gëtt.",
        "apihelp-edit-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.",
        "apihelp-edit-example-edit": "Eng Säit änneren",
index c30110a..c28ac64 100644 (file)
        "apihelp-delete-example-reason": "Usuń <kbd>Main Page</kbd> z powodem <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Ten moduł został wyłączony.",
        "apihelp-edit-description": "Twórz i edytuj strony.",
-       "apihelp-edit-param-title": "Tytuł strony, którą edytować. Nie może być użyty równocześnie z <var>$1pageid</var>.",
-       "apihelp-edit-param-pageid": "ID strony, którą edytować. Nie może być używany równocześnie z <var>$1title</var>.",
+       "apihelp-edit-param-title": "Tytuł strony do edycji. Nie może być użyty równocześnie z <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "ID strony do edycji. Nie może być używany równocześnie z <var>$1title</var>.",
        "apihelp-edit-param-section": "Numer sekcji. <kbd>0</kbd> dla górnej sekcji, <kbd>new</kbd> dla nowej sekcji.",
        "apihelp-edit-param-sectiontitle": "Tytuł nowej sekcji.",
        "apihelp-edit-param-text": "Zawartość strony.",
        "apihelp-edit-param-summary": "Opis edycji. Także tytuł sekcji gdy użyto $1section=new, a nie ustawiono $1sectiontitle.",
-       "apihelp-edit-param-tags": "Znaczniki zmian, które przypisać do tej edycji.",
+       "apihelp-edit-param-tags": "Znaczniki zmian do zastosowania w tej edycji.",
        "apihelp-edit-param-minor": "Drobna zmiana.",
        "apihelp-edit-param-notminor": "Nie oznaczaj tej zmiany jako drobną.",
        "apihelp-edit-param-bot": "Oznacz tę edycję jako edycję bota.",
        "apihelp-purge-description": "Wyczyść pamięć podręczną dla stron o podanych tytułach.\n\nWymaga wysłania jako żądanie POST jeżeli użytkownik jest niezalogowany.",
        "apihelp-purge-param-forcelinkupdate": "Uaktualnij tabele linków.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Uaktualnij tabele linków włącznie z linkami dotyczącymi każdej strony wykorzystywanej jako szablon na tej stronie.",
-       "apihelp-purge-example-simple": "Przemiel strony <kbd>Main Page</kbd> i <kbd>API</kbd>.",
+       "apihelp-purge-example-simple": "Wyczyść strony <kbd>Main Page</kbd> i <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Przeczyść pierwsze 10 stron w przestrzeni głównej.",
        "apihelp-query+allcategories-description": "Emuluj wszystkie kategorie.",
        "apihelp-query+allcategories-param-dir": "Kierunek sortowania.",
        "api-pageset-param-titles": "Lista tytułów, z którymi pracować.",
        "api-pageset-param-pageids": "Lista identyfikatorów stron, z którymi pracować.",
        "api-pageset-param-revids": "Lista identyfikatorów wersji, z którymi pracować.",
-       "api-pageset-param-generator": "Pobierz listę stron, z którymi pracować poprzez wykonanie określonego modułu zapytań.\n\n<strong>Uwaga:</strong> Nazwy parametrów generatora muszą mieć dopisany prefiks \"g\", zobacz przykłady.",
+       "api-pageset-param-generator": "Pobierz listę stron, z którymi pracować poprzez wykonanie określonego modułu zapytań.\n\n<strong>Uwaga:</strong> Nazwy parametrów generatora musi poprzedzać prefiks „g”. Zobacz przykłady.",
        "api-pageset-param-redirects-generator": "Automatycznie rozwiązuj przekierowania ze stron podanych w <var>$1titles</var>, <var>$1pageids</var>, oraz <var>$1revids</var>, a także ze stron zwróconych przez <var>$1generator</var>.",
        "api-pageset-param-converttitles": "Konwertuj tytuły do innych wariantów, jeżeli trzeba. Będzie działać tylko wtedy, gdy język zawartości wiki będzie wspierał konwersje wariantów. Języki, które wspierają konwersję wariantów to m.in. $1.",
        "api-help-title": "Pomoc MediaWiki API",
        "api-help-param-default": "Domyślnie: $1",
        "api-help-param-default-empty": "Domyślnie: <span class=\"apihelp-empty\">(puste)</span>",
        "api-help-param-token": "Token \"$1\" zdobyty z [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
-       "api-help-param-continue": "Gdy będzie dostępnych więcej wyników, użyj tego do ich kontynuowania.",
+       "api-help-param-continue": "Gdy będzie dostępnych więcej wyników, użyj tego do kontynuowania.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(bez opisu)</span>",
        "api-help-examples": "{{PLURAL:$1|Przykład|Przykłady}}:",
        "api-help-permissions": "{{PLURAL:$2|Uprawnienie|Uprawnienia}}:",
index 830a21e..1f1ac4b 100644 (file)
@@ -8,7 +8,7 @@
                        "Hamilton Abreu"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentação]]\n* [[mw: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 Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em activo desenvolvimento, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das actualizações.\n\n<strong>Solicitações erradas:</strong> Quando solicitações erradas são enviadas à API, um cabeçalho em HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Testes:</strong> Para facilitar os testes de solicitações à API, consulte [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentação]]\n* [[mw: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 Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em desenvolvimento ativo, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das atualizações.\n\n<strong>Pedidos incorretos:</strong> Quando são enviados pedidos incorretos à API, um cabeçalho de HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Testes:</strong> Para facilitar os testes de pedidos à API, consulte [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Qual acção a executar.",
        "apihelp-main-param-format": "O formato de saída.",
        "apihelp-main-param-origin": "Ao aceder à API usando um pedido AJAX entre domínios (CORS), coloque aqui o domínio de origem. Isto tem de ser incluído em todas as verificações prévias, e portanto tem de fazer parte da URI do pedido (e não do conteúdo do POST).\n\nPara pedidos autenticados, este valor tem de corresponder de forma exata a um dos cabeçalhos <code>Origin</code>, portanto tem de ser algo como <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não for igual ao cabeçalho <code>Origin</code>, será devolvida a resposta 403. Se este parâmetro for igual ao cabeçalho <code>Origin</code> e a origem for permitida (<i>white-listed</i>) os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão preenchidos.\n\nPara pedidos não autenticados, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code>\nseja preenchido, mas <code>Access-Control-Allow-Credentials</code> terá o valor <code>false</code> e todos os dados específicos do utilizador serão restringidos.",
        "apihelp-emailuser-description": "Enviar correio eletrónico a utilizador.",
        "apihelp-emailuser-param-subject": "Assunto.",
        "apihelp-emailuser-param-text": "Texto.",
+       "apihelp-emailuser-param-ccme": "Enviar-me uma cópia desta mensagem de correio eletrónico.",
        "apihelp-expandtemplates-description": "Expande todas as predefinições em notação wiki.",
        "apihelp-expandtemplates-param-title": "Título da página.",
        "apihelp-expandtemplates-example-simple": "Expandir a notação wiki <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
        "apihelp-feedcontributions-param-feedformat": "O formato do feed.",
        "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas contribuições eliminadas.",
+       "apihelp-feedcontributions-param-toponly": "Mostrar apenas as edições mais recentes.",
        "apihelp-feedcontributions-param-hideminor": "Ocultar edições menores.",
        "apihelp-feedcontributions-param-showsizediff": "Mostrar diferença de tamanho entre edições.",
        "apihelp-feedrecentchanges-param-feedformat": "O formato do feed.",
@@ -86,7 +88,7 @@
        "apihelp-query+filearchive-example-simple": "Mostrar lista de todos os ficheiros eliminados",
        "apihelp-query+info-description": "Obter informação básica da página.",
        "apihelp-query+recentchanges-example-simple": "Lista de mudanças recentes",
-       "apihelp-query+search-param-enablerewrites": "Habilitar rescrever a pesquisa interna. Alguns motores de busca podem rescrever a consulta para outra que acha dará melhores resultados, como a corrigir erros de ortografia.",
+       "apihelp-query+search-param-enablerewrites": "Ativar reescrita da consulta interna. Alguns motores de busca podem reescrever a consulta, substituindo-a por outra que consideram que dará melhores resultados, como acontece na correção de erros de ortografia.",
        "apihelp-query+watchlist-param-owner": "Usado com $1token para aceder à lista de páginas vigiadas de outro utilizador.",
        "apihelp-query+watchlist-param-token": "Uma chave de segurança (disponível nas [[Special:Preferences#mw-prefsection-watchlist|preferências]] do utilizador) para permitir acesso à lista de páginas vigiadas de outro utilizador.",
        "apihelp-query+watchlistraw-param-owner": "Usado com $1token para aceder à lista de páginas vigiadas de outro utilizador.",
index 35389b0..e409591 100644 (file)
@@ -89,7 +89,7 @@
        "apihelp-edit-param-tags": "Ändra taggar till att gälla för revideringen.",
        "apihelp-edit-param-minor": "Mindre redigering.",
        "apihelp-edit-param-notminor": "Icke-mindre redigering.",
-       "apihelp-edit-param-bot": "Markera denna redigering som robotredigering.",
+       "apihelp-edit-param-bot": "Markera denna redigering som en robotredigering.",
        "apihelp-edit-param-basetimestamp": "Tidsstämpel för grundversionen, används för att upptäcka redigeringskonflikter. Kan erhållas genom [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Tidsstämpel för när redigeringsprocessen började, används för att upptäcka redigeringskonflikter. Ett lämpligt värde kan erhållas via  <var>[[Special:ApiHelp/main|curtimestamp]]</var> när redigeringsprocessen startas (t.ex. när sidans innehåll laddas för redigering).",
        "apihelp-edit-param-recreate": "Ignorera felmeddelande om sidan har blivit raderad under tiden.",
        "apihelp-emailuser-param-text": "E-postmeddelandets innehåll.",
        "apihelp-emailuser-param-ccme": "Skicka en kopia av detta e-postmeddelande till mig.",
        "apihelp-emailuser-example-email": "Skicka ett e-postmeddelande till användaren <kbd>WikiSysop</kbd> med texten <kbd>Content</kbd>.",
-       "apihelp-expandtemplates-description": "Expanderar alla mallar i wikitext.",
+       "apihelp-expandtemplates-description": "Expanderar alla mallar inom wikitext.",
        "apihelp-expandtemplates-param-title": "Sidans rubrik.",
        "apihelp-expandtemplates-param-text": "Wikitext att konvertera.",
        "apihelp-expandtemplates-param-revid": "Revision ID, för <nowiki>{{REVISIONID}}</nowiki> och liknande variabler.",
index e223e16..eeb233e 100644 (file)
@@ -1678,7 +1678,7 @@ class AuthManager implements LoggerAwareInterface {
 
                // Ignore warnings about master connections/writes...hard to avoid here
                $trxProfiler = \Profiler::instance()->getTransactionProfiler();
-               $trxProfiler->setSilenced( true );
+               $old = $trxProfiler->setSilenced( true );
                try {
                        $status = $user->addToDatabase();
                        if ( !$status->isOK() ) {
@@ -1704,7 +1704,7 @@ class AuthManager implements LoggerAwareInterface {
                                return $status;
                        }
                } catch ( \Exception $ex ) {
-                       $trxProfiler->setSilenced( false );
+                       $trxProfiler->setSilenced( $old );
                        $this->logger->error( __METHOD__ . ': {username} failed with exception {exception}', [
                                'username' => $username,
                                'exception' => $ex,
@@ -1743,7 +1743,7 @@ class AuthManager implements LoggerAwareInterface {
                        $logEntry->insert();
                }
 
-               $trxProfiler->setSilenced( false );
+               $trxProfiler->setSilenced( $old );
 
                if ( $login ) {
                        $this->setSessionDataForUser( $user );
index f393acd..6834ac0 100644 (file)
@@ -631,11 +631,11 @@ class MessageCache {
                if ( $dest === 'all' ) {
                        $cacheKey = wfMemcKey( 'messages', $code );
                        $success = $this->mMemc->set( $cacheKey, $cache );
+                       $this->setValidationHash( $code, $cache );
                } else {
                        $success = true;
                }
 
-               $this->setValidationHash( $code, $cache );
                $this->saveToLocalCache( $code, $cache );
 
                return $success;
index 5755918..3389a00 100644 (file)
@@ -82,15 +82,6 @@ class MWUnknownContentModelException extends MWException {
  * @ingroup Content
  */
 abstract class ContentHandler {
-       /**
-        * Switch for enabling deprecation warnings. Used by ContentHandler::deprecated()
-        * and ContentHandler::runLegacyHooks().
-        *
-        * Once the ContentHandler code has settled in a bit, this should be set to true to
-        * make extensions etc. show warnings when using deprecated functions and hooks.
-        */
-       protected static $enableDeprecationWarnings = false;
-
        /**
         * Convenience function for getting flat text from a Content object. This
         * should only be used in the context of backwards compatibility with code
@@ -1139,25 +1130,6 @@ abstract class ContentHandler {
                return $this->supportsDirectEditing();
        }
 
-       /**
-        * Logs a deprecation warning, visible if $wgDevelopmentWarnings, but only if
-        * self::$enableDeprecationWarnings is set to true.
-        *
-        * @param string $func The name of the deprecated function
-        * @param string $version The version since the method is deprecated. Usually 1.21
-        *   for ContentHandler related stuff.
-        * @param string|bool $component : Component to which the function belongs.
-        *   If false, it is assumed the function is in MediaWiki core.
-        *
-        * @see ContentHandler::$enableDeprecationWarnings
-        * @see wfDeprecated
-        */
-       public static function deprecated( $func, $version, $component = false ) {
-               if ( self::$enableDeprecationWarnings ) {
-                       wfDeprecated( $func, $version, $component, 3 );
-               }
-       }
-
        /**
         * Call a legacy hook that uses text instead of Content objects.
         * Will log a warning when a matching hook function is registered.
index fe12ff7..f4a6dc6 100644 (file)
@@ -77,7 +77,7 @@ class WikiTextStructure {
                        $heading = $heading[ 'line' ];
 
                        // Some wikis wrap the brackets in a span:
-                       // http://en.wikipedia.org/wiki/MediaWiki:Cite_reference_link
+                       // https://en.wikipedia.org/wiki/MediaWiki:Cite_reference_link
                        $heading = preg_replace( '/<\/?span>/', '', $heading );
                        // Normalize [] so the following regexp would work.
                        $heading = preg_replace( [ '/&#91;/', '/&#93;/' ], [ '[', ']' ], $heading );
index 8a761f5..1ba6c1f 100644 (file)
@@ -52,6 +52,8 @@ class DeferredUpdates {
        private static $preSendUpdates = [];
        /** @var DeferrableUpdate[] Updates to be deferred until after request end */
        private static $postSendUpdates = [];
+       /** @var bool Whether to just run updates in addUpdate() */
+       private static $immediateMode = false;
 
        const ALL = 0; // all updates; in web requests, use only after flushing the output buffer
        const PRESEND = 1; // for updates that should run before flushing output buffer
@@ -85,6 +87,12 @@ class DeferredUpdates {
                        self::push( self::$postSendUpdates, $update );
                }
 
+               if ( self::$immediateMode ) {
+                       // No more explicit doUpdates() calls will happen, so run this now
+                       self::doUpdates( 'run' );
+                       return;
+               }
+
                // Try to run the updates now if in CLI mode and no transaction is active.
                // This covers scripts that don't/barely use the DB but make updates to other stores.
                if ( $wgCommandLineMode ) {
@@ -126,6 +134,14 @@ class DeferredUpdates {
                }
        }
 
+       /**
+        * @param bool $value Whether to just immediately run updates in addUpdate()
+        * @since 1.28
+        */
+       public static function setImmediateMode( $value ) {
+               self::$immediateMode = (bool)$value;
+       }
+
        /**
         * @param DeferrableUpdate[] $queue
         * @param DeferrableUpdate $update
index cd644cb..16e9a44 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup DifferenceEngine
  */
 
-// Deprecated, use class constant instead
+/** @deprecated use class constant instead */
 define( 'MW_DIFF_VERSION', '1.11a' );
 
 /**
@@ -176,7 +176,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @param int $id Revision ID
         *
-        * @return mixed URL or false
+        * @return string|bool Link HTML or false
         */
        public function deletedLink( $id ) {
                if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
index 66f89f9..3390a56 100644 (file)
@@ -126,6 +126,9 @@ class HTMLDateTimeField extends HTMLTextField {
 
        protected function parseDate( $value ) {
                $value = trim( $value );
+               if ( $value === '' ) {
+                       return false;
+               }
 
                if ( $this->mType === 'date' ) {
                        $value .= ' T00:00:00+0000';
@@ -138,7 +141,7 @@ class HTMLDateTimeField extends HTMLTextField {
                        $date = new DateTime( $value, new DateTimeZone( 'GMT' ) );
                        return $date->getTimestamp();
                } catch ( Exception $ex ) {
-                       return 0;
+                       return false;
                }
        }
 
index 497f273..a637ce0 100644 (file)
@@ -290,6 +290,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'doNonUniquePlTlIl' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
                        [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
+                       [ 'modifyField', 'recentchanges', 'rc_ip', 'patch-rc_ip_modify.sql' ],
                ];
        }
 
index 8b1ca18..5cdb83f 100644 (file)
@@ -62,6 +62,7 @@
        "config-memory-bad": "<strong>Предупреждение:<strong> <code>memory_limit</code> на PHP е $1.\nСтойността вероятно е твърде ниска.\nВъзможно е инсталацията да се провали!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] е инсталиран",
        "config-apc": "[http://www.php.net/apc APC] е инсталиран",
+       "config-apcu": "[http://www.php.net/apc APC] е инсталиран",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] е инсталиран",
        "config-mod-security": "<strong>Предупреждение:</strong> [http://modsecurity.org/ mod_security]/mod_security2 е включено на вашия уеб сървър. Много от обичайните му конфигурации пораждат проблеми с МедияУики и друг софтуер, който позволява публикуване на произволно съдържание.\nАко е възможно, моля изключете го. В противен случай се обърнете към [http://modsecurity.org/documentation/ документацията на mod_security] или се свържете с поддръжката на хостинга си, ако се сблъскате със случайни грешки.",
        "config-diff3-bad": "GNU diff3 не беше намерен.",
        "config-cache-options": "Настройки за обектното кеширане:",
        "config-cache-help": "Обектното кеширане се използва за подобряване на скоростта на МедияУики чрез кеширане на често използваните данни.\nСилно препоръчително е на средните и големите сайтове да включат тази настройка, но малките също могат да се възползват от нея.",
        "config-cache-none": "Без кеширане (не се премахва от функционалността, но това влияе на скоростта на по-големи уикита)",
-       "config-cache-accel": "PHP обектно кеширане (APC, XCache или WinCache)",
+       "config-cache-accel": "PHP обектно кеширане (APCu, XCache или WinCache)",
        "config-cache-memcached": "Използване на Memcached (изисква допълнителни настройки и конфигуриране)",
        "config-memcached-servers": "Memcached сървъри:",
        "config-memcached-help": "Списък с IP адреси за използване за Memcached.\nНеобходимо е да бъдат разделени по един на ред, както и да е посочен порта. Пример:\n127.0.0.1:11211\n192.168.1.25:1234",
        "config-install-done-path": "<strong>Поздравления!</strong>\nИнсталирането на МедияУики приключи успешно.\n\nИнсталаторът създаде файл <code>LocalSettings.php</code>.\nТой съдържа всички ваши настройки.\n\nНеобходимо е той да бъде изтеглен и поставен в <code>$4</code>. Изтеглянето би трябвало да започне автоматично.\n\nАко изтеглянето не започне автоматично или е било прекратено, файлът може да бъде изтеглен чрез щракване на препратката по-долу:\n\n$3\n\n<strong>Забележка:</strong> Ако това не бъде направено сега, генерираният конфигурационен файл няма да е достъпен на по-късен етап ако не бъде изтеглен сега или инсталацията приключи без изтеглянето му.\n\nКогато файлът вече е в основната директория, <strong>[$2 уикито ще е достъпно на този адрес]</strong>.",
        "config-download-localsettings": "Изтегляне на <code>LocalSettings.php</code>",
        "config-help": "помощ",
+       "config-help-tooltip": "Щракнете за разширяване",
        "config-nofile": "Файлът „$1“ не може да бъде открит. Да не е бил изтрит?",
        "config-extension-link": "Знаете ли, че това уики поддържа [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions разширения]?\n\nМожете да разгледате [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category разширенията по категория] или [https://www.mediawiki.org/wiki/Extension_Matrix Матрицата на разширенията] за пълен списък на разширенията.",
        "mainpagetext": "<strong>МедияУики беше успешно инсталирано.</strong>",
index 7dbca51..5939291 100644 (file)
@@ -75,6 +75,7 @@
        "config-memory-bad": "'''Varoitus:''' PHP:n <code>memory_limit</code> on $1.\nTämä on luultavasti liian alhainen.\nAsennus saattaa epäonnistua!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] on asennettu",
        "config-apc": "[http://www.php.net/apc APC] on asennettu.",
+       "config-apcu": "[http://www.php.net/apcu APCu] on asennettu",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] on asennettu",
        "config-diff3-bad": "GNU diff3:a ei löytynyt.",
        "config-git": "Löydetty Git versionhallintaohjelmisto: <code>$1</code>",
index c9ae2c8..271f3d6 100644 (file)
@@ -69,6 +69,7 @@
        "config-memory-bad": "<strong>경고:</strong> PHP의 <code>memory_limit</code>는 $1입니다.\n아마도 너무 낮은 것 같습니다.\n설치가 실패할 수 있습니다!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache]가 설치되었습니다",
        "config-apc": "[http://www.php.net/apc APC]가 설치되었습니다",
+       "config-apcu": "[http://www.php.net/apcu APCu]가 설치되었습니다",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]가 설치되었습니다",
        "config-no-cache-apcu": "<strong>경고:</strong> [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] 또는 [http://www.iis.net/download/WinCacheForPhp WinCache]를 찾을 수 없습니다.\n개체 캐싱을 활성화할 수 없습니다.",
        "config-mod-security": "<strong>경고:</strong> 웹 서버에 [http://modsecurity.org/ mod_security]가 허용되었습니다. 잘못 설정된 경우 미디어위키나 사용자가 임의의 내용을 게시할 수 있는 다른 소프트웨어에 대한 문제를 일으킬 수 있습니다.\n[http://modsecurity.org/documentation/ mod_security] 문서를 참고하거나 임의의 오류가 발생할 경우 호스트의 지원 요청에 문의하십시오.",
index 22cceb4..41e526a 100644 (file)
@@ -4,7 +4,8 @@
                        "Eitvys200",
                        "Mantak111",
                        "Zygimantus",
-                       "Hugo.arg"
+                       "Hugo.arg",
+                       "Homo"
                ]
        },
        "config-desc": "MediaWiki diegimas",
        "config-license": "Autorinės teisės ir licencija:",
        "config-license-pd": "Viešas domenas",
        "config-email-settings": "El. pašto nustatymai",
-       "config-email-watchlist": "Įjungti stebimų pranešimą",
+       "config-email-watchlist": "Įjungti stebimų pranešimą",
        "config-email-auth": "Įjungti el. pašto autentifikavimą",
        "config-upload-settings": "Vaizdų ir failų įkėlimai",
        "config-upload-enable": "Įgalinti failų įkėlimus",
index 0e5d40a..a6b1508 100644 (file)
@@ -52,7 +52,7 @@
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki hjem]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Brukerguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratorguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ OSS]\n----\n* <doclink href=Readme>Les meg</doclink>\n* <doclink href=ReleaseNotes>Utgivelsesnotater</doclink>\n* <doclink href=Copying>Kopiering</doclink>\n* <doclink href=UpgradeDoc>Oppgradering</doclink>",
        "config-env-good": "Miljøet har blitt sjekket.\nDu kan installere MediaWiki.",
        "config-env-bad": "Miljøet har blitt sjekket.\nDu kan installere MediaWiki.",
-       "config-env-php": "PHP $1 er innstallert.",
+       "config-env-php": "PHP $1 er installert.",
        "config-env-hhvm": "HHVM $1 er installert.",
        "config-unicode-using-intl": "Bruker [http://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Advarsel''': [http://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.\nOm du kjører et nettsted med høy trafikk bør du lese litt om [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
@@ -64,8 +64,8 @@
        "config-pcre-no-utf8": "'''Fatal''': PHPs PCRE modul ser ut til å være kompilert uten PCRE_UTF8-støtte.\nMediaWiki krever UTF-8-støtte for å fungere riktig.",
        "config-memory-raised": "PHPs <code>memory_limit</code> er $1, økt til $2.",
        "config-memory-bad": "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.\nDette er sannsynligvis for lavt.\nInstallasjonen kan mislykkes!",
-       "config-xcache": "[http://xcache.lighttpd.net/ XCache] er innstallert",
-       "config-apc": "[http://www.php.net/apc APC] er innstallert",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] er installert",
+       "config-apc": "[http://www.php.net/apc APC] er installert",
        "config-apcu": "[http://www.php.net/apcu APCu] er installert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] er installert",
        "config-no-cache-apcu": "<strong>Advarsel:</strong> Kunne ikke finne [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nObjekthurtiglagring er ikke aktivert.",
index ce9ff81..2847efc 100644 (file)
@@ -24,7 +24,7 @@
        "config-page-dbconnect": "डेटाबेससँग सम्बन्ध बनाउने",
        "config-page-dbsettings": "डेटावेस सेटिङ",
        "config-page-name": "नाम",
-       "config-page-options": "विà¤\95लà¥\8dपहरà¥\81",
+       "config-page-options": "विà¤\95लà¥\8dपहरà¥\82",
        "config-page-install": "स्थापना गर्ने",
        "config-page-complete": "पूरा भयो !",
        "config-page-restart": "स्थापना फेरि सुरु गर्ने",
index e04944f..6cd4d38 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Harald Khan",
                        "Nghtwlkr",
-                       "Njardarlogar"
+                       "Njardarlogar",
+                       "Jon Harald Søby"
                ]
        },
        "config-your-language": "Språket ditt:",
@@ -13,8 +14,8 @@
        "config-page-language": "Språk",
        "config-memory-raised": "PHPs <code>memory_limit</code> er $1, auka til $2.",
        "config-memory-bad": "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.\nDette er sannsynlegvis for lågt.\nInstallasjonen kan mislukkast!",
-       "config-xcache": "[http://xcache.lighttpd.net/ XCache] er innstallert",
-       "config-apc": "[http://www.php.net/apc APC] er innstallert",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] er installert",
+       "config-apc": "[http://www.php.net/apc APC] er installert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] er installert",
        "config-db-name": "Databasenamn:",
        "config-db-username": "Databasebrukarnamn:",
index 365231c..0820ff5 100644 (file)
@@ -64,6 +64,7 @@
        "config-memory-bad": "<strong>Cảnh báo:</strong> <code>memory_limit</code> của PHP là $1.\nGiá trị này có lẽ quá thấp.\nCài đặt có thể bị thất bại!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] đã được cài đặt",
        "config-apc": "[http://www.php.net/apc APC] đã được cài đặt",
+       "config-apcu": "[http://www.php.net/apcu APCu] đã được cài đặt",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] đã được cài đặt",
        "config-no-cache-apcu": "<strong>Cảnh báo:</strong> Không tìm thấy [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache], hoặc [http://www.iis.net/download/WinCacheForPhp WinCache].\nVùng nhớ đệm đối tượng không được kích hoạt.",
        "config-mod-security": "<strong>Cảnh báo:</strong> [http://modsecurity.org/ mod_security]/mod_security2 đã được kích hoạt trên máy chủ Web của bạn. Nhiều cấu hình phổ biến của phần mềm này sẽ gây vấn đề cho MediaWiki và những phần mềm khác cho phép người dùng đăng các nội dung tùy tiện.\nNếu có thể, bạn nên vô hiệu nó. Còn không, tra cứu [http://modsecurity.org/documentation/ tài liệu mod_security] hoặc liên hệ với nhà cung cấp hỗ trợ cho máy chủ nếu bạn gặp những lỗi ngẫu nhiên nào đó.",
        "config-cache-options": "Thiết lập bộ nhớ đệm đối tượng:",
        "config-cache-help": "Lưu vào bộ nhớ đệm đối tượng được sử dụng để cải thiện tốc độ của MediaWiki bằng cách lưu vào bộ nhớ đệm những dữ liệu thường xuyên sử dụng.\nCác trang web từ trung bình cho đến các trang web lớn rất được khuyến khích kích hoạt tính năng này, và các trang web nhỏ cũng sẽ nhìn thấy lợi ích tương tự.",
        "config-cache-none": "Không lưu vào bộ nhớ đệm (không có chức năng nhiệm vụ sẽ được loại bỏ, nhưng tốc độ có thể bị ảnh hưởng trên các trang web wiki lớn hơn)",
-       "config-cache-accel": "Bộ nhớ đệm đối tượng PHP (APC, XCache, hoặc WinCache)",
+       "config-cache-accel": "Bộ nhớ đệm đối tượng PHP (APC, APCu, XCache, hoặc WinCache)",
        "config-cache-memcached": "Sử dụng Memcached (cần thiết lập và cấu hình thêm)",
        "config-memcached-servers": "Máy chủ Memcached:",
        "config-memcached-help": "Danh sách các địa chỉ IP để sử dụng cho Memcached .\nNên xác định trên một dòng và chỉ định các cổng được sử dụng. Ví dụ:\n 127.0.0.1:11211\n 192.168.1.25:1234",
diff --git a/includes/libs/IEContentAnalyzer.php b/includes/libs/IEContentAnalyzer.php
deleted file mode 100644 (file)
index 0d1e527..0000000
+++ /dev/null
@@ -1,851 +0,0 @@
-<?php
-/**
- * Simulation of Microsoft Internet Explorer's MIME type detection algorithm.
- *
- * @file
- * @todo Define the exact license of this file.
- */
-
-/**
- * This class simulates Microsoft Internet Explorer's terribly broken and
- * insecure MIME type detection algorithm. It can be used to check web uploads
- * with an apparently safe type, to see if IE will reinterpret them to produce
- * something dangerous.
- *
- * It is full of bugs and strange design choices should not under any
- * circumstances be used to determine a MIME type to present to a user or
- * client. (Apple Safari developers, this means you too.)
- *
- * This class is based on a disassembly of IE 5.0, 6.0 and 7.0. Although I have
- * attempted to ensure that this code works in exactly the same way as Internet
- * Explorer, it does not share any source code, or creative choices such as
- * variable names, thus I (Tim Starling) claim copyright on it.
- *
- * It may be redistributed without restriction. To aid reuse, this class does
- * not depend on any MediaWiki module.
- */
-class IEContentAnalyzer {
-       /**
-        * Relevant data taken from the type table in IE 5
-        */
-       protected $baseTypeTable = [
-               'ambiguous' /*1*/ => [
-                       'text/plain',
-                       'application/octet-stream',
-                       'application/x-netcdf', // [sic]
-               ],
-               'text' /*3*/ => [
-                       'text/richtext', 'image/x-bitmap', 'application/postscript', 'application/base64',
-                       'application/macbinhex40', 'application/x-cdf', 'text/scriptlet'
-               ],
-               'binary' /*4*/ => [
-                       'application/pdf', 'audio/x-aiff', 'audio/basic', 'audio/wav', 'image/gif',
-                       'image/pjpeg', 'image/jpeg', 'image/tiff', 'image/x-png', 'image/png', 'image/bmp',
-                       'image/x-jg', 'image/x-art', 'image/x-emf', 'image/x-wmf', 'video/avi',
-                       'video/x-msvideo', 'video/mpeg', 'application/x-compressed',
-                       'application/x-zip-compressed', 'application/x-gzip-compressed', 'application/java',
-                       'application/x-msdownload'
-               ],
-               'html' /*5*/ => [ 'text/html' ],
-       ];
-
-       /**
-        * Changes to the type table in later versions of IE
-        */
-       protected $addedTypes = [
-               'ie07' => [
-                       'text' => [ 'text/xml', 'application/xml' ]
-               ],
-       ];
-
-       /**
-        * An approximation of the "Content Type" values in HKEY_CLASSES_ROOT in a
-        * typical Windows installation.
-        *
-        * Used for extension to MIME type mapping if detection fails.
-        */
-       protected $registry = [
-               '.323' => 'text/h323',
-               '.3g2' => 'video/3gpp2',
-               '.3gp' => 'video/3gpp',
-               '.3gp2' => 'video/3gpp2',
-               '.3gpp' => 'video/3gpp',
-               '.aac' => 'audio/aac',
-               '.ac3' => 'audio/ac3',
-               '.accda' => 'application/msaccess',
-               '.accdb' => 'application/msaccess',
-               '.accdc' => 'application/msaccess',
-               '.accde' => 'application/msaccess',
-               '.accdr' => 'application/msaccess',
-               '.accdt' => 'application/msaccess',
-               '.ade' => 'application/msaccess',
-               '.adp' => 'application/msaccess',
-               '.adts' => 'audio/aac',
-               '.ai' => 'application/postscript',
-               '.aif' => 'audio/aiff',
-               '.aifc' => 'audio/aiff',
-               '.aiff' => 'audio/aiff',
-               '.amc' => 'application/x-mpeg',
-               '.application' => 'application/x-ms-application',
-               '.asf' => 'video/x-ms-asf',
-               '.asx' => 'video/x-ms-asf',
-               '.au' => 'audio/basic',
-               '.avi' => 'video/avi',
-               '.bmp' => 'image/bmp',
-               '.caf' => 'audio/x-caf',
-               '.cat' => 'application/vnd.ms-pki.seccat',
-               '.cbo' => 'application/sha',
-               '.cdda' => 'audio/aiff',
-               '.cer' => 'application/x-x509-ca-cert',
-               '.conf' => 'text/plain',
-               '.crl' => 'application/pkix-crl',
-               '.crt' => 'application/x-x509-ca-cert',
-               '.css' => 'text/css',
-               '.csv' => 'application/vnd.ms-excel',
-               '.der' => 'application/x-x509-ca-cert',
-               '.dib' => 'image/bmp',
-               '.dif' => 'video/x-dv',
-               '.dll' => 'application/x-msdownload',
-               '.doc' => 'application/msword',
-               '.docm' => 'application/vnd.ms-word.document.macroEnabled.12',
-               '.docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
-               '.dot' => 'application/msword',
-               '.dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
-               '.dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
-               '.dv' => 'video/x-dv',
-               '.dwfx' => 'model/vnd.dwfx+xps',
-               '.edn' => 'application/vnd.adobe.edn',
-               '.eml' => 'message/rfc822',
-               '.eps' => 'application/postscript',
-               '.etd' => 'application/x-ebx',
-               '.exe' => 'application/x-msdownload',
-               '.fdf' => 'application/vnd.fdf',
-               '.fif' => 'application/fractals',
-               '.gif' => 'image/gif',
-               '.gsm' => 'audio/x-gsm',
-               '.hqx' => 'application/mac-binhex40',
-               '.hta' => 'application/hta',
-               '.htc' => 'text/x-component',
-               '.htm' => 'text/html',
-               '.html' => 'text/html',
-               '.htt' => 'text/webviewhtml',
-               '.hxa' => 'application/xml',
-               '.hxc' => 'application/xml',
-               '.hxd' => 'application/octet-stream',
-               '.hxe' => 'application/xml',
-               '.hxf' => 'application/xml',
-               '.hxh' => 'application/octet-stream',
-               '.hxi' => 'application/octet-stream',
-               '.hxk' => 'application/xml',
-               '.hxq' => 'application/octet-stream',
-               '.hxr' => 'application/octet-stream',
-               '.hxs' => 'application/octet-stream',
-               '.hxt' => 'application/xml',
-               '.hxv' => 'application/xml',
-               '.hxw' => 'application/octet-stream',
-               '.ico' => 'image/x-icon',
-               '.iii' => 'application/x-iphone',
-               '.ins' => 'application/x-internet-signup',
-               '.iqy' => 'text/x-ms-iqy',
-               '.isp' => 'application/x-internet-signup',
-               '.jfif' => 'image/jpeg',
-               '.jnlp' => 'application/x-java-jnlp-file',
-               '.jpe' => 'image/jpeg',
-               '.jpeg' => 'image/jpeg',
-               '.jpg' => 'image/jpeg',
-               '.jtx' => 'application/x-jtx+xps',
-               '.latex' => 'application/x-latex',
-               '.log' => 'text/plain',
-               '.m1v' => 'video/mpeg',
-               '.m2v' => 'video/mpeg',
-               '.m3u' => 'audio/x-mpegurl',
-               '.mac' => 'image/x-macpaint',
-               '.man' => 'application/x-troff-man',
-               '.mda' => 'application/msaccess',
-               '.mdb' => 'application/msaccess',
-               '.mde' => 'application/msaccess',
-               '.mfp' => 'application/x-shockwave-flash',
-               '.mht' => 'message/rfc822',
-               '.mhtml' => 'message/rfc822',
-               '.mid' => 'audio/mid',
-               '.midi' => 'audio/mid',
-               '.mod' => 'video/mpeg',
-               '.mov' => 'video/quicktime',
-               '.mp2' => 'video/mpeg',
-               '.mp2v' => 'video/mpeg',
-               '.mp3' => 'audio/mpeg',
-               '.mp4' => 'video/mp4',
-               '.mpa' => 'video/mpeg',
-               '.mpe' => 'video/mpeg',
-               '.mpeg' => 'video/mpeg',
-               '.mpf' => 'application/vnd.ms-mediapackage',
-               '.mpg' => 'video/mpeg',
-               '.mpv2' => 'video/mpeg',
-               '.mqv' => 'video/quicktime',
-               '.NMW' => 'application/nmwb',
-               '.nws' => 'message/rfc822',
-               '.odc' => 'text/x-ms-odc',
-               '.ols' => 'application/vnd.ms-publisher',
-               '.p10' => 'application/pkcs10',
-               '.p12' => 'application/x-pkcs12',
-               '.p7b' => 'application/x-pkcs7-certificates',
-               '.p7c' => 'application/pkcs7-mime',
-               '.p7m' => 'application/pkcs7-mime',
-               '.p7r' => 'application/x-pkcs7-certreqresp',
-               '.p7s' => 'application/pkcs7-signature',
-               '.pct' => 'image/pict',
-               '.pdf' => 'application/pdf',
-               '.pdx' => 'application/vnd.adobe.pdx',
-               '.pfx' => 'application/x-pkcs12',
-               '.pic' => 'image/pict',
-               '.pict' => 'image/pict',
-               '.pinstall' => 'application/x-picasa-detect',
-               '.pko' => 'application/vnd.ms-pki.pko',
-               '.png' => 'image/png',
-               '.pnt' => 'image/x-macpaint',
-               '.pntg' => 'image/x-macpaint',
-               '.pot' => 'application/vnd.ms-powerpoint',
-               '.potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12',
-               '.potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
-               '.ppa' => 'application/vnd.ms-powerpoint',
-               '.ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
-               '.pps' => 'application/vnd.ms-powerpoint',
-               '.ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
-               '.ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
-               '.ppt' => 'application/vnd.ms-powerpoint',
-               '.pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
-               '.pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
-               '.prf' => 'application/pics-rules',
-               '.ps' => 'application/postscript',
-               '.pub' => 'application/vnd.ms-publisher',
-               '.pwz' => 'application/vnd.ms-powerpoint',
-               '.py' => 'text/plain',
-               '.pyw' => 'text/plain',
-               '.qht' => 'text/x-html-insertion',
-               '.qhtm' => 'text/x-html-insertion',
-               '.qt' => 'video/quicktime',
-               '.qti' => 'image/x-quicktime',
-               '.qtif' => 'image/x-quicktime',
-               '.qtl' => 'application/x-quicktimeplayer',
-               '.rat' => 'application/rat-file',
-               '.rmf' => 'application/vnd.adobe.rmf',
-               '.rmi' => 'audio/mid',
-               '.rqy' => 'text/x-ms-rqy',
-               '.rtf' => 'application/msword',
-               '.sct' => 'text/scriptlet',
-               '.sd2' => 'audio/x-sd2',
-               '.sdp' => 'application/sdp',
-               '.shtml' => 'text/html',
-               '.sit' => 'application/x-stuffit',
-               '.sldm' => 'application/vnd.ms-powerpoint.slide.macroEnabled.12',
-               '.sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
-               '.slk' => 'application/vnd.ms-excel',
-               '.snd' => 'audio/basic',
-               '.so' => 'application/x-apachemodule',
-               '.sol' => 'text/plain',
-               '.sor' => 'text/plain',
-               '.spc' => 'application/x-pkcs7-certificates',
-               '.spl' => 'application/futuresplash',
-               '.sst' => 'application/vnd.ms-pki.certstore',
-               '.stl' => 'application/vnd.ms-pki.stl',
-               '.swf' => 'application/x-shockwave-flash',
-               '.thmx' => 'application/vnd.ms-officetheme',
-               '.tif' => 'image/tiff',
-               '.tiff' => 'image/tiff',
-               '.txt' => 'text/plain',
-               '.uls' => 'text/iuls',
-               '.vcf' => 'text/x-vcard',
-               '.vdx' => 'application/vnd.ms-visio.viewer',
-               '.vsd' => 'application/vnd.ms-visio.viewer',
-               '.vss' => 'application/vnd.ms-visio.viewer',
-               '.vst' => 'application/vnd.ms-visio.viewer',
-               '.vsx' => 'application/vnd.ms-visio.viewer',
-               '.vtx' => 'application/vnd.ms-visio.viewer',
-               '.wav' => 'audio/wav',
-               '.wax' => 'audio/x-ms-wax',
-               '.wbk' => 'application/msword',
-               '.wdp' => 'image/vnd.ms-photo',
-               '.wiz' => 'application/msword',
-               '.wm' => 'video/x-ms-wm',
-               '.wma' => 'audio/x-ms-wma',
-               '.wmd' => 'application/x-ms-wmd',
-               '.wmv' => 'video/x-ms-wmv',
-               '.wmx' => 'video/x-ms-wmx',
-               '.wmz' => 'application/x-ms-wmz',
-               '.wpl' => 'application/vnd.ms-wpl',
-               '.wsc' => 'text/scriptlet',
-               '.wvx' => 'video/x-ms-wvx',
-               '.xaml' => 'application/xaml+xml',
-               '.xbap' => 'application/x-ms-xbap',
-               '.xdp' => 'application/vnd.adobe.xdp+xml',
-               '.xfdf' => 'application/vnd.adobe.xfdf',
-               '.xht' => 'application/xhtml+xml',
-               '.xhtml' => 'application/xhtml+xml',
-               '.xla' => 'application/vnd.ms-excel',
-               '.xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
-               '.xlk' => 'application/vnd.ms-excel',
-               '.xll' => 'application/vnd.ms-excel',
-               '.xlm' => 'application/vnd.ms-excel',
-               '.xls' => 'application/vnd.ms-excel',
-               '.xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
-               '.xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
-               '.xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
-               '.xlt' => 'application/vnd.ms-excel',
-               '.xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
-               '.xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
-               '.xlw' => 'application/vnd.ms-excel',
-               '.xml' => 'text/xml',
-               '.xps' => 'application/vnd.ms-xpsdocument',
-               '.xsl' => 'text/xml',
-       ];
-
-       /**
-        * IE versions which have been analysed to bring you this class, and for
-        * which some substantive difference exists. These will appear as keys
-        * in the return value of getRealMimesFromData(). The names are chosen to sort correctly.
-        */
-       protected $versions = [ 'ie05', 'ie06', 'ie07', 'ie07.strict', 'ie07.nohtml' ];
-
-       /**
-        * Type table with versions expanded
-        */
-       protected $typeTable = [];
-
-       /** constructor */
-       function __construct() {
-               // Construct versioned type arrays from the base type array plus additions
-               $types = $this->baseTypeTable;
-               foreach ( $this->versions as $version ) {
-                       if ( isset( $this->addedTypes[$version] ) ) {
-                               foreach ( $this->addedTypes[$version] as $format => $addedTypes ) {
-                                       $types[$format] = array_merge( $types[$format], $addedTypes );
-                               }
-                       }
-                       $this->typeTable[$version] = $types;
-               }
-       }
-
-       /**
-        * Get the MIME types from getMimesFromData(), but convert the result from IE's
-        * idiosyncratic private types into something other apps will understand.
-        *
-        * @param string $fileName the file name (unused at present)
-        * @param string $chunk the first 256 bytes of the file
-        * @param string $proposed the MIME type proposed by the server
-        *
-        * @return Array: map of IE version to detected MIME type
-        */
-       public function getRealMimesFromData( $fileName, $chunk, $proposed ) {
-               $types = $this->getMimesFromData( $fileName, $chunk, $proposed );
-               $types = array_map( [ $this, 'translateMimeType' ], $types );
-               return $types;
-       }
-
-       /**
-        * Translate a MIME type from IE's idiosyncratic private types into
-        * more commonly understood type strings
-        * @param $type
-        * @return string
-        */
-       public function translateMimeType( $type ) {
-               static $table = [
-                       'image/pjpeg' => 'image/jpeg',
-                       'image/x-png' => 'image/png',
-                       'image/x-wmf' => 'application/x-msmetafile',
-                       'image/bmp' => 'image/x-bmp',
-                       'application/x-zip-compressed' => 'application/zip',
-                       'application/x-compressed' => 'application/x-compress',
-                       'application/x-gzip-compressed' => 'application/x-gzip',
-                       'audio/mid' => 'audio/midi',
-               ];
-               if ( isset( $table[$type] ) ) {
-                       $type = $table[$type];
-               }
-               return $type;
-       }
-
-       /**
-        * Get the untranslated MIME types for all known versions
-        *
-        * @param string $fileName the file name (unused at present)
-        * @param string $chunk the first 256 bytes of the file
-        * @param string $proposed the MIME type proposed by the server
-        *
-        * @return Array: map of IE version to detected MIME type
-        */
-       public function getMimesFromData( $fileName, $chunk, $proposed ) {
-               $types = [];
-               foreach ( $this->versions as $version ) {
-                       $types[$version] = $this->getMimeTypeForVersion( $version, $fileName, $chunk, $proposed );
-               }
-               return $types;
-       }
-
-       /**
-        * Get the MIME type for a given named version
-        * @param $version
-        * @param $fileName
-        * @param $chunk
-        * @param $proposed
-        * @return bool|string
-        */
-       protected function getMimeTypeForVersion( $version, $fileName, $chunk, $proposed ) {
-               // Strip text after a semicolon
-               $semiPos = strpos( $proposed, ';' );
-               if ( $semiPos !== false ) {
-                       $proposed = substr( $proposed, 0, $semiPos );
-               }
-
-               $proposedFormat = $this->getDataFormat( $version, $proposed );
-               if ( $proposedFormat == 'unknown'
-                       && $proposed != 'multipart/mixed'
-                       && $proposed != 'multipart/x-mixed-replace' )
-               {
-                       return $proposed;
-               }
-               if ( strval( $chunk ) === '' ) {
-                       return $proposed;
-               }
-
-               // Truncate chunk at 255 bytes
-               $chunk = substr( $chunk, 0, 255 );
-
-               // IE does the Check*Headers() calls last, and instead does the following image
-               // type checks by directly looking for the magic numbers. What I do here should
-               // have the same effect since the magic number checks are identical in both cases.
-               $result = $this->sampleData( $version, $chunk );
-               $sampleFound = $result['found'];
-               $counters = $result['counters'];
-               $binaryType = $this->checkBinaryHeaders( $version, $chunk );
-               $textType = $this->checkTextHeaders( $version, $chunk );
-
-               if ( $proposed == 'text/html' && isset( $sampleFound['html'] ) ) {
-                       return 'text/html';
-               }
-               if ( $proposed == 'image/gif' && $binaryType == 'image/gif' ) {
-                       return 'image/gif';
-               }
-               if ( ( $proposed == 'image/pjpeg' || $proposed == 'image/jpeg' )
-                       && $binaryType == 'image/pjpeg' )
-               {
-                       return $proposed;
-               }
-               // PNG check added in IE 7
-               if ( $version >= 'ie07'
-                       && ( $proposed == 'image/x-png' || $proposed == 'image/png' )
-                       && $binaryType == 'image/x-png' )
-               {
-                       return $proposed;
-               }
-
-               // CDF was removed in IE 7 so it won't be in $sampleFound for later versions
-               if ( isset( $sampleFound['cdf'] ) ) {
-                       return 'application/x-cdf';
-               }
-
-               // RSS and Atom were added in IE 7 so they won't be in $sampleFound for
-               // previous versions
-               if ( isset( $sampleFound['rss'] ) ) {
-                       return 'application/rss+xml';
-               }
-               if ( isset( $sampleFound['rdf-tag'] )
-                       && isset( $sampleFound['rdf-url'] )
-                       && isset( $sampleFound['rdf-purl'] ) )
-               {
-                       return 'application/rss+xml';
-               }
-               if ( isset( $sampleFound['atom'] ) ) {
-                       return 'application/atom+xml';
-               }
-
-               if ( isset( $sampleFound['xml'] ) ) {
-                       // TODO: I'm not sure under what circumstances this flag is enabled
-                       if ( strpos( $version, 'strict' ) !== false ) {
-                               if ( $proposed == 'text/html' || $proposed == 'text/xml' ) {
-                                       return 'text/xml';
-                               }
-                       } else {
-                               return 'text/xml';
-                       }
-               }
-               if ( isset( $sampleFound['html'] ) ) {
-                       // TODO: I'm not sure under what circumstances this flag is enabled
-                       if ( strpos( $version, 'nohtml' ) !== false ) {
-                               if ( $proposed == 'text/plain' ) {
-                                       return 'text/html';
-                               }
-                       } else {
-                               return 'text/html';
-                       }
-               }
-               if ( isset( $sampleFound['xbm'] ) ) {
-                       return 'image/x-bitmap';
-               }
-               if ( isset( $sampleFound['binhex'] ) ) {
-                       return 'application/macbinhex40';
-               }
-               if ( isset( $sampleFound['scriptlet'] ) ) {
-                       if ( strpos( $version, 'strict' ) !== false ) {
-                               if ( $proposed == 'text/plain' || $proposed == 'text/scriptlet' ) {
-                                       return 'text/scriptlet';
-                               }
-                       } else {
-                               return 'text/scriptlet';
-                       }
-               }
-
-               // Freaky heuristics to determine if the data is text or binary
-               // The heuristic is of course broken for non-ASCII text
-               if ( $counters['ctrl'] != 0 && ( $counters['ff'] + $counters['low'] )
-                       < ( $counters['ctrl'] + $counters['high'] ) * 16 )
-               {
-                       $kindOfBinary = true;
-                       $type = $binaryType ? $binaryType : $textType;
-                       if ( $type === false ) {
-                               $type = 'application/octet-stream';
-                       }
-               } else {
-                       $kindOfBinary = false;
-                       $type = $textType ? $textType : $binaryType;
-                       if ( $type === false ) {
-                               $type = 'text/plain';
-                       }
-               }
-
-               // Check if the output format is ambiguous
-               // This generally means that detection failed, real types aren't ambiguous
-               $detectedFormat = $this->getDataFormat( $version, $type );
-               if ( $detectedFormat != 'ambiguous' ) {
-                       return $type;
-               }
-
-               if ( $proposedFormat != 'ambiguous' ) {
-                       // FormatAgreesWithData()
-                       if ( $proposedFormat == 'text' && !$kindOfBinary ) {
-                               return $proposed;
-                       }
-                       if ( $proposedFormat == 'binary' && $kindOfBinary ) {
-                               return $proposed;
-                       }
-                       if ( $proposedFormat == 'html' ) {
-                               return $proposed;
-                       }
-               }
-
-               // Find a MIME type by searching the registry for the file extension.
-               $dotPos = strrpos( $fileName, '.' );
-               if ( $dotPos === false ) {
-                       return $type;
-               }
-               $ext = substr( $fileName, $dotPos );
-               if ( isset( $this->registry[$ext] ) ) {
-                       return $this->registry[$ext];
-               }
-
-               // TODO: If the extension has an application registered to it, IE will return
-               // application/octet-stream. We'll skip that, so we could erroneously
-               // return text/plain or application/x-netcdf where application/octet-stream
-               // would be correct.
-
-               return $type;
-       }
-
-       /**
-        * Check for text headers at the start of the chunk
-        * Confirmed same in 5 and 7.
-        * @param $version
-        * @param $chunk
-        * @return bool|string
-        */
-       private function checkTextHeaders( $version, $chunk ) {
-               $chunk2 = substr( $chunk, 0, 2 );
-               $chunk4 = substr( $chunk, 0, 4 );
-               $chunk5 = substr( $chunk, 0, 5 );
-               if ( $chunk4 == '%PDF' ) {
-                       return 'application/pdf';
-               }
-               if ( $chunk2 == '%!' ) {
-                       return 'application/postscript';
-               }
-               if ( $chunk5 == '{\\rtf' ) {
-                       return 'text/richtext';
-               }
-               if ( $chunk5 == 'begin' ) {
-                       return 'application/base64';
-               }
-               return false;
-       }
-
-       /**
-        * Check for binary headers at the start of the chunk
-        * Confirmed same in 5 and 7.
-        * @param $version
-        * @param $chunk
-        * @return bool|string
-        */
-       private function checkBinaryHeaders( $version, $chunk ) {
-               $chunk2 = substr( $chunk, 0, 2 );
-               $chunk3 = substr( $chunk, 0, 3 );
-               $chunk4 = substr( $chunk, 0, 4 );
-               $chunk5 = substr( $chunk, 0, 5 );
-               $chunk5uc = strtoupper( $chunk5 );
-               $chunk8 = substr( $chunk, 0, 8 );
-               if ( $chunk5uc == 'GIF87' || $chunk5uc == 'GIF89' ) {
-                       return 'image/gif';
-               }
-               if ( $chunk2 == "\xff\xd8" ) {
-                       return 'image/pjpeg'; // actually plain JPEG but this is what IE returns
-               }
-
-               if ( $chunk2 == 'BM'
-                       && substr( $chunk, 6, 2 ) == "\000\000"
-                       && substr( $chunk, 8, 2 ) == "\000\000" )
-               {
-                       return 'image/bmp'; // another non-standard MIME
-               }
-               if ( $chunk4 == 'RIFF'
-                       && substr( $chunk, 8, 4 ) == 'WAVE' )
-               {
-                       return 'audio/wav';
-               }
-               // These were integer literals in IE
-               // Perhaps the author was not sure what the target endianness was
-               if ( $chunk4 == ".sd\000"
-                       || $chunk4 == ".snd"
-                       || $chunk4 == "\000ds."
-                       || $chunk4 == "dns." )
-               {
-                       return 'audio/basic';
-               }
-               if ( $chunk3 == "MM\000" ) {
-                       return 'image/tiff';
-               }
-               if ( $chunk2 == 'MZ' ) {
-                       return 'application/x-msdownload';
-               }
-               if ( $chunk8 == "\x89PNG\x0d\x0a\x1a\x0a" ) {
-                       return 'image/x-png'; // [sic]
-               }
-               if ( strlen( $chunk ) >= 5 ) {
-                       $byte2 = ord( $chunk[2] );
-                       $byte4 = ord( $chunk[4] );
-                       if ( $byte2 >= 3 && $byte2 <= 31 && $byte4 == 0 && $chunk2 == 'JG' ) {
-                               return 'image/x-jg';
-                       }
-               }
-               // More endian confusion?
-               if ( $chunk4 == 'MROF' ) {
-                       return 'audio/x-aiff';
-               }
-               $chunk4_8 = substr( $chunk, 8, 4 );
-               if ( $chunk4 == 'FORM' && ( $chunk4_8 == 'AIFF' || $chunk4_8 == 'AIFC' ) ) {
-                       return 'audio/x-aiff';
-               }
-               if ( $chunk4 == 'RIFF' && $chunk4_8 == 'AVI ' ) {
-                       return 'video/avi';
-               }
-               if ( $chunk4 == "\x00\x00\x01\xb3" || $chunk4 == "\x00\x00\x01\xba" ) {
-                       return 'video/mpeg';
-               }
-               if ( $chunk4 == "\001\000\000\000"
-                       && substr( $chunk, 40, 4 ) == ' EMF' )
-               {
-                       return 'image/x-emf';
-               }
-               if ( $chunk4 == "\xd7\xcd\xc6\x9a" ) {
-                       return 'image/x-wmf';
-               }
-               if ( $chunk4 == "\xca\xfe\xba\xbe" ) {
-                       return 'application/java';
-               }
-               if ( $chunk2 == 'PK' ) {
-                       return 'application/x-zip-compressed';
-               }
-               if ( $chunk2 == "\x1f\x9d" ) {
-                       return 'application/x-compressed';
-               }
-               if ( $chunk2 == "\x1f\x8b" ) {
-                       return 'application/x-gzip-compressed';
-               }
-               // Skip redundant check for ZIP
-               if ( $chunk5 == "MThd\000" ) {
-                       return 'audio/mid';
-               }
-               if ( $chunk4 == '%PDF' ) {
-                       return 'application/pdf';
-               }
-               return false;
-       }
-
-       /**
-        * Do heuristic checks on the bulk of the data sample.
-        * Search for HTML tags.
-        * @param $version
-        * @param $chunk
-        * @return array
-        */
-       protected function sampleData( $version, $chunk ) {
-               $found = [];
-               $counters = [
-                       'ctrl' => 0,
-                       'high' => 0,
-                       'low' => 0,
-                       'lf' => 0,
-                       'cr' => 0,
-                       'ff' => 0
-               ];
-               $htmlTags = [
-                       'html',
-                       'head',
-                       'title',
-                       'body',
-                       'script',
-                       'a href',
-                       'pre',
-                       'img',
-                       'plaintext',
-                       'table'
-               ];
-               $rdfUrl = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
-               $rdfPurl = 'http://purl.org/rss/1.0/';
-               $xbmMagic1 = '#define';
-               $xbmMagic2 = '_width';
-               $xbmMagic3 = '_bits';
-               $binhexMagic = 'converted with BinHex';
-               $chunkLength = strlen( $chunk );
-
-               for ( $offset = 0; $offset < $chunkLength; $offset++ ) {
-                       $curChar = $chunk[$offset];
-                       if ( $curChar == "\x0a" ) {
-                               $counters['lf']++;
-                               continue;
-                       } elseif ( $curChar == "\x0d" ) {
-                               $counters['cr']++;
-                               continue;
-                       } elseif ( $curChar == "\x0c" ) {
-                               $counters['ff']++;
-                               continue;
-                       } elseif ( $curChar == "\t" ) {
-                               $counters['low']++;
-                               continue;
-                       } elseif ( ord( $curChar ) < 32 ) {
-                               $counters['ctrl']++;
-                               continue;
-                       } elseif ( ord( $curChar ) >= 128 ) {
-                               $counters['high']++;
-                               continue;
-                       }
-
-                       $counters['low']++;
-                       if ( $curChar == '<' ) {
-                               // XML
-                               $remainder = substr( $chunk, $offset + 1 );
-                               if ( !strncasecmp( $remainder, '?XML', 4 ) ) {
-                                       $nextChar = substr( $chunk, $offset + 5, 1 );
-                                       if ( $nextChar == ':' || $nextChar == ' ' || $nextChar == "\t" ) {
-                                               $found['xml'] = true;
-                                       }
-                               }
-                               // Scriptlet (JSP)
-                               if ( !strncasecmp( $remainder, 'SCRIPTLET', 9 ) ) {
-                                       $found['scriptlet'] = true;
-                                       break;
-                               }
-                               // HTML
-                               foreach ( $htmlTags as $tag ) {
-                                       if ( !strncasecmp( $remainder, $tag, strlen( $tag ) ) ) {
-                                               $found['html'] = true;
-                                       }
-                               }
-                               // Skip broken check for additional tags (HR etc.)
-
-                               // CHANNEL replaced by RSS, RDF and FEED in IE 7
-                               if ( $version < 'ie07' ) {
-                                       if ( !strncasecmp( $remainder, 'CHANNEL', 7 ) ) {
-                                               $found['cdf'] = true;
-                                       }
-                               } else {
-                                       // RSS
-                                       if ( !strncasecmp( $remainder, 'RSS', 3 ) ) {
-                                               $found['rss'] = true;
-                                               break; // return from SampleData
-                                       }
-                                       if ( !strncasecmp( $remainder, 'rdf:RDF', 7 ) ) {
-                                               $found['rdf-tag'] = true;
-                                               // no break
-                                       }
-                                       if ( !strncasecmp( $remainder, 'FEED', 4 ) ) {
-                                               $found['atom'] = true;
-                                               break;
-                                       }
-                               }
-                               continue;
-                       }
-                       // Skip broken check for -->
-
-                       // RSS URL checks
-                       // For some reason both URLs must appear before it is recognised
-                       $remainder = substr( $chunk, $offset );
-                       if ( !strncasecmp( $remainder, $rdfUrl, strlen( $rdfUrl ) ) ) {
-                               $found['rdf-url'] = true;
-                               if ( isset( $found['rdf-tag'] )
-                                       && isset( $found['rdf-purl'] ) ) // [sic]
-                               {
-                                       break;
-                               }
-                               continue;
-                       }
-
-                       if ( !strncasecmp( $remainder, $rdfPurl, strlen( $rdfPurl ) ) ) {
-                               if ( isset( $found['rdf-tag'] )
-                                       && isset( $found['rdf-url'] ) ) // [sic]
-                               {
-                                       break;
-                               }
-                               continue;
-                       }
-
-                       // XBM checks
-                       if ( !strncasecmp( $remainder, $xbmMagic1, strlen( $xbmMagic1 ) ) ) {
-                               $found['xbm1'] = true;
-                               continue;
-                       }
-                       if ( $curChar == '_' ) {
-                               if ( isset( $found['xbm2'] ) ) {
-                                       if ( !strncasecmp( $remainder, $xbmMagic3, strlen( $xbmMagic3 ) ) ) {
-                                               $found['xbm'] = true;
-                                               break;
-                                       }
-                               } elseif ( isset( $found['xbm1'] ) ) {
-                                       if ( !strncasecmp( $remainder, $xbmMagic2, strlen( $xbmMagic2 ) ) ) {
-                                               $found['xbm2'] = true;
-                                       }
-                               }
-                       }
-
-                       // BinHex
-                       if ( !strncmp( $remainder, $binhexMagic, strlen( $binhexMagic ) ) ) {
-                               $found['binhex'] = true;
-                       }
-               }
-               return [ 'found' => $found, 'counters' => $counters ];
-       }
-
-       /**
-        * @param $version
-        * @param $type
-        * @return int|string
-        */
-       protected function getDataFormat( $version, $type ) {
-               $types = $this->typeTable[$version];
-               if ( $type == '(null)' || strval( $type ) === '' ) {
-                       return 'ambiguous';
-               }
-               foreach ( $types as $format => $list ) {
-                       if ( in_array( $type, $list ) ) {
-                               return $format;
-                       }
-               }
-               return 'unknown';
-       }
-}
diff --git a/includes/libs/XmlTypeCheck.php b/includes/libs/XmlTypeCheck.php
deleted file mode 100644 (file)
index f057140..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-<?php
-/**
- * XML syntax and type checker.
- *
- * Since 1.24.2, it uses XMLReader instead of xml_parse, which gives us
- * more control over the expansion of XML entities. When passed to the
- * callback, entities will be fully expanded, but may report the XML is
- * invalid if expanding the entities are likely to cause a DoS.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-class XmlTypeCheck {
-       /**
-        * Will be set to true or false to indicate whether the file is
-        * well-formed XML. Note that this doesn't check schema validity.
-        */
-       public $wellFormed = null;
-
-       /**
-        * Will be set to true if the optional element filter returned
-        * a match at some point.
-        */
-       public $filterMatch = false;
-
-       /**
-        * Will contain the type of filter hit if the optional element filter returned
-        * a match at some point.
-        * @var mixed
-        */
-       public $filterMatchType = false;
-
-       /**
-        * Name of the document's root element, including any namespace
-        * as an expanded URL.
-        */
-       public $rootElement = '';
-
-       /**
-        * A stack of strings containing the data of each xml element as it's processed. Append
-        * data to the top string of the stack, then pop off the string and process it when the
-        * element is closed.
-        */
-       protected $elementData = [];
-
-       /**
-        * A stack of element names and attributes, as we process them.
-        */
-       protected $elementDataContext = [];
-
-       /**
-        * Current depth of the data stack.
-        */
-       protected $stackDepth = 0;
-
-       /**
-        * Additional parsing options
-        */
-       private $parserOptions = [
-               'processing_instruction_handler' => '',
-       ];
-
-       /**
-        * @param string $input a filename or string containing the XML element
-        * @param callable $filterCallback (optional)
-        *        Function to call to do additional custom validity checks from the
-        *        SAX element handler event. This gives you access to the element
-        *        namespace, name, attributes, and text contents.
-        *        Filter should return 'true' to toggle on $this->filterMatch
-        * @param bool $isFile (optional) indicates if the first parameter is a
-        *        filename (default, true) or if it is a string (false)
-        * @param array $options list of additional parsing options:
-        *        processing_instruction_handler: Callback for xml_set_processing_instruction_handler
-        */
-       function __construct( $input, $filterCallback = null, $isFile = true, $options = [] ) {
-               $this->filterCallback = $filterCallback;
-               $this->parserOptions = array_merge( $this->parserOptions, $options );
-               $this->validateFromInput( $input, $isFile );
-       }
-
-       /**
-        * Alternative constructor: from filename
-        *
-        * @param string $fname the filename of an XML document
-        * @param callable $filterCallback (optional)
-        *        Function to call to do additional custom validity checks from the
-        *        SAX element handler event. This gives you access to the element
-        *        namespace, name, and attributes, but not to text contents.
-        *        Filter should return 'true' to toggle on $this->filterMatch
-        * @return XmlTypeCheck
-        */
-       public static function newFromFilename( $fname, $filterCallback = null ) {
-               return new self( $fname, $filterCallback, true );
-       }
-
-       /**
-        * Alternative constructor: from string
-        *
-        * @param string $string a string containing an XML element
-        * @param callable $filterCallback (optional)
-        *        Function to call to do additional custom validity checks from the
-        *        SAX element handler event. This gives you access to the element
-        *        namespace, name, and attributes, but not to text contents.
-        *        Filter should return 'true' to toggle on $this->filterMatch
-        * @return XmlTypeCheck
-        */
-       public static function newFromString( $string, $filterCallback = null ) {
-               return new self( $string, $filterCallback, false );
-       }
-
-       /**
-        * Get the root element. Simple accessor to $rootElement
-        *
-        * @return string
-        */
-       public function getRootElement() {
-               return $this->rootElement;
-       }
-
-       /**
-        * @param string $fname the filename
-        */
-       private function validateFromInput( $xml, $isFile ) {
-               $reader = new XMLReader();
-               if ( $isFile ) {
-                       $s = $reader->open( $xml, null, LIBXML_NOERROR | LIBXML_NOWARNING );
-               } else {
-                       $s = $reader->XML( $xml, null, LIBXML_NOERROR | LIBXML_NOWARNING );
-               }
-               if ( $s !== true ) {
-                       // Couldn't open the XML
-                       $this->wellFormed = false;
-               } else {
-                       $oldDisable = libxml_disable_entity_loader( true );
-                       $reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
-                       try {
-                               $this->validate( $reader );
-                       } catch ( Exception $e ) {
-                               // Calling this malformed, because we didn't parse the whole
-                               // thing. Maybe just an external entity refernce.
-                               $this->wellFormed = false;
-                               $reader->close();
-                               libxml_disable_entity_loader( $oldDisable );
-                               throw $e;
-                       }
-                       $reader->close();
-                       libxml_disable_entity_loader( $oldDisable );
-               }
-       }
-
-       private function readNext( XMLReader $reader ) {
-               set_error_handler( [ $this, 'XmlErrorHandler' ] );
-               $ret = $reader->read();
-               restore_error_handler();
-               return $ret;
-       }
-
-       public function XmlErrorHandler( $errno, $errstr ) {
-               $this->wellFormed = false;
-       }
-
-       private function validate( $reader ) {
-
-               // First, move through anything that isn't an element, and
-               // handle any processing instructions with the callback
-               do {
-                       if ( !$this->readNext( $reader ) ) {
-                               // Hit the end of the document before any elements
-                               $this->wellFormed = false;
-                               return;
-                       }
-                       if ( $reader->nodeType === XMLReader::PI ) {
-                               $this->processingInstructionHandler( $reader->name, $reader->value );
-                       }
-               } while ( $reader->nodeType != XMLReader::ELEMENT );
-
-               // Process the rest of the document
-               do {
-                       switch ( $reader->nodeType ) {
-                               case XMLReader::ELEMENT:
-                                       $name = $this->expandNS(
-                                               $reader->name,
-                                               $reader->namespaceURI
-                                       );
-                                       if ( $this->rootElement === '' ) {
-                                               $this->rootElement = $name;
-                                       }
-                                       $empty = $reader->isEmptyElement;
-                                       $attrs = $this->getAttributesArray( $reader );
-                                       $this->elementOpen( $name, $attrs );
-                                       if ( $empty ) {
-                                               $this->elementClose();
-                                       }
-                                       break;
-
-                               case XMLReader::END_ELEMENT:
-                                       $this->elementClose();
-                                       break;
-
-                               case XMLReader::WHITESPACE:
-                               case XMLReader::SIGNIFICANT_WHITESPACE:
-                               case XMLReader::CDATA:
-                               case XMLReader::TEXT:
-                                       $this->elementData( $reader->value );
-                                       break;
-
-                               case XMLReader::ENTITY_REF:
-                                       // Unexpanded entity (maybe external?),
-                                       // don't send to the filter (xml_parse didn't)
-                                       break;
-
-                               case XMLReader::COMMENT:
-                                       // Don't send to the filter (xml_parse didn't)
-                                       break;
-
-                               case XMLReader::PI:
-                                       // Processing instructions can happen after the header too
-                                       $this->processingInstructionHandler(
-                                               $reader->name,
-                                               $reader->value
-                                       );
-                                       break;
-                               default:
-                                       // One of DOC, DOC_TYPE, ENTITY, END_ENTITY,
-                                       // NOTATION, or XML_DECLARATION
-                                       // xml_parse didn't send these to the filter, so we won't.
-                       }
-
-               } while ( $this->readNext( $reader ) );
-
-               if ( $this->stackDepth !== 0 ) {
-                       $this->wellFormed = false;
-               } elseif ( $this->wellFormed === null ) {
-                       $this->wellFormed = true;
-               }
-
-       }
-
-       /**
-        * Get all of the attributes for an XMLReader's current node
-        * @param $r XMLReader
-        * @return array of attributes
-        */
-       private function getAttributesArray( XMLReader $r ) {
-               $attrs = [];
-               while ( $r->moveToNextAttribute() ) {
-                       if ( $r->namespaceURI === 'http://www.w3.org/2000/xmlns/' ) {
-                               // XMLReader treats xmlns attributes as normal
-                               // attributes, while xml_parse doesn't
-                               continue;
-                       }
-                       $name = $this->expandNS( $r->name, $r->namespaceURI );
-                       $attrs[$name] = $r->value;
-               }
-               return $attrs;
-       }
-
-       /**
-        * @param $name element or attribute name, maybe with a full or short prefix
-        * @param $namespaceURI the namespaceURI
-        * @return string the name prefixed with namespaceURI
-        */
-       private function expandNS( $name, $namespaceURI ) {
-               if ( $namespaceURI ) {
-                       $parts = explode( ':', $name );
-                       $localname = array_pop( $parts );
-                       return "$namespaceURI:$localname";
-               }
-               return $name;
-       }
-
-       /**
-        * @param $name
-        * @param $attribs
-        */
-       private function elementOpen( $name, $attribs ) {
-               $this->elementDataContext[] = [ $name, $attribs ];
-               $this->elementData[] = '';
-               $this->stackDepth++;
-       }
-
-       /**
-        */
-       private function elementClose() {
-               list( $name, $attribs ) = array_pop( $this->elementDataContext );
-               $data = array_pop( $this->elementData );
-               $this->stackDepth--;
-               $callbackReturn = false;
-
-               if ( is_callable( $this->filterCallback ) ) {
-                       $callbackReturn = call_user_func(
-                               $this->filterCallback,
-                               $name,
-                               $attribs,
-                               $data
-                       );
-               }
-               if ( $callbackReturn ) {
-                       // Filter hit!
-                       $this->filterMatch = true;
-                       $this->filterMatchType = $callbackReturn;
-               }
-       }
-
-       /**
-        * @param $data
-        */
-       private function elementData( $data ) {
-               // Collect any data here, and we'll run the callback in elementClose
-               $this->elementData[ $this->stackDepth - 1 ] .= trim( $data );
-       }
-
-       /**
-        * @param $target
-        * @param $data
-        */
-       private function processingInstructionHandler( $target, $data ) {
-               $callbackReturn = false;
-               if ( $this->parserOptions['processing_instruction_handler'] ) {
-                       $callbackReturn = call_user_func(
-                               $this->parserOptions['processing_instruction_handler'],
-                               $target,
-                               $data
-                       );
-               }
-               if ( $callbackReturn ) {
-                       // Filter hit!
-                       $this->filterMatch = true;
-                       $this->filterMatchType = $callbackReturn;
-               }
-       }
-}
diff --git a/includes/libs/mime/IEContentAnalyzer.php b/includes/libs/mime/IEContentAnalyzer.php
new file mode 100644 (file)
index 0000000..0d1e527
--- /dev/null
@@ -0,0 +1,851 @@
+<?php
+/**
+ * Simulation of Microsoft Internet Explorer's MIME type detection algorithm.
+ *
+ * @file
+ * @todo Define the exact license of this file.
+ */
+
+/**
+ * This class simulates Microsoft Internet Explorer's terribly broken and
+ * insecure MIME type detection algorithm. It can be used to check web uploads
+ * with an apparently safe type, to see if IE will reinterpret them to produce
+ * something dangerous.
+ *
+ * It is full of bugs and strange design choices should not under any
+ * circumstances be used to determine a MIME type to present to a user or
+ * client. (Apple Safari developers, this means you too.)
+ *
+ * This class is based on a disassembly of IE 5.0, 6.0 and 7.0. Although I have
+ * attempted to ensure that this code works in exactly the same way as Internet
+ * Explorer, it does not share any source code, or creative choices such as
+ * variable names, thus I (Tim Starling) claim copyright on it.
+ *
+ * It may be redistributed without restriction. To aid reuse, this class does
+ * not depend on any MediaWiki module.
+ */
+class IEContentAnalyzer {
+       /**
+        * Relevant data taken from the type table in IE 5
+        */
+       protected $baseTypeTable = [
+               'ambiguous' /*1*/ => [
+                       'text/plain',
+                       'application/octet-stream',
+                       'application/x-netcdf', // [sic]
+               ],
+               'text' /*3*/ => [
+                       'text/richtext', 'image/x-bitmap', 'application/postscript', 'application/base64',
+                       'application/macbinhex40', 'application/x-cdf', 'text/scriptlet'
+               ],
+               'binary' /*4*/ => [
+                       'application/pdf', 'audio/x-aiff', 'audio/basic', 'audio/wav', 'image/gif',
+                       'image/pjpeg', 'image/jpeg', 'image/tiff', 'image/x-png', 'image/png', 'image/bmp',
+                       'image/x-jg', 'image/x-art', 'image/x-emf', 'image/x-wmf', 'video/avi',
+                       'video/x-msvideo', 'video/mpeg', 'application/x-compressed',
+                       'application/x-zip-compressed', 'application/x-gzip-compressed', 'application/java',
+                       'application/x-msdownload'
+               ],
+               'html' /*5*/ => [ 'text/html' ],
+       ];
+
+       /**
+        * Changes to the type table in later versions of IE
+        */
+       protected $addedTypes = [
+               'ie07' => [
+                       'text' => [ 'text/xml', 'application/xml' ]
+               ],
+       ];
+
+       /**
+        * An approximation of the "Content Type" values in HKEY_CLASSES_ROOT in a
+        * typical Windows installation.
+        *
+        * Used for extension to MIME type mapping if detection fails.
+        */
+       protected $registry = [
+               '.323' => 'text/h323',
+               '.3g2' => 'video/3gpp2',
+               '.3gp' => 'video/3gpp',
+               '.3gp2' => 'video/3gpp2',
+               '.3gpp' => 'video/3gpp',
+               '.aac' => 'audio/aac',
+               '.ac3' => 'audio/ac3',
+               '.accda' => 'application/msaccess',
+               '.accdb' => 'application/msaccess',
+               '.accdc' => 'application/msaccess',
+               '.accde' => 'application/msaccess',
+               '.accdr' => 'application/msaccess',
+               '.accdt' => 'application/msaccess',
+               '.ade' => 'application/msaccess',
+               '.adp' => 'application/msaccess',
+               '.adts' => 'audio/aac',
+               '.ai' => 'application/postscript',
+               '.aif' => 'audio/aiff',
+               '.aifc' => 'audio/aiff',
+               '.aiff' => 'audio/aiff',
+               '.amc' => 'application/x-mpeg',
+               '.application' => 'application/x-ms-application',
+               '.asf' => 'video/x-ms-asf',
+               '.asx' => 'video/x-ms-asf',
+               '.au' => 'audio/basic',
+               '.avi' => 'video/avi',
+               '.bmp' => 'image/bmp',
+               '.caf' => 'audio/x-caf',
+               '.cat' => 'application/vnd.ms-pki.seccat',
+               '.cbo' => 'application/sha',
+               '.cdda' => 'audio/aiff',
+               '.cer' => 'application/x-x509-ca-cert',
+               '.conf' => 'text/plain',
+               '.crl' => 'application/pkix-crl',
+               '.crt' => 'application/x-x509-ca-cert',
+               '.css' => 'text/css',
+               '.csv' => 'application/vnd.ms-excel',
+               '.der' => 'application/x-x509-ca-cert',
+               '.dib' => 'image/bmp',
+               '.dif' => 'video/x-dv',
+               '.dll' => 'application/x-msdownload',
+               '.doc' => 'application/msword',
+               '.docm' => 'application/vnd.ms-word.document.macroEnabled.12',
+               '.docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+               '.dot' => 'application/msword',
+               '.dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
+               '.dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+               '.dv' => 'video/x-dv',
+               '.dwfx' => 'model/vnd.dwfx+xps',
+               '.edn' => 'application/vnd.adobe.edn',
+               '.eml' => 'message/rfc822',
+               '.eps' => 'application/postscript',
+               '.etd' => 'application/x-ebx',
+               '.exe' => 'application/x-msdownload',
+               '.fdf' => 'application/vnd.fdf',
+               '.fif' => 'application/fractals',
+               '.gif' => 'image/gif',
+               '.gsm' => 'audio/x-gsm',
+               '.hqx' => 'application/mac-binhex40',
+               '.hta' => 'application/hta',
+               '.htc' => 'text/x-component',
+               '.htm' => 'text/html',
+               '.html' => 'text/html',
+               '.htt' => 'text/webviewhtml',
+               '.hxa' => 'application/xml',
+               '.hxc' => 'application/xml',
+               '.hxd' => 'application/octet-stream',
+               '.hxe' => 'application/xml',
+               '.hxf' => 'application/xml',
+               '.hxh' => 'application/octet-stream',
+               '.hxi' => 'application/octet-stream',
+               '.hxk' => 'application/xml',
+               '.hxq' => 'application/octet-stream',
+               '.hxr' => 'application/octet-stream',
+               '.hxs' => 'application/octet-stream',
+               '.hxt' => 'application/xml',
+               '.hxv' => 'application/xml',
+               '.hxw' => 'application/octet-stream',
+               '.ico' => 'image/x-icon',
+               '.iii' => 'application/x-iphone',
+               '.ins' => 'application/x-internet-signup',
+               '.iqy' => 'text/x-ms-iqy',
+               '.isp' => 'application/x-internet-signup',
+               '.jfif' => 'image/jpeg',
+               '.jnlp' => 'application/x-java-jnlp-file',
+               '.jpe' => 'image/jpeg',
+               '.jpeg' => 'image/jpeg',
+               '.jpg' => 'image/jpeg',
+               '.jtx' => 'application/x-jtx+xps',
+               '.latex' => 'application/x-latex',
+               '.log' => 'text/plain',
+               '.m1v' => 'video/mpeg',
+               '.m2v' => 'video/mpeg',
+               '.m3u' => 'audio/x-mpegurl',
+               '.mac' => 'image/x-macpaint',
+               '.man' => 'application/x-troff-man',
+               '.mda' => 'application/msaccess',
+               '.mdb' => 'application/msaccess',
+               '.mde' => 'application/msaccess',
+               '.mfp' => 'application/x-shockwave-flash',
+               '.mht' => 'message/rfc822',
+               '.mhtml' => 'message/rfc822',
+               '.mid' => 'audio/mid',
+               '.midi' => 'audio/mid',
+               '.mod' => 'video/mpeg',
+               '.mov' => 'video/quicktime',
+               '.mp2' => 'video/mpeg',
+               '.mp2v' => 'video/mpeg',
+               '.mp3' => 'audio/mpeg',
+               '.mp4' => 'video/mp4',
+               '.mpa' => 'video/mpeg',
+               '.mpe' => 'video/mpeg',
+               '.mpeg' => 'video/mpeg',
+               '.mpf' => 'application/vnd.ms-mediapackage',
+               '.mpg' => 'video/mpeg',
+               '.mpv2' => 'video/mpeg',
+               '.mqv' => 'video/quicktime',
+               '.NMW' => 'application/nmwb',
+               '.nws' => 'message/rfc822',
+               '.odc' => 'text/x-ms-odc',
+               '.ols' => 'application/vnd.ms-publisher',
+               '.p10' => 'application/pkcs10',
+               '.p12' => 'application/x-pkcs12',
+               '.p7b' => 'application/x-pkcs7-certificates',
+               '.p7c' => 'application/pkcs7-mime',
+               '.p7m' => 'application/pkcs7-mime',
+               '.p7r' => 'application/x-pkcs7-certreqresp',
+               '.p7s' => 'application/pkcs7-signature',
+               '.pct' => 'image/pict',
+               '.pdf' => 'application/pdf',
+               '.pdx' => 'application/vnd.adobe.pdx',
+               '.pfx' => 'application/x-pkcs12',
+               '.pic' => 'image/pict',
+               '.pict' => 'image/pict',
+               '.pinstall' => 'application/x-picasa-detect',
+               '.pko' => 'application/vnd.ms-pki.pko',
+               '.png' => 'image/png',
+               '.pnt' => 'image/x-macpaint',
+               '.pntg' => 'image/x-macpaint',
+               '.pot' => 'application/vnd.ms-powerpoint',
+               '.potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12',
+               '.potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
+               '.ppa' => 'application/vnd.ms-powerpoint',
+               '.ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
+               '.pps' => 'application/vnd.ms-powerpoint',
+               '.ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
+               '.ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
+               '.ppt' => 'application/vnd.ms-powerpoint',
+               '.pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
+               '.pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+               '.prf' => 'application/pics-rules',
+               '.ps' => 'application/postscript',
+               '.pub' => 'application/vnd.ms-publisher',
+               '.pwz' => 'application/vnd.ms-powerpoint',
+               '.py' => 'text/plain',
+               '.pyw' => 'text/plain',
+               '.qht' => 'text/x-html-insertion',
+               '.qhtm' => 'text/x-html-insertion',
+               '.qt' => 'video/quicktime',
+               '.qti' => 'image/x-quicktime',
+               '.qtif' => 'image/x-quicktime',
+               '.qtl' => 'application/x-quicktimeplayer',
+               '.rat' => 'application/rat-file',
+               '.rmf' => 'application/vnd.adobe.rmf',
+               '.rmi' => 'audio/mid',
+               '.rqy' => 'text/x-ms-rqy',
+               '.rtf' => 'application/msword',
+               '.sct' => 'text/scriptlet',
+               '.sd2' => 'audio/x-sd2',
+               '.sdp' => 'application/sdp',
+               '.shtml' => 'text/html',
+               '.sit' => 'application/x-stuffit',
+               '.sldm' => 'application/vnd.ms-powerpoint.slide.macroEnabled.12',
+               '.sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
+               '.slk' => 'application/vnd.ms-excel',
+               '.snd' => 'audio/basic',
+               '.so' => 'application/x-apachemodule',
+               '.sol' => 'text/plain',
+               '.sor' => 'text/plain',
+               '.spc' => 'application/x-pkcs7-certificates',
+               '.spl' => 'application/futuresplash',
+               '.sst' => 'application/vnd.ms-pki.certstore',
+               '.stl' => 'application/vnd.ms-pki.stl',
+               '.swf' => 'application/x-shockwave-flash',
+               '.thmx' => 'application/vnd.ms-officetheme',
+               '.tif' => 'image/tiff',
+               '.tiff' => 'image/tiff',
+               '.txt' => 'text/plain',
+               '.uls' => 'text/iuls',
+               '.vcf' => 'text/x-vcard',
+               '.vdx' => 'application/vnd.ms-visio.viewer',
+               '.vsd' => 'application/vnd.ms-visio.viewer',
+               '.vss' => 'application/vnd.ms-visio.viewer',
+               '.vst' => 'application/vnd.ms-visio.viewer',
+               '.vsx' => 'application/vnd.ms-visio.viewer',
+               '.vtx' => 'application/vnd.ms-visio.viewer',
+               '.wav' => 'audio/wav',
+               '.wax' => 'audio/x-ms-wax',
+               '.wbk' => 'application/msword',
+               '.wdp' => 'image/vnd.ms-photo',
+               '.wiz' => 'application/msword',
+               '.wm' => 'video/x-ms-wm',
+               '.wma' => 'audio/x-ms-wma',
+               '.wmd' => 'application/x-ms-wmd',
+               '.wmv' => 'video/x-ms-wmv',
+               '.wmx' => 'video/x-ms-wmx',
+               '.wmz' => 'application/x-ms-wmz',
+               '.wpl' => 'application/vnd.ms-wpl',
+               '.wsc' => 'text/scriptlet',
+               '.wvx' => 'video/x-ms-wvx',
+               '.xaml' => 'application/xaml+xml',
+               '.xbap' => 'application/x-ms-xbap',
+               '.xdp' => 'application/vnd.adobe.xdp+xml',
+               '.xfdf' => 'application/vnd.adobe.xfdf',
+               '.xht' => 'application/xhtml+xml',
+               '.xhtml' => 'application/xhtml+xml',
+               '.xla' => 'application/vnd.ms-excel',
+               '.xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
+               '.xlk' => 'application/vnd.ms-excel',
+               '.xll' => 'application/vnd.ms-excel',
+               '.xlm' => 'application/vnd.ms-excel',
+               '.xls' => 'application/vnd.ms-excel',
+               '.xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
+               '.xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
+               '.xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+               '.xlt' => 'application/vnd.ms-excel',
+               '.xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
+               '.xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
+               '.xlw' => 'application/vnd.ms-excel',
+               '.xml' => 'text/xml',
+               '.xps' => 'application/vnd.ms-xpsdocument',
+               '.xsl' => 'text/xml',
+       ];
+
+       /**
+        * IE versions which have been analysed to bring you this class, and for
+        * which some substantive difference exists. These will appear as keys
+        * in the return value of getRealMimesFromData(). The names are chosen to sort correctly.
+        */
+       protected $versions = [ 'ie05', 'ie06', 'ie07', 'ie07.strict', 'ie07.nohtml' ];
+
+       /**
+        * Type table with versions expanded
+        */
+       protected $typeTable = [];
+
+       /** constructor */
+       function __construct() {
+               // Construct versioned type arrays from the base type array plus additions
+               $types = $this->baseTypeTable;
+               foreach ( $this->versions as $version ) {
+                       if ( isset( $this->addedTypes[$version] ) ) {
+                               foreach ( $this->addedTypes[$version] as $format => $addedTypes ) {
+                                       $types[$format] = array_merge( $types[$format], $addedTypes );
+                               }
+                       }
+                       $this->typeTable[$version] = $types;
+               }
+       }
+
+       /**
+        * Get the MIME types from getMimesFromData(), but convert the result from IE's
+        * idiosyncratic private types into something other apps will understand.
+        *
+        * @param string $fileName the file name (unused at present)
+        * @param string $chunk the first 256 bytes of the file
+        * @param string $proposed the MIME type proposed by the server
+        *
+        * @return Array: map of IE version to detected MIME type
+        */
+       public function getRealMimesFromData( $fileName, $chunk, $proposed ) {
+               $types = $this->getMimesFromData( $fileName, $chunk, $proposed );
+               $types = array_map( [ $this, 'translateMimeType' ], $types );
+               return $types;
+       }
+
+       /**
+        * Translate a MIME type from IE's idiosyncratic private types into
+        * more commonly understood type strings
+        * @param $type
+        * @return string
+        */
+       public function translateMimeType( $type ) {
+               static $table = [
+                       'image/pjpeg' => 'image/jpeg',
+                       'image/x-png' => 'image/png',
+                       'image/x-wmf' => 'application/x-msmetafile',
+                       'image/bmp' => 'image/x-bmp',
+                       'application/x-zip-compressed' => 'application/zip',
+                       'application/x-compressed' => 'application/x-compress',
+                       'application/x-gzip-compressed' => 'application/x-gzip',
+                       'audio/mid' => 'audio/midi',
+               ];
+               if ( isset( $table[$type] ) ) {
+                       $type = $table[$type];
+               }
+               return $type;
+       }
+
+       /**
+        * Get the untranslated MIME types for all known versions
+        *
+        * @param string $fileName the file name (unused at present)
+        * @param string $chunk the first 256 bytes of the file
+        * @param string $proposed the MIME type proposed by the server
+        *
+        * @return Array: map of IE version to detected MIME type
+        */
+       public function getMimesFromData( $fileName, $chunk, $proposed ) {
+               $types = [];
+               foreach ( $this->versions as $version ) {
+                       $types[$version] = $this->getMimeTypeForVersion( $version, $fileName, $chunk, $proposed );
+               }
+               return $types;
+       }
+
+       /**
+        * Get the MIME type for a given named version
+        * @param $version
+        * @param $fileName
+        * @param $chunk
+        * @param $proposed
+        * @return bool|string
+        */
+       protected function getMimeTypeForVersion( $version, $fileName, $chunk, $proposed ) {
+               // Strip text after a semicolon
+               $semiPos = strpos( $proposed, ';' );
+               if ( $semiPos !== false ) {
+                       $proposed = substr( $proposed, 0, $semiPos );
+               }
+
+               $proposedFormat = $this->getDataFormat( $version, $proposed );
+               if ( $proposedFormat == 'unknown'
+                       && $proposed != 'multipart/mixed'
+                       && $proposed != 'multipart/x-mixed-replace' )
+               {
+                       return $proposed;
+               }
+               if ( strval( $chunk ) === '' ) {
+                       return $proposed;
+               }
+
+               // Truncate chunk at 255 bytes
+               $chunk = substr( $chunk, 0, 255 );
+
+               // IE does the Check*Headers() calls last, and instead does the following image
+               // type checks by directly looking for the magic numbers. What I do here should
+               // have the same effect since the magic number checks are identical in both cases.
+               $result = $this->sampleData( $version, $chunk );
+               $sampleFound = $result['found'];
+               $counters = $result['counters'];
+               $binaryType = $this->checkBinaryHeaders( $version, $chunk );
+               $textType = $this->checkTextHeaders( $version, $chunk );
+
+               if ( $proposed == 'text/html' && isset( $sampleFound['html'] ) ) {
+                       return 'text/html';
+               }
+               if ( $proposed == 'image/gif' && $binaryType == 'image/gif' ) {
+                       return 'image/gif';
+               }
+               if ( ( $proposed == 'image/pjpeg' || $proposed == 'image/jpeg' )
+                       && $binaryType == 'image/pjpeg' )
+               {
+                       return $proposed;
+               }
+               // PNG check added in IE 7
+               if ( $version >= 'ie07'
+                       && ( $proposed == 'image/x-png' || $proposed == 'image/png' )
+                       && $binaryType == 'image/x-png' )
+               {
+                       return $proposed;
+               }
+
+               // CDF was removed in IE 7 so it won't be in $sampleFound for later versions
+               if ( isset( $sampleFound['cdf'] ) ) {
+                       return 'application/x-cdf';
+               }
+
+               // RSS and Atom were added in IE 7 so they won't be in $sampleFound for
+               // previous versions
+               if ( isset( $sampleFound['rss'] ) ) {
+                       return 'application/rss+xml';
+               }
+               if ( isset( $sampleFound['rdf-tag'] )
+                       && isset( $sampleFound['rdf-url'] )
+                       && isset( $sampleFound['rdf-purl'] ) )
+               {
+                       return 'application/rss+xml';
+               }
+               if ( isset( $sampleFound['atom'] ) ) {
+                       return 'application/atom+xml';
+               }
+
+               if ( isset( $sampleFound['xml'] ) ) {
+                       // TODO: I'm not sure under what circumstances this flag is enabled
+                       if ( strpos( $version, 'strict' ) !== false ) {
+                               if ( $proposed == 'text/html' || $proposed == 'text/xml' ) {
+                                       return 'text/xml';
+                               }
+                       } else {
+                               return 'text/xml';
+                       }
+               }
+               if ( isset( $sampleFound['html'] ) ) {
+                       // TODO: I'm not sure under what circumstances this flag is enabled
+                       if ( strpos( $version, 'nohtml' ) !== false ) {
+                               if ( $proposed == 'text/plain' ) {
+                                       return 'text/html';
+                               }
+                       } else {
+                               return 'text/html';
+                       }
+               }
+               if ( isset( $sampleFound['xbm'] ) ) {
+                       return 'image/x-bitmap';
+               }
+               if ( isset( $sampleFound['binhex'] ) ) {
+                       return 'application/macbinhex40';
+               }
+               if ( isset( $sampleFound['scriptlet'] ) ) {
+                       if ( strpos( $version, 'strict' ) !== false ) {
+                               if ( $proposed == 'text/plain' || $proposed == 'text/scriptlet' ) {
+                                       return 'text/scriptlet';
+                               }
+                       } else {
+                               return 'text/scriptlet';
+                       }
+               }
+
+               // Freaky heuristics to determine if the data is text or binary
+               // The heuristic is of course broken for non-ASCII text
+               if ( $counters['ctrl'] != 0 && ( $counters['ff'] + $counters['low'] )
+                       < ( $counters['ctrl'] + $counters['high'] ) * 16 )
+               {
+                       $kindOfBinary = true;
+                       $type = $binaryType ? $binaryType : $textType;
+                       if ( $type === false ) {
+                               $type = 'application/octet-stream';
+                       }
+               } else {
+                       $kindOfBinary = false;
+                       $type = $textType ? $textType : $binaryType;
+                       if ( $type === false ) {
+                               $type = 'text/plain';
+                       }
+               }
+
+               // Check if the output format is ambiguous
+               // This generally means that detection failed, real types aren't ambiguous
+               $detectedFormat = $this->getDataFormat( $version, $type );
+               if ( $detectedFormat != 'ambiguous' ) {
+                       return $type;
+               }
+
+               if ( $proposedFormat != 'ambiguous' ) {
+                       // FormatAgreesWithData()
+                       if ( $proposedFormat == 'text' && !$kindOfBinary ) {
+                               return $proposed;
+                       }
+                       if ( $proposedFormat == 'binary' && $kindOfBinary ) {
+                               return $proposed;
+                       }
+                       if ( $proposedFormat == 'html' ) {
+                               return $proposed;
+                       }
+               }
+
+               // Find a MIME type by searching the registry for the file extension.
+               $dotPos = strrpos( $fileName, '.' );
+               if ( $dotPos === false ) {
+                       return $type;
+               }
+               $ext = substr( $fileName, $dotPos );
+               if ( isset( $this->registry[$ext] ) ) {
+                       return $this->registry[$ext];
+               }
+
+               // TODO: If the extension has an application registered to it, IE will return
+               // application/octet-stream. We'll skip that, so we could erroneously
+               // return text/plain or application/x-netcdf where application/octet-stream
+               // would be correct.
+
+               return $type;
+       }
+
+       /**
+        * Check for text headers at the start of the chunk
+        * Confirmed same in 5 and 7.
+        * @param $version
+        * @param $chunk
+        * @return bool|string
+        */
+       private function checkTextHeaders( $version, $chunk ) {
+               $chunk2 = substr( $chunk, 0, 2 );
+               $chunk4 = substr( $chunk, 0, 4 );
+               $chunk5 = substr( $chunk, 0, 5 );
+               if ( $chunk4 == '%PDF' ) {
+                       return 'application/pdf';
+               }
+               if ( $chunk2 == '%!' ) {
+                       return 'application/postscript';
+               }
+               if ( $chunk5 == '{\\rtf' ) {
+                       return 'text/richtext';
+               }
+               if ( $chunk5 == 'begin' ) {
+                       return 'application/base64';
+               }
+               return false;
+       }
+
+       /**
+        * Check for binary headers at the start of the chunk
+        * Confirmed same in 5 and 7.
+        * @param $version
+        * @param $chunk
+        * @return bool|string
+        */
+       private function checkBinaryHeaders( $version, $chunk ) {
+               $chunk2 = substr( $chunk, 0, 2 );
+               $chunk3 = substr( $chunk, 0, 3 );
+               $chunk4 = substr( $chunk, 0, 4 );
+               $chunk5 = substr( $chunk, 0, 5 );
+               $chunk5uc = strtoupper( $chunk5 );
+               $chunk8 = substr( $chunk, 0, 8 );
+               if ( $chunk5uc == 'GIF87' || $chunk5uc == 'GIF89' ) {
+                       return 'image/gif';
+               }
+               if ( $chunk2 == "\xff\xd8" ) {
+                       return 'image/pjpeg'; // actually plain JPEG but this is what IE returns
+               }
+
+               if ( $chunk2 == 'BM'
+                       && substr( $chunk, 6, 2 ) == "\000\000"
+                       && substr( $chunk, 8, 2 ) == "\000\000" )
+               {
+                       return 'image/bmp'; // another non-standard MIME
+               }
+               if ( $chunk4 == 'RIFF'
+                       && substr( $chunk, 8, 4 ) == 'WAVE' )
+               {
+                       return 'audio/wav';
+               }
+               // These were integer literals in IE
+               // Perhaps the author was not sure what the target endianness was
+               if ( $chunk4 == ".sd\000"
+                       || $chunk4 == ".snd"
+                       || $chunk4 == "\000ds."
+                       || $chunk4 == "dns." )
+               {
+                       return 'audio/basic';
+               }
+               if ( $chunk3 == "MM\000" ) {
+                       return 'image/tiff';
+               }
+               if ( $chunk2 == 'MZ' ) {
+                       return 'application/x-msdownload';
+               }
+               if ( $chunk8 == "\x89PNG\x0d\x0a\x1a\x0a" ) {
+                       return 'image/x-png'; // [sic]
+               }
+               if ( strlen( $chunk ) >= 5 ) {
+                       $byte2 = ord( $chunk[2] );
+                       $byte4 = ord( $chunk[4] );
+                       if ( $byte2 >= 3 && $byte2 <= 31 && $byte4 == 0 && $chunk2 == 'JG' ) {
+                               return 'image/x-jg';
+                       }
+               }
+               // More endian confusion?
+               if ( $chunk4 == 'MROF' ) {
+                       return 'audio/x-aiff';
+               }
+               $chunk4_8 = substr( $chunk, 8, 4 );
+               if ( $chunk4 == 'FORM' && ( $chunk4_8 == 'AIFF' || $chunk4_8 == 'AIFC' ) ) {
+                       return 'audio/x-aiff';
+               }
+               if ( $chunk4 == 'RIFF' && $chunk4_8 == 'AVI ' ) {
+                       return 'video/avi';
+               }
+               if ( $chunk4 == "\x00\x00\x01\xb3" || $chunk4 == "\x00\x00\x01\xba" ) {
+                       return 'video/mpeg';
+               }
+               if ( $chunk4 == "\001\000\000\000"
+                       && substr( $chunk, 40, 4 ) == ' EMF' )
+               {
+                       return 'image/x-emf';
+               }
+               if ( $chunk4 == "\xd7\xcd\xc6\x9a" ) {
+                       return 'image/x-wmf';
+               }
+               if ( $chunk4 == "\xca\xfe\xba\xbe" ) {
+                       return 'application/java';
+               }
+               if ( $chunk2 == 'PK' ) {
+                       return 'application/x-zip-compressed';
+               }
+               if ( $chunk2 == "\x1f\x9d" ) {
+                       return 'application/x-compressed';
+               }
+               if ( $chunk2 == "\x1f\x8b" ) {
+                       return 'application/x-gzip-compressed';
+               }
+               // Skip redundant check for ZIP
+               if ( $chunk5 == "MThd\000" ) {
+                       return 'audio/mid';
+               }
+               if ( $chunk4 == '%PDF' ) {
+                       return 'application/pdf';
+               }
+               return false;
+       }
+
+       /**
+        * Do heuristic checks on the bulk of the data sample.
+        * Search for HTML tags.
+        * @param $version
+        * @param $chunk
+        * @return array
+        */
+       protected function sampleData( $version, $chunk ) {
+               $found = [];
+               $counters = [
+                       'ctrl' => 0,
+                       'high' => 0,
+                       'low' => 0,
+                       'lf' => 0,
+                       'cr' => 0,
+                       'ff' => 0
+               ];
+               $htmlTags = [
+                       'html',
+                       'head',
+                       'title',
+                       'body',
+                       'script',
+                       'a href',
+                       'pre',
+                       'img',
+                       'plaintext',
+                       'table'
+               ];
+               $rdfUrl = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
+               $rdfPurl = 'http://purl.org/rss/1.0/';
+               $xbmMagic1 = '#define';
+               $xbmMagic2 = '_width';
+               $xbmMagic3 = '_bits';
+               $binhexMagic = 'converted with BinHex';
+               $chunkLength = strlen( $chunk );
+
+               for ( $offset = 0; $offset < $chunkLength; $offset++ ) {
+                       $curChar = $chunk[$offset];
+                       if ( $curChar == "\x0a" ) {
+                               $counters['lf']++;
+                               continue;
+                       } elseif ( $curChar == "\x0d" ) {
+                               $counters['cr']++;
+                               continue;
+                       } elseif ( $curChar == "\x0c" ) {
+                               $counters['ff']++;
+                               continue;
+                       } elseif ( $curChar == "\t" ) {
+                               $counters['low']++;
+                               continue;
+                       } elseif ( ord( $curChar ) < 32 ) {
+                               $counters['ctrl']++;
+                               continue;
+                       } elseif ( ord( $curChar ) >= 128 ) {
+                               $counters['high']++;
+                               continue;
+                       }
+
+                       $counters['low']++;
+                       if ( $curChar == '<' ) {
+                               // XML
+                               $remainder = substr( $chunk, $offset + 1 );
+                               if ( !strncasecmp( $remainder, '?XML', 4 ) ) {
+                                       $nextChar = substr( $chunk, $offset + 5, 1 );
+                                       if ( $nextChar == ':' || $nextChar == ' ' || $nextChar == "\t" ) {
+                                               $found['xml'] = true;
+                                       }
+                               }
+                               // Scriptlet (JSP)
+                               if ( !strncasecmp( $remainder, 'SCRIPTLET', 9 ) ) {
+                                       $found['scriptlet'] = true;
+                                       break;
+                               }
+                               // HTML
+                               foreach ( $htmlTags as $tag ) {
+                                       if ( !strncasecmp( $remainder, $tag, strlen( $tag ) ) ) {
+                                               $found['html'] = true;
+                                       }
+                               }
+                               // Skip broken check for additional tags (HR etc.)
+
+                               // CHANNEL replaced by RSS, RDF and FEED in IE 7
+                               if ( $version < 'ie07' ) {
+                                       if ( !strncasecmp( $remainder, 'CHANNEL', 7 ) ) {
+                                               $found['cdf'] = true;
+                                       }
+                               } else {
+                                       // RSS
+                                       if ( !strncasecmp( $remainder, 'RSS', 3 ) ) {
+                                               $found['rss'] = true;
+                                               break; // return from SampleData
+                                       }
+                                       if ( !strncasecmp( $remainder, 'rdf:RDF', 7 ) ) {
+                                               $found['rdf-tag'] = true;
+                                               // no break
+                                       }
+                                       if ( !strncasecmp( $remainder, 'FEED', 4 ) ) {
+                                               $found['atom'] = true;
+                                               break;
+                                       }
+                               }
+                               continue;
+                       }
+                       // Skip broken check for -->
+
+                       // RSS URL checks
+                       // For some reason both URLs must appear before it is recognised
+                       $remainder = substr( $chunk, $offset );
+                       if ( !strncasecmp( $remainder, $rdfUrl, strlen( $rdfUrl ) ) ) {
+                               $found['rdf-url'] = true;
+                               if ( isset( $found['rdf-tag'] )
+                                       && isset( $found['rdf-purl'] ) ) // [sic]
+                               {
+                                       break;
+                               }
+                               continue;
+                       }
+
+                       if ( !strncasecmp( $remainder, $rdfPurl, strlen( $rdfPurl ) ) ) {
+                               if ( isset( $found['rdf-tag'] )
+                                       && isset( $found['rdf-url'] ) ) // [sic]
+                               {
+                                       break;
+                               }
+                               continue;
+                       }
+
+                       // XBM checks
+                       if ( !strncasecmp( $remainder, $xbmMagic1, strlen( $xbmMagic1 ) ) ) {
+                               $found['xbm1'] = true;
+                               continue;
+                       }
+                       if ( $curChar == '_' ) {
+                               if ( isset( $found['xbm2'] ) ) {
+                                       if ( !strncasecmp( $remainder, $xbmMagic3, strlen( $xbmMagic3 ) ) ) {
+                                               $found['xbm'] = true;
+                                               break;
+                                       }
+                               } elseif ( isset( $found['xbm1'] ) ) {
+                                       if ( !strncasecmp( $remainder, $xbmMagic2, strlen( $xbmMagic2 ) ) ) {
+                                               $found['xbm2'] = true;
+                                       }
+                               }
+                       }
+
+                       // BinHex
+                       if ( !strncmp( $remainder, $binhexMagic, strlen( $binhexMagic ) ) ) {
+                               $found['binhex'] = true;
+                       }
+               }
+               return [ 'found' => $found, 'counters' => $counters ];
+       }
+
+       /**
+        * @param $version
+        * @param $type
+        * @return int|string
+        */
+       protected function getDataFormat( $version, $type ) {
+               $types = $this->typeTable[$version];
+               if ( $type == '(null)' || strval( $type ) === '' ) {
+                       return 'ambiguous';
+               }
+               foreach ( $types as $format => $list ) {
+                       if ( in_array( $type, $list ) ) {
+                               return $format;
+                       }
+               }
+               return 'unknown';
+       }
+}
diff --git a/includes/libs/mime/MimeAnalyzer.php b/includes/libs/mime/MimeAnalyzer.php
new file mode 100644 (file)
index 0000000..5f4d7c9
--- /dev/null
@@ -0,0 +1,1166 @@
+<?php
+/**
+ * Module defining helper functions for detecting and dealing with MIME types.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Implements functions related to MIME types such as detection and mapping to file extension
+ *
+ * @since 1.28
+ */
+class MimeAnalyzer implements LoggerAwareInterface {
+       /** @var string */
+       protected $typeFile;
+       /** @var string */
+       protected $infoFile;
+       /** @var string */
+       protected $xmlTypes;
+       /** @var callable */
+       protected $initCallback;
+       /** @var callable */
+       protected $detectCallback;
+       /** @var callable */
+       protected $guessCallback;
+       /** @var callable */
+       protected $extCallback;
+       /** @var array Mapping of media types to arrays of MIME types */
+       protected $mediaTypes = null;
+       /** @var array Map of MIME type aliases */
+       protected $mimeTypeAliases = null;
+       /** @var array Map of MIME types to file extensions (as a space separated list) */
+       protected $mimetoExt = null;
+
+       /** @var array Map of file extensions types to MIME types (as a space separated list) */
+       public $mExtToMime = null; // legacy name; field accessed by hooks
+
+       /** @var IEContentAnalyzer */
+       protected $IEAnalyzer;
+
+       /** @var string Extra MIME types, set for example by media handling extensions */
+       private $extraTypes = '';
+       /** @var string Extra MIME info, set for example by media handling extensions */
+       private $extraInfo = '';
+
+       /** @var LoggerInterface */
+       private $logger;
+
+       /**
+        * Defines a set of well known MIME types
+        * This is used as a fallback to mime.types files.
+        * An extensive list of well known MIME types is provided by
+        * the file mime.types in the includes directory.
+        *
+        * This list concatenated with mime.types is used to create a MIME <-> ext
+        * map. Each line contains a MIME type followed by a space separated list of
+        * extensions. If multiple extensions for a single MIME type exist or if
+        * multiple MIME types exist for a single extension then in most cases
+        * MediaWiki assumes that the first extension following the MIME type is the
+        * canonical extension, and the first time a MIME type appears for a certain
+        * extension is considered the canonical MIME type.
+        *
+        * (Note that appending the type file list to the end of self::$wellKnownTypes
+        * sucks because you can't redefine canonical types. This could be fixed by
+        * appending self::$wellKnownTypes behind type file list, but who knows
+        * what will break? In practice this probably isn't a problem anyway -- Bryan)
+        */
+       protected static $wellKnownTypes = <<<EOT
+application/ogg ogx ogg ogm ogv oga spx
+application/pdf pdf
+application/vnd.oasis.opendocument.chart odc
+application/vnd.oasis.opendocument.chart-template otc
+application/vnd.oasis.opendocument.database odb
+application/vnd.oasis.opendocument.formula odf
+application/vnd.oasis.opendocument.formula-template otf
+application/vnd.oasis.opendocument.graphics odg
+application/vnd.oasis.opendocument.graphics-template otg
+application/vnd.oasis.opendocument.image odi
+application/vnd.oasis.opendocument.image-template oti
+application/vnd.oasis.opendocument.presentation odp
+application/vnd.oasis.opendocument.presentation-template otp
+application/vnd.oasis.opendocument.spreadsheet ods
+application/vnd.oasis.opendocument.spreadsheet-template ots
+application/vnd.oasis.opendocument.text odt
+application/vnd.oasis.opendocument.text-master otm
+application/vnd.oasis.opendocument.text-template ott
+application/vnd.oasis.opendocument.text-web oth
+application/javascript js
+application/x-shockwave-flash swf
+audio/midi mid midi kar
+audio/mpeg mpga mpa mp2 mp3
+audio/x-aiff aif aiff aifc
+audio/x-wav wav
+audio/ogg oga spx ogg
+image/x-bmp bmp
+image/gif gif
+image/jpeg jpeg jpg jpe
+image/png png
+image/svg+xml svg
+image/svg svg
+image/tiff tiff tif
+image/vnd.djvu djvu
+image/x.djvu djvu
+image/x-djvu djvu
+image/x-portable-pixmap ppm
+image/x-xcf xcf
+text/plain txt
+text/html html htm
+video/ogg ogv ogm ogg
+video/mpeg mpg mpeg
+EOT;
+
+       /**
+        * Defines a set of well known MIME info entries
+        * This is used as a fallback to mime.info files.
+        * An extensive list of well known MIME types is provided by
+        * the file mime.info in the includes directory.
+        */
+       protected static $wellKnownInfo = <<<EOT
+application/pdf [OFFICE]
+application/vnd.oasis.opendocument.chart [OFFICE]
+application/vnd.oasis.opendocument.chart-template [OFFICE]
+application/vnd.oasis.opendocument.database [OFFICE]
+application/vnd.oasis.opendocument.formula [OFFICE]
+application/vnd.oasis.opendocument.formula-template [OFFICE]
+application/vnd.oasis.opendocument.graphics [OFFICE]
+application/vnd.oasis.opendocument.graphics-template [OFFICE]
+application/vnd.oasis.opendocument.image [OFFICE]
+application/vnd.oasis.opendocument.image-template [OFFICE]
+application/vnd.oasis.opendocument.presentation [OFFICE]
+application/vnd.oasis.opendocument.presentation-template [OFFICE]
+application/vnd.oasis.opendocument.spreadsheet [OFFICE]
+application/vnd.oasis.opendocument.spreadsheet-template [OFFICE]
+application/vnd.oasis.opendocument.text [OFFICE]
+application/vnd.oasis.opendocument.text-template [OFFICE]
+application/vnd.oasis.opendocument.text-master [OFFICE]
+application/vnd.oasis.opendocument.text-web [OFFICE]
+application/javascript text/javascript application/x-javascript [EXECUTABLE]
+application/x-shockwave-flash [MULTIMEDIA]
+audio/midi [AUDIO]
+audio/x-aiff [AUDIO]
+audio/x-wav [AUDIO]
+audio/mp3 audio/mpeg [AUDIO]
+application/ogg audio/ogg video/ogg [MULTIMEDIA]
+image/x-bmp image/x-ms-bmp image/bmp [BITMAP]
+image/gif [BITMAP]
+image/jpeg [BITMAP]
+image/png [BITMAP]
+image/svg+xml [DRAWING]
+image/tiff [BITMAP]
+image/vnd.djvu [BITMAP]
+image/x-xcf [BITMAP]
+image/x-portable-pixmap [BITMAP]
+text/plain [TEXT]
+text/html [TEXT]
+video/ogg [VIDEO]
+video/mpeg [VIDEO]
+unknown/unknown application/octet-stream application/x-empty [UNKNOWN]
+EOT;
+
+       /**
+        * @param array $params Configuration map, includes:
+        *   - typeFile: path to file with the list of known MIME types
+        *   - infoFile: path to file with the MIME type info
+        *   - xmlTypes: map of root element names to XML MIME types
+        *   - initCallback: initialization callback that is passed this object [optional]
+        *   - detectCallback: alternative to finfo that returns the mime type for a file.
+        *      For example, the callback can return the output of "file -bi". [optional]
+        *   - guessCallback: callback to improve the guessed MIME type using the file data.
+        *      This is intended for fixing mistakes in fileinfo or "detectCallback". [optional]
+        *   - extCallback: callback to improve the guessed MIME type using the extension. [optional]
+        *   - logger: PSR-3 logger [optional]
+        * @note Constructing these instances is expensive due to file reads.
+        *  A service or singleton pattern should be used to avoid creating instances again and again.
+        */
+       public function __construct( array $params ) {
+               $this->typeFile = $params['typeFile'];
+               $this->infoFile = $params['infoFile'];
+               $this->xmlTypes = $params['xmlTypes'];
+               $this->initCallback = isset( $params['initCallback'] )
+                       ? $params['initCallback']
+                       : null;
+               $this->detectCallback = isset( $params['detectCallback'] )
+                       ? $params['detectCallback']
+                       : null;
+               $this->guessCallback = isset( $params['guessCallback'] )
+                       ? $params['guessCallback']
+                       : null;
+               $this->extCallback = isset( $params['extCallback'] )
+                       ? $params['extCallback']
+                       : null;
+               $this->logger = isset( $params['logger'] )
+                       ? $params['logger']
+                       : new \Psr\Log\NullLogger();
+
+               $this->loadFiles();
+       }
+
+       protected function loadFiles() {
+               /**
+                *   --- load mime.types ---
+                */
+
+               # Allow media handling extensions adding MIME-types and MIME-info
+               if ( $this->initCallback ) {
+                       call_user_func( $this->initCallback, $this );
+               }
+
+               $types = self::$wellKnownTypes;
+
+               $mimeTypeFile = $this->typeFile;
+               if ( $mimeTypeFile ) {
+                       if ( is_file( $mimeTypeFile ) && is_readable( $mimeTypeFile ) ) {
+                               $this->logger->info( __METHOD__ . ": loading mime types from $mimeTypeFile\n" );
+                               $types .= "\n";
+                               $types .= file_get_contents( $mimeTypeFile );
+                       } else {
+                               $this->logger->info( __METHOD__ . ": can't load mime types from $mimeTypeFile\n" );
+                       }
+               } else {
+                       $this->logger->info( __METHOD__ .
+                               ": no mime types file defined, using built-ins only.\n" );
+               }
+
+               $types .= "\n" . $this->extraTypes;
+
+               $types = str_replace( [ "\r\n", "\n\r", "\n\n", "\r\r", "\r" ], "\n", $types );
+               $types = str_replace( "\t", " ", $types );
+
+               $this->mimetoExt = [];
+               $this->mExtToMime = [];
+
+               $lines = explode( "\n", $types );
+               foreach ( $lines as $s ) {
+                       $s = trim( $s );
+                       if ( empty( $s ) ) {
+                               continue;
+                       }
+                       if ( strpos( $s, '#' ) === 0 ) {
+                               continue;
+                       }
+
+                       $s = strtolower( $s );
+                       $i = strpos( $s, ' ' );
+
+                       if ( $i === false ) {
+                               continue;
+                       }
+
+                       $mime = substr( $s, 0, $i );
+                       $ext = trim( substr( $s, $i + 1 ) );
+
+                       if ( empty( $ext ) ) {
+                               continue;
+                       }
+
+                       if ( !empty( $this->mimetoExt[$mime] ) ) {
+                               $this->mimetoExt[$mime] .= ' ' . $ext;
+                       } else {
+                               $this->mimetoExt[$mime] = $ext;
+                       }
+
+                       $extensions = explode( ' ', $ext );
+
+                       foreach ( $extensions as $e ) {
+                               $e = trim( $e );
+                               if ( empty( $e ) ) {
+                                       continue;
+                               }
+
+                               if ( !empty( $this->mExtToMime[$e] ) ) {
+                                       $this->mExtToMime[$e] .= ' ' . $mime;
+                               } else {
+                                       $this->mExtToMime[$e] = $mime;
+                               }
+                       }
+               }
+
+               /**
+                *   --- load mime.info ---
+                */
+
+               $mimeInfoFile = $this->infoFile;
+
+               $info = self::$wellKnownInfo;
+
+               if ( $mimeInfoFile ) {
+                       if ( is_file( $mimeInfoFile ) && is_readable( $mimeInfoFile ) ) {
+                               $this->logger->info( __METHOD__ . ": loading mime info from $mimeInfoFile\n" );
+                               $info .= "\n";
+                               $info .= file_get_contents( $mimeInfoFile );
+                       } else {
+                               $this->logger->info( __METHOD__ . ": can't load mime info from $mimeInfoFile\n" );
+                       }
+               } else {
+                       $this->logger->info( __METHOD__ .
+                               ": no mime info file defined, using built-ins only.\n" );
+               }
+
+               $info .= "\n" . $this->extraInfo;
+
+               $info = str_replace( [ "\r\n", "\n\r", "\n\n", "\r\r", "\r" ], "\n", $info );
+               $info = str_replace( "\t", " ", $info );
+
+               $this->mimeTypeAliases = [];
+               $this->mediaTypes = [];
+
+               $lines = explode( "\n", $info );
+               foreach ( $lines as $s ) {
+                       $s = trim( $s );
+                       if ( empty( $s ) ) {
+                               continue;
+                       }
+                       if ( strpos( $s, '#' ) === 0 ) {
+                               continue;
+                       }
+
+                       $s = strtolower( $s );
+                       $i = strpos( $s, ' ' );
+
+                       if ( $i === false ) {
+                               continue;
+                       }
+
+                       # print "processing MIME INFO line $s<br>";
+
+                       $match = [];
+                       if ( preg_match( '!\[\s*(\w+)\s*\]!', $s, $match ) ) {
+                               $s = preg_replace( '!\[\s*(\w+)\s*\]!', '', $s );
+                               $mtype = trim( strtoupper( $match[1] ) );
+                       } else {
+                               $mtype = MEDIATYPE_UNKNOWN;
+                       }
+
+                       $m = explode( ' ', $s );
+
+                       if ( !isset( $this->mediaTypes[$mtype] ) ) {
+                               $this->mediaTypes[$mtype] = [];
+                       }
+
+                       foreach ( $m as $mime ) {
+                               $mime = trim( $mime );
+                               if ( empty( $mime ) ) {
+                                       continue;
+                               }
+
+                               $this->mediaTypes[$mtype][] = $mime;
+                       }
+
+                       if ( count( $m ) > 1 ) {
+                               $main = $m[0];
+                               $mCount = count( $m );
+                               for ( $i = 1; $i < $mCount; $i += 1 ) {
+                                       $mime = $m[$i];
+                                       $this->mimeTypeAliases[$mime] = $main;
+                               }
+                       }
+               }
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
+       /**
+        * Adds to the list mapping MIME to file extensions.
+        * As an extension author, you are encouraged to submit patches to
+        * MediaWiki's core to add new MIME types to mime.types.
+        * @param string $types
+        */
+       public function addExtraTypes( $types ) {
+               $this->extraTypes .= "\n" . $types;
+       }
+
+       /**
+        * Adds to the list mapping MIME to media type.
+        * As an extension author, you are encouraged to submit patches to
+        * MediaWiki's core to add new MIME info to mime.info.
+        * @param string $info
+        */
+       public function addExtraInfo( $info ) {
+               $this->extraInfo .= "\n" . $info;
+       }
+
+       /**
+        * Returns a list of file extensions for a given MIME type as a space
+        * separated string or null if the MIME type was unrecognized. Resolves
+        * MIME type aliases.
+        *
+        * @param string $mime
+        * @return string|null
+        */
+       public function getExtensionsForType( $mime ) {
+               $mime = strtolower( $mime );
+
+               // Check the mime-to-ext map
+               if ( isset( $this->mimetoExt[$mime] ) ) {
+                       return $this->mimetoExt[$mime];
+               }
+
+               // Resolve the MIME type to the canonical type
+               if ( isset( $this->mimeTypeAliases[$mime] ) ) {
+                       $mime = $this->mimeTypeAliases[$mime];
+                       if ( isset( $this->mimetoExt[$mime] ) ) {
+                               return $this->mimetoExt[$mime];
+                       }
+               }
+
+               return null;
+       }
+
+       /**
+        * Returns a list of MIME types for a given file extension as a space
+        * separated string or null if the extension was unrecognized.
+        *
+        * @param string $ext
+        * @return string|null
+        */
+       public function getTypesForExtension( $ext ) {
+               $ext = strtolower( $ext );
+
+               $r = isset( $this->mExtToMime[$ext] ) ? $this->mExtToMime[$ext] : null;
+               return $r;
+       }
+
+       /**
+        * Returns a single MIME type for a given file extension or null if unknown.
+        * This is always the first type from the list returned by getTypesForExtension($ext).
+        *
+        * @param string $ext
+        * @return string|null
+        */
+       public function guessTypesForExtension( $ext ) {
+               $m = $this->getTypesForExtension( $ext );
+               if ( is_null( $m ) ) {
+                       return null;
+               }
+
+               // TODO: Check if this is needed; strtok( $m, ' ' ) should be sufficient
+               $m = trim( $m );
+               $m = preg_replace( '/\s.*$/', '', $m );
+
+               return $m;
+       }
+
+       /**
+        * Tests if the extension matches the given MIME type. Returns true if a
+        * match was found, null if the MIME type is unknown, and false if the
+        * MIME type is known but no matches where found.
+        *
+        * @param string $extension
+        * @param string $mime
+        * @return bool|null
+        */
+       public function isMatchingExtension( $extension, $mime ) {
+               $ext = $this->getExtensionsForType( $mime );
+
+               if ( !$ext ) {
+                       return null; // Unknown MIME type
+               }
+
+               $ext = explode( ' ', $ext );
+
+               $extension = strtolower( $extension );
+               return in_array( $extension, $ext );
+       }
+
+       /**
+        * Returns true if the MIME type is known to represent an image format
+        * supported by the PHP GD library.
+        *
+        * @param string $mime
+        *
+        * @return bool
+        */
+       public function isPHPImageType( $mime ) {
+               // As defined by imagegetsize and image_type_to_mime
+               static $types = [
+                       'image/gif', 'image/jpeg', 'image/png',
+                       'image/x-bmp', 'image/xbm', 'image/tiff',
+                       'image/jp2', 'image/jpeg2000', 'image/iff',
+                       'image/xbm', 'image/x-xbitmap',
+                       'image/vnd.wap.wbmp', 'image/vnd.xiff',
+                       'image/x-photoshop',
+                       'application/x-shockwave-flash',
+               ];
+
+               return in_array( $mime, $types );
+       }
+
+       /**
+        * Returns true if the extension represents a type which can
+        * be reliably detected from its content. Use this to determine
+        * whether strict content checks should be applied to reject
+        * invalid uploads; if we can't identify the type we won't
+        * be able to say if it's invalid.
+        *
+        * @todo Be more accurate when using fancy MIME detector plugins;
+        *       right now this is the bare minimum getimagesize() list.
+        * @param string $extension
+        * @return bool
+        */
+       function isRecognizableExtension( $extension ) {
+               static $types = [
+                       // Types recognized by getimagesize()
+                       'gif', 'jpeg', 'jpg', 'png', 'swf', 'psd',
+                       'bmp', 'tiff', 'tif', 'jpc', 'jp2',
+                       'jpx', 'jb2', 'swc', 'iff', 'wbmp',
+                       'xbm',
+
+                       // Formats we recognize magic numbers for
+                       'djvu', 'ogx', 'ogg', 'ogv', 'oga', 'spx',
+                       'mid', 'pdf', 'wmf', 'xcf', 'webm', 'mkv', 'mka',
+                       'webp',
+
+                       // XML formats we sure hope we recognize reliably
+                       'svg',
+               ];
+               return in_array( strtolower( $extension ), $types );
+       }
+
+       /**
+        * Improves a MIME type using the file extension. Some file formats are very generic,
+        * so their MIME type is not very meaningful. A more useful MIME type can be derived
+        * by looking at the file extension. Typically, this method would be called on the
+        * result of guessMimeType().
+        *
+        * @param string $mime The MIME type, typically guessed from a file's content.
+        * @param string $ext The file extension, as taken from the file name
+        *
+        * @return string The MIME type
+        */
+       public function improveTypeFromExtension( $mime, $ext ) {
+               if ( $mime === 'unknown/unknown' ) {
+                       if ( $this->isRecognizableExtension( $ext ) ) {
+                               $this->logger->info( __METHOD__ . ': refusing to guess mime type for .' .
+                                       "$ext file, we should have recognized it\n" );
+                       } else {
+                               // Not something we can detect, so simply
+                               // trust the file extension
+                               $mime = $this->guessTypesForExtension( $ext );
+                       }
+               } elseif ( $mime === 'application/x-opc+zip' ) {
+                       if ( $this->isMatchingExtension( $ext, $mime ) ) {
+                               // A known file extension for an OPC file,
+                               // find the proper MIME type for that file extension
+                               $mime = $this->guessTypesForExtension( $ext );
+                       } else {
+                               $this->logger->info( __METHOD__ .
+                                       ": refusing to guess better type for $mime file, " .
+                                       ".$ext is not a known OPC extension.\n" );
+                               $mime = 'application/zip';
+                       }
+               } elseif ( $mime === 'text/plain' && $this->findMediaType( ".$ext" ) === MEDIATYPE_TEXT ) {
+                       // Textual types are sometimes not recognized properly.
+                       // If detected as text/plain, and has an extension which is textual
+                       // improve to the extension's type. For example, csv and json are often
+                       // misdetected as text/plain.
+                       $mime = $this->guessTypesForExtension( $ext );
+               }
+
+               # Media handling extensions can improve the MIME detected
+               $callback = $this->extCallback;
+               if ( $callback ) {
+                       $callback( $this, $ext, $mime /* by reference */ );
+               }
+
+               if ( isset( $this->mimeTypeAliases[$mime] ) ) {
+                       $mime = $this->mimeTypeAliases[$mime];
+               }
+
+               $this->logger->info( __METHOD__ . ": improved mime type for .$ext: $mime\n" );
+               return $mime;
+       }
+
+       /**
+        * MIME type detection. This uses detectMimeType to detect the MIME type
+        * of the file, but applies additional checks to determine some well known
+        * file formats that may be missed or misinterpreted by the default MIME
+        * detection (namely XML based formats like XHTML or SVG, as well as ZIP
+        * based formats like OPC/ODF files).
+        *
+        * @param string $file The file to check
+        * @param string|bool $ext The file extension, or true (default) to extract
+        *   it from the filename. Set it to false to ignore the extension. DEPRECATED!
+        *   Set to false, use improveTypeFromExtension($mime, $ext) later to improve MIME type.
+        *
+        * @return string The MIME type of $file
+        */
+       public function guessMimeType( $file, $ext = true ) {
+               if ( $ext ) { // TODO: make $ext default to false. Or better, remove it.
+                       $this->logger->info( __METHOD__ .
+                               ": WARNING: use of the \$ext parameter is deprecated. " .
+                               "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
+               }
+
+               $mime = $this->doGuessMimeType( $file, $ext );
+
+               if ( !$mime ) {
+                       $this->logger->info( __METHOD__ .
+                               ": internal type detection failed for $file (.$ext)...\n" );
+                       $mime = $this->detectMimeType( $file, $ext );
+               }
+
+               if ( isset( $this->mimeTypeAliases[$mime] ) ) {
+                       $mime = $this->mimeTypeAliases[$mime];
+               }
+
+               $this->logger->info( __METHOD__ . ": guessed mime type of $file: $mime\n" );
+               return $mime;
+       }
+
+       /**
+        * Guess the MIME type from the file contents.
+        *
+        * @todo Remove $ext param
+        *
+        * @param string $file
+        * @param mixed $ext
+        * @return bool|string
+        * @throws UnexpectedValueException
+        */
+       private function doGuessMimeType( $file, $ext ) {
+               // Read a chunk of the file
+               MediaWiki\suppressWarnings();
+               $f = fopen( $file, 'rb' );
+               MediaWiki\restoreWarnings();
+
+               if ( !$f ) {
+                       return 'unknown/unknown';
+               }
+
+               $fsize = filesize( $file );
+               if ( $fsize === false ) {
+                       return 'unknown/unknown';
+               }
+
+               $head = fread( $f, 1024 );
+               $tailLength = min( 65558, $fsize ); // 65558 = maximum size of a zip EOCDR
+               if ( fseek( $f, -1 * $tailLength, SEEK_END ) === -1 ) {
+                       throw new UnexpectedValueException(
+                               "Seeking $tailLength bytes from EOF failed in " . __METHOD__ );
+               }
+               $tail = $tailLength ? fread( $f, $tailLength ) : '';
+               fclose( $f );
+
+               $this->logger->info( __METHOD__ .
+                       ": analyzing head and tail of $file for magic numbers.\n" );
+
+               // Hardcode a few magic number checks...
+               $headers = [
+                       // Multimedia...
+                       'MThd'             => 'audio/midi',
+                       'OggS'             => 'application/ogg',
+
+                       // Image formats...
+                       // Note that WMF may have a bare header, no magic number.
+                       "\x01\x00\x09\x00" => 'application/x-msmetafile', // Possibly prone to false positives?
+                       "\xd7\xcd\xc6\x9a" => 'application/x-msmetafile',
+                       '%PDF'             => 'application/pdf',
+                       'gimp xcf'         => 'image/x-xcf',
+
+                       // Some forbidden fruit...
+                       'MZ'               => 'application/octet-stream', // DOS/Windows executable
+                       "\xca\xfe\xba\xbe" => 'application/octet-stream', // Mach-O binary
+                       "\x7fELF"          => 'application/octet-stream', // ELF binary
+               ];
+
+               foreach ( $headers as $magic => $candidate ) {
+                       if ( strncmp( $head, $magic, strlen( $magic ) ) == 0 ) {
+                               $this->logger->info( __METHOD__ .
+                                       ": magic header in $file recognized as $candidate\n" );
+                               return $candidate;
+                       }
+               }
+
+               /* Look for WebM and Matroska files */
+               if ( strncmp( $head, pack( "C4", 0x1a, 0x45, 0xdf, 0xa3 ), 4 ) == 0 ) {
+                       $doctype = strpos( $head, "\x42\x82" );
+                       if ( $doctype ) {
+                               // Next byte is datasize, then data (sizes larger than 1 byte are stupid muxers)
+                               $data = substr( $head, $doctype + 3, 8 );
+                               if ( strncmp( $data, "matroska", 8 ) == 0 ) {
+                                       $this->logger->info( __METHOD__ . ": recognized file as video/x-matroska\n" );
+                                       return "video/x-matroska";
+                               } elseif ( strncmp( $data, "webm", 4 ) == 0 ) {
+                                       $this->logger->info( __METHOD__ . ": recognized file as video/webm\n" );
+                                       return "video/webm";
+                               }
+                       }
+                       $this->logger->info( __METHOD__ . ": unknown EBML file\n" );
+                       return "unknown/unknown";
+               }
+
+               /* Look for WebP */
+               if ( strncmp( $head, "RIFF", 4 ) == 0 &&
+                       strncmp( substr( $head, 8, 7 ), "WEBPVP8", 7 ) == 0
+               ) {
+                       $this->logger->info( __METHOD__ . ": recognized file as image/webp\n" );
+                       return "image/webp";
+               }
+
+               /**
+                * Look for PHP.  Check for this before HTML/XML...  Warning: this is a
+                * heuristic, and won't match a file with a lot of non-PHP before.  It
+                * will also match text files which could be PHP. :)
+                *
+                * @todo FIXME: For this reason, the check is probably useless -- an attacker
+                * could almost certainly just pad the file with a lot of nonsense to
+                * circumvent the check in any case where it would be a security
+                * problem.  On the other hand, it causes harmful false positives (bug
+                * 16583).  The heuristic has been cut down to exclude three-character
+                * strings like "<? ", but should it be axed completely?
+                */
+               if ( ( strpos( $head, '<?php' ) !== false ) ||
+                       ( strpos( $head, "<\x00?\x00p\x00h\x00p" ) !== false ) ||
+                       ( strpos( $head, "<\x00?\x00 " ) !== false ) ||
+                       ( strpos( $head, "<\x00?\x00\n" ) !== false ) ||
+                       ( strpos( $head, "<\x00?\x00\t" ) !== false ) ||
+                       ( strpos( $head, "<\x00?\x00=" ) !== false ) ) {
+
+                       $this->logger->info( __METHOD__ . ": recognized $file as application/x-php\n" );
+                       return 'application/x-php';
+               }
+
+               /**
+                * look for XML formats (XHTML and SVG)
+                */
+               $xml = new XmlTypeCheck( $file );
+               if ( $xml->wellFormed ) {
+                       $xmlTypes = $this->xmlTypes;
+                       if ( isset( $xmlTypes[$xml->getRootElement()] ) ) {
+                               return $xmlTypes[$xml->getRootElement()];
+                       } else {
+                               return 'application/xml';
+                       }
+               }
+
+               /**
+                * look for shell scripts
+                */
+               $script_type = null;
+
+               # detect by shebang
+               if ( substr( $head, 0, 2 ) == "#!" ) {
+                       $script_type = "ASCII";
+               } elseif ( substr( $head, 0, 5 ) == "\xef\xbb\xbf#!" ) {
+                       $script_type = "UTF-8";
+               } elseif ( substr( $head, 0, 7 ) == "\xfe\xff\x00#\x00!" ) {
+                       $script_type = "UTF-16BE";
+               } elseif ( substr( $head, 0, 7 ) == "\xff\xfe#\x00!" ) {
+                       $script_type = "UTF-16LE";
+               }
+
+               if ( $script_type ) {
+                       if ( $script_type !== "UTF-8" && $script_type !== "ASCII" ) {
+                               // Quick and dirty fold down to ASCII!
+                               $pack = [ 'UTF-16BE' => 'n*', 'UTF-16LE' => 'v*' ];
+                               $chars = unpack( $pack[$script_type], substr( $head, 2 ) );
+                               $head = '';
+                               foreach ( $chars as $codepoint ) {
+                                       if ( $codepoint < 128 ) {
+                                               $head .= chr( $codepoint );
+                                       } else {
+                                               $head .= '?';
+                                       }
+                               }
+                       }
+
+                       $match = [];
+
+                       if ( preg_match( '%/?([^\s]+/)(\w+)%', $head, $match ) ) {
+                               $mime = "application/x-{$match[2]}";
+                               $this->logger->info( __METHOD__ . ": shell script recognized as $mime\n" );
+                               return $mime;
+                       }
+               }
+
+               // Check for ZIP variants (before getimagesize)
+               if ( strpos( $tail, "PK\x05\x06" ) !== false ) {
+                       $this->logger->info( __METHOD__ . ": ZIP header present in $file\n" );
+                       return $this->detectZipType( $head, $tail, $ext );
+               }
+
+               MediaWiki\suppressWarnings();
+               $gis = getimagesize( $file );
+               MediaWiki\restoreWarnings();
+
+               if ( $gis && isset( $gis['mime'] ) ) {
+                       $mime = $gis['mime'];
+                       $this->logger->info( __METHOD__ . ": getimagesize detected $file as $mime\n" );
+                       return $mime;
+               }
+
+               # Media handling extensions can guess the MIME by content
+               # It's intentionally here so that if core is wrong about a type (false positive),
+               # people will hopefully nag and submit patches :)
+               $mime = false;
+               # Some strings by reference for performance - assuming well-behaved hooks
+               $callback = $this->guessCallback;
+               if ( $callback ) {
+                       $callback( $this, $head, $tail, $file, $mime /* by reference */ );
+               };
+
+               return $mime;
+       }
+
+       /**
+        * Detect application-specific file type of a given ZIP file from its
+        * header data.  Currently works for OpenDocument and OpenXML types...
+        * If can't tell, returns 'application/zip'.
+        *
+        * @param string $header Some reasonably-sized chunk of file header
+        * @param string|null $tail The tail of the file
+        * @param string|bool $ext The file extension, or true to extract it from the filename.
+        *   Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
+        *   use improveTypeFromExtension($mime, $ext) later to improve MIME type.
+        *
+        * @return string
+        */
+       function detectZipType( $header, $tail = null, $ext = false ) {
+               if ( $ext ) { # TODO: remove $ext param
+                       $this->logger->info( __METHOD__ .
+                               ": WARNING: use of the \$ext parameter is deprecated. " .
+                               "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
+               }
+
+               $mime = 'application/zip';
+               $opendocTypes = [
+                       'chart-template',
+                       'chart',
+                       'formula-template',
+                       'formula',
+                       'graphics-template',
+                       'graphics',
+                       'image-template',
+                       'image',
+                       'presentation-template',
+                       'presentation',
+                       'spreadsheet-template',
+                       'spreadsheet',
+                       'text-template',
+                       'text-master',
+                       'text-web',
+                       'text' ];
+
+               // http://lists.oasis-open.org/archives/office/200505/msg00006.html
+               $types = '(?:' . implode( '|', $opendocTypes ) . ')';
+               $opendocRegex = "/^mimetype(application\/vnd\.oasis\.opendocument\.$types)/";
+
+               $openxmlRegex = "/^\[Content_Types\].xml/";
+
+               if ( preg_match( $opendocRegex, substr( $header, 30 ), $matches ) ) {
+                       $mime = $matches[1];
+                       $this->logger->info( __METHOD__ . ": detected $mime from ZIP archive\n" );
+               } elseif ( preg_match( $openxmlRegex, substr( $header, 30 ) ) ) {
+                       $mime = "application/x-opc+zip";
+                       # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
+                       if ( $ext !== true && $ext !== false ) {
+                               /** This is the mode used by getPropsFromPath
+                                * These MIME's are stored in the database, where we don't really want
+                                * x-opc+zip, because we use it only for internal purposes
+                                */
+                               if ( $this->isMatchingExtension( $ext, $mime ) ) {
+                                       /* A known file extension for an OPC file,
+                                        * find the proper mime type for that file extension
+                                        */
+                                       $mime = $this->guessTypesForExtension( $ext );
+                               } else {
+                                       $mime = "application/zip";
+                               }
+                       }
+                       $this->logger->info( __METHOD__ .
+                               ": detected an Open Packaging Conventions archive: $mime\n" );
+               } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
+                       ( $headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
+                       preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
+                       if ( substr( $header, 512, 4 ) == "\xEC\xA5\xC1\x00" ) {
+                               $mime = "application/msword";
+                       }
+                       switch ( substr( $header, 512, 6 ) ) {
+                               case "\xEC\xA5\xC1\x00\x0E\x00":
+                               case "\xEC\xA5\xC1\x00\x1C\x00":
+                               case "\xEC\xA5\xC1\x00\x43\x00":
+                                       $mime = "application/vnd.ms-powerpoint";
+                                       break;
+                               case "\xFD\xFF\xFF\xFF\x10\x00":
+                               case "\xFD\xFF\xFF\xFF\x1F\x00":
+                               case "\xFD\xFF\xFF\xFF\x22\x00":
+                               case "\xFD\xFF\xFF\xFF\x23\x00":
+                               case "\xFD\xFF\xFF\xFF\x28\x00":
+                               case "\xFD\xFF\xFF\xFF\x29\x00":
+                               case "\xFD\xFF\xFF\xFF\x10\x02":
+                               case "\xFD\xFF\xFF\xFF\x1F\x02":
+                               case "\xFD\xFF\xFF\xFF\x22\x02":
+                               case "\xFD\xFF\xFF\xFF\x23\x02":
+                               case "\xFD\xFF\xFF\xFF\x28\x02":
+                               case "\xFD\xFF\xFF\xFF\x29\x02":
+                                       $mime = "application/vnd.msexcel";
+                                       break;
+                       }
+
+                       $this->logger->info( __METHOD__ .
+                               ": detected a MS Office document with OPC trailer\n" );
+               } else {
+                       $this->logger->info( __METHOD__ . ": unable to identify type of ZIP archive\n" );
+               }
+               return $mime;
+       }
+
+       /**
+        * Internal MIME type detection. Detection is done using the fileinfo
+        * extension if it is available. It can be overriden by callback, which could
+        * use an external program, for example. If detection fails and $ext is not false,
+        * the MIME type is guessed from the file extension, using guessTypesForExtension.
+        *
+        * If the MIME type is still unknown, getimagesize is used to detect the
+        * MIME type if the file is an image. If no MIME type can be determined,
+        * this function returns 'unknown/unknown'.
+        *
+        * @param string $file The file to check
+        * @param string|bool $ext The file extension, or true (default) to extract it from the filename.
+        *   Set it to false to ignore the extension. DEPRECATED! Set to false, use
+        *   improveTypeFromExtension($mime, $ext) later to improve MIME type.
+        *
+        * @return string The MIME type of $file
+        */
+       private function detectMimeType( $file, $ext = true ) {
+               /** @todo Make $ext default to false. Or better, remove it. */
+               if ( $ext ) {
+                       $this->logger->info( __METHOD__ .
+                               ": WARNING: use of the \$ext parameter is deprecated. "
+                               . "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
+               }
+
+               $callback = $this->detectCallback;
+               $m = null;
+               if ( $callback ) {
+                       $m = $callback( $file );
+               } elseif ( function_exists( "finfo_open" ) && function_exists( "finfo_file" ) ) {
+                       $mime_magic_resource = finfo_open( FILEINFO_MIME );
+
+                       if ( $mime_magic_resource ) {
+                               $m = finfo_file( $mime_magic_resource, $file );
+                               finfo_close( $mime_magic_resource );
+                       } else {
+                               $this->logger->info( __METHOD__ .
+                                       ": finfo_open failed on " . FILEINFO_MIME . "!\n" );
+                       }
+               } else {
+                       $this->logger->info( __METHOD__ . ": no magic mime detector found!\n" );
+               }
+
+               if ( $m ) {
+                       # normalize
+                       $m = preg_replace( '![;, ].*$!', '', $m ); # strip charset, etc
+                       $m = trim( $m );
+                       $m = strtolower( $m );
+
+                       if ( strpos( $m, 'unknown' ) !== false ) {
+                               $m = null;
+                       } else {
+                               $this->logger->info( __METHOD__ . ": magic mime type of $file: $m\n" );
+                               return $m;
+                       }
+               }
+
+               // If desired, look at extension as a fallback.
+               if ( $ext === true ) {
+                       $i = strrpos( $file, '.' );
+                       $ext = strtolower( $i ? substr( $file, $i + 1 ) : '' );
+               }
+               if ( $ext ) {
+                       if ( $this->isRecognizableExtension( $ext ) ) {
+                               $this->logger->info( __METHOD__ . ": refusing to guess mime type for .$ext file, "
+                                       . "we should have recognized it\n" );
+                       } else {
+                               $m = $this->guessTypesForExtension( $ext );
+                               if ( $m ) {
+                                       $this->logger->info( __METHOD__ . ": extension mime type of $file: $m\n" );
+                                       return $m;
+                               }
+                       }
+               }
+
+               // Unknown type
+               $this->logger->info( __METHOD__ . ": failed to guess mime type for $file!\n" );
+               return 'unknown/unknown';
+       }
+
+       /**
+        * Determine the media type code for a file, using its MIME type, name and
+        * possibly its contents.
+        *
+        * This function relies on the findMediaType(), mapping extensions and MIME
+        * types to media types.
+        *
+        * @todo analyse file if need be
+        * @todo look at multiple extension, separately and together.
+        *
+        * @param string $path Full path to the image file, in case we have to look at the contents
+        *        (if null, only the MIME type is used to determine the media type code).
+        * @param string $mime MIME type. If null it will be guessed using guessMimeType.
+        *
+        * @return string A value to be used with the MEDIATYPE_xxx constants.
+        */
+       function getMediaType( $path = null, $mime = null ) {
+               if ( !$mime && !$path ) {
+                       return MEDIATYPE_UNKNOWN;
+               }
+
+               // If MIME type is unknown, guess it
+               if ( !$mime ) {
+                       $mime = $this->guessMimeType( $path, false );
+               }
+
+               // Special code for ogg - detect if it's video (theora),
+               // else label it as sound.
+               if ( $mime == 'application/ogg' && file_exists( $path ) ) {
+
+                       // Read a chunk of the file
+                       $f = fopen( $path, "rt" );
+                       if ( !$f ) {
+                               return MEDIATYPE_UNKNOWN;
+                       }
+                       $head = fread( $f, 256 );
+                       fclose( $f );
+
+                       $head = str_replace( 'ffmpeg2theora', '', strtolower( $head ) );
+
+                       // This is an UGLY HACK, file should be parsed correctly
+                       if ( strpos( $head, 'theora' ) !== false ) {
+                               return MEDIATYPE_VIDEO;
+                       } elseif ( strpos( $head, 'vorbis' ) !== false ) {
+                               return MEDIATYPE_AUDIO;
+                       } elseif ( strpos( $head, 'flac' ) !== false ) {
+                               return MEDIATYPE_AUDIO;
+                       } elseif ( strpos( $head, 'speex' ) !== false ) {
+                               return MEDIATYPE_AUDIO;
+                       } else {
+                               return MEDIATYPE_MULTIMEDIA;
+                       }
+               }
+
+               $type = null;
+               // Check for entry for full MIME type
+               if ( $mime ) {
+                       $type = $this->findMediaType( $mime );
+                       if ( $type !== MEDIATYPE_UNKNOWN ) {
+                               return $type;
+                       }
+               }
+
+               // Check for entry for file extension
+               if ( $path ) {
+                       $i = strrpos( $path, '.' );
+                       $e = strtolower( $i ? substr( $path, $i + 1 ) : '' );
+
+                       // TODO: look at multi-extension if this fails, parse from full path
+                       $type = $this->findMediaType( '.' . $e );
+                       if ( $type !== MEDIATYPE_UNKNOWN ) {
+                               return $type;
+                       }
+               }
+
+               // Check major MIME type
+               if ( $mime ) {
+                       $i = strpos( $mime, '/' );
+                       if ( $i !== false ) {
+                               $major = substr( $mime, 0, $i );
+                               $type = $this->findMediaType( $major );
+                               if ( $type !== MEDIATYPE_UNKNOWN ) {
+                                       return $type;
+                               }
+                       }
+               }
+
+               if ( !$type ) {
+                       $type = MEDIATYPE_UNKNOWN;
+               }
+
+               return $type;
+       }
+
+       /**
+        * Returns a media code matching the given MIME type or file extension.
+        * File extensions are represented by a string starting with a dot (.) to
+        * distinguish them from MIME types.
+        *
+        * This function relies on the mapping defined by $this->mMediaTypes
+        * @access private
+        * @param string $extMime
+        * @return int|string
+        */
+       function findMediaType( $extMime ) {
+               if ( strpos( $extMime, '.' ) === 0 ) {
+                       // If it's an extension, look up the MIME types
+                       $m = $this->getTypesForExtension( substr( $extMime, 1 ) );
+                       if ( !$m ) {
+                               return MEDIATYPE_UNKNOWN;
+                       }
+
+                       $m = explode( ' ', $m );
+               } else {
+                       // Normalize MIME type
+                       if ( isset( $this->mimeTypeAliases[$extMime] ) ) {
+                               $extMime = $this->mimeTypeAliases[$extMime];
+                       }
+
+                       $m = [ $extMime ];
+               }
+
+               foreach ( $m as $mime ) {
+                       foreach ( $this->mediaTypes as $type => $codes ) {
+                               if ( in_array( $mime, $codes, true ) ) {
+                                       return $type;
+                               }
+                       }
+               }
+
+               return MEDIATYPE_UNKNOWN;
+       }
+
+       /**
+        * Get the MIME types that various versions of Internet Explorer would
+        * detect from a chunk of the content.
+        *
+        * @param string $fileName The file name (unused at present)
+        * @param string $chunk The first 256 bytes of the file
+        * @param string $proposed The MIME type proposed by the server
+        * @return array
+        */
+       public function getIEMimeTypes( $fileName, $chunk, $proposed ) {
+               $ca = $this->getIEContentAnalyzer();
+               return $ca->getRealMimesFromData( $fileName, $chunk, $proposed );
+       }
+
+       /**
+        * Get a cached instance of IEContentAnalyzer
+        *
+        * @return IEContentAnalyzer
+        */
+       protected function getIEContentAnalyzer() {
+               if ( is_null( $this->IEAnalyzer ) ) {
+                       $this->IEAnalyzer = new IEContentAnalyzer;
+               }
+               return $this->IEAnalyzer;
+       }
+}
diff --git a/includes/libs/mime/XmlTypeCheck.php b/includes/libs/mime/XmlTypeCheck.php
new file mode 100644 (file)
index 0000000..f057140
--- /dev/null
@@ -0,0 +1,347 @@
+<?php
+/**
+ * XML syntax and type checker.
+ *
+ * Since 1.24.2, it uses XMLReader instead of xml_parse, which gives us
+ * more control over the expansion of XML entities. When passed to the
+ * callback, entities will be fully expanded, but may report the XML is
+ * invalid if expanding the entities are likely to cause a DoS.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class XmlTypeCheck {
+       /**
+        * Will be set to true or false to indicate whether the file is
+        * well-formed XML. Note that this doesn't check schema validity.
+        */
+       public $wellFormed = null;
+
+       /**
+        * Will be set to true if the optional element filter returned
+        * a match at some point.
+        */
+       public $filterMatch = false;
+
+       /**
+        * Will contain the type of filter hit if the optional element filter returned
+        * a match at some point.
+        * @var mixed
+        */
+       public $filterMatchType = false;
+
+       /**
+        * Name of the document's root element, including any namespace
+        * as an expanded URL.
+        */
+       public $rootElement = '';
+
+       /**
+        * A stack of strings containing the data of each xml element as it's processed. Append
+        * data to the top string of the stack, then pop off the string and process it when the
+        * element is closed.
+        */
+       protected $elementData = [];
+
+       /**
+        * A stack of element names and attributes, as we process them.
+        */
+       protected $elementDataContext = [];
+
+       /**
+        * Current depth of the data stack.
+        */
+       protected $stackDepth = 0;
+
+       /**
+        * Additional parsing options
+        */
+       private $parserOptions = [
+               'processing_instruction_handler' => '',
+       ];
+
+       /**
+        * @param string $input a filename or string containing the XML element
+        * @param callable $filterCallback (optional)
+        *        Function to call to do additional custom validity checks from the
+        *        SAX element handler event. This gives you access to the element
+        *        namespace, name, attributes, and text contents.
+        *        Filter should return 'true' to toggle on $this->filterMatch
+        * @param bool $isFile (optional) indicates if the first parameter is a
+        *        filename (default, true) or if it is a string (false)
+        * @param array $options list of additional parsing options:
+        *        processing_instruction_handler: Callback for xml_set_processing_instruction_handler
+        */
+       function __construct( $input, $filterCallback = null, $isFile = true, $options = [] ) {
+               $this->filterCallback = $filterCallback;
+               $this->parserOptions = array_merge( $this->parserOptions, $options );
+               $this->validateFromInput( $input, $isFile );
+       }
+
+       /**
+        * Alternative constructor: from filename
+        *
+        * @param string $fname the filename of an XML document
+        * @param callable $filterCallback (optional)
+        *        Function to call to do additional custom validity checks from the
+        *        SAX element handler event. This gives you access to the element
+        *        namespace, name, and attributes, but not to text contents.
+        *        Filter should return 'true' to toggle on $this->filterMatch
+        * @return XmlTypeCheck
+        */
+       public static function newFromFilename( $fname, $filterCallback = null ) {
+               return new self( $fname, $filterCallback, true );
+       }
+
+       /**
+        * Alternative constructor: from string
+        *
+        * @param string $string a string containing an XML element
+        * @param callable $filterCallback (optional)
+        *        Function to call to do additional custom validity checks from the
+        *        SAX element handler event. This gives you access to the element
+        *        namespace, name, and attributes, but not to text contents.
+        *        Filter should return 'true' to toggle on $this->filterMatch
+        * @return XmlTypeCheck
+        */
+       public static function newFromString( $string, $filterCallback = null ) {
+               return new self( $string, $filterCallback, false );
+       }
+
+       /**
+        * Get the root element. Simple accessor to $rootElement
+        *
+        * @return string
+        */
+       public function getRootElement() {
+               return $this->rootElement;
+       }
+
+       /**
+        * @param string $fname the filename
+        */
+       private function validateFromInput( $xml, $isFile ) {
+               $reader = new XMLReader();
+               if ( $isFile ) {
+                       $s = $reader->open( $xml, null, LIBXML_NOERROR | LIBXML_NOWARNING );
+               } else {
+                       $s = $reader->XML( $xml, null, LIBXML_NOERROR | LIBXML_NOWARNING );
+               }
+               if ( $s !== true ) {
+                       // Couldn't open the XML
+                       $this->wellFormed = false;
+               } else {
+                       $oldDisable = libxml_disable_entity_loader( true );
+                       $reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
+                       try {
+                               $this->validate( $reader );
+                       } catch ( Exception $e ) {
+                               // Calling this malformed, because we didn't parse the whole
+                               // thing. Maybe just an external entity refernce.
+                               $this->wellFormed = false;
+                               $reader->close();
+                               libxml_disable_entity_loader( $oldDisable );
+                               throw $e;
+                       }
+                       $reader->close();
+                       libxml_disable_entity_loader( $oldDisable );
+               }
+       }
+
+       private function readNext( XMLReader $reader ) {
+               set_error_handler( [ $this, 'XmlErrorHandler' ] );
+               $ret = $reader->read();
+               restore_error_handler();
+               return $ret;
+       }
+
+       public function XmlErrorHandler( $errno, $errstr ) {
+               $this->wellFormed = false;
+       }
+
+       private function validate( $reader ) {
+
+               // First, move through anything that isn't an element, and
+               // handle any processing instructions with the callback
+               do {
+                       if ( !$this->readNext( $reader ) ) {
+                               // Hit the end of the document before any elements
+                               $this->wellFormed = false;
+                               return;
+                       }
+                       if ( $reader->nodeType === XMLReader::PI ) {
+                               $this->processingInstructionHandler( $reader->name, $reader->value );
+                       }
+               } while ( $reader->nodeType != XMLReader::ELEMENT );
+
+               // Process the rest of the document
+               do {
+                       switch ( $reader->nodeType ) {
+                               case XMLReader::ELEMENT:
+                                       $name = $this->expandNS(
+                                               $reader->name,
+                                               $reader->namespaceURI
+                                       );
+                                       if ( $this->rootElement === '' ) {
+                                               $this->rootElement = $name;
+                                       }
+                                       $empty = $reader->isEmptyElement;
+                                       $attrs = $this->getAttributesArray( $reader );
+                                       $this->elementOpen( $name, $attrs );
+                                       if ( $empty ) {
+                                               $this->elementClose();
+                                       }
+                                       break;
+
+                               case XMLReader::END_ELEMENT:
+                                       $this->elementClose();
+                                       break;
+
+                               case XMLReader::WHITESPACE:
+                               case XMLReader::SIGNIFICANT_WHITESPACE:
+                               case XMLReader::CDATA:
+                               case XMLReader::TEXT:
+                                       $this->elementData( $reader->value );
+                                       break;
+
+                               case XMLReader::ENTITY_REF:
+                                       // Unexpanded entity (maybe external?),
+                                       // don't send to the filter (xml_parse didn't)
+                                       break;
+
+                               case XMLReader::COMMENT:
+                                       // Don't send to the filter (xml_parse didn't)
+                                       break;
+
+                               case XMLReader::PI:
+                                       // Processing instructions can happen after the header too
+                                       $this->processingInstructionHandler(
+                                               $reader->name,
+                                               $reader->value
+                                       );
+                                       break;
+                               default:
+                                       // One of DOC, DOC_TYPE, ENTITY, END_ENTITY,
+                                       // NOTATION, or XML_DECLARATION
+                                       // xml_parse didn't send these to the filter, so we won't.
+                       }
+
+               } while ( $this->readNext( $reader ) );
+
+               if ( $this->stackDepth !== 0 ) {
+                       $this->wellFormed = false;
+               } elseif ( $this->wellFormed === null ) {
+                       $this->wellFormed = true;
+               }
+
+       }
+
+       /**
+        * Get all of the attributes for an XMLReader's current node
+        * @param $r XMLReader
+        * @return array of attributes
+        */
+       private function getAttributesArray( XMLReader $r ) {
+               $attrs = [];
+               while ( $r->moveToNextAttribute() ) {
+                       if ( $r->namespaceURI === 'http://www.w3.org/2000/xmlns/' ) {
+                               // XMLReader treats xmlns attributes as normal
+                               // attributes, while xml_parse doesn't
+                               continue;
+                       }
+                       $name = $this->expandNS( $r->name, $r->namespaceURI );
+                       $attrs[$name] = $r->value;
+               }
+               return $attrs;
+       }
+
+       /**
+        * @param $name element or attribute name, maybe with a full or short prefix
+        * @param $namespaceURI the namespaceURI
+        * @return string the name prefixed with namespaceURI
+        */
+       private function expandNS( $name, $namespaceURI ) {
+               if ( $namespaceURI ) {
+                       $parts = explode( ':', $name );
+                       $localname = array_pop( $parts );
+                       return "$namespaceURI:$localname";
+               }
+               return $name;
+       }
+
+       /**
+        * @param $name
+        * @param $attribs
+        */
+       private function elementOpen( $name, $attribs ) {
+               $this->elementDataContext[] = [ $name, $attribs ];
+               $this->elementData[] = '';
+               $this->stackDepth++;
+       }
+
+       /**
+        */
+       private function elementClose() {
+               list( $name, $attribs ) = array_pop( $this->elementDataContext );
+               $data = array_pop( $this->elementData );
+               $this->stackDepth--;
+               $callbackReturn = false;
+
+               if ( is_callable( $this->filterCallback ) ) {
+                       $callbackReturn = call_user_func(
+                               $this->filterCallback,
+                               $name,
+                               $attribs,
+                               $data
+                       );
+               }
+               if ( $callbackReturn ) {
+                       // Filter hit!
+                       $this->filterMatch = true;
+                       $this->filterMatchType = $callbackReturn;
+               }
+       }
+
+       /**
+        * @param $data
+        */
+       private function elementData( $data ) {
+               // Collect any data here, and we'll run the callback in elementClose
+               $this->elementData[ $this->stackDepth - 1 ] .= trim( $data );
+       }
+
+       /**
+        * @param $target
+        * @param $data
+        */
+       private function processingInstructionHandler( $target, $data ) {
+               $callbackReturn = false;
+               if ( $this->parserOptions['processing_instruction_handler'] ) {
+                       $callbackReturn = call_user_func(
+                               $this->parserOptions['processing_instruction_handler'],
+                               $target,
+                               $data
+                       );
+               }
+               if ( $callbackReturn ) {
+                       // Filter hit!
+                       $this->filterMatch = true;
+                       $this->filterMatchType = $callbackReturn;
+               }
+       }
+}
diff --git a/includes/libs/mime/defines.php b/includes/libs/mime/defines.php
new file mode 100644 (file)
index 0000000..ae0b5f8
--- /dev/null
@@ -0,0 +1,46 @@
+<?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
+ */
+
+/**@{
+ * Media types.
+ * This defines constants for the value returned by File::getMediaType()
+ */
+// unknown format
+define( 'MEDIATYPE_UNKNOWN', 'UNKNOWN' );
+// some bitmap image or image source (like psd, etc). Can't scale up.
+define( 'MEDIATYPE_BITMAP', 'BITMAP' );
+// some vector drawing (SVG, WMF, PS, ...) or image source (oo-draw, etc). Can scale up.
+define( 'MEDIATYPE_DRAWING', 'DRAWING' );
+// simple audio file (ogg, mp3, wav, midi, whatever)
+define( 'MEDIATYPE_AUDIO', 'AUDIO' );
+// simple video file (ogg, mpg, etc;
+// no not include formats here that may contain executable sections or scripts!)
+define( 'MEDIATYPE_VIDEO', 'VIDEO' );
+// Scriptable Multimedia (flash, advanced video container formats, etc)
+define( 'MEDIATYPE_MULTIMEDIA', 'MULTIMEDIA' );
+// Office Documents, Spreadsheets (office formats possibly containing apples, scripts, etc)
+define( 'MEDIATYPE_OFFICE', 'OFFICE' );
+// Plain text (possibly containing program code or scripts)
+define( 'MEDIATYPE_TEXT', 'TEXT' );
+// binary executable
+define( 'MEDIATYPE_EXECUTABLE', 'EXECUTABLE' );
+// archive file (zip, tar, etc)
+define( 'MEDIATYPE_ARCHIVE', 'ARCHIVE' );
+/**@}*/
diff --git a/includes/libs/mime/mime.info b/includes/libs/mime/mime.info
new file mode 100644 (file)
index 0000000..b04d3c6
--- /dev/null
@@ -0,0 +1,119 @@
+# MIME type info file.
+# the first MIME type in each line is the "main" MIME type,
+# the others are aliases for this type
+# the media type is given in upper case and square brackets,
+# like [BITMAP], and must indicate a media type as defined by
+# the MEDIATYPE_xxx constants in Defines.php
+
+
+image/gif      [BITMAP]
+image/png image/x-png  [BITMAP]
+image/ief      [BITMAP]
+image/jpeg image/pjpeg [BITMAP]
+image/jp2      [BITMAP]
+image/xbm      [BITMAP]
+image/tiff     [BITMAP]
+image/x-icon image/x-ico image/vnd.microsoft.icon      [BITMAP]
+image/x-rgb    [BITMAP]
+image/x-portable-pixmap                [BITMAP]
+image/x-portable-graymap image/x-portable-greymap      [BITMAP]
+image/x-bmp image/x-ms-bmp image/bmp application/x-bmp application/bmp [BITMAP]
+image/x-photoshop image/psd image/x-psd image/photoshop image/vnd.adobe.photoshop      [BITMAP]
+image/vnd.djvu image/x.djvu image/x-djvu [BITMAP]
+image/webp     [BITMAP]
+
+image/svg+xml application/svg+xml application/svg image/svg    [DRAWING]
+application/postscript [DRAWING]
+application/x-latex    [DRAWING]
+application/x-tex      [DRAWING]
+application/x-dia-diagram [DRAWING]
+
+
+audio/mpeg audio/mp3 audio/mpeg3       [AUDIO]
+audio/mp4                              [AUDIO]
+audio/wav audio/x-wav audio/wave       [AUDIO]
+audio/midi audio/mid   [AUDIO]
+audio/basic            [AUDIO]
+audio/ogg              [AUDIO]
+audio/x-aiff           [AUDIO]
+audio/x-pn-realaudio   [AUDIO]
+audio/x-realaudio      [AUDIO]
+audio/webm             [AUDIO]
+audio/x-matroska       [AUDIO]
+audio/x-flac           [AUDIO]
+audio/flac             [AUDIO]
+
+video/mpeg application/mpeg    [VIDEO]
+video/ogg                      [VIDEO]
+video/x-sgi-video              [VIDEO]
+video/x-flv                    [VIDEO]
+video/webm                     [VIDEO]
+video/x-matroska               [VIDEO]
+video/mp4                      [VIDEO]
+
+application/ogg application/x-ogg audio/ogg audio/x-ogg video/ogg video/x-ogg          [MULTIMEDIA]
+
+application/x-shockwave-flash  [MULTIMEDIA]
+audio/x-pn-realaudio-plugin    [MULTIMEDIA]
+model/iges     [MULTIMEDIA]
+model/mesh     [MULTIMEDIA]
+model/vrml     [MULTIMEDIA]
+video/quicktime        [MULTIMEDIA]
+video/x-msvideo        [MULTIMEDIA]
+
+text/plain     [TEXT]
+text/html application/xhtml+xml        [TEXT]
+application/xml text/xml       [TEXT]
+text   [TEXT]
+application/json       [TEXT]
+text/csv       [TEXT]
+text/tab-separated-values      [TEXT]
+
+application/zip application/x-zip      [ARCHIVE]
+application/x-gzip     [ARCHIVE]
+application/x-bzip     [ARCHIVE]
+application/x-bzip2    [ARCHIVE]
+application/x-tar      [ARCHIVE]
+application/x-stuffit  [ARCHIVE]
+application/x-opc+zip  [ARCHIVE]
+application/x-7z-compressed [ARCHIVE]
+
+application/javascript text/javascript application/x-javascript application/x-ecmascript text/ecmascript       [EXECUTABLE]
+application/x-bash     [EXECUTABLE]
+application/x-sh       [EXECUTABLE]
+application/x-csh      [EXECUTABLE]
+application/x-tcsh     [EXECUTABLE]
+application/x-tcl      [EXECUTABLE]
+application/x-perl     [EXECUTABLE]
+application/x-python   [EXECUTABLE]
+
+application/pdf application/acrobat    [OFFICE]
+application/msword             [OFFICE]
+application/vnd.ms-excel       [OFFICE]
+application/vnd.ms-powerpoint  [OFFICE]
+application/x-director         [OFFICE]
+text/rtf                       [OFFICE]
+
+application/vnd.openxmlformats-officedocument.wordprocessingml.document        [OFFICE]
+application/vnd.openxmlformats-officedocument.wordprocessingml.template                [OFFICE]
+application/vnd.ms-word.document.macroEnabled.12                               [OFFICE]
+application/vnd.ms-word.template.macroEnabled.12                               [OFFICE]
+application/vnd.openxmlformats-officedocument.presentationml.template          [OFFICE]
+application/vnd.openxmlformats-officedocument.presentationml.slideshow         [OFFICE]
+application/vnd.openxmlformats-officedocument.presentationml.presentation      [OFFICE]
+application/vnd.ms-powerpoint.addin.macroEnabled.12                            [OFFICE]
+application/vnd.ms-powerpoint.presentation.macroEnabled.12                     [OFFICE]
+application/vnd.ms-powerpoint.presentation.macroEnabled.12                     [OFFICE]
+application/vnd.ms-powerpoint.slideshow.macroEnabled.12                                [OFFICE]
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet              [OFFICE]
+application/vnd.openxmlformats-officedocument.spreadsheetml.template           [OFFICE]
+application/vnd.ms-excel.sheet.macroEnabled.12                                 [OFFICE]
+application/vnd.ms-excel.template.macroEnabled.12                              [OFFICE]
+application/vnd.ms-excel.addin.macroEnabled.12                                 [OFFICE]
+application/vnd.ms-excel.sheet.binary.macroEnabled.12                          [OFFICE]
+application/acad application/x-acad application/autocad_dwg image/x-dwg application/dwg application/x-dwg application/x-autocad image/vnd.dwg drawing/dwg [DRAWING]
+chemical/x-mdl-molfile     [DRAWING]
+chemical/x-mdl-sdfile      [DRAWING]
+chemical/x-mdl-rxnfile     [DRAWING]
+chemical/x-mdl-rdfile      [DRAWING]
+chemical/x-mdl-rgfile      [DRAWING]
diff --git a/includes/libs/mime/mime.types b/includes/libs/mime/mime.types
new file mode 100644 (file)
index 0000000..b4f515a
--- /dev/null
@@ -0,0 +1,188 @@
+application/acad dwg
+application/andrew-inset ez
+application/mac-binhex40 hqx
+application/mac-compactpro cpt
+application/mathml+xml mathml
+application/msword doc dot
+application/octet-stream bin dms lha lzh exe class so dll
+application/oda oda
+application/ogg ogx ogg ogm ogv oga spx opus
+application/pdf pdf
+application/postscript ai eps ps
+application/rdf+xml rdf
+application/smil smi smil
+application/srgs gram
+application/srgs+xml grxml
+application/vnd.mif mif
+application/vnd.ms-excel xls xlt xla
+application/vnd.ms-powerpoint ppt pot pps ppa
+application/vnd.wap.wbxml wbxml
+application/vnd.wap.wmlc wmlc
+application/vnd.wap.wmlscriptc wmlsc
+application/voicexml+xml vxml
+application/x-7z-compressed 7z
+application/x-bcpio bcpio
+application/x-bzip bz
+application/x-bzip2 bz2
+application/x-cdlink vcd
+application/x-chess-pgn pgn
+application/x-cpio cpio
+application/x-csh csh
+application/x-dia-diagram dia
+application/x-director dcr dir dxr
+application/x-dvi dvi
+application/x-futuresplash spl
+application/x-gtar gtar tar
+application/x-gzip gz
+application/x-hdf hdf
+application/x-jar jar
+application/javascript js
+application/json json
+application/x-koan skp skd skt skm
+application/x-latex latex
+application/x-netcdf nc cdf
+application/x-sh sh
+application/x-shar shar
+application/x-shockwave-flash swf
+application/x-stuffit sit
+application/x-sv4cpio sv4cpio
+application/x-sv4crc sv4crc
+application/x-tar tar
+application/x-tcl tcl
+application/x-tex tex
+application/x-texinfo texinfo texi
+application/x-troff t tr roff
+application/x-troff-man man
+application/x-troff-me me
+application/x-troff-ms ms
+application/x-ustar ustar
+application/x-wais-source src
+application/x-xpinstall xpi
+application/xhtml+xml xhtml xht
+application/xslt+xml xslt
+application/xml xml xsl xsd kml
+application/xml-dtd dtd
+application/zip zip jar xpi sxc stc sxd std sxi sti sxm stm sxw stw
+application/x-rar rar
+application/font-woff woff
+application/font-woff2 woff2
+application/vnd.ms-fontobject eot
+application/x-font-ttf ttf
+audio/basic au snd
+audio/midi mid midi kar
+audio/mpeg mpga mp2 mp3
+audio/ogg oga ogg spx opus
+video/webm webm
+audio/webm webm
+audio/x-aiff aif aiff aifc
+audio/x-matroska mka mkv
+audio/x-mpegurl m3u
+audio/x-ogg oga ogg spx opus
+audio/x-pn-realaudio ram rm
+audio/x-pn-realaudio-plugin rpm
+audio/x-realaudio ra
+audio/x-wav wav
+audio/wav wav
+audio/x-flac flac
+audio/flac flac
+chemical/x-pdb pdb
+chemical/x-xyz xyz
+image/bmp bmp
+image/cgm cgm
+image/gif gif
+image/ief ief
+image/jp2 j2k jp2 jpg2
+image/jpeg jpeg jpg jpe
+image/png png apng
+image/svg+xml svg
+image/tiff tiff tif
+image/vnd.djvu djvu djv
+image/vnd.microsoft.icon ico
+image/vnd.wap.wbmp wbmp
+image/webp webp
+image/x-cmu-raster ras
+image/x-icon ico
+image/x-ms-bmp bmp
+image/x-portable-anymap pnm
+image/x-portable-bitmap pbm
+image/x-portable-graymap pgm
+image/x-portable-pixmap ppm
+image/x-rgb rgb
+image/x-photoshop psd
+image/x-xbitmap xbm
+image/x-xpixmap xpm
+image/x-xwindowdump xwd
+model/iges igs iges
+model/mesh msh mesh silo
+model/vrml wrl vrml
+text/calendar ics ifb
+text/css css
+text/csv csv
+text/html html htm
+text/plain txt
+text/richtext rtx
+text/rtf rtf
+text/sgml sgml sgm
+text/tab-separated-values tsv
+text/vnd.wap.wml wml
+text/vnd.wap.wmlscript wmls
+text/xml xml xsl xslt rss rdf
+text/x-component htc
+text/x-setext etx
+text/x-sawfish jl
+video/mpeg mpeg mpg mpe
+video/mp4 mp4 m4a m4p m4b m4r m4v
+audio/mp4 m4a
+video/ogg ogv ogm ogg
+video/quicktime qt mov
+video/vnd.mpegurl mxu
+video/x-flv flv
+video/x-matroska mkv mka
+video/x-msvideo avi
+video/x-ogg ogv ogm ogg
+video/x-sgi-movie movie
+x-conference/x-cooltalk ice
+application/vnd.oasis.opendocument.chart odc
+application/vnd.oasis.opendocument.chart-template otc
+application/vnd.oasis.opendocument.database odb
+application/vnd.oasis.opendocument.formula odf
+application/vnd.oasis.opendocument.formula-template otf
+application/vnd.oasis.opendocument.graphics odg
+application/vnd.oasis.opendocument.graphics-template otg
+application/vnd.oasis.opendocument.image odi
+application/vnd.oasis.opendocument.image-template oti
+application/vnd.oasis.opendocument.presentation odp
+application/vnd.oasis.opendocument.presentation-template otp
+application/vnd.oasis.opendocument.spreadsheet ods
+application/vnd.oasis.opendocument.spreadsheet-template ots
+application/vnd.oasis.opendocument.text odt
+application/vnd.oasis.opendocument.text-master odm
+application/vnd.oasis.opendocument.text-template ott
+application/vnd.oasis.opendocument.text-web oth
+application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
+application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
+application/vnd.ms-word.document.macroEnabled.12 docm
+application/vnd.ms-word.template.macroEnabled.12 dotm
+application/vnd.openxmlformats-officedocument.presentationml.template potx
+application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
+application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
+application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam
+application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm
+application/vnd.ms-powerpoint.presentation.macroEnabled.12 potm
+application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
+application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
+application/vnd.ms-excel.sheet.macroEnabled.12 xlsm
+application/vnd.ms-excel.template.macroEnabled.12 xltm
+application/vnd.ms-excel.addin.macroEnabled.12 xlam
+application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb
+model/vnd.dwfx+xps dwfx
+application/vnd.ms-xpsdocument xps
+application/x-opc+zip docx dotx docm dotm potx ppsx pptx ppam pptm potm ppsm xlsx xltx xlsm xltm xlam xlsb dwfx xps
+chemical/x-mdl-molfile mol
+chemical/x-mdl-sdfile sdf
+chemical/x-mdl-rxnfile rxn
+chemical/x-mdl-rdfile rd
+chemical/x-mdl-rgfile rg
+application/x-amf amf
+application/sla stl
index d7db732..e7c4edb 100644 (file)
@@ -939,12 +939,13 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $cValue = $this->get( $key, $curTTL, $checkKeys, $asOf ); // current value
                $value = $cValue; // return value
 
-               // Determine if a regeneration is desired
+               $preCallbackTime = microtime( true );
+               // Determine if a cached value regeneration is needed or desired
                if ( $value !== false
                        && $curTTL > 0
                        && $this->isValid( $value, $versioned, $asOf, $minTime )
                        && !$this->worthRefreshExpiring( $curTTL, $lowTTL )
-                       && !$this->worthRefreshPopular( $asOf, $ageNew, $popWindow )
+                       && !$this->worthRefreshPopular( $asOf, $ageNew, $popWindow, $preCallbackTime )
                ) {
                        return $value;
                }
@@ -1013,8 +1014,10 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                }
 
                if ( $value !== false && $ttl >= 0 ) {
-                       // Update the cache; this will fail if the key is tombstoned
                        $setOpts['lockTSE'] = $lockTSE;
+                       // Use best known "since" timestamp if not provided
+                       $setOpts += [ 'since' => $preCallbackTime ];
+                       // Update the cache; this will fail if the key is tombstoned
                        $this->set( $key, $value, $ttl, $setOpts );
                }
 
@@ -1046,7 +1049,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * Example usage:
         * @code
         *     $rows = $cache->getMultiWithSetCallback(
-        *         // Map of cache keys to entitiy IDs
+        *         // Map of cache keys to entity IDs
         *         $cache->makeMultiKeys(
         *             $this->fileVersionIds(),
         *             function ( $id, WANObjectCache $cache ) {
@@ -1336,10 +1339,11 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * @param float $asOf UNIX timestamp of the value
         * @param integer $ageNew Age of key when this might recommend refreshing (seconds)
         * @param integer $timeTillRefresh Age of key when it should be refreshed if popular (seconds)
+        * @param float $now The current UNIX timestamp
         * @return bool
         */
-       protected function worthRefreshPopular( $asOf, $ageNew, $timeTillRefresh ) {
-               $age = microtime( true ) - $asOf;
+       protected function worthRefreshPopular( $asOf, $ageNew, $timeTillRefresh, $now ) {
+               $age = $now - $asOf;
                $timeOld = $age - $ageNew;
                if ( $timeOld <= 0 ) {
                        return false;
index 12f6df5..bf5e299 100644 (file)
@@ -80,11 +80,15 @@ class TransactionProfiler implements LoggerAwareInterface {
        }
 
        /**
-        * @param bool $value
+        * @param bool $value New value
+        * @return bool Old value
         * @since 1.28
         */
        public function setSilenced( $value ) {
+               $old = $this->silenced;
                $this->silenced = $value;
+
+               return $old;
        }
 
        /**
index 9f1f228..a5a170b 100644 (file)
@@ -50,8 +50,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        /** @var string SQL query */
        protected $mLastQuery = '';
-       /** @var bool */
-       protected $mDoneWrites = false;
+       /** @var float|bool UNIX timestamp of last write query */
+       protected $mLastWriteTime = false;
        /** @var string|bool */
        protected $mPHPError = false;
        /** @var string */
@@ -511,11 +511,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        public function doneWrites() {
-               return (bool)$this->mDoneWrites;
+               return (bool)$this->mLastWriteTime;
        }
 
        public function lastDoneWrites() {
-               return $this->mDoneWrites ?: false;
+               return $this->mLastWriteTime ?: false;
        }
 
        public function writesPending() {
@@ -820,7 +820,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                throw new DBReadOnlyError( $this, "Database is read-only: $reason" );
                        }
                        # Set a flag indicating that writes have been done
-                       $this->mDoneWrites = microtime( true );
+                       $this->mLastWriteTime = microtime( true );
                }
 
                // Add trace comment to the begin of the sql string, right after the operator.
@@ -2682,7 +2682,6 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $this->mTrxTimestamp = microtime( true );
                $this->mTrxFname = $fname;
                $this->mTrxDoneWrites = false;
-               $this->mTrxAutomatic = ( $mode === self::TRANSACTION_INTERNAL );
                $this->mTrxAutomaticAtomic = false;
                $this->mTrxAtomicLevels = [];
                $this->mTrxShortId = sprintf( '%06x', mt_rand( 0, 0xffffff ) );
@@ -2696,6 +2695,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                // as lag itself just to be safe
                $status = $this->getApproximateLagStatus();
                $this->mTrxReplicaLag = $status['lag'] + ( microtime( true ) - $status['since'] );
+               // T147697: make explicitTrxActive() return true until begin() finishes. This way, no
+               // caller will think its OK to muck around with the transaction just because startAtomic()
+               // has not yet completed (e.g. setting mTrxAtomicLevels).
+               $this->mTrxAutomatic = ( $mode === self::TRANSACTION_INTERNAL );
        }
 
        /**
@@ -2748,7 +2751,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $writeTime = $this->pendingWriteQueryDuration( self::ESTIMATE_DB_APPLY );
                $this->doCommit( $fname );
                if ( $this->mTrxDoneWrites ) {
-                       $this->mDoneWrites = microtime( true );
+                       $this->mLastWriteTime = microtime( true );
                        $this->trxProfiler->transactionWritingOut(
                                $this->mServer, $this->mDBname, $this->mTrxShortId, $writeTime );
                }
index f504ec4..9662a5b 100644 (file)
@@ -72,8 +72,6 @@ abstract class DatabaseMysqlBase extends Database {
         * @param array $params
         */
        function __construct( array $params ) {
-               parent::__construct( $params );
-
                $this->lagDetectionMethod = isset( $params['lagDetectionMethod'] )
                        ? $params['lagDetectionMethod']
                        : 'Seconds_Behind_Master';
@@ -89,6 +87,8 @@ abstract class DatabaseMysqlBase extends Database {
                }
                $this->sqlMode = isset( $params['sqlMode'] ) ? $params['sqlMode'] : '';
                $this->utf8Mode = !empty( $params['utf8Mode'] );
+
+               parent::__construct( $params );
        }
 
        /**
@@ -608,6 +608,16 @@ abstract class DatabaseMysqlBase extends Database {
         */
        abstract protected function mysqlRealEscapeString( $s );
 
+       public function addQuotes( $s ) {
+               if ( is_bool( $s ) ) {
+                       // Parent would transform to int, which does not play nice with MySQL type juggling.
+                       // When searching for an int in a string column, the strings are cast to int, which
+                       // means false would match any string not starting with a number.
+                       $s = (string)(int)$s;
+               }
+               return parent::addQuotes( $s );
+       }
+
        /**
         * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
         *
index 33f3561..32df19d 100644 (file)
@@ -667,6 +667,10 @@ class LoadBalancer implements ILoadBalancer {
                } elseif ( isset( $this->mConns['local'][$i][0] ) ) {
                        $conn = $this->mConns['local'][$i][0];
                } else {
+                       if ( !isset( $this->mServers[$i] ) || !is_array( $this->mServers[$i] ) ) {
+                               throw new InvalidArgumentException( "No server with index '$i'." );
+                       }
+                       // Open a new connection
                        $server = $this->mServers[$i];
                        $server['serverIndex'] = $i;
                        $conn = $this->reallyOpenConnection( $server, false );
@@ -747,6 +751,9 @@ class LoadBalancer implements ILoadBalancer {
                                        ": reusing free connection from $oldDomain for $domain" );
                        }
                } else {
+                       if ( !isset( $this->mServers[$i] ) || !is_array( $this->mServers[$i] ) ) {
+                               throw new InvalidArgumentException( "No server with index '$i'." );
+                       }
                        // Open a new connection
                        $server = $this->mServers[$i];
                        $server['serverIndex'] = $i;
@@ -799,17 +806,11 @@ class LoadBalancer implements ILoadBalancer {
         * @throws DBAccessError
         * @throws InvalidArgumentException
         */
-       protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
+       protected function reallyOpenConnection( array $server, $dbNameOverride = false ) {
                if ( $this->disabled ) {
                        throw new DBAccessError();
                }
 
-               if ( !is_array( $server ) ) {
-                       throw new InvalidArgumentException(
-                               'You must update your load-balancing configuration. ' .
-                               'See DefaultSettings.php entry for $wgDBservers.' );
-               }
-
                if ( $dbNameOverride !== false ) {
                        $server['dbname'] = $dbNameOverride;
                }
@@ -1323,7 +1324,7 @@ class LoadBalancer implements ILoadBalancer {
                        $cache->makeGlobalKey( __CLASS__, 'server-read-only', $masterServer ),
                        self::TTL_CACHE_READONLY,
                        function () use ( $domain, $conn ) {
-                               $this->trxProfiler->setSilenced( true );
+                               $old = $this->trxProfiler->setSilenced( true );
                                try {
                                        $dbw = $conn ?: $this->getConnection( self::DB_MASTER, [], $domain );
                                        $readOnly = (int)$dbw->serverIsReadOnly();
@@ -1333,7 +1334,7 @@ class LoadBalancer implements ILoadBalancer {
                                } catch ( DBError $e ) {
                                        $readOnly = 0;
                                }
-                               $this->trxProfiler->setSilenced( false );
+                               $this->trxProfiler->setSilenced( $old );
                                return $readOnly;
                        },
                        [ 'pcTTL' => $cache::TTL_PROC_LONG, 'busyValue' => 0 ]
index 9de4850..0dec95f 100644 (file)
@@ -75,7 +75,7 @@ class LoadBalancerSingle extends LoadBalancer {
         *
         * @return IDatabase
         */
-       protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
+       protected function reallyOpenConnection( array $server, $dbNameOverride = false ) {
                return $this->db;
        }
 }
diff --git a/includes/mime.info b/includes/mime.info
deleted file mode 100644 (file)
index b04d3c6..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-# MIME type info file.
-# the first MIME type in each line is the "main" MIME type,
-# the others are aliases for this type
-# the media type is given in upper case and square brackets,
-# like [BITMAP], and must indicate a media type as defined by
-# the MEDIATYPE_xxx constants in Defines.php
-
-
-image/gif      [BITMAP]
-image/png image/x-png  [BITMAP]
-image/ief      [BITMAP]
-image/jpeg image/pjpeg [BITMAP]
-image/jp2      [BITMAP]
-image/xbm      [BITMAP]
-image/tiff     [BITMAP]
-image/x-icon image/x-ico image/vnd.microsoft.icon      [BITMAP]
-image/x-rgb    [BITMAP]
-image/x-portable-pixmap                [BITMAP]
-image/x-portable-graymap image/x-portable-greymap      [BITMAP]
-image/x-bmp image/x-ms-bmp image/bmp application/x-bmp application/bmp [BITMAP]
-image/x-photoshop image/psd image/x-psd image/photoshop image/vnd.adobe.photoshop      [BITMAP]
-image/vnd.djvu image/x.djvu image/x-djvu [BITMAP]
-image/webp     [BITMAP]
-
-image/svg+xml application/svg+xml application/svg image/svg    [DRAWING]
-application/postscript [DRAWING]
-application/x-latex    [DRAWING]
-application/x-tex      [DRAWING]
-application/x-dia-diagram [DRAWING]
-
-
-audio/mpeg audio/mp3 audio/mpeg3       [AUDIO]
-audio/mp4                              [AUDIO]
-audio/wav audio/x-wav audio/wave       [AUDIO]
-audio/midi audio/mid   [AUDIO]
-audio/basic            [AUDIO]
-audio/ogg              [AUDIO]
-audio/x-aiff           [AUDIO]
-audio/x-pn-realaudio   [AUDIO]
-audio/x-realaudio      [AUDIO]
-audio/webm             [AUDIO]
-audio/x-matroska       [AUDIO]
-audio/x-flac           [AUDIO]
-audio/flac             [AUDIO]
-
-video/mpeg application/mpeg    [VIDEO]
-video/ogg                      [VIDEO]
-video/x-sgi-video              [VIDEO]
-video/x-flv                    [VIDEO]
-video/webm                     [VIDEO]
-video/x-matroska               [VIDEO]
-video/mp4                      [VIDEO]
-
-application/ogg application/x-ogg audio/ogg audio/x-ogg video/ogg video/x-ogg          [MULTIMEDIA]
-
-application/x-shockwave-flash  [MULTIMEDIA]
-audio/x-pn-realaudio-plugin    [MULTIMEDIA]
-model/iges     [MULTIMEDIA]
-model/mesh     [MULTIMEDIA]
-model/vrml     [MULTIMEDIA]
-video/quicktime        [MULTIMEDIA]
-video/x-msvideo        [MULTIMEDIA]
-
-text/plain     [TEXT]
-text/html application/xhtml+xml        [TEXT]
-application/xml text/xml       [TEXT]
-text   [TEXT]
-application/json       [TEXT]
-text/csv       [TEXT]
-text/tab-separated-values      [TEXT]
-
-application/zip application/x-zip      [ARCHIVE]
-application/x-gzip     [ARCHIVE]
-application/x-bzip     [ARCHIVE]
-application/x-bzip2    [ARCHIVE]
-application/x-tar      [ARCHIVE]
-application/x-stuffit  [ARCHIVE]
-application/x-opc+zip  [ARCHIVE]
-application/x-7z-compressed [ARCHIVE]
-
-application/javascript text/javascript application/x-javascript application/x-ecmascript text/ecmascript       [EXECUTABLE]
-application/x-bash     [EXECUTABLE]
-application/x-sh       [EXECUTABLE]
-application/x-csh      [EXECUTABLE]
-application/x-tcsh     [EXECUTABLE]
-application/x-tcl      [EXECUTABLE]
-application/x-perl     [EXECUTABLE]
-application/x-python   [EXECUTABLE]
-
-application/pdf application/acrobat    [OFFICE]
-application/msword             [OFFICE]
-application/vnd.ms-excel       [OFFICE]
-application/vnd.ms-powerpoint  [OFFICE]
-application/x-director         [OFFICE]
-text/rtf                       [OFFICE]
-
-application/vnd.openxmlformats-officedocument.wordprocessingml.document        [OFFICE]
-application/vnd.openxmlformats-officedocument.wordprocessingml.template                [OFFICE]
-application/vnd.ms-word.document.macroEnabled.12                               [OFFICE]
-application/vnd.ms-word.template.macroEnabled.12                               [OFFICE]
-application/vnd.openxmlformats-officedocument.presentationml.template          [OFFICE]
-application/vnd.openxmlformats-officedocument.presentationml.slideshow         [OFFICE]
-application/vnd.openxmlformats-officedocument.presentationml.presentation      [OFFICE]
-application/vnd.ms-powerpoint.addin.macroEnabled.12                            [OFFICE]
-application/vnd.ms-powerpoint.presentation.macroEnabled.12                     [OFFICE]
-application/vnd.ms-powerpoint.presentation.macroEnabled.12                     [OFFICE]
-application/vnd.ms-powerpoint.slideshow.macroEnabled.12                                [OFFICE]
-application/vnd.openxmlformats-officedocument.spreadsheetml.sheet              [OFFICE]
-application/vnd.openxmlformats-officedocument.spreadsheetml.template           [OFFICE]
-application/vnd.ms-excel.sheet.macroEnabled.12                                 [OFFICE]
-application/vnd.ms-excel.template.macroEnabled.12                              [OFFICE]
-application/vnd.ms-excel.addin.macroEnabled.12                                 [OFFICE]
-application/vnd.ms-excel.sheet.binary.macroEnabled.12                          [OFFICE]
-application/acad application/x-acad application/autocad_dwg image/x-dwg application/dwg application/x-dwg application/x-autocad image/vnd.dwg drawing/dwg [DRAWING]
-chemical/x-mdl-molfile     [DRAWING]
-chemical/x-mdl-sdfile      [DRAWING]
-chemical/x-mdl-rxnfile     [DRAWING]
-chemical/x-mdl-rdfile      [DRAWING]
-chemical/x-mdl-rgfile      [DRAWING]
diff --git a/includes/mime.types b/includes/mime.types
deleted file mode 100644 (file)
index b4f515a..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-application/acad dwg
-application/andrew-inset ez
-application/mac-binhex40 hqx
-application/mac-compactpro cpt
-application/mathml+xml mathml
-application/msword doc dot
-application/octet-stream bin dms lha lzh exe class so dll
-application/oda oda
-application/ogg ogx ogg ogm ogv oga spx opus
-application/pdf pdf
-application/postscript ai eps ps
-application/rdf+xml rdf
-application/smil smi smil
-application/srgs gram
-application/srgs+xml grxml
-application/vnd.mif mif
-application/vnd.ms-excel xls xlt xla
-application/vnd.ms-powerpoint ppt pot pps ppa
-application/vnd.wap.wbxml wbxml
-application/vnd.wap.wmlc wmlc
-application/vnd.wap.wmlscriptc wmlsc
-application/voicexml+xml vxml
-application/x-7z-compressed 7z
-application/x-bcpio bcpio
-application/x-bzip bz
-application/x-bzip2 bz2
-application/x-cdlink vcd
-application/x-chess-pgn pgn
-application/x-cpio cpio
-application/x-csh csh
-application/x-dia-diagram dia
-application/x-director dcr dir dxr
-application/x-dvi dvi
-application/x-futuresplash spl
-application/x-gtar gtar tar
-application/x-gzip gz
-application/x-hdf hdf
-application/x-jar jar
-application/javascript js
-application/json json
-application/x-koan skp skd skt skm
-application/x-latex latex
-application/x-netcdf nc cdf
-application/x-sh sh
-application/x-shar shar
-application/x-shockwave-flash swf
-application/x-stuffit sit
-application/x-sv4cpio sv4cpio
-application/x-sv4crc sv4crc
-application/x-tar tar
-application/x-tcl tcl
-application/x-tex tex
-application/x-texinfo texinfo texi
-application/x-troff t tr roff
-application/x-troff-man man
-application/x-troff-me me
-application/x-troff-ms ms
-application/x-ustar ustar
-application/x-wais-source src
-application/x-xpinstall xpi
-application/xhtml+xml xhtml xht
-application/xslt+xml xslt
-application/xml xml xsl xsd kml
-application/xml-dtd dtd
-application/zip zip jar xpi sxc stc sxd std sxi sti sxm stm sxw stw
-application/x-rar rar
-application/font-woff woff
-application/font-woff2 woff2
-application/vnd.ms-fontobject eot
-application/x-font-ttf ttf
-audio/basic au snd
-audio/midi mid midi kar
-audio/mpeg mpga mp2 mp3
-audio/ogg oga ogg spx opus
-video/webm webm
-audio/webm webm
-audio/x-aiff aif aiff aifc
-audio/x-matroska mka mkv
-audio/x-mpegurl m3u
-audio/x-ogg oga ogg spx opus
-audio/x-pn-realaudio ram rm
-audio/x-pn-realaudio-plugin rpm
-audio/x-realaudio ra
-audio/x-wav wav
-audio/wav wav
-audio/x-flac flac
-audio/flac flac
-chemical/x-pdb pdb
-chemical/x-xyz xyz
-image/bmp bmp
-image/cgm cgm
-image/gif gif
-image/ief ief
-image/jp2 j2k jp2 jpg2
-image/jpeg jpeg jpg jpe
-image/png png apng
-image/svg+xml svg
-image/tiff tiff tif
-image/vnd.djvu djvu djv
-image/vnd.microsoft.icon ico
-image/vnd.wap.wbmp wbmp
-image/webp webp
-image/x-cmu-raster ras
-image/x-icon ico
-image/x-ms-bmp bmp
-image/x-portable-anymap pnm
-image/x-portable-bitmap pbm
-image/x-portable-graymap pgm
-image/x-portable-pixmap ppm
-image/x-rgb rgb
-image/x-photoshop psd
-image/x-xbitmap xbm
-image/x-xpixmap xpm
-image/x-xwindowdump xwd
-model/iges igs iges
-model/mesh msh mesh silo
-model/vrml wrl vrml
-text/calendar ics ifb
-text/css css
-text/csv csv
-text/html html htm
-text/plain txt
-text/richtext rtx
-text/rtf rtf
-text/sgml sgml sgm
-text/tab-separated-values tsv
-text/vnd.wap.wml wml
-text/vnd.wap.wmlscript wmls
-text/xml xml xsl xslt rss rdf
-text/x-component htc
-text/x-setext etx
-text/x-sawfish jl
-video/mpeg mpeg mpg mpe
-video/mp4 mp4 m4a m4p m4b m4r m4v
-audio/mp4 m4a
-video/ogg ogv ogm ogg
-video/quicktime qt mov
-video/vnd.mpegurl mxu
-video/x-flv flv
-video/x-matroska mkv mka
-video/x-msvideo avi
-video/x-ogg ogv ogm ogg
-video/x-sgi-movie movie
-x-conference/x-cooltalk ice
-application/vnd.oasis.opendocument.chart odc
-application/vnd.oasis.opendocument.chart-template otc
-application/vnd.oasis.opendocument.database odb
-application/vnd.oasis.opendocument.formula odf
-application/vnd.oasis.opendocument.formula-template otf
-application/vnd.oasis.opendocument.graphics odg
-application/vnd.oasis.opendocument.graphics-template otg
-application/vnd.oasis.opendocument.image odi
-application/vnd.oasis.opendocument.image-template oti
-application/vnd.oasis.opendocument.presentation odp
-application/vnd.oasis.opendocument.presentation-template otp
-application/vnd.oasis.opendocument.spreadsheet ods
-application/vnd.oasis.opendocument.spreadsheet-template ots
-application/vnd.oasis.opendocument.text odt
-application/vnd.oasis.opendocument.text-master odm
-application/vnd.oasis.opendocument.text-template ott
-application/vnd.oasis.opendocument.text-web oth
-application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
-application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
-application/vnd.ms-word.document.macroEnabled.12 docm
-application/vnd.ms-word.template.macroEnabled.12 dotm
-application/vnd.openxmlformats-officedocument.presentationml.template potx
-application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
-application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
-application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam
-application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm
-application/vnd.ms-powerpoint.presentation.macroEnabled.12 potm
-application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm
-application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
-application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
-application/vnd.ms-excel.sheet.macroEnabled.12 xlsm
-application/vnd.ms-excel.template.macroEnabled.12 xltm
-application/vnd.ms-excel.addin.macroEnabled.12 xlam
-application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb
-model/vnd.dwfx+xps dwfx
-application/vnd.ms-xpsdocument xps
-application/x-opc+zip docx dotx docm dotm potx ppsx pptx ppam pptm potm ppsm xlsx xltx xlsm xltm xlam xlsb dwfx xps
-chemical/x-mdl-molfile mol
-chemical/x-mdl-sdfile sdf
-chemical/x-mdl-rxnfile rxn
-chemical/x-mdl-rdfile rd
-chemical/x-mdl-rgfile rg
-application/x-amf amf
-application/sla stl
index 8160a75..53a474b 100644 (file)
@@ -291,24 +291,6 @@ class ObjectCache {
                return $cache;
        }
 
-       /**
-        * @param array $params [optional] Array key 'fallback' for $fallback.
-        * @param int|string $fallback Fallback cache, e.g. (CACHE_NONE, "hash") (since 1.24)
-        * @return BagOStuff
-        * @deprecated since 1.27
-        */
-       public static function newAccelerator( $params = [], $fallback = null ) {
-               if ( $fallback === null ) {
-                       if ( is_array( $params ) && isset( $params['fallback'] ) ) {
-                               $fallback = $params['fallback'];
-                       } elseif ( !is_array( $params ) ) {
-                               $fallback = $params;
-                       }
-               }
-
-               return self::getLocalServerInstance( $fallback );
-       }
-
        /**
         * Create a new cache object of the specified type.
         *
index 9428609..548e533 100644 (file)
@@ -210,7 +210,7 @@ class Article implements Page {
         * @return string Return the text of this revision
         */
        public function getContent() {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
+               wfDeprecated( __METHOD__, '1.21' );
                $content = $this->getContentObject();
                return ContentHandler::getContentText( $content );
        }
index c791587..3dc41fb 100644 (file)
@@ -121,6 +121,11 @@ class WikiPage implements Page, IDBAccessObject {
                        throw new MWException( "Invalid or virtual namespace $ns given." );
                }
 
+               $page = null;
+               if ( !Hooks::run( 'WikiPageFactory', [ $title, &$page ] ) ) {
+                       return $page;
+               }
+
                switch ( $ns ) {
                        case NS_FILE:
                                $page = new WikiFilePage( $title );
index a32acc2..f0898ba 100644 (file)
@@ -3784,9 +3784,28 @@ class Parser {
         * @return string
         */
        public function extensionSubstitution( $params, $frame ) {
+               static $errorStr = '<span class="error">';
+               static $errorLen = 20;
+
                $name = $frame->expand( $params['name'] );
+               if ( substr( $name, 0, $errorLen ) === $errorStr ) {
+                       // Probably expansion depth or node count exceeded. Just punt the
+                       // error up.
+                       return $name;
+               }
+
                $attrText = !isset( $params['attr'] ) ? null : $frame->expand( $params['attr'] );
+               if ( substr( $attrText, 0, $errorLen ) === $errorStr ) {
+                       // See above
+                       return $attrText;
+               }
+
                $content = !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] );
+               if ( substr( $content, 0, $errorLen ) === $errorStr ) {
+                       // See above
+                       return $content;
+               }
+
                $marker = self::MARKER_PREFIX . "-$name-"
                        . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
 
@@ -3844,6 +3863,10 @@ class Parser {
                                $output = "<$name$attrText/>";
                        } else {
                                $close = is_null( $params['close'] ) ? '' : $frame->expand( $params['close'] );
+                               if ( substr( $close, 0, $errorLen ) === $errorStr ) {
+                                       // See above
+                                       return $close;
+                               }
                                $output = "<$name$attrText>$content$close";
                        }
                }
index 34a0a99..143f5cc 100644 (file)
@@ -1009,6 +1009,7 @@ MESSAGE;
                foreach ( $modules as $name => $module ) {
                        try {
                                $content = $module->getModuleContent( $context );
+                               $implementKey = $name . '@' . $module->getVersionHash( $context );
                                $strContent = '';
 
                                // Append output
@@ -1020,7 +1021,7 @@ MESSAGE;
                                                        $strContent = $scripts;
                                                } elseif ( is_array( $scripts ) ) {
                                                        // ...except when $scripts is an array of URLs
-                                                       $strContent = self::makeLoaderImplementScript( $name, $scripts, [], [], [] );
+                                                       $strContent = self::makeLoaderImplementScript( $implementKey, $scripts, [], [], [] );
                                                }
                                                break;
                                        case 'styles':
@@ -1046,7 +1047,7 @@ MESSAGE;
                                                        }
                                                }
                                                $strContent = self::makeLoaderImplementScript(
-                                                       $name,
+                                                       $implementKey,
                                                        $scripts,
                                                        isset( $content['styles'] ) ? $content['styles'] : [],
                                                        isset( $content['messagesBlob'] ) ? new XmlJsCode( $content['messagesBlob'] ) : [],
@@ -1125,7 +1126,7 @@ MESSAGE;
        /**
         * Return JS code that calls mw.loader.implement with given module properties.
         *
-        * @param string $name Module name
+        * @param string $name Module name or implement key (format "`[name]@[version]`")
         * @param XmlJsCode|array|string $scripts Code as XmlJsCode (to be wrapped in a closure),
         *  list of URLs to JavaScript files, or a string of JavaScript for `$.globalEval`.
         * @param mixed $styles Array of CSS strings keyed by media type, or an array of lists of URLs
index 263cb11..ea811b6 100644 (file)
@@ -642,7 +642,11 @@ final class SessionBackend {
                        ] );
                        $this->user->setToken();
                        if ( !wfReadOnly() ) {
-                               $this->user->saveSettings();
+                               // Promise that the token set here will be valid; save it at end of request
+                               $user = $this->user;
+                               \DeferredUpdates::addCallableUpdate( function () use ( $user ) {
+                                       $user->saveSettings();
+                               } );
                        }
                        $this->metaDirty = true;
                }
index 87865df..6ea8b89 100644 (file)
@@ -29,10 +29,11 @@ abstract class BaseTemplate extends QuickTemplate {
         * Get a Message object with its context set
         *
         * @param string $name Message name
+        * @param ... $params Message params
         * @return Message
         */
-       public function getMsg( $name ) {
-               return $this->getSkin()->msg( $name );
+       public function getMsg( $name /* ... */ ) {
+               return call_user_func_array( [ $this->getSkin(), 'msg' ], func_get_args() );
        }
 
        function msg( $str ) {
index bf83e7b..275e121 100644 (file)
@@ -1070,7 +1070,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                }
                if ( !$this->isSignup() && $this->showExtraInformation() ) {
                        $passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
-                       if ( $passwordReset->isAllowed( $this->getUser() ) ) {
+                       if ( $passwordReset->isAllowed( $this->getUser() )->isGood() ) {
                                $fieldDefinitions['passwordReset'] = [
                                        'type' => 'info',
                                        'raw' => true,
index 7b4e9db..f494b9d 100644 (file)
@@ -69,9 +69,9 @@ class EmailConfirmation extends UnlistedSpecialPage {
                                $this->getOutput()->addWikiMsg( 'confirmemail_noemail' );
                        }
                } else {
-                       $trxProfiler->setSilenced( true );
+                       $old = $trxProfiler->setSilenced( true );
                        $this->attemptConfirm( $code );
-                       $trxProfiler->setSilenced( false );
+                       $trxProfiler->setSilenced( $old );
                }
        }
 
index d2e3e7f..c54abad 100644 (file)
@@ -45,9 +45,9 @@ class EmailInvalidation extends UnlistedSpecialPage {
                $this->checkReadOnly();
                $this->checkPermissions();
 
-               $trxProfiler->setSilenced( true );
+               $old = $trxProfiler->setSilenced( true );
                $this->attemptInvalidate( $code );
-               $trxProfiler->setSilenced( false );
+               $trxProfiler->setSilenced( $old );
        }
 
        /**
index fcd4ab5..dcaff4d 100644 (file)
@@ -106,7 +106,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        ];
 
        public function __construct() {
-               parent::__construct( 'Revisiondelete', 'deletedhistory' );
+               parent::__construct( 'Revisiondelete', 'deleterevision' );
        }
 
        public function doesWrites() {
@@ -210,17 +210,19 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->showForm();
                }
 
-               $qc = $this->getLogQueryCond();
-               # Show relevant lines from the deletion log
-               $deleteLogPage = new LogPage( 'delete' );
-               $output->addHTML( "<h2>" . $deleteLogPage->getName()->escaped() . "</h2>\n" );
-               LogEventsList::showLogExtract(
-                       $output,
-                       'delete',
-                       $this->targetObj,
-                       '', /* user */
-                       [ 'lim' => 25, 'conds' => $qc, 'useMaster' => $this->wasSaved ]
-               );
+               if ( $user->isAllowed( 'deletedhistory' ) ) {
+                       $qc = $this->getLogQueryCond();
+                       # Show relevant lines from the deletion log
+                       $deleteLogPage = new LogPage( 'delete' );
+                       $output->addHTML( "<h2>" . $deleteLogPage->getName()->escaped() . "</h2>\n" );
+                       LogEventsList::showLogExtract(
+                               $output,
+                               'delete',
+                               $this->targetObj,
+                               '', /* user */
+                               [ 'lim' => 25, 'conds' => $qc, 'useMaster' => $this->wasSaved ]
+                       );
+               }
                # Show relevant lines from the suppression log
                if ( $user->isAllowed( 'suppressionlog' ) ) {
                        $suppressLogPage = new LogPage( 'suppress' );
index 99f9c7c..4824961 100644 (file)
@@ -618,9 +618,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $form .= Xml::openElement( 'form', [
                        'method' => 'get',
-                       'action' => $this->getPageTitle()->getLocalURL(),
+                       'action' => wfScript(),
                        'id' => 'mw-watchlist-form'
                ] );
+               $form .= Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() );
                $form .= Xml::fieldset(
                        $this->msg( 'watchlist-options' )->text(),
                        false,
index 069b460..1346e1c 100644 (file)
@@ -328,7 +328,7 @@ class BalanceElement {
        /**
         * Parent of this element, or the string "flat" if this element has
         * already been flattened into its parent.
-        * @var string|null $parent
+        * @var BalanceElement|string|null $parent
         */
        public $parent;
 
@@ -337,7 +337,7 @@ class BalanceElement {
         * child will be an actual BalanceElement object; the rest will
         * be strings, representing either text nodes or flattened
         * BalanceElement objects.
-        * @var array $children
+        * @var BalanceElement[]|string[] $children
         */
        public $children;
 
@@ -465,6 +465,7 @@ class BalanceElement {
         * in its parent by that string.
         *
         * @param array $config Balancer configuration; see Balancer::__construct().
+        * @return string
         *
         * @see __toString()
         */
@@ -653,7 +654,7 @@ class BalanceElement {
 class BalanceStack implements IteratorAggregate {
        /**
         * Backing storage for the stack.
-        * @var array $elements
+        * @var BalanceElement[] $elements
         */
        private $elements = [];
        /**
@@ -717,6 +718,7 @@ class BalanceStack implements IteratorAggregate {
        /**
         * Insert text at the appropriate place for inserting a node.
         * @param string $value
+        * @param bool $isComment
         * @see https://html.spec.whatwg.org/multipage/syntax.html#appropriate-place-for-inserting-a-node
         */
        public function insertText( $value, $isComment = false ) {
@@ -906,7 +908,7 @@ class BalanceStack implements IteratorAggregate {
        /**
         * Return an iterator over this stack which visits the current node
         * first, and the root node last.
-        * @return Iterator
+        * @return \Iterator
         */
        public function getIterator() {
                return new ReverseArrayIterator( $this->elements );
@@ -1080,6 +1082,8 @@ class BalanceStack implements IteratorAggregate {
        /**
         * Foster parent the given $elt in the stack of open elements.
         * @param BalanceElement|string $elt
+        * @return BalanceElement|string
+        *
         * @see https://html.spec.whatwg.org/multipage/syntax.html#foster-parent
         */
        private function fosterParent( $elt ) {
@@ -1520,6 +1524,7 @@ class BalanceActiveFormattingElements {
 
        /**
         * Determine whether an element is in the list of formatting elements.
+        * @param BalanceElement $elt
         * @return boolean
         */
        public function isInList( BalanceElement $elt ) {
@@ -1529,6 +1534,8 @@ class BalanceActiveFormattingElements {
        /**
         * Find the element $elt in the list and remove it.
         * Used when parsing &lt;a&gt; in body mode.
+        *
+        * @param BalanceElement $elt
         */
        public function remove( BalanceElement $elt ) {
                if ( $this->head !== $elt && !$elt->prevAFE ) {
@@ -1597,6 +1604,9 @@ class BalanceActiveFormattingElements {
 
        /**
         * Find element $a in the list and replace it with element $b
+        *
+        * @param BalanceElement $a
+        * @param BalanceElement $b
         */
        public function replace( BalanceElement $a, BalanceElement $b ) {
                if ( $this->head !== $a && !$a->prevAFE ) {
@@ -1628,6 +1638,9 @@ class BalanceActiveFormattingElements {
 
        /**
         * Find $a in the list and insert $b after it.
+
+        * @param BalanceElement $a
+        * @param BalanceElement $b
         */
        public function insertAfter( BalanceElement $a, BalanceElement $b ) {
                if ( $this->head !== $a && !$a->prevAFE ) {
@@ -1778,9 +1791,12 @@ class BalanceActiveFormattingElements {
  */
 class Balancer {
        private $parseMode;
+       /** @var \Iterator */
        private $bitsIterator;
        private $allowedHtmlElements;
+       /** @var BalanceActiveFormattingElements */
        private $afe;
+       /** @var BalanceStack */
        private $stack;
        private $strict;
        private $allowComments;
@@ -1795,6 +1811,11 @@ class Balancer {
        private $inRCDATA;
        private $inRAWTEXT;
 
+       /** @var callable|null */
+       private $processingCallback;
+       /** @var array */
+       private $processingArgs;
+
        /**
         * Valid HTML5 comments.
         * Regex borrowed from Tim Starling's "remex-html" project.
@@ -2582,7 +2603,7 @@ class Balancer {
                        case 'tt':
                        case 'u':
                                $this->afe->reconstruct( $this->stack );
-                               $this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ), $attribs );
+                               $this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ) );
                                return true;
 
                        case 'nobr':
@@ -2591,7 +2612,7 @@ class Balancer {
                                        $this->inBodyMode( 'endtag', 'nobr' );
                                        $this->afe->reconstruct( $this->stack );
                                }
-                               $this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ), $attribs );
+                               $this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ) );
                                return true;
 
                        case 'applet':
diff --git a/includes/utils/MWGrants.php b/includes/utils/MWGrants.php
deleted file mode 100644 (file)
index 58efdc7..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-<?php
-/**
- * Functions and constants to deal with grants
- *
- * 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
- */
-
-/**
- * A collection of public static functions to deal with grants.
- */
-class MWGrants {
-
-       /**
-        * List all known grants.
-        * @return array
-        */
-       public static function getValidGrants() {
-               global $wgGrantPermissions;
-
-               return array_keys( $wgGrantPermissions );
-       }
-
-       /**
-        * Map all grants to corresponding user rights.
-        * @return array grant => array of rights
-        */
-       public static function getRightsByGrant() {
-               global $wgGrantPermissions;
-
-               $res = [];
-               foreach ( $wgGrantPermissions as $grant => $rights ) {
-                       $res[$grant] = array_keys( array_filter( $rights ) );
-               }
-               return $res;
-       }
-
-       /**
-        * Fetch the display name of the grant
-        * @param string $grant
-        * @param Language|string|null $lang
-        * @return string Grant description
-        */
-       public static function grantName( $grant, $lang = null ) {
-               // Give grep a chance to find the usages:
-               // grant-blockusers, grant-createeditmovepage, grant-delete,
-               // grant-editinterface, grant-editmycssjs, grant-editmywatchlist,
-               // grant-editpage, grant-editprotected, grant-highvolume,
-               // grant-oversight, grant-patrol, grant-protect, grant-rollback,
-               // grant-sendemail, grant-uploadeditmovefile, grant-uploadfile,
-               // grant-basic, grant-viewdeleted, grant-viewmywatchlist,
-               // grant-createaccount
-               $msg = wfMessage( "grant-$grant" );
-               if ( $lang !== null ) {
-                       if ( is_string( $lang ) ) {
-                               $lang = Language::factory( $lang );
-                       }
-                       $msg->inLanguage( $lang );
-               }
-               if ( !$msg->exists() ) {
-                       $msg = wfMessage( 'grant-generic', $grant );
-                       if ( $lang ) {
-                               $msg->inLanguage( $lang );
-                       }
-               }
-               return $msg->text();
-       }
-
-       /**
-        * Fetch the display names for the grants.
-        * @param string[] $grants
-        * @param Language|string|null $lang
-        * @return string[] Corresponding grant descriptions
-        */
-       public static function grantNames( array $grants, $lang = null ) {
-               if ( $lang !== null ) {
-                       if ( is_string( $lang ) ) {
-                               $lang = Language::factory( $lang );
-                       }
-               }
-
-               $ret = [];
-               foreach ( $grants as $grant ) {
-                       $ret[] = self::grantName( $grant, $lang );
-               }
-               return $ret;
-       }
-
-       /**
-        * Fetch the rights allowed by a set of grants.
-        * @param string[]|string $grants
-        * @return string[]
-        */
-       public static function getGrantRights( $grants ) {
-               global $wgGrantPermissions;
-
-               $rights = [];
-               foreach ( (array)$grants as $grant ) {
-                       if ( isset( $wgGrantPermissions[$grant] ) ) {
-                               $rights = array_merge( $rights, array_keys( array_filter( $wgGrantPermissions[$grant] ) ) );
-                       }
-               }
-               return array_unique( $rights );
-       }
-
-       /**
-        * Test that all grants in the list are known.
-        * @param string[] $grants
-        * @return bool
-        */
-       public static function grantsAreValid( array $grants ) {
-               return array_diff( $grants, self::getValidGrants() ) === [];
-       }
-
-       /**
-        * Divide the grants into groups.
-        * @param string[]|null $grantsFilter
-        * @return array Map of (group => (grant list))
-        */
-       public static function getGrantGroups( $grantsFilter = null ) {
-               global $wgGrantPermissions, $wgGrantPermissionGroups;
-
-               if ( is_array( $grantsFilter ) ) {
-                       $grantsFilter = array_flip( $grantsFilter );
-               }
-
-               $groups = [];
-               foreach ( $wgGrantPermissions as $grant => $rights ) {
-                       if ( $grantsFilter !== null && !isset( $grantsFilter[$grant] ) ) {
-                               continue;
-                       }
-                       if ( isset( $wgGrantPermissionGroups[$grant] ) ) {
-                               $groups[$wgGrantPermissionGroups[$grant]][] = $grant;
-                       } else {
-                               $groups['other'][] = $grant;
-                       }
-               }
-
-               return $groups;
-       }
-
-       /**
-        * Get the list of grants that are hidden and should always be granted
-        * @return string[]
-        */
-       public static function getHiddenGrants() {
-               global $wgGrantPermissionGroups;
-
-               $grants = [];
-               foreach ( $wgGrantPermissionGroups as $grant => $group ) {
-                       if ( $group === 'hidden' ) {
-                               $grants[] = $grant;
-                       }
-               }
-               return $grants;
-       }
-
-       /**
-        * Generate a link to Special:ListGrants for a particular grant name.
-        *
-        * This should be used to link end users to a full description of what
-        * rights they are giving when they authorize a grant.
-        *
-        * @param string $grant the grant name
-        * @param Language|string|null $lang
-        * @return string (proto-relative) HTML link
-        */
-       public static function getGrantsLink( $grant, $lang = null ) {
-               return \Linker::linkKnown(
-                       \SpecialPage::getTitleFor( 'Listgrants', false, $grant ),
-                       htmlspecialchars( self::grantName( $grant, $lang ) )
-               );
-       }
-
-       /**
-        * Generate wikitext to display a list of grants
-        * @param string[]|null $grantsFilter If non-null, only display these grants.
-        * @param Language|string|null $lang
-        * @return string Wikitext
-        */
-       public static function getGrantsWikiText( $grantsFilter, $lang = null ) {
-               global $wgContLang;
-
-               if ( is_string( $lang ) ) {
-                       $lang = Language::factory( $lang );
-               } elseif ( $lang === null ) {
-                       $lang = $wgContLang;
-               }
-
-               $s = '';
-               foreach ( self::getGrantGroups( $grantsFilter ) as $group => $grants ) {
-                       if ( $group === 'hidden' ) {
-                               continue; // implicitly granted
-                       }
-                       $s .= "*<span class=\"mw-grantgroup\">" .
-                               wfMessage( "grant-group-$group" )->inLanguage( $lang )->text() . "</span>\n";
-                       $s .= ":" . $lang->semicolonList( self::grantNames( $grants, $lang ) ) . "\n";
-               }
-               return "$s\n";
-       }
-
-}
index 3e28759..7ef2eff 100644 (file)
@@ -291,7 +291,7 @@ class Language {
                # Since these are limited, this is safe even later changes to the registry --
                # the only oddity is that it might change the type of the tag, and thus
                # the results from the capturing groups.
-               # http://www.iana.org/assignments/language-subtag-registry
+               # https://www.iana.org/assignments/language-subtag-registry
 
                $grandfathered = "en{$s}GB{$s}oed"
                        . "|i{$s}(?:ami|bnn|default|enochian|hak|klingon|lux|mingo|navajo|pwn|tao|tay|tsu)"
@@ -1623,7 +1623,7 @@ class Language {
         *
         * Based on a PHP-Nuke block by Sharjeel which is released under GNU/GPL license
         *
-        * @see http://phpnuke.org/modules.php?name=News&file=article&sid=8234&mode=thread&order=0&thold=0
+        * @see https://phpnuke.org/modules.php?name=News&file=article&sid=8234&mode=thread&order=0&thold=0
         *
         * @param string $ts
         *
@@ -1852,9 +1852,9 @@ class Language {
         * Algorithm to convert Gregorian dates to Thai solar dates,
         * Minguo dates or Minguo dates.
         *
-        * Link: http://en.wikipedia.org/wiki/Thai_solar_calendar
-        *       http://en.wikipedia.org/wiki/Minguo_calendar
-        *       http://en.wikipedia.org/wiki/Japanese_era_name
+        * Link: https://en.wikipedia.org/wiki/Thai_solar_calendar
+        *       https://en.wikipedia.org/wiki/Minguo_calendar
+        *       https://en.wikipedia.org/wiki/Japanese_era_name
         *
         * @param string $ts 14-character timestamp
         * @param string $cName Calender name
@@ -2593,7 +2593,7 @@ class Language {
        public function iconv( $in, $out, $string ) {
                # Even with //IGNORE iconv can whine about illegal characters in
                # *input* string. We just ignore those too.
-               # REF: http://bugs.php.net/bug.php?id=37166
+               # REF: https://bugs.php.net/bug.php?id=37166
                # REF: https://phabricator.wikimedia.org/T18885
                MediaWiki\suppressWarnings();
                $text = iconv( $in, $out . '//IGNORE', $string );
@@ -4461,14 +4461,15 @@ class Language {
        }
 
        /**
-        * @todo Document
+        * Formats a time given in seconds into a string representation of that time.
+        *
         * @param int|float $seconds
-        * @param array $format Optional
-        *   If $format['avoid'] === 'avoidseconds': don't mention seconds if $seconds >= 1 hour.
-        *   If $format['avoid'] === 'avoidminutes': don't mention seconds/minutes if $seconds > 48 hours.
+        * @param array $format An optional argument that formats the returned string in different ways:
+        *   If $format['avoid'] === 'avoidseconds': don't show seconds if $seconds >= 1 hour,
+        *   If $format['avoid'] === 'avoidminutes': don't show seconds/minutes if $seconds > 48 hours,
         *   If $format['noabbrevs'] is true: use 'seconds' and friends instead of 'seconds-abbrev'
         *     and friends.
-        *   For backwards compatibility, $format may also be one of the strings 'avoidseconds'
+        * @note For backwards compatibility, $format may also be one of the strings 'avoidseconds'
         *     or 'avoidminutes'.
         * @return string
         */
index 13ba7e8..1c003ad 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Language
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Base class for language conversion.
@@ -550,8 +551,8 @@ class LanguageConverter {
                        $variant = $this->getPreferredVariant();
                }
 
-               $cache = ObjectCache::newAccelerator( CACHE_NONE );
-               $key = wfMemcKey( 'languageconverter', 'namespace-text', $index, $variant );
+               $cache = MediaWikiServices::getInstance()->getLocalServerObjectCache();
+               $key = $cache->makeKey( 'languageconverter', 'namespace-text', $index, $variant );
                $nsVariantText = $cache->get( $key );
                if ( $nsVariantText !== false ) {
                        return $nsVariantText;
index 4003bdd..a2288d0 100644 (file)
@@ -28,7 +28,7 @@
  *
  *
  * Based on:
- *   - http://commons.wikimedia.org/wiki/Image:Inuktitut.png
+ *   - https://commons.wikimedia.org/wiki/Image:Inuktitut.png
  *   - LanguageSr.php
  *
  * @ingroup Language
index 60384a8..c2560a4 100644 (file)
@@ -70,7 +70,7 @@ class LanguageRu extends Language {
 
        /**
         * Four-digit number should be without group commas (spaces)
-        * See manual of style at http://ru.wikipedia.org/wiki/Википедия:Оформление_статей
+        * See manual of style at https://ru.wikipedia.org/wiki/Википедия:Оформление_статей
         * So "1 234 567", "12 345" but "1234"
         *
         * @param string $_
index 61aba70..0de396d 100644 (file)
@@ -28,7 +28,7 @@
  *
  *
  * Based on:
- *   - http://en.wikipedia.org/wiki/Shilha_language
+ *   - https://en.wikipedia.org/wiki/Shilha_language
  *   - LanguageSr.php
  *
  * @ingroup Language
index c947341..42ee44d 100644 (file)
@@ -27,7 +27,7 @@
  * Turkish has two different i, one with a dot and another without a dot. They
  * are totally different letters in this language, so we have to override the
  * ucfirst and lcfirst methods.
- * See http://en.wikipedia.org/wiki/Dotted_and_dotless_I
+ * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I
  * and @bug 28040
  * @ingroup Language
  */
index 836fb86..1ed9a44 100644 (file)
@@ -316,7 +316,7 @@ class Names {
                'nv' => 'Diné bizaad', # Navajo
                'ny' => 'Chi-Chewa', # Chichewa
                'oc' => 'occitan', # Occitan
-               'olo' => 'Livvinкarjala', # Livvi-Karelian
+               'olo' => 'Livvinkarjala', # Livvi-Karelian
                'om' => 'Oromoo', # Oromo
                'or' => 'ଓଡ଼ିଆ', # Oriya
                'os' => 'Ирон', # Ossetic, bug 29091
index 092ecc4..75e8de8 100644 (file)
        "minoredit": "He feito una edición menor",
        "watchthis": "Cosirar ista pachina",
        "savearticle": "Alzar pachina",
+       "publishpage": "Publicar a pachina",
        "publishchanges": "Publicar os cambeos",
        "preview": "Previsualización",
        "showpreview": "Amostrar previsualización",
index 04b7369..5b16b7e 100644 (file)
        "htmlform-user-not-exists": "<strong>$1</strong> غير موجود",
        "htmlform-user-not-valid": "اسم المستخدم <strong>$1</strong> غير صالح.",
        "logentry-delete-delete": "{{GENDER:$2|حذف|حذفت}} $1 صفحة $3",
-       "logentry-delete-restore": "{{GENDER:$2|استعاد|استعادت}} $1 صفحة $3",
+       "logentry-delete-restore": "{{GENDER:$2|استرجع|استرجعت}} $1 صفحة $3",
        "logentry-delete-event": "{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} في سجل $3: $4",
        "logentry-delete-revision": "غيّر{{GENDER:$2||ت}} $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4",
        "logentry-delete-event-legacy": "{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية رؤية أحداث في سجل $3",
index a88feea..733cb95 100644 (file)
        "upload-curl-error28": "Көтөү ваҡыты үтте",
        "upload-curl-error28-text": "\nСайт бигерәк оҙаҡ яуап бирмәй.\nЗинһар, сайттың эшләүен тикшерегеҙ һәм, бер аҙ көткәндән һуң, яңынан ҡабатлап ҡарағыҙ.\nБәлки, һеҙгә сайт бушыраҡ саҡта ҡабатлап ҡарарға кәрәктер.",
        "license": "Рөхсәтнамә:",
-       "license-header": "Рөхсәтнәмә",
+       "license-header": "Рөхсәтнамә",
        "nolicense": "Бер нимә лә һайланмаған",
        "licenses-edit": "Лицензия параметрҙарын үҙгәртергә",
        "license-nopreview": "(Ҡарап сығыу мөмкин түгел)",
index f60b28d..7077396 100644 (file)
        "loginreqtitle": "Патрабуецца ўваход у сыстэму",
        "loginreqlink": "ўвайсьці",
        "loginreqpagetext": "Вы мусіце $1, каб праглядаць іншыя старонкі.",
-       "accmailtitle": "Пароль адасланы.",
-       "accmailtext": "СÑ\82воÑ\80анÑ\8b Ð°Ð´Ð²Ð¾Ð»Ñ\8cнÑ\8b Ð¿Ð°Ñ\80олÑ\8c Ð´Ð»Ñ\8f [[User talk:$1|$1]] Ð±Ñ\8bÑ\9e Ð°Ð´Ð°Ñ\81ланÑ\8b Ð¿Ð° Ð°Ð´Ñ\80аÑ\81е $2. Ð¯Ð³Ð¾ Ð¼Ð¾Ð¶Ð½Ð° Ð·Ñ\8cмÑ\8fнÑ\96Ñ\86Ñ\8c Ð½Ð° Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b ''[[Special:ChangePassword|зÑ\8cменÑ\8b Ð¿Ð°Ñ\80олÑ\8e]]'' пасьля ўваходу.",
+       "accmailtitle": "Пароль адасланы",
+       "accmailtext": "Ð\92Ñ\8bпадковÑ\8b Ð¿Ð°Ñ\80олÑ\8c Ð´Ð»Ñ\8f [[User talk:$1|$1]] Ð±Ñ\8bÑ\9e Ð°Ð´Ð°Ñ\81ланÑ\8b Ð¿Ð° Ð°Ð´Ñ\80аÑ\81е $2. Ð¯Ð³Ð¾ Ð¼Ð¾Ð¶Ð½Ð° Ð·Ñ\8cмÑ\8fнÑ\96Ñ\86Ñ\8c Ð½Ð° Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b <em>[[Special:ChangePassword|зÑ\8cменÑ\8b Ð¿Ð°Ñ\80олÑ\8e]]</em> пасьля ўваходу.",
        "newarticle": "(Новая)",
        "newarticletext": "Вы прыйшлі па спасылцы на старонку, якая яшчэ не існуе.\nКаб стварыць яе, напішыце тэкст у полі ніжэй (глядзіце [$1 старонку дапамогі] для дадатковай інфармацыі).\nКалі Вы трапілі сюды памылкова, націсьніце кнопку «<strong>назад</strong>» у вашым браўзэры.",
        "anontalkpagetext": "----\n<em>Гэта старонка гутарак ананімнага ўдзельніка, які яшчэ не стварыў сабе рахунак альбо не ўжывае яго.</em>\nТаму мы вымушаныя ўжываць лічбавы IP-адрас дзеля ягонай ідэнтыфікацыі. Адзін IP-адрас можа выкарыстоўвацца некалькімі ўдзельнікамі. Калі Вы — ананімны ўдзельнік і лічыце, што атрымалі не прызначаныя Вам камэнтары, калі ласка, [[Special:CreateAccount|стварыце рахунак]] альбо [[Special:UserLogin|ўвайдзіце ў сыстэму]], каб у будучыні пазьбегнуць магчымай блытаніны зь іншымі ананімнымі ўдзельнікамі.",
        "noarticletext": "Цяпер тэкст на гэтай старонцы адсутнічае.\nВы можаце [[Special:Search/{{PAGENAME}}|пашукаць гэтую назву]] сярод іншых старонак, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пашукаць у адпаведных журналах падзеяў]\nальбо [{{fullurl:{{FULLPAGENAME}}|action=edit}} стварыць гэтую старонку]</span>.",
        "noarticletext-nopermission": "Цяпер на гэтай старонцы тэкст адсутнічае.\nВы можаце [[Special:Search/{{PAGENAME}}|пашукаць назву гэтай старонкі]] на іншых старонках, альбо <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пашукаць зьвязаныя запісы ў журналах]</span>, але ў вас няма дазволу ствараць гэтую старонку.",
-       "missing-revision": "Вэрсія старонкі №$1 з назвай «{{FULLPAGENAME}}» не існуе.\n\nЗвычайна гэта здараецца з-за перахода па састарэлай спасылцы на старонку, якая была выдаленая.\nПадрабязнасьці можна знайсьці ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
-       "userpage-userdoesnotexist": "Рахунак удзельніка «<nowiki>$1</nowiki>» не зарэгістраваны. Калі ласка, удакладніце, ці жадаеце Вы стварыць/рэдагаваць гэтую старонку.",
+       "missing-revision": "Вэрсія старонкі №$1 з назвай «{{FULLPAGENAME}}» не існуе.\n\nЗвычайна гэта здараецца з-за пераходу па састарэлай спасылцы на старонку, якая была выдаленая.\nПадрабязнасьці можна знайсьці ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
+       "userpage-userdoesnotexist": "Рахунак удзельніка «$1» не зарэгістраваны. Калі ласка, удакладніце, ці жадаеце Вы стварыць/рэдагаваць гэтую старонку.",
        "userpage-userdoesnotexist-view": "Рахунак «$1» ня створаны.",
        "blocked-notice-logextract": "Гэты ўдзельнік у дадзены момант заблякаваны.\nАпошні запіс з журналу блякаваньняў пададзены ніжэй для даведкі:",
        "clearyourcache": "<strong>Заўвага:</strong> каб пабачыць зьмены пасьля захаваньня, Вам можа спатрэбіцца ачысьціць кэш Вашага браўзэра. \n* <strong>Firefox / Safari:</strong> трымайце <em>Shift</em> і націсьніце <em>Reload</em>, ці націсьніце <em>Ctrl-F5</em> ці <em>Ctrl-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Google Chrome:</strong> націсьніце <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer:</strong> трымайце <em>Ctrl</em> і націсьніце <em>Refresh</em>, ці націсьніце <em>Ctrl-F5</em>\n* <strong>Opera:</strong> перайдзіце ў <em>Menu → Settings</em> (<em>Opera → Preferences</em> на Mac), а потым у <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "apisandbox-alert-field": "Значэньне гэтага поля зьяўляецца няслушным.",
        "apisandbox-continue": "Працягнуць",
        "apisandbox-continue-clear": "Ачысьціць",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries працягне] апошні запыт; {{int:apisandbox-continue-clear}} ачысьціць парамэтры, зьвязаныя з працягам.",
        "booksources": "Крыніцы кніг",
        "booksources-search-legend": "Пошук кніг",
        "booksources-isbn": "ISBN:",
        "newimages-showbots": "Паказаць загружаныя робатамі",
        "newimages-hidepatrolled": "Схаваць патруляваныя загрузкі",
        "noimages": "Выявы адсутнічаюць.",
+       "gallery-slideshow-toggle": "Пераключыць мініятуры",
        "ilsubmit": "Шукаць",
        "bydate": "па даце",
        "sp-newimages-showfrom": "Паказаць новыя файлы, загружаныя пазьней за $2, $1",
        "feedback-thanks": "Дзякуй! Ваш водгук быў разьмешчаны на старонцы «[$2 $1]».",
        "feedback-thanks-title": "Дзякуй!",
        "feedback-useragent": "Агент удзельніка:",
-       "searchsuggest-search": "Пошук",
+       "searchsuggest-search": "Пошук у {{GRAMMAR:месны|{{SITENAME}}}}",
        "searchsuggest-containing": "утрымлівае...",
        "api-error-autoblocked": "Ваш IP-адрас быў аўтаматычна заблякаваны, бо ён быў выкарыстаны заблякаваным удзельнікам.",
        "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "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": "Імпарт праз загрузку XML",
        "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-unprotect": "Зьняцьце абароны",
index 67965f5..a5eecb0 100644 (file)
@@ -36,7 +36,8 @@
                        "Ket",
                        "Ricordo.tenerissimo",
                        "Plamen",
-                       "Iliev"
+                       "Iliev",
+                       "Spas.Z.Spasov"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
        "title-invalid-interwiki": "Желаното заглавие на страница съдържа препратка към друго уики, което не може да бъде ползвано в заглавия.",
        "title-invalid-talk-namespace": "Желаното заглавие на страница се отнася към беседа, която не съществува",
        "title-invalid-characters": "Желаното заглавие на статия съдържа невалидни знаци: „$1“",
-       "title-invalid-relative": "Заглавието съдържа относителен път. Относителни заглавия на статии (./,../) са невалидни, защото често ще са недостижимо, когато биват извиквани от браузъра на потребителя.",
+       "title-invalid-relative": "Заглавието съдържа относителен път. Относителните заглавия на статии (./,../) са невалидни, защото често са недостижими, когато биват обработвани от браузъра на потребителя.",
        "title-invalid-magic-tilde": "Желаното заглавие на статия съдържа невалидна поредица от тилди (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Желаното заглавие на статия е твърде дълго. Трябва да е не по-дълго от $1 {{PLURAL:$1|байт|байта}} в кодиране UTF-8.",
        "title-invalid-leading-colon": "Желаното заглавие на статия съдържа невалидно двоеточие в началото.",
        "virus-scanfailed": "сканирането не сполучи (код $1)",
        "virus-unknownscanner": "непознат антивирус:",
        "logouttext": "'''Излязохте от системата.'''\n\nОбърнете внимание, че някои страници все още ще се показват така, сякаш сте влезли, докато не изтриете кеша на браузъра.",
+       "cannotlogoutnow-title": "Не може да излезете сега.",
        "welcomeuser": "Здравейте, $1!",
        "welcomecreation-msg": "Вашата сметка беше създадена.\nМожете да промените [[Special:Preferences|настройките на {{SITENAME}}]] според предпочитанията си.",
        "yourname": "Потребителско име:",
        "createacct-yourpasswordagain-ph": "Въвежда се паролата (повторно)",
        "userlogin-remembermypassword": "Запомняне",
        "userlogin-signwithsecure": "Използване на защитена връзка",
+       "cannotlogin-title": "Не може да влезете в",
+       "cannotlogin-text": "Влизането в системата не е възможно.",
+       "cannotloginnow-title": "Не може да влезете сега",
+       "cannotcreateaccount-title": "Невъзможно е да бъде създадена потребителска сметка",
        "yourdomainname": "Домейн:",
        "password-change-forbidden": "Не можете да променяте пароли в това уики.",
        "externaldberror": "Или е станала грешка в базата от данни при външното удостоверяване, или не ви е позволено да обновявате външната си сметка.",
        "eauthentsent": "Писмото за потвърждение е изпратено на посочения адрес. В него са описани действията, които трябва да се извършат, за да потвърдите, че този адрес за електронна поща действително е ваш.",
        "throttled-mailpassword": "Функцията за напомняне на паролата е използвана през {{PLURAL:$1|последния един час|последните $1 часа}}.\nЗа предотвратяване на злоупотреби е разрешено да се изпраща не повече от едно напомняне в рамките на {{PLURAL:$1|един час|$1 часа}}.",
        "mailerror": "Грешка при изпращане на писмо: $1",
-       "acct_creation_throttle_hit": "Ð\9fÑ\80ез Ð¿Ð¾Ñ\81ледноÑ\82о Ð´ÐµÐ½Ð¾Ð½Ð¾Ñ\89ие, през този IP-адрес посетители на това уики са създали {{PLURAL:$1|1 сметка |$1 сметки}}, което е максималният допустим брой за този период.\nВ резултат, към момента не могат да създават повече потребителски сметки през този IP-адрес.",
+       "acct_creation_throttle_hit": "Ð\9fÑ\80ез Ð¿Ð¾Ñ\81ледниÑ\82е $2, през този IP-адрес посетители на това уики са създали {{PLURAL:$1|1 сметка |$1 сметки}}, което е максималният допустим брой за този период.\nВ резултат, към момента не могат да създават повече потребителски сметки през този IP-адрес.",
        "emailauthenticated": "Адресът на електронната ви поща беше потвърден на $2 в $3.",
        "emailnotauthenticated": "Адресът на електронната ви поща все още не е потвърден.\nНяма да получавате писма за никоя от следните възможности.",
        "noemailprefs": "За да работят тези функционалности, трябва да посочите адрес на електронна поща в своите настройки.",
        "undo-success": "Редакцията може да бъде върната. Прегледайте долното сравнение и се уверете, че наистина искате да го направите. След това съхранете страницата, за да извършите връщането.",
        "undo-failure": "Редакцията не може да бъде върната поради конфликтни междинни редакции.",
        "undo-norev": "Редакцията не може да бъде върната, тъй като не съществува или е била изтрита.",
+       "undo-nochange": "Тази редакция изглежда вече е отменена.",
        "undo-summary": "Премахната редакция $1 на [[Special:Contributions/$2|$2]] ([[User talk:$2|беседа]])",
        "undo-summary-username-hidden": "Отмяна на редакция $1 от скрит потребител",
        "cantcreateaccount-text": "[[User:$3|Потребител:$3]] е блокирал(а) създаването на сметки от този IP-адрес ('''$1''').\n\nПричината, изложена от $3, е ''$2''",
        "rev-showdeleted": "показване",
        "revisiondelete": "Изтриване/възстановяване на версии",
        "revdelete-nooldid-title": "Не е зададена версия",
-       "revdelete-nooldid-text": "Не сте задали версия или версии за изпълнението на тази функция.",
+       "revdelete-nooldid-text": "Не сте задали целева версия за изпълнението на тази функция или определената версия не съществува, или се опитвате да скриете настоящата версия.",
        "revdelete-no-file": "Посоченият файл не съществува.",
        "revdelete-show-file-confirm": "Необходимо е потвърждение, че желаете да прегледате изтритата версия на файла „<nowiki>$1</nowiki>“ от $2 $3.",
        "revdelete-show-file-submit": "Да",
        "revdelete-selected-text": "{{PLURAL:$1|Избрана версия|Избрани версии}} от [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Избрано събитие|Избрани събития}}:",
        "revdelete-text-text": "Изтритите редакции ще продължат да се виждат в историята на страницата, но части от съдържанието ще бъдат публично недостъпни.",
+       "revdelete-text-file": "Изтритите файлови редакции ще продължат да се виждат в историята на страницата, но части от съдържанието им ще бъдат публично недостъпни.",
+       "logdelete-text": "Изтриват записи в дневника ще продължат да се виждат в дневниците, но част от тяхното съдържание ще бъде недостъпно за обществеността.",
        "revdelete-text-others": "Другите администратори ще продължат да имат достъп до скритото съдържание и могат да го възстановят, освен ако не бъдат наложени допълнителни ограничения.",
        "revdelete-confirm": "Необходимо е да потвърдите, че желаете да извършите действието, разбирате последствията и го правите според [[{{MediaWiki:Policy-url}}|политиката]].",
        "revdelete-suppress-text": "Премахването трябва да се използва '''само''' при следните случаи:\n* Потенциално уязвима в правно отношение информация\n* Неподходяща лична информация\n*: ''домашни адреси и телефонни номера, номера за социално осигуряване и др.''",
        "badsig": "Избраният подпис не е валиден. Проверете HTML-етикетите!",
        "badsiglength": "Вашият подпис е твърде дълъг.\nПодписите не могат да надвишават $1 {{PLURAL:$1|знак|знака}}.",
        "yourgender": "Какво описание Ви подхожда най-много?",
-       "gender-unknown": "Ð\9fÑ\80едпоÑ\87иÑ\82ам Ð´Ð° Ð½Ðµ Ð¿Ð¾Ñ\81оÑ\87а",
+       "gender-unknown": "Ð\9aогаÑ\82о Ð²Ð¸ Ñ\81поменава, Ñ\81оÑ\84Ñ\82Ñ\83еÑ\80Ñ\8aÑ\82 Ñ\89е Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° Ð½ÐµÑ\83Ñ\82Ñ\80ални Ð´Ñ\83ми Ð·Ð° Ð¿Ð¾Ð», ÐºÐ¾Ð³Ð°Ñ\82о Ðµ Ð²Ñ\8aзможно",
        "gender-male": "Той редактира уики страниците",
        "gender-female": "Тя редактира уики страниците",
        "prefs-help-gender": "По желание: използва се за коректно обръщение по род в системните съобщения на софтуера. Тази информация е публично достъпна.",
        "right-sendemail": "Изпращане на е-писма до другите потребители",
        "right-passwordreset": "Преглеждане на е-писма за възстановяване на парола",
        "grant-group-email": "Изпращане на е-писмо",
+       "grant-blockusers": "Блокиране и отблокиране на потребители",
        "grant-createaccount": "Създаване на сметки",
        "grant-createeditmovepage": "Създаване, редактиране и преместване на страници",
        "grant-delete": "Изтриване на страници, редакции и записи в дневника",
        "grant-editmywatchlist": "редактиране на списъка ви за наблюдение",
        "grant-editpage": "Редактиране на съществуващи страници",
        "grant-editprotected": "Редактиране на защитени страници",
+       "grant-sendemail": "Изпращане на имейл до други потребители",
        "grant-uploadeditmovefile": "Качване, заменяне и прехвърляне на файлове",
        "grant-uploadfile": "Качване на нови файлове",
        "grant-basic": "Основни права",
        "upload-http-error": "Възникна HTTP грешка: $1",
        "upload-dialog-title": "Качване на файл",
        "upload-dialog-button-cancel": "Отказване",
+       "upload-dialog-button-back": "Обратно",
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Съхраняване",
        "upload-dialog-button-upload": "Качване",
        "apihelp-no-such-module": "Модул \"$1\" не беше намерен.",
        "apisandbox": "Пясъчник за API",
        "apisandbox-fullscreen": "Разшири полето",
+       "apisandbox-unfullscreen": "Показване на страница",
        "apisandbox-submit": "Направи запитване",
        "apisandbox-reset": "Изчистване",
        "apisandbox-retry": "Повторен опит",
        "apisandbox-dynamic-error-exists": "Параметър с име \"$1\" вече съществува.",
        "apisandbox-results": "Резултати",
        "apisandbox-request-url-label": "URL-адрес на заявката:",
+       "apisandbox-continue": "Продължаване",
+       "apisandbox-continue-clear": "Изчистване",
        "booksources": "Източници на книги",
        "booksources-search-legend": "Търсене на информация за книга",
        "booksources-search": "Търсене",
        "mediastatistics-table-totalbytes": "Общ размер",
        "mediastatistics-header-unknown": "Неизвестно",
        "mediastatistics-header-bitmap": "Растерни изображения",
-       "mediastatistics-header-drawing": "РиÑ\81Ñ\83нки (векторни изображения)",
+       "mediastatistics-header-drawing": "ЧеÑ\80Ñ\82ежи (векторни изображения)",
        "mediastatistics-header-audio": "Аудио",
        "mediastatistics-header-video": "Видео",
        "mediastatistics-header-multimedia": "Мултимедия",
index 1a60e1a..2b1c8f6 100644 (file)
        "apisandbox-loading-results": "API ফলাফল গ্রহণ করা হচ্ছে...",
        "apisandbox-request-url-label": "অনুরোধের URL:",
        "apisandbox-request-time": "অনুরোধের সময়: {{PLURAL:$1|$1 মি.সে.}}",
+       "apisandbox-continue": "অব্যাহত",
+       "apisandbox-continue-clear": "পরিস্কার",
        "booksources": "বইয়ের উৎস",
        "booksources-search-legend": "বইয়ের উৎসের জন্য অনুসন্ধান করা হোক",
        "booksources-isbn": "আইএসবিএন:",
        "ilsubmit": "অনুসন্ধান",
        "bydate": "তারিখ অনুযায়ী",
        "sp-newimages-showfrom": "$2, $1 এর পরের নতুন ছবিগুলো দেখাও",
+       "seconds-abbrev": "$1 সে",
        "minutes-abbrev": "$1 মিনিট",
+       "hours-abbrev": "$1 ঘ",
+       "days-abbrev": "$1 দিন",
        "seconds": "{{PLURAL:$1|$1 সেকেন্ড|$1 সেকেন্ড}}",
        "minutes": "{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}",
        "hours": "{{PLURAL:$1|$1 ঘণ্টা|$1 ঘণ্টা}}",
        "feedback-thanks": "ধন্যবাদ! আপনার প্রতিক্রিয়া \"[$2 $1]\" পাতায় পোস্ট করা হয়েছে।",
        "feedback-thanks-title": "আপনাকে ধন্যবাদ!",
        "feedback-useragent": "ব্যবহারকারী এজেন্ট:",
-       "searchsuggest-search": "অনুসন্ধান",
+       "searchsuggest-search": "{{SITENAME}} অনুসন্ধান",
        "searchsuggest-containing": "যা আছে...",
        "api-error-badaccess-groups": "আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।",
        "api-error-badtoken": "অভ্যন্তরীণ ত্রুটি: খারাপ টোকেন।",
        "usercssispublic": "অনুগ্রহ করে লক্ষ্য করুন: সিএসএসের উপপাতাগুলিতে গোপনীয় তথ্য থাকা উচিত নয় যেহেতু অন্যান্য ব্যবহারকারীও এগুলি দেখতে পান।",
        "restrictionsfield-badip": "আইপি ঠিকানা অথবা পরিসীমা অবৈধ: $1",
        "restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
-       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে<br><code>0.0.0.0/0</code><br><code>::/0</code><br>ব্যবহার করুন"
+       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে<br><code>0.0.0.0/0</code><br><code>::/0</code><br>ব্যবহার করুন",
+       "edit-error-short": "ত্রুটি: $1",
+       "edit-error-long": "ত্রুটিসমূহ:\n\n$1"
 }
index bd7643b..371a669 100644 (file)
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije}}",
        "category_header": "Članci u kategoriji \"$1\"",
-       "subcategories": "Podkategorije",
+       "subcategories": "Potkategorije",
        "category-media-header": "Datoteke u kategoriji \"$1\"",
        "category-empty": "''Ova kategorija trenutno ne sadrži članke ni medije.''",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
index 1c3ddf7..6a5d333 100644 (file)
@@ -83,7 +83,7 @@
        "tog-enotifminoredits": "Notifica'm per correu també en casos d'edicions menors",
        "tog-enotifrevealaddr": "Mostra la meua adreça electrònica en els missatges d'avís per correu",
        "tog-shownumberswatching": "Mostra el nombre d'usuaris que hi vigilen",
-       "tog-oldsig": "Signatura actual:",
+       "tog-oldsig": "La vostra signatura actual:",
        "tog-fancysig": "Tractar la signatura com a text wiki (sense enllaç automàtic)",
        "tog-uselivepreview": "Utilitza la previsualització automàtica",
        "tog-forceeditsummary": "Avisa'm en deixar el resum de la modificació en blanc",
        "newwindow": "(obre en una nova finestra)",
        "cancel": "Cancel·la",
        "moredotdotdot": "Més...",
-       "morenotlisted": "Aquesta llista no és completa.",
+       "morenotlisted": "Aquesta llista pot ser incompleta.",
        "mypage": "Pàgina",
        "mytalk": "Discussió",
        "anontalk": "Discussió",
        "talk": "Discussió",
        "views": "Vistes",
        "toolbox": "Eines",
+       "tool-link-userrights": "Canvia els grups de l'{{GENDER:$1|usuari|usuària}}",
+       "tool-link-emailuser": "Envia un missatge electrònic a l'{{GENDER:$1|usuari|usuària}}",
        "userpage": "Visualitza la pàgina d'usuari",
        "projectpage": "Visualitza la pàgina del projecte",
        "imagepage": "Visualitza la pàgina del fitxer",
        "createacct-yourpasswordagain-ph": "Introduïu de nou la contrasenya",
        "userlogin-remembermypassword": "Mantén-me connectat",
        "userlogin-signwithsecure": "Connexió segura",
+       "cannotlogin-title": "No es pot iniciar la sessió",
+       "cannotlogin-text": "No és possible iniciar la sessió.",
        "cannotloginnow-title": "Ara no es pot iniciar la sessió",
        "cannotloginnow-text": "No es pot iniciar la sessió quan s'utilitza $1.",
+       "cannotcreateaccount-title": "No es poden crear comptes",
+       "cannotcreateaccount-text": "La creació de comptes directa no està habilitada en aquest wiki.",
        "yourdomainname": "El vostre domini",
        "password-change-forbidden": "No podeu canviar les contrasenyes en aquest wiki.",
        "externaldberror": "Hi ha hagut un error en la base de dades d'autenticació o bé no teniu permís per a actualitzar el vostre compte extern.",
        "mergehistory-fail-bad-timestamp": "La marca horària no és vàlida.",
        "mergehistory-fail-invalid-source": "La pàgina font no és vàlida.",
        "mergehistory-fail-invalid-dest": "La pàgina de destinació no és vàlida.",
+       "mergehistory-fail-permission": "No hi ha permisos suficients per fusionar l'historial.",
        "mergehistory-fail-self-merge": "Les pàgines d'origen i de destinació no poden ser la mateixa",
        "mergehistory-fail-toobig": "No s'ha pogut fer la fusió de l'historial perquè es mourien més del límit de $1 {{PLURAL:$1|revisió|revisions}}.",
        "mergehistory-no-source": "La pàgina d'origen $1 no existeix.",
        "upload-dialog-disabled": "La càrrega de fitxers utilitzant aquest quadre de diàleg està desactivada en aquest wiki.",
        "upload-dialog-title": "Carrega un fitxer",
        "upload-dialog-button-cancel": "Cancel·la",
+       "upload-dialog-button-back": "Enrere",
        "upload-dialog-button-done": "Fet",
        "upload-dialog-button-save": "Desa",
        "upload-dialog-button-upload": "Carrega",
        "apisandbox-results": "Resultats",
        "apisandbox-request-url-label": "Sol·licita URL:",
        "apisandbox-request-time": "Temps de sol·licitud: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-continue": "Continua",
+       "apisandbox-continue-clear": "Neteja",
        "booksources": "Obres de referència",
        "booksources-search-legend": "Cerca fonts de llibres",
        "booksources-isbn": "ISBN:",
        "ipb-unblock": "Desbloca un usuari o una adreça IP",
        "ipb-blocklist": "Llista els bloquejos existents",
        "ipb-blocklist-contribs": "Contribucions de {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "$1 restant",
        "unblockip": "Desbloca l'usuari",
        "unblockiptext": "Empreu el següent formulari per restaurar\nl'accés a l'escriptura a una adreça IP o un usuari prèviament bloquejat.",
        "ipusubmit": "Desbloca aquesta adreça",
        "pageinfo-article-id": "ID de la pàgina",
        "pageinfo-language": "Llengua del contingut de la pàgina",
        "pageinfo-content-model": "Plantilla de contingut de pàgina",
+       "pageinfo-content-model-change": "canvia",
        "pageinfo-robot-policy": "Indexació per robots",
        "pageinfo-robot-index": "Permès",
        "pageinfo-robot-noindex": "No permès",
        "newimages-showbots": "Mostra les càrregues dels bots",
        "newimages-hidepatrolled": "Amaga les càrregues patrullades",
        "noimages": "Res per veure.",
+       "gallery-slideshow-toggle": "Canvia les miniatures",
        "ilsubmit": "Cerca",
        "bydate": "per data",
        "sp-newimages-showfrom": "Mostra fitxers nous des del $1 a les $2",
        "feedback-external-bug-report-button": "Arxiva una tasca tècnica",
        "feedback-dialog-title": "Envia el comentari",
        "feedback-dialog-intro": "Podeu utilitzar el senzill formulari de sota per a trametre la vostra opinió. El comentari s'afegirà a la pàgina «$1» juntament amb el vostre nom d'usuari.",
-       "feedback-error-title": "Error",
        "feedback-error1": "Error: Resultat de l'API no reconegut",
        "feedback-error2": "Error: Edició fallida",
        "feedback-error3": "Error: No hi ha resposta de l'API",
index fafca4a..1f83b9d 100644 (file)
@@ -55,7 +55,7 @@
        "tog-showhiddencats": "㪗藏類別",
        "tog-norollbackdiff": "Cék-hèng huòi-gūng ī-hâiu ng-sāi hiēng-sê chă-biék",
        "tog-useeditwarning": "我編輯頁面其時候離開,起動警告我蜀下",
-       "tog-prefershttps": "Láuk-diē ī-hâiu sṳ̄-cṳ̆ng sāi ăng-cuòng lièng-giék",
+       "tog-prefershttps": "Láuk-diē ī-hâiu tié-lāu sāi ăng-ciòng lièng-giék",
        "underline-always": "直頭",
        "underline-never": "頭𡅏無",
        "underline-default": "皮膚或者瀏覽器默認其",
        "december-date": "十二月$1號",
        "period-am": "AM",
        "period-pm": "PM",
-       "pagecategories": "{{PLURAL:$1}} Lôi-biék",
+       "pagecategories": "{{PLURAL:$1|Lôi-biék}}",
        "category_header": "「$1」類別下底其頁面",
        "subcategories": "子類別",
        "category-media-header": "「$1」類別下底其媒體",
        "morenotlisted": "Ciā dăng-dăng mâ̤ uòng-cīng.",
        "mypage": "頁面",
        "mytalk": "我其討論",
-       "anontalk": "Páng-gōng",
+       "anontalk": "Păng-gōng",
        "navigation": "Īng-dô̤:",
        "and": "&#32;gâe̤ng",
        "qbfind": "討",
        "redirectedfrom": "(téng $1 tṳ̀ng-déng-hióng guó-lì)",
        "redirectpagesub": "重定向頁",
        "redirectto": "重定向遘",
-       "lastmodifiedat": "Cī siŏh hiĕh sê diŏh $1 $2 sèng-hâiu có̤i-âu siŭ-gāi gì.",
+       "lastmodifiedat": "Cī siŏh hiĕk sê diŏh $1 $2 sèng-hâiu có̤i-hâiu siŭ-gāi gì.",
        "viewcount": "茲蜀頁已經乞訪問$1回了。{{PLURAL:$1}}",
        "protectedpage": "保護頁",
        "jumpto": "Tiéu gáu:",
        "thumbnail-more": "Huóng-duâi",
        "tooltip-pt-userpage": "汝其用戶頁",
        "tooltip-pt-mytalk": "汝其討論頁",
+       "tooltip-pt-anontalk": "Cī ciáh IP ôi-cī iū-guăng siŭ-gāi gì tō̤-lâung",
        "tooltip-pt-preferences": "汝其設定",
        "tooltip-pt-watchlist": "汝監視其頁面有改過其單單",
        "tooltip-pt-mycontris": "汝其貢獻其單單",
        "tooltip-n-recentchanges": "Cī-bŏng diŏh wiki ô gāi-biéng gì dăng-dăng",
        "tooltip-n-randompage": "Sùi-biêng muōng ché̤ṳ",
        "tooltip-n-help": "Sìng-tō̤ bŏng-cô gì sū-câi",
-       "tooltip-t-whatlinkshere": "Cuòng-buô lièng-gáu cŭ-uái gì wiki hiĕk-miêng dăng-dăng",
+       "tooltip-t-whatlinkshere": "Ciòng-buô lièng-gáu cŭ-uái gì wiki hiĕk-miêng dăng-dăng",
        "tooltip-t-recentchangeslinked": "鏈遘茲頁其頁面其最近修改\nCī hiĕk lièng gáu bĕk hiĕk gì cī-bŏng gì gāi-biéng",
        "tooltip-t-contributions": "茲蜀用戶其貢獻單單",
        "tooltip-t-emailuser": "向茲蜀隻用戶寄電批",
        "exif-meteringmode-0": "𣍐八",
        "exif-lightsource-0": "𣍐八",
        "exif-subjectdistancerange-0": "𣍐八",
-       "namespacesall": "cuòng-buô",
+       "namespacesall": "ciòng-buô",
        "monthsall": "囫圇年",
        "confirmemail": "確定電批地址",
        "confirmemail_invalid": "確認碼無效。\n可能已經過期了。",
index decdb5b..bde0e77 100644 (file)
        "talk": "Дийцаре",
        "views": "Хьажарш",
        "toolbox": "ГӀирсаш",
+       "tool-link-userrights": "{{GENDER:$1|Декъашхочун}} бакъо хийцар",
+       "tool-link-emailuser": "Язде {{GENDER:$1|декъашхочунга}} кехат",
        "userpage": "Хьажа декъашхочуьна агӀоне",
        "projectpage": "Хьажа кхолламан агӀоне",
        "imagepage": "Хьажа файлан агӀоне",
        "userrights": "Декъашхочун бакъонашна урхалладар",
        "userrights-lookup-user": "Декъашхойн бакъонашна урхалладар",
        "userrights-user-editname": "Язъе цӀе:",
-       "editusergroup": "Хийца декъашхочун бакъо",
+       "editusergroup": "{{GENDER:$1|Декъашхочун}} бакъо хийцар",
        "editinguser": "Хийца декъашхочуьна бакъо '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
        "userrights-editusergroup": "Хийца декъашхочун бакъо",
        "saveusergroups": "Декъашхочун бакъонаш Ӏалашъян",
index 5ef9124..ddced48 100644 (file)
@@ -8,7 +8,8 @@
                        "아라",
                        "Исмаил Садуев",
                        "Умар",
-                       "Macofe"
+                       "Macofe",
+                       "Danvintius Bookix"
                ]
        },
        "tog-underline": "Багълантыларнынъ тюбюни сызув:",
        "nstab-template": "Шаблон",
        "nstab-help": "Ярдым",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Баш Саифе",
        "nosuchaction": "Бойле бир арекет ёкъ",
        "nosuchactiontext": "URL-де бильдирильген арекет рухсетсиз.\nБельки де URL-ни янълыш язгъандырсыз, я да догъру олмагъан бир багълантыны къуллангъандырсыз.\nБу, {{SITENAME}} сайтындаки бир хатаны да косьтерип ола.",
        "nosuchspecialpage": "Бу исимде бир махсус саифе ёкъ",
        "yourpasswordagain": "Парольни бир даа язынъыз:",
        "createacct-yourpasswordagain": "Парольни тасдыкълав",
        "createacct-yourpasswordagain-ph": "Парольни бир даа язынъыз",
-       "remembermypassword": "Киришимни бу компьютерде хатырла (энъ чокъ $1 {{PLURAL:$1|1=кунь|кунь}} ичюн)",
        "userlogin-remembermypassword": "Системада къалайым",
        "userlogin-signwithsecure": "Телюкесиз багълама къулланылсын",
        "yourdomainname": "Домен адынъыз",
        "undo-failure": "Арадаки денъиштирмелер бир-бирине келишикли олмагъаны ичюн денъиштирме лягъу этилип оламай.",
        "undo-norev": "Денъиштирме лягъу этилип оламаз, чюнки о я да ёкъ, я да бар эди, амма ёкъ этильген.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|музакере]]) къулланыджысынынъ $1 номералы денъиштирмесини лягъу этюв.",
-       "cantcreateaccounttitle": "Эсап яратмакънынъ ич чареси ёкъ.",
        "cantcreateaccount-text": "Бу IP адресинден ('''$1''') эсап яратув [[User:$3|$3]] тарафындан блок этильди.\n\n$3 мына бу себепни бильдирди: ''$2''",
        "viewpagelogs": "Бу саифенинъ журналларыны косьтер",
        "nohistory": "Бу саифенинъ кечмиш версиясы ёкъ.",
        "rightslog": "Къулланыджынынъ акълары журналы",
        "action-edit": "бу саифени денъиштирмеге",
        "nchanges": "$1 {{PLURAL:$1|денъиштирме}}",
+       "enhancedrc-history": "тарих",
        "recentchanges": "Сонъки денъиштирмелер",
        "recentchanges-legend": "Сонъки денъиштирмелер сазламалары",
        "recentchanges-summary": "Япылгъан энъ сонъки денъиштирмелерни бу саифеде корип оласынъыз.",
        "contributions": "{{GENDER:$1|Къулланыджынынъ}} исселери",
        "contributions-title": "$1 къулланыджысынынъ исселери",
        "mycontris": "Исселер",
+       "anoncontribs": "Исселер",
        "contribsub2": "$1 ($2)",
        "nocontribs": "Бу критерийлерге уйгъан денъиштирме тапыламады",
        "uctop": "(сонъки)",
index 964df5c..e96da64 100644 (file)
        "feedback-thanks": "Děkujeme! Váš komentář byl přidán na stránku „[$2 $1]“.",
        "feedback-thanks-title": "Děkujeme!",
        "feedback-useragent": "Uživatelský agent:",
-       "searchsuggest-search": "Hledat",
+       "searchsuggest-search": "Hledat na {{GRAMMAR:6sg|{{SITENAME}}}}",
        "searchsuggest-containing": "obsahující…",
        "api-error-autoblocked": "Vaše IP adresa byla automaticky zablokována, protože ji používal zablokovaný uživatel.",
        "api-error-badaccess-groups": "Nemáte povoleno nahrávat soubory na tuto wiki.",
index fa332e7..715f380 100644 (file)
        "newimages-showbots": "Von Bots hochgeladene Dateien anzeigen",
        "newimages-hidepatrolled": "Kontrollierte Dateien ausblenden",
        "noimages": "Keine Dateien gefunden.",
+       "gallery-slideshow-toggle": "Vorschaubilder umschalten",
        "ilsubmit": "Suchen",
        "bydate": "nach Datum",
        "sp-newimages-showfrom": "Zeige neue Dateien ab $1, $2 Uhr",
        "feedback-thanks": "Vielen Dank. Deine Rückmeldung wurde auf der Seite „[$2 $1]“ gespeichert.",
        "feedback-thanks-title": "Danke!",
        "feedback-useragent": "User Agent:",
-       "searchsuggest-search": "Suchen",
+       "searchsuggest-search": "{{SITENAME}} durchsuchen",
        "searchsuggest-containing": "enthält …",
        "api-error-autoblocked": "Deine IP-Adresse wurde automatisch gesperrt, da sie von einem gesperrten Benutzer verwendet wurde.",
        "api-error-badaccess-groups": "Du hast nicht die Berechtigung Dateien in dieses Wiki hochzuladen.",
        "usercssispublic": "Bitte beachten: CSS-Unterseiten sollten keine vertraulichen Daten enthalten, da sie von anderen Benutzern eingesehen werden können.",
        "restrictionsfield-badip": "Ungültige IP-Adresse oder ungültiger IP-Adressbereich: $1",
        "restrictionsfield-label": "Erlaubte IP-Adressbereiche:",
-       "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "edit-error-short": "Fehler: $1",
+       "edit-error-long": "Fehler:\n\n$1"
 }
index c6df7b5..576b292 100644 (file)
@@ -25,7 +25,8 @@
                        "Matma Rex",
                        "Kumkumuk",
                        "Gırd",
-                       "Velg"
+                       "Velg",
+                       "1917 Ekim Devrimi"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
        "specialpage": "Pela xısusiye",
        "personaltools": "Hacetê şexsiy",
        "articlepage": "Pera zerreki bıvin",
-       "talk": "Behs",
+       "talk": "Vacenayış",
        "views": "Asayışi",
        "toolbox": "Haceti",
        "tool-link-userrights": "Grubanê {{GENDER:$1|karberi}} bıvırnë",
        "viewhelppage": "Pera peşti bıvin",
        "categorypage": "Pela kategoriya bıasne",
        "viewtalkpage": "Werênayışi bıvêne",
-       "otherlanguages": "Zıwananê binan de",
+       "otherlanguages": "Zederna zıwani",
        "redirectedfrom": "($1 ra kırışı yê)",
        "redirectpagesub": "Pela berdışi",
        "redirectto": "Beno hetê:",
        "passwordreset-emailtext-ip": "Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "passwordreset-emailtext-user": "$1 enê karberi, {{SITENAME}}  ra ($4) teferuatê hesab dê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "passwordreset-emailelement": "Nameyê karberi: \n$1\n\nParolaya vêrdiye: \n$2",
-       "passwordreset-emailsentemail": "Eger kı ena e-posta aitê şımaya se, jew e-posta do bırışi yo ena hesab.",
+       "passwordreset-emailsentemail": "Eger kı ena e-posta şıma rê se, yew e-posta do bırışiyo eno hesab.",
        "passwordreset-invalideamil": "Adresê eposta raşt niya",
        "changeemail": "E-posta adresa xo wedarne",
        "changeemail-header": "E-posta adresa xo vuriyayışi rë ena former pır kerë. Eger kı şıma qayılë kı e postay adresi ra wedarnë se formi rıştış dı heruna e posta veng verdë",
index 0f6d5c0..2a4bf50 100644 (file)
        "wrongpassword": "पासवर्ड गलत हालियो।\nकृपया आजी प्रयास गरया।",
        "wrongpasswordempty": "हालिएया पासवर्ड खालि थ्यो।\nकृपया आजी प्रयास गरया।",
        "password-name-match": "तमरो प्रवेशशव्द प्रयोगकर्ता नाम है फरक हुनपडन्छ ।",
-       "password-login-forbidden": "यà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤° à¤ªà¥\8dरवà¥\87श à¤¶à¤µ्द वर्जित गरिया छ।",
+       "password-login-forbidden": "यà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤° à¤ªà¥\8dरवà¥\87श à¤¶à¤¬्द वर्जित गरिया छ।",
        "mailmypassword": "पासवर्ड पूर्वनिर्धारित गर",
        "passwordremindertitle": "{{SITENAME}}का लागि नयाँ अस्थायी पासवर्ड",
        "passwordremindertext": "कसैले (सायद तमी, IP ठेगाना $1 बाट), {{SITENAME}}($4) को लागि नौलो पासवर्ड अनुरोध गर्या छ । प्रयोगकर्ता \"$2\" को लागि नौलो अस्थायी पासवर्ड \"$3\"तयार पारिया छ । यदि यो तमरो इच्छामी भयाको भया अहिले तमीले लगइन गरीबर नौलो पासवर्ड छान्नु पड्ड्या हुन्छ ।\nतमरो अस्थायी पासवर्ड  {{PLURAL:$5|एक दिन|$5 दिनहरू पछि}} अमान्य हुन्याछ ।\n\nयदि कोही अरुले नै अनुरोध गर्याको हो भण्या , या तमीले आफ्नो पासवर्ड सम्झ्यौ भण्या, अथवा\nत्यैलाई परिवर्तन गर्न चाहन्नौ भण्या, तमीले यो सन्देसको वेवास्ता गद्दसक्द्याहौ र पुरानै पासवर्ड प्रयोग गरिरहन सक्द्याहौ ।",
        "sectioneditnotsupported-text": "ये पृष्ठमी खण्ड सम्पादन असमर्थित",
        "permissionserrors": "अधिकारमी त्रुटी",
        "permissionserrorstext": "तइ काम अद्दाइ तम सित अधिकार आथिन, यिन {{PLURAL:$1|कारण|कारणअन}}ले अद्दा:",
-       "permissionserrorstext-withaction": "$2 कि लेखा तमलाईँ अनुमति नाइथिन , यिन {{PLURAL:$1|कारणले|कारणहरुले}} गद्दा :",
+       "permissionserrorstext-withaction": "$2 कि लेखा तमलाई अनुमति नाइथिन , यिन {{PLURAL:$1|कारणले|कारणहरू}}ले गद्दा :",
        "moveddeleted-notice": "पानो मेटियाको छ।\nमेटियाका और सारियाका पानाहरूको सूची तल्तिर सन्दर्भखी लेखा दियाको छ।",
        "log-fulllog": "पूरा लग हेर",
        "edit-hook-aborted": "हुकले सम्पादन बन्द गरिदियो ।\nयेले कोइ कारण दिएन ।",
        "prefs-editor": "सम्पादक",
        "prefs-preview": "पूर्वावलोकन",
        "prefs-advancedrc": "उन्नत विकल्पहरू",
-       "prefs-advancedrendering": "à¤\89नà¥\8dनत à¤µà¤¿à¤\95लà¥\8dपहरà¥\81",
+       "prefs-advancedrendering": "à¤\89नà¥\8dनत à¤µà¤¿à¤\95लà¥\8dपहरà¥\82",
        "prefs-advancedsearchoptions": "उन्नत विकल्पहरू",
        "prefs-advancedwatchlist": "उन्नत विकल्पहरू",
        "prefs-displayrc": "धेकिन्या विकल्पहरू",
index 615c4c1..dcb9f4c 100644 (file)
        "category-file-count-limited": "Η τρέχουσα κατηγορία περιέχει {{PLURAL:$1|το ακόλουθο αρχείο|τα ακόλουθα $1 αρχεία}}.",
        "listingcontinuesabbrev": "συνεχίζεται",
        "index-category": "Σελίδες καταλογογραφημένες για μηχανές αναζήτησης",
-       "noindex-category": "ΣελίδεÏ\82 Î¼Î· ÎºÎ±Ï\84αλογογÏ\81αÏ\86ημένες",
+       "noindex-category": "Î\9cη ÎºÎ±Ï\84αλογογÏ\81αÏ\86ημένεÏ\82 Ï\83ελίδες",
        "broken-file-category": "Σελίδες με κατεστραμμένους συνδέσμους",
        "about": "Σχετικά",
        "article": "Σελίδα περιεχομένου",
        "cannotlogin-text": "Η σύνδεση δεν είναι δυνατή.",
        "cannotloginnow-title": "Δεν μπορείτε να συνδεθείτε τώρα",
        "cannotloginnow-text": "Η σύνδεση δεν είναι δυνατή όταν χρησιμοποιείτε την $1.",
+       "cannotcreateaccount-title": "Αδυναμία δημιουργίας λογαριασμού",
        "yourdomainname": "Το domain σας:",
        "password-change-forbidden": "Δεν μπορείτε να αλλάξετε τους κωδικούς πρόσβασης σε αυτό το βίκι.",
        "externaldberror": "Είτε συνέβη κάποιο σφάλμα εξωτερικής πιστοποίησης της βάσης δεδομένων είτε δεν σας έχει επιτραπεί να ενημερώσετε τον εξωτερικό σας λογαριασμό.",
        "continue-editing": "Μεταβείτε στην περιοχή επεξεργασίας",
        "previewconflict": "Αυτή η προεπισκόπηση απεικονίζει το κείμενο στην επάνω περιοχή επεξεργασίας κειμένου, όπως θα εμφανιστεί εάν επιλέξετε να το αποθηκεύσετε.",
        "session_fail_preview": "'''Συγγνώμη! Δεν μπορούσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.\nΠαρακαλώ προσπαθήστε ξανά. Αν δεν δουλεύει ξανά, δοκιμάστε να [[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε πάλι.'''",
-       "session_fail_preview_html": "'''Λυπούμαστε! Δεν μπορέσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.'''\n\n''Επειδή το {{SITENAME}} επιτρέπει την εισαγωγή ακατέργαστου HTML, η προεπισκόπηση είναι κρυμμένη ως προφύλαξη ενάντια σε επιθέσεις με Javascript.''\n\n'''Αν αυτή είναι μια έγκυρη προσπάθεια επεξεργασίας, παρακαλώ προσπαθήστε ξανά. Αν πάλι δε δουλεύει, δοκιμάστε να αποσυνδεθείτε και να συνδεθείτε πάλι.'''",
+       "session_fail_preview_html": "'''Λυπούμαστε! Δεν μπορέσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.'''\n\n<em>Επειδή το {{SITENAME}} επιτρέπει την εισαγωγή ακατέργαστου HTML, η προεπισκόπηση είναι κρυμμένη ως προφύλαξη ενάντια σε επιθέσεις με Javascript.</em>\n\n<strong>Αν αυτή είναι μια έγκυρη προσπάθεια επεξεργασίας, παρακαλώ προσπαθήστε ξανά..</strong> Αν και πάλι δε λειτουργεί, δοκιμάστε να [[[[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε πάλι και δείτε αν ο φυλλομετρητής σας επιτρέπει cookies απ'αυτόν τον ιστότοπο.",
        "token_suffix_mismatch": "'''Η επεξεργασία σας απορρίφθηκε γιατί το πρόγραμμα-πελάτη σας κατακρεούργησε τους χαρακτήρες στίξης στο κουπόνι επεξεργασίας. Η επεξεργασία απορρίφθηκε για να αποφευχθεί η παραφθορά του κειμένου της σελίδας.\nΑυτό μερικές φορές συμβαίνει όταν χρησιμοποιείται ένας ανώνυμος διακομιστής μεσολάβησης διαθέσιμος μέσω του παγκόσμιου ιστού με σφάλματα.'''",
        "edit_form_incomplete": "'''Ορισμένα τμήματα της φόρμας επεξεργασίας δεν έφθασαν στο διακομιστή. Ελέγξτε ότι οι αλλαγές σας είναι άθικτες και προσπαθήστε ξανά.'''",
        "editing": "Επεξεργασία $1",
        "searchprofile-advanced-tooltip": "Αναζήτηση σε προσαρμοσμένους ονοματοχώρους",
        "search-result-size": "$1 ({{PLURAL:$2|1 λέξη|$2 λέξεις}})",
        "search-result-category-size": "{{PLURAL:$1|1 μέλος|$1 μέλη}} ({{PLURAL:$2|1 υποκατηγορία|$2 υποκατηγορίες}}, {{PLURAL:$3|1 αρχείο|$3 αρχεία}})",
-       "search-redirect": "(ανακατεύθυνση $1)",
+       "search-redirect": "(ανακατεύθυνση από $1)",
        "search-section": "(ενότητα $1)",
        "search-category": "(κατηγορία $1)",
        "search-file-match": "(ταιριάζει με το περιεχόμενο του αρχείου)",
        "userrights-changeable-col": "Ομάδες που μπορείτε να αλλάξετε",
        "userrights-unchangeable-col": "Ομάδες που δεν μπορείτε να αλλάξετε",
        "userrights-conflict": "Σύγκρουση αλλαγών στα δικαιώματα χρήστη! Παρακαλώ επανεξετάστε και επικυρώστε τις αλλαγές σας.",
-       "userrights-removed-self": "Έχετε καταργήσει επιτυχώς τα δικά σας δικαιώματα. Ως εκ τούτου, δεν είστε πλέον σε θέση να έχετε πρόσβαση σε αυτή τη σελίδα.",
+       "userrights-removed-self": "Έχετε καταργήσει τα δικά σας δικαιώματα. Ως εκ τούτου, δεν είστε πλέον σε θέση να έχετε πρόσβαση σε αυτή τη σελίδα.",
        "group": "Ομάδα:",
        "group-user": "Χρήστες",
        "group-autoconfirmed": "Αυτοεπιβεβαιωμένοι χρήστες",
        "right-override-export-depth": "Εξαγωγή σελίδων συμπεριλαμβάνοντας συνδεδεμένες σελίδες έως ένα βάθος 5 επιπέδων",
        "right-sendemail": "Αποστολή ηλεκτρονικού μηνύματος σε άλλους χρήστες",
        "right-passwordreset": "Εμφάνιση email επαναφοράς κωδικού πρόσβασης",
-       "right-managechangetags": "Δημιουργία και διαγραφή [[Special:Tags|ετικετών]] από τη βάση δεδομένων",
+       "right-managechangetags": "Δημιουργία και (απ)ενεργοποίηση [[Special:Tags|ετικετών]]",
        "right-applychangetags": "Εφαρμόστε [[Special:Tags|ετικέτες]] μαζί με τις αλλαγές",
        "right-changetags": "Προσθέστε και αφαιρέστε αυθαίρετες [[Special:Tags|ετικέτες]] σε μεμονωμένες εκδόσεις και καταχωρήσεις καταγραφών",
+       "right-deletechangetags": "Διαγραφή [[Special:Tags|ετικετών]] από τη βάση δεδομένων",
        "grant-group-page-interaction": "Αλληλεπίδραση με σελίδες",
        "grant-group-file-interaction": "Αλληλεπίδραση με πολυμέσα",
        "grant-group-watchlist-interaction": "Αλληλεπίδραση με τη λίστα παρακολούθησής σου",
        "htmlform-cloner-create": "Προσθήκη περισσοτέρων",
        "htmlform-cloner-delete": "Αφαίρεση",
        "htmlform-cloner-required": "Απαιτείται τουλάχιστον μία τιμή.",
+       "htmlform-date-placeholder": "ΕΕΕΕ-ΜΜ-ΗΗ",
+       "htmlform-date-invalid": "Η τιμή που καθορίσατε δεν είναι μια αναγνωρισμένη ημερομηνία. Δοκιμάστε να χρησιμοποιήσετε τη μορφή ΕΕΕΕ-MM-ΗΗ.",
        "htmlform-title-badnamespace": "[[:$1]] δεν είναι στο \"{{ns:$2}}\" ονοματοχώρο.",
        "htmlform-title-not-creatable": "\"$1\" - η  σελίδα τίτλου δεν είναι δυνατόν να δημιουργηθεί",
        "htmlform-title-not-exists": "Το $1 δεν υπάρχει.",
        "feedback-close": "Ολοκληρώθηκε",
        "feedback-dialog-title": "Υποβολή παρατηρήσεων",
        "feedback-dialog-intro": "Μπορείτε να χρησιμοποιήσετε την παρακάτω εύκολη φόρμα για να υποβάλετε τις παρατηρήσεις σας. Το σχόλιό σας θα προστεθεί στην σελίδα «$1», μαζί με το όνομα χρήστη σας.",
-       "feedback-error-title": "Σφάλμα",
        "feedback-error1": "Σφάλμα: Μη αναγνωρίσιμο αποτέλεσμα από το API",
        "feedback-error2": "Σφάλμα: Η επεξεργασία απέτυχε",
        "feedback-error3": "Σφάλμα: Καμία απάντηση από το API",
index 36f7461..f30c038 100644 (file)
        "newimages-showbots": "Show uploads by bots",
        "newimages-hidepatrolled": "Hide patrolled uploads",
        "noimages": "Nothing to see.",
+       "gallery-slideshow-toggle": "Toggle thumbnails",
        "ilsubmit": "Search",
        "bydate": "by date",
        "sp-newimages-showfrom": "Show new files starting from $2, $1",
        "feedback-thanks": "Thanks! Your feedback has been posted to the page \"[$2 $1]\".",
        "feedback-thanks-title": "Thank you!",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "Search",
+       "searchsuggest-search": "Search {{SITENAME}}",
        "searchsuggest-containing": "containing...",
        "api-error-autoblocked": "Your IP address has been blocked automatically, because it was used by a blocked user.",
        "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
        "usercssispublic": "Please note: CSS subpages should not contain confidential data as they are viewable by other users.",
        "restrictionsfield-badip": "Invalid IP address or range: $1",
        "restrictionsfield-label": "Allowed IP ranges:",
-       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "edit-error-short": "Error: $1",
+       "edit-error-long": "Errors:\n\n$1"
 }
index 83a8456..ac7e828 100644 (file)
@@ -48,7 +48,8 @@
                        "Zciric",
                        "Psychoslave",
                        "Orikrin1998",
-                       "Gamliel Fishkin"
+                       "Gamliel Fishkin",
+                       "Kastanoto"
                ]
        },
        "tog-underline": "Substrekado de ligiloj:",
        "talk": "Diskuto",
        "views": "Vidoj",
        "toolbox": "Iloj",
+       "tool-link-userrights": "Ŝanĝi grupojn de ĉi tiu {{GENDER:$1|uzanto}}",
+       "tool-link-emailuser": "Sendi retpoŝton al ĉi tiu {{GENDER:$1|uzanto}}",
        "userpage": "Vidi uzantopaĝon",
        "projectpage": "Rigardi projektopaĝon",
        "imagepage": "Vidi dosieropaĝon",
        "searchprofile-advanced-tooltip": "Serĉi en specialaj nomspacoj",
        "search-result-size": "$1 ({{PLURAL:$2|1 vorto|$2 vortoj}})",
        "search-result-category-size": "{{PLURAL:$1|1 membro|$1 membroj}} ({{PLURAL:$2|1 subkategorio|$2 subkategorioj}}, {{PLURAL:$3|1 dosiero|$3 dosieroj}})",
-       "search-redirect": "(alidirektilo $1)",
+       "search-redirect": "(aldirekto el $1)",
        "search-section": "(sekcio $1)",
        "search-category": "(kategorio $1)",
        "search-file-match": "(kongruas kun dosiera enhavo)",
        "emailccsubject": "Kopio de via mesaĝo al $1: $2",
        "emailsent": "Retmesaĝo sendita",
        "emailsenttext": "Via retmesaĝo estas sendita.",
-       "emailuserfooter": "Ĉi tiun retpoŝton estis sendita far $1 al $2 per la funkcio \"{{int:emailuser}}\" el {{SITENAME}}.",
+       "emailuserfooter": "Ĉi tiu retpoŝtmesaĝo estis {{GENDER:$1|sendita}} de $1 al {{GENDER:$2|$2}} per la funkcio \"{{int:emailuser}}\" ĉe {{SITENAME}}.",
        "usermessage-summary": "Lasanta sisteman mesaĝon.",
        "usermessage-editor": "Mesaĝanto de sistemo",
        "watchlist": "Mia atentaro",
index 700f4e0..efd19f3 100644 (file)
        "userlogin-remembermypassword": "Mantener mi sesión iniciada",
        "userlogin-signwithsecure": "Usar conexión segura",
        "cannotlogin-title": "No se puede iniciar sesión",
+       "cannotlogin-text": "No ha sido posible iniciar sesión.",
        "cannotloginnow-title": "No se puede iniciar sesión ahora",
        "cannotloginnow-text": "No se puede iniciar sesión cuando se usa $1.",
        "cannotcreateaccount-title": "No se pueden crear cuentas",
        "eauthentsent": "Se ha enviado un correo electrónico de confirmación a la dirección especificada.\nAntes de que se envíe cualquier otro correo a la cuenta tienes que seguir las instrucciones enviadas en el mensaje para así confirmar que la dirección te pertenece.",
        "throttled-mailpassword": "Ya se ha enviado un recordatorio de contraseña en {{PLURAL:$1|la última hora|las últimas $1 horas}}.\nPara evitar los abusos, solo se enviará un recordatorio de contraseña cada {{PLURAL:$1|hora|$1 horas}}.",
        "mailerror": "Error al enviar el mensaje: $1",
-       "acct_creation_throttle_hit": "Los visitantes a este wiki usando tu dirección IP han creado {{PLURAL:$1|una cuenta|$1 cuentas}} en el último día, lo cual es lo máximo permitido en este periodo de tiempo.\nComo resultado, los visitantes usando esta dirección IP no pueden crear más cuentas en este momento.",
+       "acct_creation_throttle_hit": "Los visitantes a este wiki usando tu dirección IP han creado {{PLURAL:$1|una cuenta|$1 cuentas}} en el último $2, lo cual es lo máximo permitido en este periodo de tiempo.\nComo resultado, los visitantes usando esta dirección IP no pueden crear más cuentas en este momento.",
        "emailauthenticated": "Tu dirección de correo electrónico fue confirmada el $2 a las $3.",
        "emailnotauthenticated": "Aún no has confirmado tu dirección de correo electrónico.\nHasta que lo hagas, las siguientes funciones no estarán disponibles.",
        "noemailprefs": "Especifica una dirección electrónica para habilitar estas características.",
        "invalid-content-data": "Datos de contenido incorrectos",
        "content-not-allowed-here": "El contenido «$1» no está permitido en la página [[$2]]",
        "editwarning-warning": "Se perderán los cambios si se cierra esta página.\nSi has iniciado sesión, puedes desactivar este aviso en la sección «{{int:prefs-editing}}» de las preferencias.",
+       "editpage-invalidcontentmodel-title": "Modelo de contenido no soportado",
+       "editpage-invalidcontentmodel-text": "El modelo de contenido \"$1\" no se admite.",
        "editpage-notsupportedcontentformat-title": "Formato de contenido no compatible",
        "editpage-notsupportedcontentformat-text": "El formato de contenido $1 no es compatible con el modelo de contenido $2.",
        "content-model-wikitext": "texto wiki",
        "searchprofile-advanced-tooltip": "Buscar en espacios de nombres personalizados",
        "search-result-size": "$1 ({{PLURAL:$2|1 palabra|$2 palabras}})",
        "search-result-category-size": "{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategorías}}, {{PLURAL:$3|1 archivo|$3 archivos}})",
-       "search-redirect": "(redirige desde $1)",
+       "search-redirect": "(redirección desde $1)",
        "search-section": "(sección $1)",
        "search-category": "(categoría $1)",
        "search-file-match": "(coincide con el contenido del archivo)",
        "apisandbox-results-fixtoken-fail": "No fue posible recuperar el token \"$1\".",
        "apisandbox-alert-page": "Los campos de esta página no son válidos.",
        "apisandbox-alert-field": "El valor de este campo no es válido.",
+       "apisandbox-continue": "Continuar",
+       "apisandbox-continue-clear": "Vaciar",
        "booksources": "Fuentes de libros",
        "booksources-search-legend": "Buscar fuentes de libros",
        "booksources-search": "Buscar",
        "undeletedrevisions": "{{PLURAL:$1|Una revisión restaurada|$1 revisiones restauradas}}",
        "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivo|$2 archivos}} restaurados",
        "undeletedfiles": "$1 {{PLURAL:$1|archivo restaurado|archivos restaurados}}",
-       "cannotundelete": "Hubo un error durante la restauración:\n$1",
+       "cannotundelete": "Hubo un error en la totalidad o en parte del proceso de la restauración:\n$1",
        "undeletedpage": "<strong>Se ha restaurado $1</strong>\n\nConsulta el [[Special:Log/delete|registro de borrados]] para ver una lista de los últimos borrados y restauraciones.",
        "undelete-header": "En el [[Special:Log/delete|registro de borrados]] se listan las páginas eliminadas.",
        "undelete-search-title": "Buscar páginas borradas",
        "tag-filter": "Filtro de [[Special:Tags|etiquetas]]:",
        "tag-filter-submit": "Filtro",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)",
+       "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",
        "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",
        "unlinkaccounts-success": "Se ha desvinculado la cuenta.",
        "authenticationdatachange-ignored": "El cambio den los datos de autentificacion no fue realizado. ¿Tal vez, no se configuró un proveedor?",
        "userjsispublic": "Recuerda: las subpáginas JavaScript no deberían contener datos confidenciales, pues otros usuarios los pueden ver.",
-       "usercssispublic": "Recuerda: las subpáginas CSS no deberían contener datos confidenciales, pues otros usuarios los pueden ver."
+       "usercssispublic": "Recuerda: las subpáginas CSS no deberían contener datos confidenciales, pues otros usuarios los pueden ver.",
+       "restrictionsfield-badip": "Dirección IP o rango inválido: $1",
+       "restrictionsfield-label": "Rangos de IP permitidos:"
 }
index 530e319..b131438 100644 (file)
        "talk": "Arutelu",
        "views": "vaatamisi",
        "toolbox": "Tööriistad",
+       "tool-link-userrights": "Muuda {{GENDER:$1|kasutajarühmi}}",
+       "tool-link-emailuser": "Saada {{GENDER:$1|kasutajale}} e-kiri",
        "userpage": "Vaata kasutajalehekülge",
        "projectpage": "Vaata projektilehekülge",
        "imagepage": "Vaata faililehekülge",
        "databaseerror-error": "Tõrge: $1",
        "transaction-duration-limit-exceeded": "Selleks et vältida tiražeerimise suurt mahajäämust, on see tehing katkestatud, kuna kirjutamise kestus ($1) ületas {{PLURAL:$2|$2}} sekundi piirangut.\nKui muudad korraga palju üksusi, siis proovi selle asemel teha mitu väiksemat toimingut.",
        "laggedslavemode": "Hoiatus: Leheküljel võivad puududa viimased uuendused.",
-       "readonly": "Andmebaas on hetkel kirjutuskaitse all",
+       "readonly": "Andmebaas lukustatud",
        "enterlockreason": "Sisesta lukustamise põhjus ning juurdepääsu taastamise ligikaudne aeg",
        "readonlytext": "Andmebaas on praegu lukustatud. Uusi sissekandeid ja muid muudatusi ei saa teha. Tõenäoliselt toimub andmebaasi plaanipärane hooldus, mille järel tavaline olukord taastub.\nSüsteemiadministraator, kes andmebaasi lukustas, andis järgmise selgituse: $1",
        "missing-article": "Andmebaas ei leidnud küsitud lehekülje \"$1\" $2 teksti.\n\nPõhjuseks võib olla võrdlus- või ajaloolink kustutatud leheküljele.\n\nKui tegemist ei ole nimetatud olukorraga, võib tegu olla ka süsteemi veaga.\nSellisel juhul tuleks teavitada [[Special:ListUsers/sysop|administraatorit]], edastades talle ka käesoleva lehe internetiaadressi.",
        "internalerror-fatal-exception": "Saatuslik erandtöötluse tõrge: $1",
        "filecopyerror": "Ei saanud faili \"$1\" kopeerida nimega \"$2\".",
        "filerenameerror": "Ei saanud faili \"$1\" failiks \"$2\" ümber nimetada.",
-       "filedeleteerror": "Faili nimega \"$1\" ei ole võimalik kustutada.",
+       "filedeleteerror": "Faili \"$1\" ei õnnestunud kustutada.",
        "directorycreateerror": "Kataloogi \"$1\" ei saanud luua.",
        "directoryreadonlyerror": "Kataloog \"$1\" on kirjutuskaitstud.",
        "directorynotreadableerror": "Kataloog \"$1\" pole loetav.",
        "myprivateinfoprotected": "Sul pole lubatud oma eraandmeid redigeerida.",
        "mypreferencesprotected": "Sul pole lubatud oma eelistusi muuta.",
        "ns-specialprotected": "Erilehekülgi ei saa redigeerida.",
-       "titleprotected": "Kasutaja [[User:$1|$1]] on selle pealkirjaga lehe loomise keelanud esitades järgmise põhjenduse: <em>$2</em>.",
+       "titleprotected": "Kasutaja [[User:$1|$1]] on selle pealkirjaga lehekülje loomise keelanud, esitades järgmise põhjenduse: <em>$2</em>.",
        "filereadonlyerror": "Faili \"$1\" ei saa muuta, sest hoidla \"$2\" on kirjutuskaitstud.\n\nSüsteemiadministraator lukustas selle järgmisel põhjusel: \"$3\".",
        "invalidtitle-knownnamespace": "Vigane pealkiri nimeruumis \"$2\" tekstiga \"$3\"",
        "invalidtitle-unknownnamespace": "Vigane pealkiri nimeruuminumbriga $1 ja tekstiga \"$2\"",
        "password-change-forbidden": "Selles vikis ei saa paroole muuta.",
        "externaldberror": "Esines autentimistõrge või sul pole õigust konto andmeid muuta.",
        "login": "Sisselogimine",
+       "login-security": "Identsuskontroll",
        "nav-login-createaccount": "Logi sisse või registreeru kasutajaks",
        "userlogin": "Sisselogimine või kasutajakonto loomine",
        "userloginnocreate": "Sisselogimine",
        "userlogin-resetpassword-link": "Kas unustasid parooli?",
        "userlogin-helplink2": "Sisselogimisabi",
        "userlogin-loggedin": "Oled juba sisse logitud nimega {{GENDER:$1|$1}}.\nKasuta allolevat vormi, et logida sisse teise kasutajaga.",
+       "userlogin-reauth": "Pead uuesti sisse logima tõestamaks, et oled {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Loo teine konto",
        "createacct-emailrequired": "E-posti aadress",
        "createacct-emailoptional": "E-posti aadress (valikuline)",
        "resetpass-temp-password": "Ajutine parool:",
        "resetpass-abort-generic": "Tarkvaralisa on paroolimuudatuse abortinud.",
        "resetpass-expired": "Sinu parool on iganenud. Palun määra uus parool, et sisse logida.",
-       "resetpass-expired-soft": "Sinu parool on iganenud ja tuleb uuesti määrata. Palun vali kohe uus parool või klõpsa \"{{int:authprovider-resetpass-skip-label}}\", et määrata see hiljem.",
-       "resetpass-validity-soft": "Sinu parool ei sobi: $1\n\nPalun vali kohe uus parool või klõpsa \"{{int:authprovider-resetpass-skip-label}}\", et see hiljem uuesti määrata.",
+       "resetpass-expired-soft": "Sinu parool on iganenud ja tuleb uuesti määrata. Palun vali kohe uus parool või klõpsa nuppu \"{{int:authprovider-resetpass-skip-label}}\", et määrata see hiljem.",
+       "resetpass-validity-soft": "Sinu parool ei sobi: $1\n\nPalun vali kohe uus parool või klõpsa nuppu \"{{int:authprovider-resetpass-skip-label}}\", et see hiljem uuesti määrata.",
        "passwordreset": "Parooli lähtestamine",
        "passwordreset-text-one": "Täida see vorm, et oma parool lähtestada.",
        "passwordreset-text-many": "{{PLURAL:$1|Täida üks väljadest, et saada e-kiri ajutise parooliga.}}",
        "changecontentmodel-title-label": "Lehekülje pealkiri",
        "changecontentmodel-model-label": "Uus sisumudel",
        "changecontentmodel-reason-label": "Põhjus:",
+       "changecontentmodel-submit": "Muuda",
        "changecontentmodel-success-title": "Sisumudel on muudetud",
        "changecontentmodel-success-text": "Lehekülje [[:$1]] sisumudel on muudetud.",
        "changecontentmodel-cannot-convert": "Lehekülje [[:$1]] sisumudelit ei saa teisendada tüübiks $2.",
        "sp-contributions-username": "IP-aadress või kasutajanimi:",
        "sp-contributions-toponly": "Ainult uusimad redaktsioonid",
        "sp-contributions-newonly": "Näita ainult uute lehekülgedega alustamist",
+       "sp-contributions-hideminor": "Peida pisimuudatused",
        "sp-contributions-submit": "Otsi",
        "whatlinkshere": "Lingid siia",
        "whatlinkshere-title": "Leheküljed, mis viitavad lehele \"$1\"",
        "pageinfo-article-id": "Lehekülje identifikaator",
        "pageinfo-language": "Lehekülje sisu keel",
        "pageinfo-content-model": "Lehekülje sisumudel",
+       "pageinfo-content-model-change": "muuda",
        "pageinfo-robot-policy": "Robotindekseering",
        "pageinfo-robot-index": "Lubatud",
        "pageinfo-robot-noindex": "Keelatud",
        "feedback-thanks": "Aitäh! Sinu tagasiside on postitatud leheküljele \"[$2 $1]\".",
        "feedback-thanks-title": "Aitäh!",
        "feedback-useragent": "Kasutajaagent:",
-       "searchsuggest-search": "Otsi",
+       "searchsuggest-search": "Otsi {{GRAMMAR:elative|{{SITENAME}}}}",
        "searchsuggest-containing": "sisalduv...",
        "api-error-badaccess-groups": "Sul pole selles vikis üleslaadimisõigust.",
        "api-error-badtoken": "Sisemine tõrge: Sobimatu nimi.",
        "mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
        "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
        "randomrootpage": "Juhuslik juurlehekülg",
+       "authmanager-provider-password": "Paroolipõhine autentimine",
+       "authmanager-provider-password-domain": "Parooli- ja domeenipõhine autentimine",
+       "authmanager-provider-temporarypassword": "Ajutine parool",
+       "changecredentials": "Autentimisandmete muutmine",
+       "changecredentials-submit": "Muuda autentimisandmed",
+       "changecredentials-success": "Sinu autentimisandmed on muudetud.",
+       "removecredentials": "Autentimisandmete eemaldamine",
+       "removecredentials-submit": "Eemalda autentimisandmed",
+       "removecredentials-success": "Sinu autentimisandmed on eemaldatud.",
+       "credentialsform-provider": "Andmete tüüp:",
+       "credentialsform-account": "Konto nimi:",
        "userjsispublic": "Pea silmas, et JavaScripti alamleheküljed ei tohiks sisaldada konfidentsiaalseid andmeid, kuna neid näevad teised kasutajad."
 }
index 0fbbe20..e2feef4 100644 (file)
        "talk": "بحث",
        "views": "بازدیدها",
        "toolbox": "ابزارها",
+       "tool-link-userrights": "تغییر گروه‌های {{GENDER:$1|کاربر}}",
+       "tool-link-emailuser": "فرستادن نامه به {{GENDER:$1|کاربر}}",
        "userpage": "نمایش صفحهٔ کاربر",
        "projectpage": "نمایش صفحهٔ پروژه",
        "imagepage": "نمایش صفحهٔ پرونده",
        "botpasswords-label-resetpassword": "بازگردانی گذرواژه",
        "botpasswords-label-grants": "اعطاهای اجرا شدنی:",
        "botpasswords-help-grants": "هر اجازه به حقوق کاربری که یک حساب کاربری دارد. [[Special:ListGrants|table of grants]] را برای اطلاعات بیشتر مشاهده کنید.",
-       "botpasswords-label-restrictions": "محدودیت استفاده:",
        "botpasswords-label-grants-column": "اعطا شد",
        "botpasswords-bad-appid": "نام ربات \"$1\" معتبر نیست.",
        "botpasswords-insert-failed": "شکست در افزودن نام ربات «$1». در حال حاضر اضافه شده است؟",
        "feedback-external-bug-report-button": "پرونده‌سازی یک عمل فنی",
        "feedback-dialog-title": "ارسال یک بازخورد",
        "feedback-dialog-intro": "شما می توانید از فرم زیر برای بازخورد استفاده کنید. متن شما همراه با نام کاربریتان به صفحهٔ \"$1\" افزوده خواهد شد.",
-       "feedback-error-title": "خطا",
        "feedback-error1": "خطا: پاسخ‌های ناشناخته از رابط برنامه‌نویسی نرم‌افزار",
        "feedback-error2": "خطا: شکست در ویرایش",
        "feedback-error3": "خطا: عدم پاسخ از رابط برنامه‌نویسی نرم‌افزار",
index d74dd1e..9720a86 100644 (file)
        "talk": "Keskustelu",
        "views": "Näkymät",
        "toolbox": "Työkalut",
+       "tool-link-userrights": "Muokkaa {{GENDER:$1|käyttäjän}} ryhmiä",
+       "tool-link-emailuser": "Lähetä sähköpostia tälle {{GENDER:$1|käyttäjälle}}",
        "userpage": "Näytä käyttäjäsivu",
        "projectpage": "Näytä projektisivu",
        "imagepage": "Näytä tiedostosivu",
        "botpasswords-updated-body": "Bottisalasana käyttäjän \"$2\" bottinimelle \"$1\" päivitettiin.",
        "botpasswords-deleted-title": "Bottisalasana poistettu",
        "botpasswords-deleted-body": "Bottisalasana käyttäjän \"$2\" bottinimelle \"$1\" poistettiin.",
-       "botpasswords-newpassword": "Uusi salasana kirjautumiseen käyttäjällä <strong>$1</strong> on <strong>$2</strong>. <em>Säilytä tämä myöhempää käyttöä varten.</em>",
+       "botpasswords-newpassword": "Uusi salasana kirjautumiseen käyttäjällä <strong>$1</strong> on <strong>$2</strong>. <em>Säilytä tämä myöhempää käyttöä varten.</em> <br> (Vanhoilla boteilla, jotka vaativat kirjautumisnimen olevan sama kuin lopullinen käyttäjänimi, voit myös käyttää nimeä <strong>$3</strong> ja salasanaa <strong>$4</strong>.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider ei ole saatavilla.",
        "botpasswords-restriction-failed": "Bottisalasanan rajoitukset estävät tämän sisäänkirjautumisen.",
        "botpasswords-invalid-name": "Annetussa käyttäjätunnuksessa ei ole bottisalasanan erotinta (\"$1\").",
        "passwordreset-emailsentusername": "Jos on olemassa vastaava rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
        "passwordreset-emailsent-capture2": "Salasananpalautus{{PLURAL:$1|sähköposti|sähköpostit}} on lähetetty. {{PLURAL:$1|Käyttäjä ja salasana|Luettelo käyttäjistä ja salasanoista}} näytetään alapuolella.",
        "passwordreset-emailerror-capture2": "Sähköpostin lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1 {{PLURAL:$3|Käyttäjänimi ja salasana|Luettelo käyttäjänimistä ja salasanoista}} näytetään alla.",
+       "passwordreset-ignored": "Salasanan palauttamista ei käsitelty. Ehkä tarjoajaa ei ollut määritetty?",
        "passwordreset-invalideamil": "Virheellinen sähköpostiosoite",
        "passwordreset-nodata": "Käyttäjätunnusta ja salasanaa ei annettu",
        "changeemail": "Muuta tai poista sähköpostiosoite",
        "invalid-content-data": "Virheellinen sisältö",
        "content-not-allowed-here": "Sivun [[$2]] sisältö ei voi olla tyyppiä $1.",
        "editwarning-warning": "Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.\nJos olet kirjautunut sisään, voit poistaa tämän varoituksen käytöstä omien asetuksien osiossa \"{{int:prefs-editing}}\".",
+       "editpage-invalidcontentmodel-title": "Sisältömalli ei ole tuettu",
+       "editpage-invalidcontentmodel-text": "Sisältömalli \"$1\" ei ole tuettu.",
        "editpage-notsupportedcontentformat-title": "Sisällön muotoa ei tueta",
        "editpage-notsupportedcontentformat-text": "Sisällön muotoa $1 ei tueta sisältömallilla $2.",
        "content-model-wikitext": "wikiteksti",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tyhjä objekti",
        "content-json-empty-array": "Tyhjä array",
+       "deprecated-self-close-category": "Sivut, joissa on virheellisiä itsensäsulkevia HTLM-tageja",
+       "deprecated-self-close-category-desc": "Sivulla on virheellisiä itsensäsulkevia HTML-tageja, kuten <code>&lt;b/></code> tai <code>&lt;span/></code>. Niiden käyttäytyminen muuttuu pian HTLM5:n määritysten mukaiseksi, joten niiden käyttö wikitekstissä on vanhentunut.",
        "duplicate-args-warning": "<strong>Varoitus:</strong> [[:$1]] kutsuu mallinetta [[:$2]] niin, että parametrille \"$3\" on annettu enemmän kuin yksi arvo. Ainoastaan viimeksi annettu arvo otetaan huomioon.",
        "duplicate-args-category": "Sivut, jotka käyttävät kaksinkertaisia argumentteja mallinekutsuissa",
        "duplicate-args-category-desc": "Tämä sivu sisältää sellaisia mallinekutsuja, jotka käyttävät kaksi kertaa samaa argumenttia kuten <nowiki>{{foo|bar=1|bar=2}}</nowiki></code> taikka <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "searchprofile-advanced-tooltip": "Etsi määritellyistä nimiavaruuksista",
        "search-result-size": "$1 ({{PLURAL:$2|1 sana|$2 sanaa}})",
        "search-result-category-size": "{{PLURAL:$1|1 jäsen|$1 jäsentä}} ({{PLURAL:$2|1 alaluokka|$2 alaluokkaa}}, {{PLURAL:$3|1 tiedosto|$3 tiedostoa}})",
-       "search-redirect": "(ohjaus $1)",
+       "search-redirect": "(ohjaus sivulta $1)",
        "search-section": "(osio $1)",
        "search-category": "(luokka $1)",
        "search-file-match": "(vastaa tiedoston sisältöä)",
        "action-applychangetags": "käyttää merkkauksia muutostesi yhteydessä",
        "action-changetags": "lisätä ja poistaa satunnaisia merkkauksia yksittäisissä sivuversioissa ja lokimerkinnöissä",
        "action-deletechangetags": "poistaa merkkauksia tietokannasta",
+       "action-purge": "päivittää tämän sivun välimuistia",
        "nchanges": "$1 {{PLURAL:$1|muutos|muutosta}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|viimeisen käynnin jälkeen}}",
        "enhancedrc-history": "historia",
        "file-thumbnail-no": "Tiedostonimi alkaa merkkijonolla <strong>$1</strong>. Tiedosto näyttäisi olevan pienennetty kuva.\nJos sinulla on tämän kuvan alkuperäinen versio, tallenna se. Muussa tapauksessa nimeä tiedosto uudelleen.",
        "fileexists-forbidden": "Samanniminen tiedosto on jo olemassa, eikä sen tilalle voi tallentaa uutta. \nJos kuitenkin haluat tallentaa tiedostosi, palaa takaisin ja käytä jotain toista nimeä. \n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Samanniminen tiedosto on jo olemassa jaetussa mediavarastossa. Tallenna tiedosto jollakin toisella nimellä. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Tallennettava tiedosto on tarkka kaksoiskappale tiedoston <strong>[[:$1]]</strong> nykyisestä versiosta.",
+       "fileexists-duplicate-version": "Tallennettava tiedosto on tarkka kaksoiskappale tiedoston <strong>[[:$1]]</strong> {{PLURAL:$2|vanhasta versiosta|vanhoista versioista}}.",
        "file-exists-duplicate": "Tämä tiedosto on kaksoiskappale {{PLURAL:$1|seuraavasta tiedostosta|seuraavista tiedostoista}}:",
        "file-deleted-duplicate": "Tiedosto, joka on identtinen tämän tiedoston kanssa ([[:$1]]) on aiemmin poistettu. Katso kyseisen tiedoston poistoloki ennen kuin jatkat uudelleentallentamista.",
        "file-deleted-duplicate-notitle": "Tämän tiedoston kanssa samanlainen tiedosto on aikaisemmin poistettu ja tiedoston nimi on häivytetty.\nSinun on syytä pyytää jotakuta häivytettyjen tietojen näkemiseen oikeutettua käyttäjää katsomaan tiedoston tiedot asian arvioimiseksi ennen kuin jatkat tiedoston lataamista tietokantaan.",
        "apisandbox-results-fixtoken": "Korjaa \"token\" ja lähetä uudelleen",
        "apisandbox-alert-page": "Tällä sivulla olevat kentät eivät ole kelvollisia.",
        "apisandbox-alert-field": "Tässä kentässä oleva arvo ei ole kelvollinen.",
+       "apisandbox-continue": "Jatka",
+       "apisandbox-continue-clear": "Tyhjennä",
        "booksources": "Kirjalähteet",
        "booksources-search-legend": "Etsi kirjalähteitä",
        "booksources-isbn": "ISBN",
        "undeletedrevisions": "{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin",
        "undeletedrevisions-files": "{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin",
        "undeletedfiles": "{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin",
-       "cannotundelete": "Palauttaminen epäonnistui:\n$1",
+       "cannotundelete": "Palauttaminen epäonnistui osittain tai kokonaan:\n$1",
        "undeletedpage": "'''$1 on palautettu.'''\n\n[[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
        "undelete-header": "[[Special:Log/delete|Poistolokissa]] on lista viimeisimmistä poistoista.",
        "undelete-search-title": "Etsi poistettuja sivuja",
        "sp-contributions-newbies-sub": "Uusien käyttäjien muokkaukset",
        "sp-contributions-newbies-title": "Uusien käyttäjien muokkaukset",
        "sp-contributions-blocklog": "estoloki",
-       "sp-contributions-suppresslog": "häivytetyt käyttäjän muokkaukset",
-       "sp-contributions-deleted": "poistetut muokkaukset",
+       "sp-contributions-suppresslog": "häivytetyt {{GENDER:$1|käyttäjän}} muokkaukset",
+       "sp-contributions-deleted": "poistetut {{GENDER:$1|käyttäjän}} muokkaukset",
        "sp-contributions-uploads": "tallennukset",
        "sp-contributions-logs": "lokit",
        "sp-contributions-talk": "keskustelu",
        "pageinfo-article-id": "Sivun tunnistenumero",
        "pageinfo-language": "Sivun sisällön kieli",
        "pageinfo-content-model": "Sivun sisältömalli",
+       "pageinfo-content-model-change": "muuta",
        "pageinfo-robot-policy": "Hakukonemerkinnät",
        "pageinfo-robot-index": "Indeksoitava",
        "pageinfo-robot-noindex": "Ei indeksoitava",
        "tag-filter": "[[Special:Tags|Merkkausten]] suodatin:",
        "tag-filter-submit": "Suodata",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merkkaus|Merkkaukset}}]]: $2)",
+       "tag-mw-contentmodelchange": "sisältömallin muutos",
+       "tag-mw-contentmodelchange-description": "Muokkaukset, jotka [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel muuttavat sivun sisältömallia]",
        "tags-title": "Merkkaukset",
        "tags-intro": "Tämä sivu luetteloi ne merkkaukset (''engl.'' tags), joilla ohjelmisto voi merkitä muokkauksia, ja mitä ne tarkoittavat.",
        "tags-tag": "Merkkauksen nimi",
        "htmlform-date-placeholder": "VVVV-KK-PP",
        "htmlform-time-placeholder": "TT:MM:SS",
        "htmlform-datetime-placeholder": "VVVV-KK-PP TT:MM:SS",
+       "htmlform-date-invalid": "Annettu arvo ei ole tunnistettava päivämäärä. Kokeile muotoa VVVV-KK-PP.",
+       "htmlform-time-invalid": "Annettu arvo ei ole tunnistettava aika. Kokeile muotoa TT:MM:SS.",
+       "htmlform-datetime-invalid": "Annettu arvo ei ole tunnistettava päivämäärä ja aika. Kokeile muotoa VVVV-KK-PP TT:MM:SS.",
+       "htmlform-date-toolow": "Annettu arvo on ennen aikaisinta sallittua päivämäärää $1.",
+       "htmlform-date-toohigh": "Annettu arvo on viimeisen sallitun päivämäärän $1 jälkeen.",
+       "htmlform-time-toolow": "Annettu arvo on ennen aikaisinta sallittua aikaa $1.",
+       "htmlform-time-toohigh": "Annettu arvo on viimeisen sallitun ajan $1 jälkeen.",
+       "htmlform-datetime-toolow": "Annettu arvo on ennen aikaisinta sallittua päivämäärää ja aikaa $1.",
+       "htmlform-datetime-toohigh": "Annettu arvo on viimeisen sallitun päivämäärän ja ajan $1 jälkeen.",
        "htmlform-title-badnamespace": "Sivu [[:$1]] ei ole nimiavaruudessa ”{{ns:$2}}”.",
        "htmlform-title-not-creatable": "”$1” ei kelpaa sivun nimeksi.",
        "htmlform-title-not-exists": "Sivua $1 ei ole olemassa.",
index ff2eb88..b60e9d1 100644 (file)
        "revdelete-radio-same": "(ne pas changer)",
        "revdelete-radio-set": "Masqué",
        "revdelete-radio-unset": "Visible",
-       "revdelete-suppress": "Supprimer également les données des administrateurs",
+       "revdelete-suppress": "Masquer également les données pour les administrateurs",
        "revdelete-unsuppress": "Enlever les restrictions sur les versions restaurées",
        "revdelete-log": "Motif :",
        "revdelete-submit": "Appliquer {{PLURAL:$1|à la révision sélectionnée|aux révisions sélectionnées}}",
        "newimages-showbots": "Afficher les imports faits par des robots",
        "newimages-hidepatrolled": "Masquer les téléchargements patrouillés",
        "noimages": "Aucune image à afficher.",
+       "gallery-slideshow-toggle": "Basculer les vignettes",
        "ilsubmit": "Rechercher",
        "bydate": "par date",
        "sp-newimages-showfrom": "Afficher les nouveaux fichiers à partir du $1 à $2",
        "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": "Afficher les modifications significatives",
+       "watchlisttools-view": "Afficher les modifications associées",
        "watchlisttools-edit": "Voir et modifier la liste de suivi",
        "watchlisttools-raw": "Modifier la liste de suivi en mode brut",
        "iranian-calendar-m1": "Farvardin",
        "tags-delete-title": "Supprimer la balise",
        "tags-delete-explanation-initial": "Vous êtes sur le point de supprimer la balise « $1 » de la base de données.",
        "tags-delete-explanation-in-use": "Elle sera supprimée de {{PLURAL:$2|$2 révision ou entrée de journal à laquelle|toutes les $2 révisions et/ou entrées de journal auxquelles}} elle est actuellement appliquée.",
-       "tags-delete-explanation-warning": "Cette action est <strong>irréversible</strong> et <strong>ne peut pas être annulée</strong>, même pas par les administrateurs de base de données. Soyez certain que c'est la balise que vous voulez supprimer.",
+       "tags-delete-explanation-warning": "Cette action est <strong>irréversible</strong> et <strong>ne peut pas être annulée</strong>, même pas par les administrateurs de base de données. Soyez certain que c'est cette balise que vous voulez supprimer.",
        "tags-delete-explanation-active": "<strong>La balise « $1 » est toujours active, et continuera à être appliquée dans le futur. </strong> Pour arrêter cela, allez à l'endroit (ou aux endroits) où la balise est appliquée, et désactivez la.",
        "tags-delete-reason": "Motif :",
        "tags-delete-submit": "Supprimer cette balise de manière irréversible",
        "log-description-managetags": "Cette page recense les tâches de maintenance liées aux [[Special:Tags|balises]]. Le journal contient uniquement les actions faites manuellement par un administrateur ; les balises peuvent être créées ou supprimées par le logiciel wiki sans que cette action ne soit inscrite dans ce journal.",
        "logentry-managetags-create": "$1 {{GENDER:$2|a créé}} la balise « $4 ».",
        "logentry-managetags-delete": "$1 {{GENDER:$2|a supprimé}} la balise « $4 » (retirée {{PLURAL:$5|d'une révision ou entrée de journal|de $5 révisions ou entrées de journal}})",
-       "logentry-managetags-activate": "$1 {{GENDER:$2|a activé}} la balise \"$4\" pour l’usage des utilisateurs et des robots",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|a activé}} la balise « $4 » pour l’usage des utilisateurs et des robots",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|a désactivé}} la balise « $4 » pour l’usage des utilisateurs et des robots",
        "log-name-tag": "Journal des balises",
        "log-description-tag": "Cette page montre quand des utilisateurs ont ajouté ou supprimé des [[Special:Tags|balises]] de révisions individuelles ou d’entrées de journal. Le journal ne liste pas les actions de marquage quand elles ont lieu au cours d’une modification, d’une suppression, ou d’une action semblable.",
        "feedback-thanks": "Merci ! Votre commentaire a été publié sur la page « [$2 $1] ».",
        "feedback-thanks-title": "Merci !",
        "feedback-useragent": "Agent utilisateur :",
-       "searchsuggest-search": "Rechercher",
+       "searchsuggest-search": "Rechercher sur {{SITENAME}}",
        "searchsuggest-containing": "contenant...",
        "api-error-autoblocked": "Votre adresse IP a été bloquée automatiquement, parce qu’elle a été utilisée par un utilisateur bloqué.",
        "api-error-badaccess-groups": "Vous n'êtes pas autorisé à verser des fichiers sur ce wiki.",
index 051e76b..dffca46 100644 (file)
        "searchprofile-advanced-tooltip": "Procurar nos espazos de nomes elixidos",
        "search-result-size": "$1 ({{PLURAL:$2|1 palabra|$2 palabras}})",
        "search-result-category-size": "{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoría|$2 subcategorías}}, {{PLURAL:$3|1 ficheiro|$3 ficheiros}})",
-       "search-redirect": "(redirixido desde $1)",
+       "search-redirect": "(redirección desde \"$1\")",
        "search-section": "(sección \"$1\")",
        "search-category": "(categoría $1)",
        "search-file-match": "(coincide co contido do ficheiro)",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "historial",
        "recentchanges": "Cambios recentes",
-       "recentchanges-legend": "Opcións dos cambios",
-       "recentchanges-summary": "Nesta páxina podes seguir as modificacións máis recentes feitas no wiki.",
+       "recentchanges-legend": "Opcións dos cambios recentes",
+       "recentchanges-summary": "Nesta páxina pode seguir as modificacións máis recentes feitas no wiki.",
        "recentchanges-noresult": "Non se produciron cambios que coincidisen con eses criterios durante o período especificado.",
        "recentchanges-feed-description": "Nesta fonte de novas pode seguir as modificacións máis recentes feitas no wiki.",
        "recentchanges-label-newpage": "Esta edición creou unha nova páxina",
        "newimages-showbots": "Mostrar as cargas feitas por bots",
        "newimages-hidepatrolled": "Ocultar as subas verificadas",
        "noimages": "Non hai imaxes para ver.",
+       "gallery-slideshow-toggle": "Intercambiar miniaturas",
        "ilsubmit": "Procurar",
        "bydate": "por data",
        "sp-newimages-showfrom": "Mostrar os novos ficheiros comezando polo $1 ás $2",
        "feedback-thanks": "Grazas! Os seus comentarios publicáronse na páxina \"[$2 $1]\".",
        "feedback-thanks-title": "Grazas!",
        "feedback-useragent": "Axente de usuario:",
-       "searchsuggest-search": "Procurar",
+       "searchsuggest-search": "Procurar en {{SITENAME}}",
        "searchsuggest-containing": "que conteña...",
        "api-error-autoblocked": "A súa dirección IP foi bloqueada automaticamente porque foi usada por un usuario bloqueado.",
        "api-error-badaccess-groups": "Non ten os permisos necesarios para cargar ficheiros neste wiki.",
index f1cf530..edd2fc9 100644 (file)
@@ -24,7 +24,7 @@
        "tog-newpageshidepatrolled": "Yún-chhông sîn ya̍p-mien chhîn-tân tú sùn-chhà ko ke ya̍p-mien",
        "tog-extendwatchlist": "Chán-khôi kâm-sṳ lie̍t-péu lòi hién-sṳ só-yû kiên-kói, m̀  tân-chhiang he chui-khiûn ke",
        "tog-usenewrc": "Chhai chui-khiûn kiên-kói lâu kâm-sṳ lie̍t-péu tú cháng-ha̍p thùng yit-ya̍p ke siû-kói",
-       "tog-numberheadings": "Phiêu-thì chhṳ-thûng phiên-ho",
+       "tog-numberheadings": "Phiêu-thì chhṳ-thung phiên-ho",
        "tog-showtoolbar": "Chán-sṳ phiên-siá kûng-khí-làn",
        "tog-editondblclick": "Sûng-khim phiên-siá ya̍p-mien",
        "tog-editsectiononrightclick": "Yún-hí yu-khim phiêu-thì phiên-siá thon-lo̍k",
        "october-date": "10-ngie̍t $1-ngit",
        "november-date": "11-ngie̍t $1-ngit",
        "december-date": "12-ngie̍t $1-ngit",
-       "pagecategories": "{{PLURAL:$1|Category|$1-chak fûn-lui}}",
+       "pagecategories": "{{PLURAL:$1|Fûn-lui}}",
        "category_header": "\"$1\" fûn-lui tú ke ya̍p-mien",
        "subcategories": "Chṳ́ fûn-lui",
        "category-media-header": "\"$1\" fûn-lui tú ke mòi-thí",
        "viewsource-title": "Khon $1 ke ngièn-sṳ́-mâ",
        "actionthrottled": "動作已經壓制",
        "actionthrottledtext": "基於反垃圾嘅考量,短時間內毋可以多次重複某操作,今下汝已經超過邇隻上限。\n請在數分鐘後再嘗試。",
-       "protectedpagetext": "邇隻頁面已經分人保護以防止編輯或其他操作。",
-       "viewsourcetext": "汝做得查看並複製本頁面嘅源碼:",
+       "protectedpagetext": "Liá ya̍p yí-kîn pûn ngìn pó-fu, kim-chṳ́ siû-kói fe̍t-chá khì-thâ chhâu-chok.",
+       "viewsourcetext": "Ngì cho-tet khon fe̍t-chá copy liá ya̍p ke ngièn-sṳ́-mâ:",
        "viewyourtext": "汝可以查看並複製'''汝對邇隻頁面作出編寫後'''嘅源代碼:",
        "protectedinterface": "邇頁提供此wiki軟體嘅介面文字,其已畀保護以防止惡意修改。\n假使想修改所有wiki嘅翻譯,請到[https://translatewiki.net/ translatewiki.net]上嘅MediaWiki本地化計畫。",
        "editinginterface": "'''警告:'''汝今下編寫緊嘅頁面係用於提供軟件嘅界面文字。\n改變邇頁將影響其他在邇隻wiki上嘅用戶界面外觀。\n假使愛修改所有wiki嘅翻譯,請到[https://translatewiki.net/ translatewiki.net]上嘅MediaWiki本地化計劃。",
        "yourpasswordagain": "Chai yit-pái sû-ngi̍p me̍t-ma:",
        "createacct-yourpasswordagain": "Khok-ngin me̍t-ma",
        "createacct-yourpasswordagain-ph": "Chai yit-pái sû-ngi̍p me̍t-ma",
-       "remembermypassword": "Chhai liá-chak liù-lám-hi sông ki-hâ ngài-ke tên-ngi̍p chhong-thai (chui-chhòng $1-ngit)",
        "userlogin-remembermypassword": "Pó-chhṳ̀ ngài-ke tên-ngi̍p chhong-thai",
        "userlogin-signwithsecure": "使用安全連線",
        "yourdomainname": "Ngì ke vet-miàng:",
        "password-change-forbidden": "汝做毋得更改本wiki上嘅密碼。",
-       "externaldberror": "Liá khó-nèn he yù-yî ngiam-chṳn sú-kí-khù chhâ-chho fe̍t-chá ngì fûn hì-thúng kim-chṳ́ kiên-sîn ngì ke ngoi-phu chòng-ho.",
+       "externaldberror": "Liá khó-nèn he yù-yî ngiam-chṳn sú-kí-khù chhâ-chho fe̍t-chá ngì fûn hì-thúng kim-chṳ́ kiên-sîn ngì ke ngoi-phu fu-thèu.",
        "login": "Tên-ngi̍p",
-       "nav-login-createaccount": "Tên-ngi̍p / kien-li̍p sîn chong-ho",
-       "userlogin": "Tên-ngi̍p / kien-li̍p sîn chong-ho",
+       "nav-login-createaccount": "Tên-ngi̍p / khôi sîn fu-thèu",
+       "userlogin": "Tên-ngi̍p / khôi sîn fu-thèu",
        "userloginnocreate": "Tên-ngi̍p",
        "logout": "Tên-chhut",
        "userlogout": "Tên-chhut",
        "notloggedin": "Hàn-mò tên-ngi̍p",
-       "userlogin-noaccount": "Hàn-mò chong-fu he mò?",
+       "userlogin-noaccount": "Hàn-mò fu-thèu he mò?",
        "userlogin-joinproject": "Chhâm-yi  {{SITENAME}}",
-       "nologin": "Hàn-mò chong-ho he-mò? $1.",
-       "nologinlink": "Kien-li̍p chong-ho",
-       "createaccount": "Kien-li̍p chong-ho",
-       "gotaccount": "Yí-kîn yúng-yû chong-ho he-mò? $1.",
+       "nologin": "Hàn-mò fu-thèu he-mò? $1.",
+       "nologinlink": "Khôi fu-thèu",
+       "createaccount": "Khôi fu-thèu",
+       "gotaccount": "Yí-kîn yû fu-thèu he-mò? $1.",
        "gotaccountlink": "Tên-ngi̍p",
        "userlogin-resetlink": "M̀-ki-tet ngì-ke tên-ngi̍p sin-sit?",
        "userlogin-resetpassword-link": "Thiâm mong-ki ngì ke me̍t-ma?",
        "createaccountreason": "Ngièn-yîn:",
        "createacct-reason": "Ngièn-yîn:",
        "createacct-reason-ph": "汝做麽嘅愛創建另一隻帳號",
-       "createacct-submit": "Kien-li̍p chong-ho",
+       "createacct-submit": "Khôi fu-thèu",
        "createacct-benefit-heading": "{{SITENAME}} he yù lâu Ngì khiung-ngióng ke ngìn kien-li̍p.",
        "createacct-benefit-body1": "$1-chhṳ phiên-siá",
        "createacct-benefit-body2": "$1-ya̍p",
        "badretype": "Ngì só khim-ngi̍p ke me̍t-ma pin m̀  siông-thùng.",
        "userexists": "汝所填入嘅用戶名稱已經存在。\n請另選一隻名稱。",
        "loginerror": "Tên-ngi̍p chhâ-chho",
-       "createacct-error": "Chong-fu kien-li̍p chhâ-chho",
-       "createaccounterror": "Mò phan-fap kien-li̍p chong-ho: $1",
+       "createacct-error": "Khôi fu-thèu chhut chhâ-chho",
+       "createaccounterror": "Mò-fap-thu khôi sîn fu-thèu: $1",
        "nocookiesnew": "本用戶賬號已分建立,但係汝登入失敗。{{SITENAME}}使用cookie登入。汝已停用cookie。請啓用cookie,之後使用汝嘅新用戶名和密碼登入。",
        "nocookieslogin": "{{SITENAME}}用cookie登入。汝已停用cookie。請啓用cookie後再試一擺。",
        "nocookiesfornew": "邇隻用戶嘅賬戶未建立,亻厓兜無法度確認其嘅來源。\n請確定汝已經開啟cookies,重新載入後再試一擺。",
        "noname": "汝還吂輸入一隻有效嘅用戶名。",
        "loginsuccesstitle": "Yí-kîn tên-ngi̍p",
        "loginsuccess": "Ngì kîm-hâ yî \"$1\"-ke sṳ̂n-fun chhai {{SITENAME}} tên-ngi̍p.",
-       "nosuchuser": "Chhìm m̀ -to yung-fu \"$1\". \nYung-fu miàng-chhṳ̂n he yû thai-séu siá khî-fûn ke . \nKiám-chhà ngì ke piâng-siá, fe̍t-chá yung hâ-mien ke péu-kak [[Special:CreateAccount|kien-li̍p yit-chak sîn chòng-ho]].",
+       "nosuchuser": "Chhìm m̀ -to yung-fu \"$1\". \nYung-fu miàng-chhṳ̂n he yû thai-séu siá khî-fûn ke . \nKiám-chhà ngì ke piâng-siá, fe̍t-chá yung hâ-mien ke péu-kak [[Special:CreateAccount|khôi yit-chak sîn fu-thèu]].",
        "nosuchusershort": "無有喊做“$1”嘅用戶。請檢查汝輸入嘅文字係毋係有差錯。",
        "nouserspecified": "汝愛指定一隻用戶名。",
        "login-userblocked": "邇隻用戶已分封鎖。毋做得登入。",
        "suspicious-userlogout": "汝登出嘅要求已經分拒絕,因為其可能係由已損壞嘅瀏覽器或者緩存代理傳送。",
        "pt-login": "Tên-ngi̍p",
        "pt-login-button": "Tên-ngi̍p",
-       "pt-createaccount": "Kien-li̍p chong-ho",
+       "pt-createaccount": "Khôi fu-thèu",
        "pt-userlogout": "Tên-chhut",
        "php-mail-error-unknown": "在PHP嘅mail()參數肚嘅未知錯誤",
        "user-mail-no-addy": "嘗試毋帶電郵地址發送電郵。",
        "preview": "預覽",
        "showpreview": "Chán-sṳ yi-lám",
        "showdiff": "Chán-sṳ chhâ-phe̍t",
-       "anoneditwarning": "<strong>Kín-ko : </strong>Ngì hàn-m̀ tên-ngi̍p. Ngì ke IP thi-chí chiông ki-liu̍k chhai liá-ya̍p ke phiên-siá li̍t-sṳ́ tú. Ká-sṳ́ ngì  <strong>[$1 tên-ngi̍p]</strong> fe̍t  <strong>[$2 kien-li̍p chong-ho]</strong>, ngì ke phiên-si̍p chiông-fi yî ngì ke sṳ́-yung-chá miàng-chhṳ̂n phiêu-sṳ, yúng-yû khì-thâ yù-tiám.",
+       "anoneditwarning": "<strong>Kín-ko:</strong> Ngì hàn-m̀ tên-ngi̍p. Ngì ke IP vi-chí voi ki-liu̍k chhai liá ya̍p ke phiên-siá li̍t-sṳ́ tú. Na-he ngì <strong>[$1 tên-ngi̍p]</strong> fe̍t-chá <strong>[$2 khôi fu-thèu]</strong>, ngì ke phiên-siá voi hién-sṳ ngì ke yung-fu miàng-sṳ, pin-chhiâ yû khì-thâ ke yù-tiám.",
        "anonpreviewwarning": "“警告:汝還吂登入。汝嘅IP地址將會記錄在邇頁嘅編輯歷史中”",
        "missingsummary": "'''提示:''' 汝無提供一隻編寫摘要。假使汝再次單擊「{{int:savearticle}}」,汝嘅編寫將毋帶編寫摘要保存。",
        "missingcommenttext": "請在下背輸入評論。",
        "subject-preview": "主題/標題預覽:",
        "blockedtitle": "用戶分查封",
        "blockedtext": "Ngì-ke yung-fu-miàng fe̍t-chá IP thi-tiám yí-kîn pûn $1 chhà-fûng.\n\nLiá-chhṳ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he ''$2''. Ngì khó-yî lièn-lo̍k $1 fe̍t-chá khì-thâ ke [[{{MediaWiki:Grouppage-sysop}}|Kón-lî-yèn]], thó-lun liá-chhṳ ke chhà-fûng. Chhù-fî ngì yí-kîn chhai ngì-ke [[Special:Preferences|Chong-ho chhâm-su sat-chṳ]] chûng sat-thin liáu yit-ke yû-háu ke email, féu-chet ngì-he put-nèn sṳ́-yung “email liá-vi yung-fu” ke kûng-yung. Ngì-ke IP thi-tiám he $3, yì-yèn ke chhà-fûng ID he #$5. Chhiáng ngì chhai só-yû chhà-chhìm chûng chu-mìn liá-ke thi-tiám khi̍p/fe̍t-he chhà-fûng ID.",
-       "autoblockedtext": "Ngì-ke IP thi-tiám yí-kîn pûn chhṳ-thung chhà-fûng, lî-yù he siên-chhièn ke nang yit-vi yung-fu pûn $1 só chhà-fûng. Yì-yèn chhà-fûng ke ngièn-yîn he: ''$2'' liá-chhṳ chhà-fûng ke khì-kiên he: $6 ngì khó-yî lièn-lo̍k $1 fe̍t-chá khì-thâ ke [[{{MediaWiki:Grouppage-sysop}}|kón-lî-yèn]], thó-lun liá-chhṳ chhà-fûng. Chhù-fî ngì yí-kîn chhai ngì-ke [[Special:Preferences|chong-ho chhâm-su sat-chṳ]] chûng sat-thin yit-ke yû-háu ke email thi-tiám, féu-chet ngì-he put-nèn sṳ́-yung \"email liá-vi yung-fu\" ke kûng-nèn. Ngì-ke chhà-fûng ID he $5. Chhiáng ngì chhai só-yû thiàu-chhà chûng chu-mìn liá-ke chhà-fûng ID.",
+       "autoblockedtext": "Ngì-ke IP thi-tiám yí-kîn pûn chhṳ-thung chhà-fûng, lî-yù he siên-chhièn ke nang yit-vi yung-fu pûn $1 só chhà-fûng. Yì-yèn chhà-fûng ke ngièn-yîn he: ''$2'' liá-chhṳ chhà-fûng ke khì-kiên he: $6 ngì khó-yî lièn-lo̍k $1 fe̍t-chá khì-thâ ke [[{{MediaWiki:Grouppage-sysop}}|kón-lî-yèn]], thó-lun liá-chhṳ chhà-fûng. Chhù-fî ngì yí-kîn chhai ngì-ke [[Special:Preferences|fu-thèu chhâm-su sat-chṳ]] chûng sat-thin yit-ke yû-háu ke email thi-tiám, féu-chet ngì-he put-nèn sṳ́-yung \"email liá-vi yung-fu\" ke kûng-nèn. Ngì-ke chhà-fûng ID he $5. Chhiáng ngì chhai só-yû thiàu-chhà chûng chu-mìn liá-ke chhà-fûng ID.",
        "whitelistedittext": "汝必須先$1正做得編寫頁面。",
        "confirmedittext": "在編寫邇頁之前汝必須確認汝嘅郵箱地址。請通過[[Special:Preferences|偏好設定]]設定並驗證汝嘅郵箱地址。",
        "nosuchsectiontitle": "Mò-yû liá-ke thon-lo̍k",
        "nocreate-loggedin": "汝並無權限去創建新頁面。",
        "permissionserrors": "Khièn-han chhâ-chho",
        "permissionserrorstext": "Kîn-kí yî-ha ke ngièn-yîn, ngì vù-yû khièn-han hi-tso yî-ha ke thung-tsok:",
-       "permissionserrorstext-withaction": "根據下背嘅{{PLURAL:$1|原因|原因}},汝並無權限去做$2:",
+       "permissionserrorstext-withaction": "Yîn-vi hâ-poi ke {{PLURAL:$1|ngièn-yîn}}, ngì mò-fap-thu $2:",
        "recreate-moveddeleted-warn": "'''警告:汝今下重新建立一隻先前曾經刪除過嘅頁面。'''\n\n汝應該愛考慮一下繼續編寫邇一隻頁面係毋係合適。\n為到方便,邇一個頁面嘅刪除日誌已經在下背提供:",
        "moveddeleted-notice": "Liá-chak ya̍p-mien yí-kîn san-chhù. \nLiá-chak ya̍p-mien ke san-chhù lâu yì-thûng ngit-chì yí-kîn chhai hâ-poi thì-kiûng lòi chhâm-kháu.",
        "log-fulllog": "Chhà-khon vàn-cháng ngit-chì",
        "undo-failure": "由於中途嘅編寫毋一致,本編輯毋做得撤銷。",
        "undo-norev": "由於其嘅修訂版本毋存在或已刪除,本編寫毋做得撤銷。",
        "undo-summary": "Chhí-sêu yù [[Special:Contributions/$2|$2]] ([[User talk:$2|tui-fa]]) só chok-chhut ke siû-thin $1",
-       "cantcreateaccounttitle": "Mò-fap kien-li̍p chong-ho",
        "cantcreateaccount-text": "從邇隻IP地址('''$1''')建立帳號已經分[[User:$3|$3]]禁止。\n\n當中分$3封禁嘅原因是''$2''",
        "viewpagelogs": "Chhà-khon liá-chak ya̍p-mien ke ngit-chì",
        "nohistory": "無本頁嘅修訂版本記錄。",
        "previousrevision": "← Sông-chak pán-pún",
        "nextrevision": "Hâ-chak pán-pún →",
        "currentrevisionlink": "Chui-sîn pán-pún",
-       "cur": "tông-chhièn",
-       "next": "下一隻",
-       "last": "sông yit-chak",
+       "cur": "kîm",
+       "next": "Heu",
+       "last": "chhièn",
        "page_first": "chui-chó",
        "page_last": "chui-mî",
-       "histlegend": "差別選擇:標記愛比較版本嘅單選按鈕並點擊底部嘅按鈕進行比較。<br />\n說明:'''({{int:cur}})''' 指撈最新版本比較,'''({{int:last}})''' 指撈上隻版本比較,'''{{int:minoreditletter}}''' = 細微修改。",
+       "histlegend": "Chhâ-phe̍t sién-chet: pêu-ki oi pí-káu pán-pún, tiám hâ-poi ke \"Pí-káu sién-chet ke pán-pún\" yung lòi pí-káu.<br />\nSot-mìn: <strong>({{int:cur}})</strong> chṳ́ lâu chui sîn pán-pún pí-káu, <strong>({{int:last}})</strong> chṳ́ thùng chhièn yit ke pán-pún pí-káu, <strong>{{int:minoreditletter}}</strong> = se-mì siû-kói.",
        "history-fieldset-title": "Liù-lám li̍t-sṳ́",
        "history-show-deleted": "Tân-chhiang he yí san-chhù ke",
        "histfirst": "chui-chó",
        "history-title": "\"$1\" ke siû-thin li̍t-sṳ́",
        "difference-title": "\"$1\" siû-thin kiên ke chhâ-bie",
        "lineno": "Thi $1 hàng:",
-       "compareselectedversions": "比較選定嘅修訂版本",
-       "editundo": "Chha̍t-siau",
+       "compareselectedversions": "Pí-káu sién-chet ke pán-pún",
+       "editundo": "Chhí-sêu",
        "searchresults": "Sêu-chhìm kiet-kó",
        "searchresults-title": "Sêu -chhìm \"$1\" ke kiet-kó",
        "titlematches": "頁面標題相符",
        "deletereasonotherlist": "其它理由",
        "rollback": "編寫倒轉頭",
        "rollbacklink": "tá chón-thèu",
-       "rollbacklinkcount": "chha̍t-siau $1 chhṳ phiên-siá",
+       "rollbacklinkcount": "chhí-sêu $1 chhṳ phiên-siá",
        "rollbackfailed": "無法倒轉頭",
        "cantrollback": "編寫無法打轉頭;最後嘅貢獻者人本文嘅唯一作者。",
        "alreadyrolled": "Mò-fap fî-fu̍k yù [[User:$2|$2]] ([[User talk:$2|thó-lun]]) chin-hàng ke [[$1]] ke chui-heu phiên-si̍p; khì-thâ ngìn yí-kîn phiên-siá fe̍t-he fî-fu̍k liáu ke-hong. Chui-heu phiên-si̍p-chá: [[User:$3|$3]] ([[User talk:$3|Thó-lun]])。",
        "sessionfailure": "汝嘅登入會話好像有問題;\n為到防止會話劫持,邇次操作已經畀取消。\n請轉到先前嘅頁面,重新載入邇頁面,然後重試。",
        "protectlogpage": "Pó-fu ngit-chì",
        "protectlogtext": "Ha-mien he vùn-chông só-thin lâu chhí-sêu só-thin ke lie̍t-péu. Chhiáng chhâm-kháu [[Special:ProtectedPages|Pó-fu vùn-chông chhîn-tân]] yî-khi̍p kiám-sṳ tông-chhièn chin-hàng ke vùn-chông pó-fu.",
-       "protectedarticle": "已保護“[[$1]]”",
+       "protectedarticle": "yí-kîn pó-fu \"[[$1]]\"",
        "modifiedarticleprotection": "已經更改“[[$1]]”嘅保護等級",
        "unprotectedarticle": "yí-kîn kié-chhù pó-fu \"[[$1]]\"",
        "protect-title": "更改“$1”嘅保護等級",
        "ipaddressorusername": "IP thi-chí fe̍t yung-fu-miàng:",
        "ipbexpiry": "Khì-han:",
        "ipbreason": "Ngièn-yîn:",
-       "ipbreason-dropdown": "*Yit-pân ke fûng-kim lî-yù \n** Tô-chhṳ kâ-ngi̍p hî-ká chṳ̂-liau \n** San-chhù ya̍p-mien nui-yùng \n** Ngoi-phu lièn-chiap kóng-ko \n** Chhai ya̍p-mien tú chen-kâ mò yi-ngi vùn-sṳ \n** Mò-lî ke hàng-vì, kûng-kit / sâu-yéu phe̍t-sâ \n** Làm-yung tô-chak chòng-ho \n** Cho-m̀ tet chiap-su ke yung-fu-miàng",
-       "ipbcreateaccount": "Chú-chṳ́ chhóng-kien sîn chòng-ho",
+       "ipbreason-dropdown": "*Yit-pân ke fûng-kim lî-yù \n** Tô-chhṳ kâ-ngi̍p hî-ká chṳ̂-liau \n** San-chhù ya̍p-mien nui-yùng \n** Ngoi-phu lièn-chiap kóng-ko \n** Chhai ya̍p-mien tú chen-kâ mò yi-ngi vùn-sṳ \n** Mò-lî ke hàng-vì, kûng-kit / sâu-yéu phe̍t-sâ \n** Làm-yung tô-chak fu-thèu \n** Cho-m̀ tet chiap-su ke yung-fu-miàng",
+       "ipbcreateaccount": "Chú-chṳ́ kien-li̍p sîn fu-thèu",
        "ipbenableautoblock": "Chhṳ-thûng chhà-fûng liá yung-fu chui-heu só yung ke IP thi-chí, lâu heu-lòi sṳ-thù phiên-siá só yung ke só-yû thi-chí",
        "ipbsubmit": "Chhà-fûng liá yung-fu",
        "ipbother": "其它時間:",
        "tooltip-pt-userpage": "{{GENDER:|Ngì ke sṳ́-yung-chá}} ya̍p-mien",
        "tooltip-pt-anonuserpage": "Ngì-ke phiên-siá pún-chham só yung IP ke tui-yin yung-fu-chông",
        "tooltip-pt-mytalk": "{{GENDER:|Ngì ke}} kâu-liù ya̍p",
-       "tooltip-pt-anontalk": "Tui-yî lòi-chhṳ chhṳ́IP thi-tiám phiên-siá ke tui-fa",
+       "tooltip-pt-anontalk": "Liá ke IP vi-chṳ́ yû-koân phiên-siá ke thó-lun",
        "tooltip-pt-preferences": "{{GENDER:|Ngì ke}} phiên-hó sat-thin",
        "tooltip-pt-watchlist": "Ngì kâm-sṳ chûng ya̍p-mien ke kiên-kói lie̍t-péu",
        "tooltip-pt-mycontris": "{{GENDER:|Ngì ke}} kung-hien lie̍t-péu",
-       "tooltip-pt-login": "Kien-ngi ngì tên-ngi̍p, than-he pin fî pit-sî ke",
+       "tooltip-pt-login": "Kien-ngi ngì tên-ngi̍p, m̀-ko mò-yit-thin oi.",
        "tooltip-pt-logout": "Tên-chhut",
+       "tooltip-pt-createaccount": "Kien-ngi ngì siên khôi yit ke fu-thèu chai tên-ngi̍p; m̀-ko mò-yit-thin oi.",
        "tooltip-ca-talk": "Liá ya̍p ke thó-lun",
        "tooltip-ca-edit": "Phiên-siá pún-ya̍p",
        "tooltip-ca-addsection": "Khôi-sṳ́ yit-chak sîn thon-lo̍k",
        "confirmemail_success": "Ngì-ke sin-siông yí-kîn pûn khok-ngin. Ngì hien-ha khó-yî tên-liu̍k pin sṳ́-yung chhṳ́ mióng-chham liáu.",
        "confirmemail_loggedin": "Ngì-ke sin-siông thi-tiám hien-ha yí-kîn pûn khok-ngin.",
        "confirmemail_subject": "{{SITENAME}} sin-siông thi-tiám khok-ngin",
-       "confirmemail_body": "Yúng-yû IP thi-tiám $1 ke yung-fu (khó-nèn he ngì) chhai {{SITENAME}} chhóng-chho liáu chong-fu  \"$2\", pin thì-kâu liáu ngì-ke email sin-siông thi-tiám.\n\nChhiáng khok-ngin liá-ke chong-fu  he su̍k-yî ngì-ke, pin thùng-sṳ̀ khí-yung chhai {{SITENAME}} sông ke email sin-siông kûng-nèn. Chhiáng chhai hi-khí chûng tá-khôi ha-mien ke lièn-kiet: $3\n\nKó-yèn ngì *mò-yû* thì-chhut liá-ke chhiáng-khiù,  chhiáng put-yeu tiám-kit Chhṳ́ lièn-kiet. Khok-ngin me̍t-me̍t chiông-voi chhai $4 ko-khì.",
+       "confirmemail_body": "Yúng-yû IP thi-tiám $1 ke yung-fu (khó-nèn he ngì) chhai {{SITENAME}} chhóng-chho liáu fu-thèu  \"$2\", pin thì-kâu liáu ngì-ke email sin-siông thi-tiám.\n\nChhiáng khok-ngin liá-ke fu-thèu  he su̍k-yî ngì-ke, pin thùng-sṳ̀ khí-yung chhai {{SITENAME}} sông ke email sin-siông kûng-nèn. Chhiáng chhai hi-khí chûng tá-khôi ha-mien ke lièn-kiet: $3\n\nKó-yèn ngì *mò-yû* thì-chhut liá-ke chhiáng-khiù,  chhiáng put-yeu tiám-kit Chhṳ́ lièn-kiet. Khok-ngin me̍t-me̍t chiông-voi chhai $4 ko-khì.",
        "scarytranscludedisabled": "[Khiam-wiki chón-von me̍t-me̍t put hí-khó yung]",
        "scarytranscludefailed": "[Tui-put-hí, mù-pán $1 thu̍k-chhí sṳt-phai]",
        "scarytranscludetoolong": "[Tui-put-hí; URL thi-tiám thai-chhòng]",
        "revdelete-restricted": "yí-kîn yin-yung han-tsṳ tsṳ tshâu-tsok-yèn",
        "revdelete-unrestricted": "yí-kîn yì-tshù yû-kûan tshâu-tsok-yè ke han-tsṳ",
        "logentry-move-move": "$1 {{GENDER:$2|yí-kîn yì-thûng}} ya̍p-mien $3 to $4",
-       "logentry-newusers-create": "Yí-kîn {{GENDER:$2|kien-li̍p}} sṳ́-yung-chá chong-ho  $1",
+       "logentry-newusers-create": "Yí-kîn {{GENDER:$2|khôi}} yung-fu fu-thèu $1",
        "logentry-upload-upload": "$1 {{GENDER:$2|yí-kîn sông-chhòn}} $3",
        "rightsnone": "(無)",
        "revdelete-summary": "piên-sip tsak-yêu",
index 458f34f..472a72c 100644 (file)
        "newimages-showbots": "הצגת העלאות שבוצעו על־ידי בוטים",
        "newimages-hidepatrolled": "הסתרת העלאות בדוקות",
        "noimages": "אין קבצים.",
+       "gallery-slideshow-toggle": "הצגת/הסתרת תמונות ממוזערות",
        "ilsubmit": "חיפוש",
        "bydate": "לפי תאריך",
        "sp-newimages-showfrom": "הצגת קבצים חדשים החל מ־$2, $1",
        "feedback-thanks": "תודה! המשוב שלך פורסם בדף \"[$2 $1]\".",
        "feedback-thanks-title": "תודה!",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "חיפוש",
+       "searchsuggest-search": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}}",
        "searchsuggest-containing": "כולל...",
        "api-error-autoblocked": "כתובת ה־IP שלך נחסמה אוטומטית, כי היא הייתה בשימוש על־ידי משתמש חסום.",
        "api-error-badaccess-groups": "אינך מורשה להעלות קבצים לאתר הוויקי הזה.",
        "usercssispublic": "שימו לב: משתמשים אחרים יכולים לצפות בדפי ה־CSS שלכם, ולכן אין לכלול בהם מידע סודי.",
        "restrictionsfield-badip": "כתובת או טווח כתובות IP בלתי תקין: $1",
        "restrictionsfield-label": "טווחי כתובות IP מותרים:",
-       "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "edit-error-short": "שגיאה: $1",
+       "edit-error-long": "שגיאות:\n\n$1"
 }
index 097d801..f6988a0 100644 (file)
@@ -73,7 +73,8 @@
                        "YmKavishwar",
                        "Upendradutt93",
                        "Nemo bis",
-                       "Wassan.anmol"
+                       "Wassan.anmol",
+                       "Ziyaurr"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "category-file-count-limited": "इस श्रेणी में निम्नलिखित {{PLURAL:$1|फ़ाइल है।|फ़ाइलें हैं।}}",
        "listingcontinuesabbrev": "जारी",
        "index-category": "सूचीबद्ध पृष्ठ",
-       "noindex-category": "असूचीबद्ध पृष्ठ",
+       "noindex-category": "असूचीबद्ध पृष्ठों",
        "broken-file-category": "टूटी हुई फ़ाइल कड़ियों वाले पृष्ठ",
        "about": "के बारे में",
        "article": "सामग्री लेख",
index 3335a30..e50c57e 100644 (file)
        "nosuchusershort": "Ne postoji suradnik s imenom \"$1\". Provjerite Vaš unos.",
        "nouserspecified": "Molimo navedite suradničko ime.",
        "login-userblocked": "Ovaj je suradnik blokiran. Prijava nije dopuštena.",
-       "wrongpassword": "Lozinka koju ste unijeli nije ispravna. Pokušajte ponovno.",
-       "wrongpasswordempty": "Niste unijeli lozinku. Pokušajte ponovno.",
+       "wrongpassword": "Zaporka koju ste unijeli nije ispravna. Pokušajte ponovno.",
+       "wrongpasswordempty": "Niste unijeli zaporku. Pokušajte ponovno.",
        "passwordtooshort": "Zaporka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
        "password-name-match": "Vaša lozinka mora biti različita od Vašeg suradničkog imena.",
        "password-login-forbidden": "Uporaba ovog suradničkog imena i lozinke nije dozvoljena.",
        "wlshowhideanons": "neprijavljene suradnike",
        "wlshowhidepatr": "ophođena uređivanja",
        "wlshowhidemine": "moje promjene",
+       "wlshowhidecategorization": "kategorizaciju stranica",
        "watchlist-options": "Izbornik popisa praćenja",
        "watching": "Pratim...",
        "unwatching": "Prestajem pratiti...",
index f9f9e50..716b82e 100644 (file)
        "category-file-count-limited": "Le sequente {{PLURAL:$1|file es|$1 files es}} in le categoria actual.",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Paginas indexate",
-       "noindex-category": "Paginas non indexate",
+       "noindex-category": "Paginas con \"__NOINDEX__\"",
        "broken-file-category": "Paginas con ligamines rupte a files",
        "about": "A proposito",
        "article": "Pagina de contento",
        "talk": "Discussion",
        "views": "Representationes",
        "toolbox": "Instrumentos",
+       "tool-link-userrights": "Modificar le gruppos del {{GENDER:$1|usator|usatrice}}",
+       "tool-link-emailuser": "Inviar e-mail a iste {{GENDER:$1|usator|usatrice}}",
        "userpage": "Vider pagina del usator",
        "projectpage": "Vider pagina de projecto",
        "imagepage": "Vider le pagina del file",
        "apisandbox-results-fixtoken-fail": "Impossibile recuperar indicio \"$1\".",
        "apisandbox-alert-page": "Certe campos in iste pagina non es valide.",
        "apisandbox-alert-field": "Le valor de iste campo non es valide.",
+       "apisandbox-continue": "Continuar",
+       "apisandbox-continue-clear": "Rader",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuara] le ultime requesta; {{int:apisandbox-continue-clear}} radera le parametros relative al continuation.",
        "booksources": "Fontes de libros",
        "booksources-search-legend": "Cercar fontes de libros",
        "booksources-search": "Cercar",
        "newimages-showbots": "Monstrar files incargate per robots",
        "newimages-hidepatrolled": "Celar le files incargate patruliate",
        "noimages": "Nihil a vider.",
+       "gallery-slideshow-toggle": "Alternar miniaturas",
        "ilsubmit": "Cercar",
        "bydate": "per data",
        "sp-newimages-showfrom": "Monstrar nove files a partir del $1 a $2",
        "htmlform-date-invalid": "Le valor specificate non es recognoscite como data. Tenta usar le formato AAAA-MM-DD.",
        "htmlform-time-invalid": "Le valor specificate non es recognoscite como hora. Tenta usar le formato HH:MM:SS.",
        "htmlform-datetime-invalid": "Le valor specificate non es recognoscite como data e hora. Tenta usar le formato AAAA-MM-DD HH:MM:SS.",
+       "htmlform-date-toolow": "Le valor specificate es anterior al prime data permittite, $1.",
+       "htmlform-date-toohigh": "Le valor specificate es posterior al ultime data permittite, $1.",
+       "htmlform-time-toolow": "Le valor specificate es anterior al prime hora permittite, $1.",
+       "htmlform-time-toohigh": "Le valor specificate es posterior al ultime hora permittite, $1.",
+       "htmlform-datetime-toolow": "Le valor specificate es anterior al prime data e hora permittite, $1.",
+       "htmlform-datetime-toohigh": "Le valor specificate es posterior al ultime data e hora permittite, $1.",
        "htmlform-title-badnamespace": "[[:$1]] non es in le spatio de nomines \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" non es un titulo de pagina creabile",
        "htmlform-title-not-exists": "$1 non existe.",
        "feedback-thanks": "Gratias! Tu evalutation ha essite publicate in le pagina \"[$2 $1]\".",
        "feedback-thanks-title": "Gratias!",
        "feedback-useragent": "Agente usator:",
-       "searchsuggest-search": "Cercar",
+       "searchsuggest-search": "Cercar in {{SITENAME}}",
        "searchsuggest-containing": "continente...",
        "api-error-autoblocked": "Tu adresse IP ha essite blocate automaticamente, perque illo ha essite usate per un usator blocate.",
        "api-error-badaccess-groups": "Tu non ha le permission de incargar files in iste wiki.",
        "unlinkaccounts-success": "Le conto ha essite disligate.",
        "authenticationdatachange-ignored": "Le cambiamento del datos de authentication non ha succedite. Pote esser que nulle fornitor ha essite configurate?",
        "userjsispublic": "Nota ben: Subpaginas JavaScript non debe continer datos confidential perque altere usatores pote vider los.",
-       "usercssispublic": "Nota ben: Subpaginas CSS non debe continer datos confidential perque altere usatores pote vider los."
+       "usercssispublic": "Nota ben: Subpaginas CSS non debe continer datos confidential perque altere usatores pote vider los.",
+       "restrictionsfield-badip": "Adresse o intervallo IP non valide: $1",
+       "restrictionsfield-label": "Intervallos IP permittite:",
+       "restrictionsfield-help": "Un adresse IP o intervallo CIDR per linea. Pro activar toto, usa<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index d22d1a7..663277e 100644 (file)
        "feedback-thanks": "Grazie! Il tuo feedback è stato pubblicato alla pagina \"[$2 $1]\".",
        "feedback-thanks-title": "Grazie!",
        "feedback-useragent": "Agente utente:",
-       "searchsuggest-search": "Ricerca",
+       "searchsuggest-search": "Cerca all'interno di {{SITENAME}}",
        "searchsuggest-containing": "contenente...",
        "api-error-autoblocked": "Il tuo indirizzo IP è stato bloccato automaticamente, perché è stato utilizzato da un utente bloccato.",
        "api-error-badaccess-groups": "Non sei autorizzato a caricare documenti su questa wiki.",
index 72b6873..600e3e8 100644 (file)
        "newwindow": "(新しいウィンドウで開きます)",
        "cancel": "取り消し",
        "moredotdotdot": "続き...",
-       "morenotlisted": "この一覧は完全ではありません。",
+       "morenotlisted": "この一覧はおそらく完全ではありません。",
        "mypage": "ページ",
        "mytalk": "トーク",
        "anontalk": "トーク",
        "talk": "議論",
        "views": "表示",
        "toolbox": "ツール",
+       "tool-link-userrights": "{{GENDER:$1|利用者}}グループの変更",
        "tool-link-emailuser": "この{{GENDER:$1|利用者}}にメールを送信",
        "userpage": "利用者ページを表示",
        "projectpage": "プロジェクトのページを表示",
        "databaseerror-query": "クエリ: $1",
        "databaseerror-function": "関数: $1",
        "databaseerror-error": "エラー: $1",
+       "transaction-duration-limit-exceeded": "書き込み処理時間 ($1) が $2 秒の制限に達したため、過多なレプリケーションの遅延を避けることを目的に、このトランザクションは中止されました。\n一度に多数の変更を試みた場合、処理を複数に細分化して実行してください。",
        "laggedslavemode": "<strong>警告:</strong> ページに最新の編集が反映されていない可能性があります。",
        "readonly": "データベースがロックされています",
        "enterlockreason": "ロックの理由の入力と、ロック解除の予定を、入力してください",
        "createacct-yourpasswordagain-ph": "パスワードを再入力",
        "userlogin-remembermypassword": "ログイン状態を保持",
        "userlogin-signwithsecure": "安全な接続の使用",
+       "cannotlogin-title": "ログイン不能",
+       "cannotlogin-text": "ログインできません",
        "cannotloginnow-title": "今はログインできません",
        "cannotloginnow-text": "$1 使用中には、ログインは不可能です。",
+       "cannotcreateaccount-title": "アカウント作成不可",
+       "cannotcreateaccount-text": "このウィキではアカウントの直接作成が無効になっています。",
        "yourdomainname": "あなたのドメイン:",
        "password-change-forbidden": "このウィキではパスワードを変更できません。",
        "externaldberror": "認証データベースでエラーが発生したか、または外部アカウントの更新が許可されていません。",
        "eauthentsent": "指定したメールアドレスに、アドレス確認のためのメールをお送りしました。\nメールに記載された手順に従って、このアカウントの所有者であることの確認が取れると、このアカウント宛のメールを受け取れるようになります。",
        "throttled-mailpassword": "パスワード再設定メールを過去 {{PLURAL:$1|$1 時間}}に送信済みです。\n悪用防止のため、パスワードの再設定は {{PLURAL:$1|$1 時間}}に 1 回のみです。",
        "mailerror": "メールを送信する際にエラーが発生しました: $1",
-       "acct_creation_throttle_hit": "あなたと同じ IP アドレスでこのウィキに訪れた人が、最近 24 時間で {{PLURAL:$1|$1 アカウント}}を作成しており、これはこの期間で作成が許可されている最大数です。\nそのため、現在この IP アドレスではアカウントをこれ以上作成できません。",
+       "acct_creation_throttle_hit": "あなたと同じ IP アドレスでこのウィキに訪れた人が、直近 $2 で {{PLURAL:$1|$1 個のアカウント}}を作成しており、この期間で作成が許可されている最大数です。\nそのため、現在この IP アドレスからこれ以上のアカウントを作成できません。",
        "emailauthenticated": "メールアドレスは$2で $3に確認済みです。",
        "emailnotauthenticated": "メールアドレスが確認されていません。\n確認されるまで、以下のいかなる機能でもメールは送信されません。",
        "noemailprefs": "これらの機能を有効にするには、個人設定でメールアドレスを登録してください。",
        "grant-highvolume": "多量の編集",
        "grant-oversight": "利用者名および版を秘匿",
        "grant-patrol": "ページへの変更の巡回",
+       "grant-privateinfo": "個人情報アクセス",
        "grant-protect": "ページを保護および保護解除",
        "grant-rollback": "ページヘの変更の巻き戻し",
        "grant-sendemail": "他の利用者へのメールの送信",
        "upload-dialog-disabled": "このウィキでは、このダイアログを使用するファイルのアップロードが無効にされています。",
        "upload-dialog-title": "ファイルをアップロード",
        "upload-dialog-button-cancel": "中止",
+       "upload-dialog-button-back": "戻る",
        "upload-dialog-button-done": "完了",
        "upload-dialog-button-save": "保存",
        "upload-dialog-button-upload": "アップロード",
        "apisandbox-results-fixtoken-fail": "\"$1\" トークンの取得に失敗しました。",
        "apisandbox-alert-page": "このページの欄が有効ではありません。",
        "apisandbox-alert-field": "この欄の値が有効ではありません。",
+       "apisandbox-continue": "続行",
+       "apisandbox-continue-clear": "消去",
        "booksources": "書籍情報源",
        "booksources-search-legend": "書籍情報源を検索",
        "booksources-isbn": "ISBN:",
        "rollbacklinkcount": "$1{{PLURAL:$1|編集}}を巻き戻し",
        "rollbacklinkcount-morethan": "$1{{PLURAL:$1|編集}}以上を巻き戻し",
        "rollbackfailed": "巻き戻しに失敗しました",
+       "rollback-missingparam": "リクエストに必要なパラメーターが見当たりません。",
        "cantrollback": "編集を差し戻せません。\n最後の投稿者が、このページの唯一の作者です。",
        "alreadyrolled": "ページ[[:$1]]の[[User:$2|$2]] ([[User talk:$2|トーク]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) による編集を巻き戻せません。\n他の利用者が既に編集または巻き戻しを行ったためです。\n\nこのページの最後の編集は[[User:$3|$3]] ([[User talk:$3|トーク]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) によるものです。",
        "editcomment": "編集内容の要約: <em>$1</em>",
        "tags-actions-header": "対処操作",
        "tags-active-yes": "はい",
        "tags-active-no": "いいえ",
-       "tags-source-extension": "拡張機能による定義",
+       "tags-source-extension": "ソフトウェアによる定義",
        "tags-source-manual": "利用者およびボットによる手動適用",
        "tags-source-none": "もう使われていない",
        "tags-edit": "編集",
        "htmlform-cloner-create": "さらに追加",
        "htmlform-cloner-delete": "除去",
        "htmlform-cloner-required": "少なくとも 1 つの値が必要です。",
+       "htmlform-date-placeholder": "YYYY-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
        "htmlform-title-badnamespace": "[[:$1]]は、\"{{ns:$2}}\"名前空間にありません。",
        "htmlform-title-not-creatable": "\"$1\" は、作成可能なページ名では、ありません。",
        "htmlform-title-not-exists": "$1 は存在しません。",
        "feedback-external-bug-report-button": "技術的タスクをファイル",
        "feedback-dialog-title": "フィードバックの送信",
        "feedback-dialog-intro": "以下のフォームでフィードバックを簡単に提出できます。あなたのコメントは利用者名と共に、ページ \"$1\" に追加されるでしょう。",
-       "feedback-error-title": "エラー",
        "feedback-error1": "エラー: 認識できない結果を API が返しました",
        "feedback-error2": "エラー: 編集に失敗しました",
        "feedback-error3": "エラー: API からの応答がありません",
        "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-restore": "ページの復帰",
        "log-action-filter-delete-event": "記録の削除",
        "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-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": "認証が行われていない、またはセッションデータが失われました。最初からやり直してください。",
        "linkaccounts-submit": "アカウントを関連付ける",
        "unlinkaccounts": "アカウントの関連付け解除",
        "unlinkaccounts-success": "アカウントの関連付けが解除されました。",
-       "authenticationdatachange-ignored": "認証データの変更は処理されませんでした。プロバイダーが設定されていない可能性があります。"
+       "authenticationdatachange-ignored": "認証データの変更は処理されませんでした。プロバイダーが設定されていない可能性があります。",
+       "userjsispublic": "注意: JavaScript のサブページは第三者が閲覧可能なため、機微な情報を含めないでください。",
+       "usercssispublic": "注意: CSS のサブページは第三者が閲覧可能なため、機微な情報を含めないでください。",
+       "restrictionsfield-badip": "無効な IP アドレス、またはその範囲: $1",
+       "restrictionsfield-label": "許可する IP の範囲:",
+       "restrictionsfield-help": "一行につき、単一の IP アドレス、もしくは CIDR による範囲。全帯域からの接続を許可する場合は<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index e6e7170..29bd82d 100644 (file)
        "history": "Бет тарихы",
        "history_short": "Тарихы",
        "updatedmarker": "соңғы қаралғаннан кейін жаңартылған",
-       "printableversion": "Басып шығару нұсқасы",
+       "printableversion": "Басып шығару",
        "permalink": "Тұрақты сілтеме",
        "print": "Басып шығару",
        "view": "Қарау",
        "right-noratelimit": "Еселік шектелімдері ықпал етпейді",
        "right-import": "Басқа уикилерден беттерді сырттан алу",
        "right-importupload": "Файлдарды жүктеу арқылы беттерді сырттан алу",
-       "right-patrol": "Басқарардың өңдемелерін тексерілді деп белгілеу",
+       "right-patrol": "Басқалардың өңдемелерін тексерілді деп белгілеу",
        "right-autopatrol": "Өз өңдемелерін тексерілді деп өздіктік белгілеу",
        "right-patrolmarks": "Жуықтағы өзгерістердегі зерттеу белгілерін көру",
        "right-unwatchedpages": "Бақыланылмаған бет тізімін көру",
        "pageinfo-hidden-categories": "Жасырылған {{PLURAL:$1|санат|санаттар}} ($1)",
        "pageinfo-templates": "Кіріктірілген {{PLURAL:$1|үлгі|үлгілер}} ($1)",
        "pageinfo-transclusions": "Kіріктірілген {{PLURAL:$1|бет|беттер}} ($1)",
-       "pageinfo-toolboxlink": "Ð\91ұл Ð±ÐµÑ\82 Ñ\82Ñ\83Ñ\80алÑ\8b Ð¼әлімет",
+       "pageinfo-toolboxlink": "Ð\9cәлімет",
        "pageinfo-redirectsto": "Айдатылғандар",
        "pageinfo-redirectsto-info": "Информация",
        "pageinfo-contentpage": "Контент бетке санала ма?",
index 1dc2caf..8dabe1a 100644 (file)
        "feedback-thanks": "감사합니다! \"[$2 $1]\" 문서에 의견을 남겼습니다.",
        "feedback-thanks-title": "감사합니다!",
        "feedback-useragent": "사용자 에이전트:",
-       "searchsuggest-search": "검색",
+       "searchsuggest-search": "{{SITENAME}} 검색",
        "searchsuggest-containing": "다음 문자열 포함...",
        "api-error-autoblocked": "사용자의 IP 주소는 차단된 사용자에 의해 사용되었으므로 자동으로 차단된 상태입니다.",
        "api-error-badaccess-groups": "이 위키에 파일을 올릴 권한이 없습니다.",
index 76f1cce..ec6d6a2 100644 (file)
        "feedback-thanks": "Merci! Äre Feedback gouf op der Säit \"[$2 $1]\" gespäichert.",
        "feedback-thanks-title": "Merci!",
        "feedback-useragent": "User Agent:",
-       "searchsuggest-search": "Sichen",
+       "searchsuggest-search": "Op {{SITENAME}} sichen",
        "searchsuggest-containing": "mat ...",
        "api-error-autoblocked": "Är IP-Adress gouf automatesch gespaart wëll se vun engem gespaarte Benotzer  benotzt gouf",
        "api-error-badaccess-groups": "Et ass Iech net erlaabt fir Fichieren op dës Wiki eropzelueden.",
        "linkaccounts-submit": "Benotzerkonte verbannen",
        "userjsispublic": "DEnkt drun: Op JavaScript-Ënnersäite solle keng vertraulech Informatioune stoe well se vun anere Benotzer kënne gesi ginn.",
        "restrictionsfield-badip": "Net valabel IP-Adress oder Beräich: $1",
-       "restrictionsfield-label": "Zougeloossen IP-Beräicher:"
+       "restrictionsfield-label": "Zougeloossen IP-Beräicher:",
+       "edit-error-short": "Feeler: $1",
+       "edit-error-long": "Feeler:\n\n$1"
 }
index f1d9a18..a497488 100644 (file)
        "yourname": "Уртахдин тӀвар",
        "yourpassword": "Парол",
        "yourpasswordagain": "Парол кхьин хъувун:",
-       "remembermypassword": "И браузерда зи логин рикӀел хуьхь (лап гзаф $1 {{PLURAL:$1|1=югъ|йикъар}})",
        "yourdomainname": "Куь домен",
        "login": "Гьахьун",
        "nav-login-createaccount": "Гьахьун/аккаунт туькӀуьрун",
        "youremail": "Электрон почта:",
        "username": "Уртахдин тӀвар",
        "yourrealname": "Xалис тIвар:",
-       "yourlanguage": "ЧIалар",
+       "yourlanguage": "ЧӀалар",
        "yournick": "ЦӀийи къул:",
        "yourgender": "Жинс:",
        "gender-male": "итимдин",
        "file-anchor-link": "Файл",
        "filehist": "Файлдин тарих",
        "filehist-help": "Файлдин виликан жуьре килигун патал, гьа а жуьредин тарих/вахт илиса,",
-       "filehist-deleteall": "виÑ\80и ÐºÑ\8aакÑ\8aудун",
-       "filehist-deleteone": "кÑ\8aакÑ\8aудун",
+       "filehist-deleteall": "виÑ\80и Ð°Ð»удун",
+       "filehist-deleteone": "алудун",
        "filehist-revert": "элкъуьрна хкун",
        "filehist-current": "алай",
        "filehist-datetime": "Тарих/вахт",
        "filedelete": "$1 алудун",
        "filedelete-legend": "Файл алудун",
        "filedelete-comment": "Кар",
-       "filedelete-submit": "Ð\9aÑ\8aакÑ\8aудун",
+       "filedelete-submit": "Ð\90лудун",
        "filedelete-reason-otherlist": "Муькуь себеб",
        "mimesearch": "MIME ахтармишун",
        "download": "АцIун",
        "unwatching": "Амма клигнай",
        "created": "туькIуьрнава",
        "changed": "дегишнава",
-       "deletepage": "Ð\9aÑ\8aакÑ\8aудун хъувун",
+       "deletepage": "Ð\90лудун хъувун",
        "confirm": "Тестикьун",
        "delete-confirm": "«$1» алудун",
-       "delete-legend": "Ð\9aÑ\8aакÑ\8aудун",
+       "delete-legend": "Ð\90лудун",
        "confirmdeletetext": "Квез чlуриз кlанзани чарар гьадан вири тарихар галаз.                                                                                                                         Буюр, сидикъара,куьне чlурзатlа, куьн агъавурда автlа вуч ийизатlа ва куьне ийизатlа жуьреда [[{{MediaWiki:Policy-url}}| политика]].",
        "actioncomplete": "Кар авунва",
        "actionfailed": "Кар йиз алакьнавач",
index 8c5b16c..4fec1a2 100644 (file)
        "tog-watchuploads": "Azonzi i noeuvi file che metto in osservaçion",
        "tog-watchrollback": "Azonzi a-i sotta osservassion e paggine dovve ho fæto un rollback",
        "tog-minordefault": "Indica de longo comme menô e modiffiche",
-       "tog-previewontop": "Veddi l'anteprimma de d'äto a-o spaçio pe cangiâ",
-       "tog-previewonfirst": "Veddi l'anteprimma a-o primmo cangiamento",
+       "tog-previewontop": "Mostra l'anteprimma de d'ato a-a casella de modiffica",
+       "tog-previewonfirst": "Mostra l'anteprimma in sciâ primma modiffica",
        "tog-enotifwatchlistpages": "Famme savéi via e-mail quande 'na paggina o in file inti mæ osservæ a ven cangiâ.",
        "tog-enotifusertalkpages": "Màndime un'e-mail se gh'é de modìffiche inta mæ pagina de discuscion.",
        "tog-enotifminoredits": "Mandime una email ascì pe e modifiche menoî de pagine e di file",
        "tog-enotifrevealaddr": "Mostra o mæ addresso inte e-mail de notiffica",
        "tog-shownumberswatching": "Mostra o numero di utenti che tegnan d'oeuggio sta pagina",
-       "tog-oldsig": "Firma attuale:",
+       "tog-oldsig": "Firma attoale:",
        "tog-fancysig": "Tratta a firma comme wikitesto (sensa un collegamento aotomatico)",
        "tog-uselivepreview": "Abillita a fonsion de l'anteprimma in diretta",
        "tog-forceeditsummary": "Domanda conferma se o campo ogetto o l'è veuo",
@@ -57,7 +57,7 @@
        "tog-showhiddencats": "Fa vedde e categorîe ascose",
        "tog-norollbackdiff": "Ometti o confronto tra verscioin doppo ch'ho fæto o ripristino",
        "tog-useeditwarning": "Avertime se lascio 'na paggina de modiffica sens'avei sarvou i cangi",
-       "tog-prefershttps": "Deuvia sempre una connescion segua quande se intra",
+       "tog-prefershttps": "Adœuvia delongo una connescion segua quande se intra",
        "underline-always": "Sempre",
        "underline-never": "Mâi",
        "underline-default": "Impostassioin predefinie do navegatô o da skin",
        "category-file-count-limited": "Questa categoria a contegne {{PLURAL:$1|o file indicao|i $1 file indicæ}} chi de sotta.",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Paggine indiçizzæ",
-       "noindex-category": "Pàgine sénsa indiçe",
+       "noindex-category": "Paggine sença endexo",
        "broken-file-category": "Paggine con di colegamenti a di file che no ghe son",
        "about": "Informaçioìn",
-       "article": "Pagina di contegnùi",
+       "article": "Voxe",
        "newwindow": "(O s'arve inte 'n âtro barcon)",
        "cancel": "Scancella",
        "moredotdotdot": "De ciû...",
-       "morenotlisted": "Questa lista a no l'è completa.",
+       "morenotlisted": "Questa lista a poriæ ese incompleta.",
        "mypage": "Paggina",
        "mytalk": "Discuscioin",
        "anontalk": "Discuscion pe questo addresso IP",
        "talk": "Discuscion",
        "views": "Vìxite",
        "toolbox": "Arneixi",
+       "tool-link-userrights": "Modiffica groppi {{GENDER:$1|utente}}",
+       "tool-link-emailuser": "Manda un'e-mail a questo {{GENDER:$1|utente}}",
        "userpage": "Veddi a paggina utente",
        "projectpage": "Veddi a paggina de servissio",
        "imagepage": "Vizualizza a paggina do file",
        "userlogin-remembermypassword": "Mantegnime collegou",
        "userlogin-signwithsecure": "Adoeuvia una conescion segua",
        "cannotlogin-title": "Imposcibbile intrâ",
+       "cannotlogin-text": "L'accesso o no l'è poscibbile.",
        "cannotloginnow-title": "Aoa no se poeu intrâ",
        "cannotloginnow-text": "Quande s'adoeuvia $1 no se poeu intrâ.",
        "cannotcreateaccount-title": "Imposcibbile creâ di utençe",
+       "cannotcreateaccount-text": "A creaçion diretta de l'utença a no l'è attivâ insce questo wiki.",
        "yourdomainname": "Indirisso do scito:",
        "password-change-forbidden": "No ti peu cangiâ poula segretta in questa wiki.",
        "externaldberror": "Gh'è stæto un aro co-o server de aotenticaçion esterno, oppû no ti g'hæ i aotorizzaçioin pe aggiornâ o to accesso esterno.",
        "botpasswords-label-resetpassword": "Reimposta a poula segretta",
        "botpasswords-label-grants": "Assegnaçioin applicabile:",
        "botpasswords-help-grants": "Ogni assegnaçion a dà accesso a-i driti utente elencæ che un'utença a g'ha zà. Amia a [[Special:ListGrants|tabella d'e assegnaçioin]] pe de ulteioî informaçioin.",
-       "botpasswords-label-restrictions": "Restriçioin d'utilizzo:",
        "botpasswords-label-grants-column": "Assegnaçioin",
        "botpasswords-bad-appid": "O nomme bot \"$1\" o no l'è vallido.",
        "botpasswords-insert-failed": "Imposcibile azonze o nomme bot \"$1\". O l'è za stæto azonto?",
        "passwordreset-emailelement": "Nomme utente: \n$1\n\nPoula segretta temporannia: \n$2",
        "passwordreset-emailsentemail": "Se questo addresso de posta elettronnica o l'è associou a-a teu utença, alloa saiâ inviou un'e-mail pe rempostâ a poula segretta.",
        "passwordreset-emailsentusername": "Se gh'è un adreçço de posta elettronica associou con questo nomme utente, alloa saiâ inviou una email pe rempostâ a password.",
-       "passwordreset-emailsent-capture2": "L'email de rempostaçion da password {{PLURAL:$1|a l'è stæta inviâ|son stæte inviæ}}. {{PLURAL:$1|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|L'|E }}e-mail de rempostaçion da password {{PLURAL:$1|a l'è stæta inviâ|son stæte inviæ}}. {{PLURAL:$1|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì.",
        "passwordreset-emailerror-capture2": "Invio de email {{GENDER:$2|a l'utente}} non ariescio: $1. {{PLURAL:$3|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
        "passwordreset-nocaller": "Un chi ciamma ti g'hæ da dâlo",
        "passwordreset-nosuchcaller": "O ciamante o no l'existe: $1",
        "searchprofile-advanced-tooltip": "Çerca inti namespace personalizæ",
        "search-result-size": "$1 ({{PLURAL:$2|1 paròlla|$2 paròlle}})",
        "search-result-category-size": "{{PLURAL:$1|1 utente|$1 utenti}} ({{PLURAL:$2|1 sottocategoria|$2 sottocategorie}}, {{PLURAL:$3|1 file|$3 file}})",
-       "search-redirect": "(redirect $1)",
+       "search-redirect": "(Rendriçço da $1)",
        "search-section": "(seçión $1)",
        "search-category": "(categoria $1)",
        "search-file-match": "(corrispondença into contegnuo do file)",
        "largefileserver": "O file o suppera e dimenscioin consentie da-a configuaçion do server.",
        "emptyfile": "O file apen-a caregou pâ esee voeuo. Questo poriæ ese dovuo a un aro into nomme do file. Controlla se ti voeu davei caregâ sto file.",
        "windows-nonascii-filename": "Questo wiki o no supporta di nommi de file con di caratteri speciali.",
-       "fileexists": "Un papê con sto nomme o l'existe za, pe piaxei danni 'n'euggiâ a <strong>[[:$1]]</strong> se no ti t'ê seguo de voeilo cangiâ.\n[[$1|thumb]]",
+       "fileexists": "Un file con sto nomme o l'existe za, pe piaxei danni 'n'oeuggiâ a <strong>[[:$1]]</strong> se no ti t'ê seguo de voeilo cangiâ.\n[[$1|thumb]]",
        "filepageexists": "A pagina de descriçion de questo file a l'è za stæta creâ a l'adreçço <strong>[[:$1]]</strong>, sciben che no ghe segge ancon un file con questo nomme. A descriçion de l'oggetto inseia in fase de caregamento a no l'appariâ in scia pagina de descriçion. Pe fâ scì che l'oggetto o comparisce in sciâ pagina de descriçion, saiâ necessaio modificala manualmente.\n[[$1|thumb]]",
        "fileexists-extension": "Un file co-in nomme scimile a questo o l'esiste za: [[$2|thumb]]\n* Nomme do file caregou: <strong>[[:$1]]</strong>\n* Nomme do file existente: <strong>[[:$2]]</strong>\nTi voeu miga çerne un nomme ciu caratteristego?",
-       "fileexists-thumbnail-yes": "O file caregou o pâ ese una miniatua ''(thumbnail)''. [[$1|thumb]]\nVerifica, pe confronto, il file <strong>[[:$1]]</strong>.\nSe se tratta da mæxima inmaggine, inte dimenscioin originale, no l'è necessaio caregâne un'atra in miniatua.",
+       "fileexists-thumbnail-yes": "O file caregou o pâ ese 'na miniatua ''(thumbnail)''. [[$1|thumb]]\nControlla o file <strong>[[:$1]]</strong>.\nSe se tratta da mæxima inmaggine, inte dimenscioin originale, no l'è necessaio caregâne un'atra in miniatua.",
        "file-thumbnail-no": "O nomme do file comença con <strong>$1</strong>; pâ ch'o segge un'inmaggine de dimenscioin redute ''(miniatua)''.\nSe ti dispon-i del'immaggine inta risoluçion originale, carreghila. Sedunque, pe piaxei, cangighe o nomme.",
        "fileexists-forbidden": "Un file con questo nomme o l'existe za e o no poeu ese soviascrito. Se ti voeu caregâ o to file, torna inderê e dagghe un atro nomme. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Un file con questo nomme o l'esiste za inte l'archivio de risorse multimediæ condivise. Se ti dexiddei ancon caregâ o file, torna inderê e modifica o nomme co-o quæ caregâ o file. [[File:$1|thumb|center|$1]]",
        "upload-dialog-disabled": "O caregamento di file tramite questo barcon de dialogo o l'è disabilitou inte questo wiki.",
        "upload-dialog-title": "Carrega file",
        "upload-dialog-button-cancel": "Anulla",
+       "upload-dialog-button-back": "Inderê",
        "upload-dialog-button-done": "Fæto",
        "upload-dialog-button-save": "Sarva",
        "upload-dialog-button-upload": "Carrega",
        "uploadstash-errclear": "O nettezzo di file o no l'è ariescio.",
        "uploadstash-refresh": "Aggiorna l'elenco di file",
        "uploadstash-thumbnail": "veddi miniatua",
+       "uploadstash-exception": "Imposcibile memoizâ o caregamento in stash ($1): \"$2\".",
        "invalid-chunk-offset": "Offset d'a parte non vallido.",
        "img-auth-accessdenied": "Accesso negou",
        "img-auth-nopathinfo": "PATH_INFO mancante.\nO server o no l'è impostou pe passâ quest'informaçion.\nO poriæ ese basou insce CGI e o no poeu supportâ img_auth.\nAmia https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "apisandbox-results-fixtoken-fail": "Imposcibile recuperâ o token \"$1\".",
        "apisandbox-alert-page": "I campi insce questa pagina no son vallidi.",
        "apisandbox-alert-field": "O valô de questo campo o no l'è vallido.",
+       "apisandbox-continue": "Continnoa",
+       "apisandbox-continue-clear": "Nettezza",
        "booksources": "Fonte libraie",
        "booksources-search-legend": "Çerca e fonti",
        "booksources-isbn": "Codice ISBN:",
        "undeletepage": "Veddi e recuppera e pagine scançellæ",
        "undeletepagetitle": "'''Quanto segue o l'è composto da de revixoin scassæ de [[:$1|$1]]'''.",
        "viewdeletedpage": "Veddi e paggine scassæ",
-       "undeletepagetext": "{{PLURAL:$1|A seguente pagina a l'è stæta scassâ, ma a l'è ancon in archivio e pertanto a poeu ese recuperâ|Le seguente pagine son stæte scassæ, ma son ancon in archivio e pertanto poeuan ese recuperæ}}. L'archivio o poeu ese vuou periodicamente.",
+       "undeletepagetext": "{{PLURAL:$1|A seguente pagina a l'è stæta scassâ, ma a l'è ancon in archivio e pertanto a poeu ese recuperâ|E seguente pagine son stæte scassæ, ma son ancon in archivio e pertanto poeuan ese recuperæ}}. L'archivio o poeu ese vuou periodicamente.",
        "undelete-fieldset-title": "Ripristina revixoin",
        "undeleteextrahelp": "Pe recuperâ l'intrega cronologia da pagina, lascia tutte e caselle deseleçionæ e fanni clic insce '''''{{int:undeletebtn}}'''''.\nPe effettuâ un ripristino selettivo, seleçion-a e caselle corrispondente a-e verscioin da ripristinâ e fanni clic insce '''''{{int:undeletebtn}}'''''.",
        "undeleterevisions": "{{PLURAL:$1|Una revixon scassâ|$1 revixoin scassæ}}",
        "movepagetalktext": "Se ti seleçion-i questa casella, a corispondente paggina de discuscion a saiâ mesciâ aotomaticamente a-o neuvo tittolo, a meno che existe zà una paggina de discuscion ch'a no segge veua.\n\nInte sti caxi, ti doviæ mesciâ o unî manoalmente a paggina, se proppio ti veu.",
        "moveuserpage-warning": "'''Attençione:''' Ti stæ pe mesciâ una pagina utente. Notta che solo a pagina a saiâ mesciâ. L'utente o ''no'' saiâ rinominou.",
        "movecategorypage-warning": "<strong>Attençione:</strong> ti stæ pe mesciâ una categoria. Notta che solo sta paggina a saiâ mesciâ e tutte e pagine inta vegia categoria <em>no</em> saian inseie inta noeuva.",
-       "movenologintext": "O stramuo dee paggine o l'è consentio solo che a-i utenti registræ ch'han eseguio l'[[Special:UserLogin|accesso]] a-o scito.",
+       "movenologintext": "O stramuo de paggine o l'è consentio solo che a-i utenti registræ ch'han eseguio l'[[Special:UserLogin|accesso]] a-o scito.",
        "movenotallowed": "No ti g'hæ o permisso pe mesciâ de paggine.",
        "movenotallowedfile": "No ti g'hæ o permisso pe mesciâ di file.",
        "cant-move-user-page": "No ti g'hæ o permisso pe mesciâ de pagine utente (escluse e sottopagine).",
        "allmessagesdefault": "Testo predefinio",
        "allmessagescurrent": "Testo corrente",
        "allmessagestext": "Sta chie a l'è a lista de tutti i messaggi de scistema disponibili into namespace MediaWiki.\nVixita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [https://translatewiki.net translatewiki.net] se ti voeu contribuî a-a localizzaçion generrica de MediaWiki.",
-       "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' o non ti te peu vedde, perchè '''$wgUseDatabaseMessages''' o non l'è attivo.",
+       "allmessagesnotsupportedDB": "No l'è poscibbile doeuviâ sta paggina perchè o flag '''$wgUseDatabaseMessages''' o no l'è attivo.",
        "allmessages-filter-legend": "Filtro",
        "allmessages-filter": "Filtra pe stato de modiffica:",
        "allmessages-filter-unmodified": "Non modificæ",
        "tooltip-undo": "\"Anùlla\" o permette de anulâ sto cangiaménto e o l'arve o modulo de cangiaménto inta modalitæ anteprìmma. Ti peu ascì métte a raxón inte l'ogetto do cangiaménto.",
        "tooltip-preferences-save": "Sarva e preferençe",
        "tooltip-summary": "Scrîvi 'na scintexi",
-       "common.css": "/** i stili css scriti chie se applicana tutte e skin */",
+       "common.css": "/** i stili css scriti chì se apprican a tutte e skin */",
        "anonymous": "{{PLURAL:$1|Utente anonnimo|Utenti anonnimi}} de {{SITENAME}}",
        "siteuser": "$1, utente de {{SITENAME}}",
        "anonuser": "$1, utente anonnimo de {{SITENAME}}",
        "tag-filter-submit": "Filtro",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etichetta|Etichette}}]]: $2)",
        "tag-mw-contentmodelchange": "cangio a-o modello di contegnui",
+       "tag-mw-contentmodelchange-description": "Modiffiche che [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel cangian o modello di contegnui] de 'na paggina",
        "tags-title": "Etichette",
        "tags-intro": "Questa pagina a l'elenca i etichette che o software o poriæ associâ a 'na modiffica e o so scignificou.",
        "tags-tag": "Nomme de l'etichetta",
        "htmlform-cloner-create": "Azonzi de l'atro",
        "htmlform-cloner-delete": "Leva",
        "htmlform-cloner-required": "Ghe voeu a-o manco un valô.",
+       "htmlform-date-placeholder": "AAAA-MM-GG",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "AAAA-MM-GG HH:MM:SS",
+       "htmlform-date-invalid": "O valô specificou o no l'è riconoscito comme dæta. Prœuva a dœuviâ o formato AAAA-MM-GG.",
+       "htmlform-time-invalid": "O valô specificou o no l'è riconosciuo comme oraio. Prœuva a dœuviâ o formato HH:MM:SS.",
+       "htmlform-datetime-invalid": "O valô specificou o no l'è riconosciuo comme dæta e oa. Prœuva a dœuviâ o formato AAAA-MM-GG HH:MM:SS.",
+       "htmlform-date-toolow": "O valô specificou o l'è precedente a-a primma dæta consentia do $1.",
+       "htmlform-date-toohigh": "O valô specificou o l'è succescivo a l'urtima dæta consentia do $1.",
+       "htmlform-time-toolow": "O valô specificou o l'è precedente a-o primmo oraio consentio do $1.",
+       "htmlform-time-toohigh": "O valô specificou o l'è succescivo a l'urtimo oraio consentio do $1.",
+       "htmlform-datetime-toolow": "O valô specificou o l'è precedente a-a primma dæta e oa consentia do $1.",
+       "htmlform-datetime-toohigh": "O valô specificou o l'è succescivo a l'urtima dæta e oa consentia do $1.",
        "htmlform-title-badnamespace": "[[:$1]] a no se troeuva into namespace \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" o l'è o tittolo de una paggina non creabile",
        "htmlform-title-not-exists": "$1 a no l'existe.",
        "feedback-external-bug-report-button": "Documenta un problema tecnico",
        "feedback-dialog-title": "Invia un feedback",
        "feedback-dialog-intro": "Doeuvia o moddulo sottostante pe inviâ o to feedback. O to commento o l'appariâ inta paggina \"$1\", assemme a-o to nomme utente.",
-       "feedback-error-title": "Errô",
        "feedback-error1": "Errô: Da-a API l'è arrivou un risultou non riconosciuo",
        "feedback-error2": "Errô: No l'è stæto poscibbile eseguî a modiffica",
        "feedback-error3": "Errô: Nisciun-a risposta da-a API",
        "limitreport-expansiondepth": "Mascima profonditæ d'espanscion",
        "limitreport-expensivefunctioncount": "Nummero de fonçioin do parser dispendiose",
        "expandtemplates": "Espanscion di template",
-       "expand_templates_intro": "Questa pagina speciale a l'elabboa un testo espandendo tutti i template presenti.\nA carcoa ascì o risultou de fonçioon supportæ da-o parser comme\n<code><nowiki>{{</nowiki>#language:…}}</code> e de variabbile de scistema quæ\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>,\nsaiv'a dî inta prattica tutto 'lo che s'attroeuva tra parentexi graffe dogge.",
+       "expand_templates_intro": "Questa pagina speciale a l'elabboa un scrito espandendo tutti i template presenti.\nA calcola ascì o risultato de fonçioin supportæ da-o parser comme\n<code><nowiki>{{</nowiki>#language:…}}</code> e de variabbile de scistema quæ\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>,\nsaiv'a dî inta prattica tutto 'lo che s'attroeuva tra parentexi graffe dogge.",
        "expand_templates_title": "Contesto (pe {{FULLPAGENAME}} eçç.):",
        "expand_templates_input": "Testo da espande:",
        "expand_templates_output": "Risultou",
        "linkaccounts-submit": "Collega utençe",
        "unlinkaccounts": "Scollega utençe",
        "unlinkaccounts-success": "L'utença a l'è stæta scollegâ.",
-       "authenticationdatachange-ignored": "O cangiamento da dæta d'aotenticaçion o no l'è passou. Foscia che no gh'ea un provider configuou?"
+       "authenticationdatachange-ignored": "O cangiamento da dæta d'aotenticaçion o no l'è passou. Foscia che no gh'ea un provider configuou?",
+       "userjsispublic": "Regorda: e sottopaggine JavaScript no devan contegnî dæti riservæ percose son vixoalizabbile da-i atri utenti.",
+       "usercssispublic": "Regorda: e sottopagine CSS no devan contegnî dæti riservæ percose son vixoalizabbile da i atri utenti.",
+       "restrictionsfield-badip": "Intervallo d'adreççi IP non vallido:$1",
+       "restrictionsfield-label": "Intervalli IP consentii:",
+       "restrictionsfield-help": "Un adresso IP ò intervallo CIDR pe linnia. Pe consentî tutto, adœuvia<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 18a05e5..2cccbf5 100644 (file)
        "tog-hidepatrolled": "Slėpti patikrintus keitimus paskutinių keitimų sąraše",
        "tog-newpageshidepatrolled": "Slėpti patikrintus puslapius iš naujausių straipsnių sąrašo",
        "tog-hidecategorization": "Slėpti puslapių kategorizavimą",
-       "tog-extendwatchlist": "Išplėsti stebimųjų sąrašą, kad rodytų visus tinkamus keitimus, ne tik pačius naujausius.",
+       "tog-extendwatchlist": "Išplėsti stebimųjų sąrašą, kad rodytų visus tinkamus keitimus, ne tik pačius naujausius",
        "tog-usenewrc": "Grupuoti pakeitimas pagal puslapį paskutinių keitimų ir stebėjimo sąrašuose",
        "tog-numberheadings": "Automatiškai numeruoti skyrelius",
        "tog-showtoolbar": "Rodyti redagavimo įrankių juosta",
        "tog-editondblclick": "Puslapių redagavimas dvigubu spustelėjimu (JavaScript)",
        "tog-editsectiononrightclick": "Įjungti skyrelių redagavimą paspaudus skyrelio pavadinimą dešiniuoju pelės klavišu (JavaScript)",
-       "tog-watchcreations": "Pridėti puslapius, kuriuos aš sukuriu, į stebimų sąrašą",
-       "tog-watchdefault": "Pridėti puslapius, kuriuos aš redaguoju, į stebimų sąrašą",
-       "tog-watchmoves": "Pridėti puslapius, kuriuos aš perkeliu, į stebimų sąrašą",
-       "tog-watchdeletion": "Pridėti puslapius, kuriuos aš ištrinu, į stebimų sąrašą",
+       "tog-watchcreations": "Pridėti mano sukuriamus puslapius į stebimųjų sąrašą",
+       "tog-watchdefault": "Pridėti puslapius, kuriuos aš redaguoju, į stebimų sąrašą",
+       "tog-watchmoves": "Pridėti puslapius ir failus, kuriuos aš perkeliu, į stebimųjų sąrašą",
+       "tog-watchdeletion": "Pridėti puslapius, kuriuos aš ištrinu, į stebimų sąrašą",
        "tog-watchuploads": "Pridėti naujus failus, kurios aš įkeliu, į mano stebimųjų sąrašą",
-       "tog-watchrollback": "Pridėti puslapius, kuriuose aš atlikau atmetimus į mano stebėjimo sąrašą",
+       "tog-watchrollback": "Pridėti puslapius, kuriuose aš atlikau atmetimus, į stebimųjų sąrašą",
        "tog-minordefault": "Pagal nutylėjimą pažymėti redagavimus kaip smulkius",
        "tog-previewontop": "Rodyti peržiūrą virš redagavimo lauko",
        "tog-previewonfirst": "Rodyti peržiūrą pirmą kartą pakeitus",
        "tog-enotifminoredits": "Siųsti man laišką, kai puslapio keitimas yra smulkus",
        "tog-enotifrevealaddr": "Rodyti mano el. pašto adresą priminimo laiškuose",
        "tog-shownumberswatching": "Rodyti stebinčių naudotojų skaičių",
-       "tog-oldsig": "Jūsų egzistuojantis parašas:",
+       "tog-oldsig": "Jūsų dabartinis parašas:",
        "tog-fancysig": "Laikyti parašą vikitekstu (be automatinių nuorodų)",
        "tog-uselivepreview": "Naudoti tiesioginę peržiūrą",
        "tog-forceeditsummary": "Klausti, kai palieku tuščią keitimo komentarą",
-       "tog-watchlisthideown": "Slėpti mano keitimus stebimų sąraše",
-       "tog-watchlisthidebots": "Slėpti robotų keitimus stebimų sąraše",
-       "tog-watchlisthideminor": "Slėpti smulkius keitimus stebimų sąraše",
+       "tog-watchlisthideown": "Slėpti mano keitimus stebimų sąraše",
+       "tog-watchlisthidebots": "Slėpti botų keitimus stebimųjų sąraše",
+       "tog-watchlisthideminor": "Slėpti smulkius keitimus stebimų sąraše",
        "tog-watchlisthideliu": "Slėpti prisijungusių naudotojų keitimus stebimųjų sąraše",
        "tog-watchlistreloadautomatically": "Atnaujinti stebėjimų sąrašą automatiškai, kai tik filtras yra pakeičiamas (reikalingas JavaScript)",
        "tog-watchlisthideanons": "Slėpti anoniminių naudotojų keitimus stebimųjų sąraše",
        "laggedslavemode": "Dėmesio: Puslapyje gali nesimatyti naujausių pakeitimų.",
        "readonly": "Duomenų bazė užrakinta",
        "enterlockreason": "Įveskite užrakinimo priežastį, taip pat datą, kada bus atrakinta",
-       "readonlytext": "Duomenų bazė šiuo metu yra užrakinta naujiems įrašams ar kitiems keitimams,\nturbūt duomenų bazės techninei profilaktikai,\npo to viskas vėl veiks kaip įprasta.\n\nUžrakinusiojo administratoriaus pateiktas rakinimo paaiškinimas: $1",
+       "readonlytext": "Duomenų bazė šiuo metu yra užrakinta naujiems įrašams ar kitiems keitimams,greičiausiai duomenų bazės techninei profilaktikai,\npo kurios viskas vėl veiks kaip įprasta.\n\nUžrakinusiojo sistemos administratoriaus pateiktas paaiškinimas: $1",
        "missing-article": "Duomenų bazė nerado puslapio teksto, kurį ji turėtų rasti, pavadinto „$1“ $2.\n\nPaprastai tai būna dėl pasenusios skirtumo ar istorijos nuorodos į puslapį, kuris buvo ištrintas.\n\nJei tai ne tas atvejis, jūs galbūt radote klaidą programinėje įrangoje.\nPrašome apie tai pranešti [[Special:ListUsers/sysop|administratoriui]], nepamiršdami nurodyti nuorodą.",
        "missingarticle-rev": "(versija#: $1)",
        "missingarticle-diff": "(Skirt.: $1, $2)",
        "title-invalid-magic-tilde": "Prašomo puslapio pavadinimas turi negalima magiška tildės seką (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Prašomo puslapio pavadinimas yra per ilgas. Jis turi būti ne ilgesnis nei {{PLURAL:$1|baitas|baitai}} UTF-8 koduotėje.",
        "title-invalid-leading-colon": "Prašomo puslapio pavadinimas turi neleistiną dvitaškį pradžioje.",
-       "perfcached": "Rodoma išsaugota duomenų kopija, todėl duomenys gali būti ne patys naujausi. Maksimaliai $1 {{PLURAL:$1|rezultatas|rezultatai|rezultatų}} yra saugoma.",
-       "perfcachedts": "Rodoma išsaugota duomenų kopija, kuri buvo atnaujinta $2 $3. Maksimaliai $4 {{PLURAL:$4|rezultatas|rezultatai|rezultatų}} yra saugoma.",
+       "perfcached": "Rodoma išsaugota duomenų kopija, todėl duomenys gali būti ne patys naujausi. Saugoma iki $1 {{PLURAL:$1|rezultatas|rezultatai|rezultatų}}.",
+       "perfcachedts": "Rodoma išsaugota duomenų kopija, kuri buvo atnaujinta $2 $3. Saugoma iki $4 {{PLURAL:$4|rezultatas|rezultatai|rezultatų}}.",
        "querypage-no-updates": "Atnaujinimai šiam puslapiui dabar yra išjungti. Duomenys čia dabar nebus atnaujinti.",
        "viewsource": "Žiūrėti kodą",
        "viewsource-title": "Peržiūrėti šaltinį $1",
        "actionthrottled": "Veiksmas apribotas",
-       "actionthrottledtext": "Kad būtų apsisaugota nuo reklamų, jums neleidžiama daug kartų atlikti šį veiksmą per trumpą laiko tarpą, bet jūs pasiekėte šį limitą. Prašome vėl pamėginti po kelių minučių.",
+       "actionthrottledtext": "Kad būtų apsisaugota nuo pažeidimų, jums neleidžiama pernelyg daug kartų atlikti šį veiksmą per trumpą laiko tarpą. Jūs viršijote šį limitą. Prašome vėl pamėginti po kelių minučių.",
        "protectedpagetext": "Šis puslapis yra užrakintas, saugant jį nuo redagavimo.",
        "viewsourcetext": "Jūs galite peržiūrėti ir kopijuoti puslapio kodą:",
        "viewyourtext": "Jūs galite peržiūrėti ir kopijuoti <strong>savo pakeitimų</strong> kodą į šį puslapį:",
        "eauthentsent": "Patvirtinimo laiškas buvo nusiųstas į paskirtąjį el. pašto adresą.\nPrieš išsiunčiant kitą laišką į jūsų dėžutę, jūs turite vykdyti nurodymus laiške, kad patvirtintumėte, kad dėžutė tikrai yra jūsų.",
        "throttled-mailpassword": "Slaptažodžio priminimas jau buvo išsiųstas, per {{PLURAL:$1|$1 paskutinę valandą|$1 paskutines valandas|$1 paskutinių valandų}}.\n\nNorint apsisaugoti nuo piktnaudžiavimo, slaptažodžio priminimas gali būti išsiųstas tik kas {{PLURAL:$1|$1 valandą|$1 valandas|$1 valandų}}.",
        "mailerror": "Klaida siunčiant laišką: $1",
-       "acct_creation_throttle_hit": "Šio projekto lankytojai, naudojantys jūsų IP adresą, sukūrė {{PLURAL:$1|$1 paskyrą|$1 paskyras|$1 paskyrų}} per paskutiniąją dieną, o tai yra didžiausias leidžiamas kiekis per šį laiko tarpą.\nTodėl šiuo metu lankytojai, naudojantys šį IP adresą, daugiau negali kurti paskyrų.",
+       "acct_creation_throttle_hit": "Šio projekto lankytojai, naudojantys jūsų IP adresą, sukūrė {{PLURAL:$1|$1 paskyrą|$1 paskyras|$1 paskyrų}} per $2, o tai yra didžiausias leidžiamas kiekis per šį laiko tarpą.\nTodėl šiuo metu lankytojai, naudojantys šį IP adresą, daugiau negali kurti paskyrų.",
        "emailauthenticated": "Jūsų el. pašto adresas buvo patvirtintas $2 d. $3.",
        "emailnotauthenticated": "Jūsų el. pašto adresas dar nėra patvirtintas. Jokie laiškai\nnebus siunčiami nei vienai žemiau išvardintai paslaugai.",
        "noemailprefs": "Nurodykite el. pašto adresą, kad šios funkcijos veiktų.",
        "pt-userlogout": "Atsijungti",
        "php-mail-error-unknown": "Nežinoma klaida PHP mail() funkcijoje",
        "user-mail-no-addy": "Bandyta išsiųsti elektroninį laišką be el. pašto adreso.",
-       "user-mail-no-body": "Mėginta siųsti tuščia ar pernelyg trumpą E-pašto žinutė.",
+       "user-mail-no-body": "Bandyta siųsti tuščią ar pernelyg trumpą el. pašto žinutę.",
        "changepassword": "Pakeisti slaptažodį",
        "resetpass_announce": "Norint užbaigti prisijungimą jums reikia nustatyti naująjį slaptažodį.",
        "resetpass_text": "<!-- Įterpkite čia tekstą -->",
        "resetpass-expired": "Jūsų slaptažodžio galiojimas baigėsi. Prašome nustatyti naują prisijungimo slaptažodį.",
        "resetpass-expired-soft": "Jūsų slaptažodžio galiojimas baigėsi ir jį reikia atkurti iš naujo. Pasirinkite naują slaptažodį dabar arba spauskite \"{{int:authprovider-resetpass-skip-label}}\", kad būtų atstatytas vėliau.",
        "resetpass-validity-soft": "Jūsų slaptažodis netinkamas: $1\n\nPasirinkite naują slaptažodį dabar arba spauskite \"{{int:authprovider-resetpass-skip-label}}\", kad būtų atkurtas vėliau.",
-       "passwordreset": "Atstatyti slaptažodį",
+       "passwordreset": "Atkurti slaptažodį",
        "passwordreset-text-one": "Užpildykite šią formą, norėdami atkurti savo slaptažodį.",
-       "passwordreset-text-many": "{{PLURAL:$1|Užpildykite vieną iš laukų slaptažodžio atkūrimui.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Užpildykite vieną iš laukelių, kad el. paštu gautumėte laikinąjį slaptažodį.}}",
        "passwordreset-disabled": "Slaptažodžių atstatymai šiame wikyje išjungti.",
        "passwordreset-emaildisabled": "El. pašto funkcijos uždraustos šiame wiki.",
        "passwordreset-username": "Naudotojo vardas:",
        "suppressionlog": "Trynimo sąrašas",
        "suppressionlogtext": "Žemiau yra trynimų ir blokavimų sąrašas, įtraukiant turinį, paslėptą nuo administratorių.\nŽiūrėkite [[Special:BlockList|blokavimų sąrašą]], kad rastumėte dabar veikiančius draudimus ir blokavimus.",
        "mergehistory": "Sujungti puslapių istorijas",
-       "mergehistory-header": "Šis puslapis leidžia jus prijungti vieno pirminio puslapio istorijos versijas į naujesnį puslapį. Įsitikinkite, kad šis pakeitimas palaikys istorinį puslapio tęstinumą.\n\n'''Turi likti bent dabartinė pirminio puslapio versija.'''",
+       "mergehistory-header": "Šis puslapis leidžia jums prijungti vieno pirminio puslapio istorijos versijas į naujesnį puslapį. Įsitikinkite, kad šis pakeitimas palaikys istorinį puslapio tęstinumą.\n\n'''Turi likti bent dabartinė pirminio puslapio versija.'''",
        "mergehistory-box": "Sujungti dviejų puslapių versijas:",
        "mergehistory-from": "Pirminis puslapis:",
        "mergehistory-into": "Paskirties puslapis:",
        "searchprofile-advanced-tooltip": "Ieškoti skirtingose vardų srityse",
        "search-result-size": "$1 ({{PLURAL:$2|1 žodis|$2 žodžiai|$2 žodžių}})",
        "search-result-category-size": "{{PLURAL:$1|1 narys|$1 narių}} ({{PLURAL:$2|1 subkategorijoje|$2 subkategorijų}}, {{PLURAL:$3|1 failas|$3 failų}})",
-       "search-redirect": "(peradresavimas $1)",
+       "search-redirect": "(peradresavimas iš $1)",
        "search-section": "(skyrius $1)",
        "search-category": "(kategorija $1)",
        "search-file-match": "(atitinka rinkmenos turinį)",
        "prefs-user-pages": "Naudotojo puslapiai",
        "prefs-personal": "Naudotojo profilis",
        "prefs-rc": "Naujausi keitimai",
-       "prefs-watchlist": "Stebimų sąrašas",
+       "prefs-watchlist": "Stebimų sąrašas",
        "prefs-editwatchlist": "Redaguoti stebimųjų sąrašą",
-       "prefs-editwatchlist-label": "Redaguoti įrašus savo stebėjimo sąraše:",
-       "prefs-editwatchlist-edit": "Peržiūrėti ir pašalinti pavadinmus savo stebėjimo sąraše",
+       "prefs-editwatchlist-label": "Redaguoti įrašus stebėjimųjų sąraše:",
+       "prefs-editwatchlist-edit": "Peržiūrėti ir pašalinti puslapius iš stebimųjų sąrašo",
        "prefs-editwatchlist-raw": "Redaguoti grynąjį stebimųjų sąrašą",
        "prefs-editwatchlist-clear": "Išvalyti stebimųjų sąrašą",
        "prefs-watchlist-days": "Dienos rodomos stebimųjų sąraše:",
        "timezoneregion-europe": "Europa",
        "timezoneregion-indian": "Indijos vandenynas",
        "timezoneregion-pacific": "Ramusis vandenynas",
-       "allowemail": "Leisti siųsti el. laiškus iš kitų naudotojų",
+       "allowemail": "Leisti kitiems naudotojams siųsti man el. laiškus",
        "prefs-searchoptions": "Paieška",
        "prefs-namespaces": "Vardų sritys",
        "default": "pagal nutylėjimą",
        "email": "El. paštas",
        "prefs-help-realname": "Tikrasis vardas yra neprivalomas.\nJei jūs jį įvesite, jis bus naudojamas pažymėti jūsų darbą.",
        "prefs-help-email": "E-pašto adresas yra neprivalomas, tačiau reikalingas slaptažodį naujo, turi tu pamiršai savo slaptažodį.",
-       "prefs-help-email-others": "Taip pat galite pasirinkti, kad žmonės galėtų susisiekti su jumis per jūsų naudotojo ar naudotojo aptarimo puslapį neatskleidžiant jūsų tapatybės.",
+       "prefs-help-email-others": "Taip pat galite pasirinkti, kad žmonės galėtų susisiekti su jumis el. paštu per jūsų naudotojo ar naudotojo aptarimo puslapyje esančią nuorodą. Jūsų el. pašto adresas, kitam naudotojui su jumis susisiekus, nėra atskleidžiamas.",
        "prefs-help-email-required": "El. pašto adresas yra būtinas.",
        "prefs-info": "Pagrindinė informacija",
        "prefs-i18n": "Kalbos nustatymai",
        "right-edituserjs": "Redaguoti kitų naudotojų JS failus",
        "right-editmyusercss": "Redaguoti savo vartotojo CSS failus",
        "right-editmyuserjs": "Redaguokite savo naudotojo vartotojo JavaScript failus",
-       "right-viewmywatchlist": "Peržiūrėti savo stebimų sąrašą",
+       "right-viewmywatchlist": "Peržiūrėti savo stebimų sąrašą",
        "right-editmywatchlist": "Keiskite savo stebimųjų sąrašą. Atminkite, kad kai kurie veiksmai vis vien pridės puslapius netgi be tokios teisės.",
        "right-viewmyprivateinfo": "Peržiūrėti asmeninius duomenis (pvz., elektroninis paštas, tikras vardas)",
        "right-editmyprivateinfo": "Keisti asmeninius duomenis (pvz., elektroninis paštas, tikras vardas)",
        "grant-generic": "\"$1\" teisių rinkinys",
        "grant-group-page-interaction": "Sąveikauti su puslapiais",
        "grant-group-file-interaction": "Sąveikauti su medija",
-       "grant-group-watchlist-interaction": "Sąveikauti su savo stebimu sąrašu",
+       "grant-group-watchlist-interaction": "Sąveikauti su savo stebimųjų sąrašu",
        "grant-group-email": "Siųsti el. laišką",
        "grant-group-high-volume": "Atlikti didelės apimties veiklą",
        "grant-group-customization": "Pritaikymas ir parinktys",
        "enhancedrc-history": "istorija",
        "recentchanges": "Naujausi keitimai",
        "recentchanges-legend": "Naujausių keitimų parinktys",
-       "recentchanges-summary": "Å iame puslapyje yra patys naujausi pakeitimai Å¡iame projekte.",
+       "recentchanges-summary": "Žemiau pateikiamas naujausių Å¡io projekto pakeitimų sÄ\85raÅ¡as.",
        "recentchanges-noresult": "Per nurodytą laiką atliktų keitimų, atitinkančių nurodytas sąlygas, nėra.",
        "recentchanges-feed-description": "Sekite pačius naujausius projekto keitimus šiame šaltinyje.",
        "recentchanges-label-newpage": "Šiuo keitimu sukurtas naujas puslapis",
        "statistics-users-active-desc": "Naudotojai, kurie per {{PLURAL:$1|paskutinę dieną|paskutines $1 dienų}} padarė keitimų",
        "pageswithprop": "Puslapiai su puslapio atributais",
        "pageswithprop-legend": "Puslapiai su puslapio atributais",
-       "pageswithprop-text": "Šiame puslapyje pateikiami puslapiai, kurie ypač naudoja puslapio atributus.",
-       "pageswithprop-prop": "Ypatybės pavadinimas:",
+       "pageswithprop-text": "Šiame puslapyje pateikiami puslapiai, turintys atitinkamą puslapio atributą.",
+       "pageswithprop-prop": "Atributo pavadinimas:",
        "pageswithprop-submit": "Eiti",
        "pageswithprop-prophidden-long": "ilgo teksto turto vertė paslėpta ($1)",
        "pageswithprop-prophidden-binary": "dvejetainė turto vertė paslėpta ($1)",
        "uncategorizedtemplates": "Šablonai, nepriskirti jokiai kategorijai",
        "unusedcategories": "Nenaudojamos kategorijos",
        "unusedimages": "Nenaudojami failai",
-       "wantedcategories": "Geidžiamiausios kategorijos",
-       "wantedpages": "Geidžiamiausi puslapiai",
+       "wantedcategories": "Reikiamiausios kategorijos",
+       "wantedpages": "Reikiamiausi puslapiai",
        "wantedpages-summary": "Sąrašas neegzistuojančių puslapių su daugiausią nuorodų į juos, išskyrus puslapius, kurie turi tik nukreipimus į juos. Jei norite pamatyti sąrašą neegzistuojančių puslapių, su nukreipimais į juos, žiūrėkite [[{{#special:BrokenRedirects}}|neveikiančių nuorodų sąrašą]].",
        "wantedpages-badtitle": "Neleistinas pavadinimas rezultatų rinkinyje: $1",
-       "wantedfiles": "Trokštami failai",
+       "wantedfiles": "Reikiamiausi failai",
        "wantedfiletext-cat": "Sekantys failai yra naudojami, bet neegzistuoja. Čia failai iš išorinių saugyklų gali būti išvardinti, nors jie jose ir egzistuoja. Failai netenkinantys šių sąlygų gali būti <del>perbraukti</del>. Papildomai peržiūrėkite [[:$1|puslapius]], kuriuose yra naudojami čia išvardinti neegzistuojantys failai.",
        "wantedfiletext-cat-noforeign": "Šie failai yra naudojami, bet neegzistuoja. Be to, puslapiai su šiais failais, kurie neegzistuoja yra išvardinti [[:$1]].",
        "wantedfiletext-nocat": "Sekantys failai yra naudojami, bet neegzistuoja. Čia failai iš išorinių saugyklų gali būti išvardinti, nors jie jose ir egzistuoja. Failai netenkinantys šių sąlygų gali būti <del>perbraukti</del>.",
        "wantedfiletext-nocat-noforeign": "Šios rinkmenos yra naudojamos, tačiau nesti.",
-       "wantedtemplates": "Trokštami šablonai",
+       "wantedtemplates": "Reikiamiausi šablonai",
        "mostlinked": "Daugiausiai nurodomi puslapiai",
        "mostlinkedcategories": "Daugiausiai nurodomos kategorijos",
        "mostlinkedtemplates": "Daugiausiai nurodomi šablonai",
        "apisandbox-results-fixtoken-fail": "Nepavyko gauti „$1“ žetono.",
        "apisandbox-alert-page": "Laukai šiame puslapyje yra negalimi.",
        "apisandbox-alert-field": "Šio lauko reikšmė yra neteisinga.",
+       "apisandbox-continue": "Tęsti",
+       "apisandbox-continue-clear": "Išvalyti",
        "booksources": "Knygų šaltiniai",
        "booksources-search-legend": "Knygų šaltinių paieška",
        "booksources-search": "Ieškoti",
        "mailnologin": "Nėra adreso",
        "mailnologintext": "Jums reikia būti [[Special:UserLogin|prisijungusiam]] ir turi būti įvestas teisingas el. pašto adresas jūsų [[Special:Preferences|nustatymuose]], kad siųstumėte el. laiškus kitiems nautotojams.",
        "emailuser": "Rašyti laišką šiam naudotojui",
-       "emailuser-title-target": "Siųsti E-pašto žinutę {{GENDER:$1|user}}",
+       "emailuser-title-target": "Siųsti el. pašto žinutę {{GENDER:$1|naudotojui|naudotojai}}",
        "emailuser-title-notarget": "El. pašto vartotojas",
-       "emailpagetext": "Jūs galite pasinaudoti šiuo pavyzdžiu, norėdami nusiųsti elektroninį laišką šiam naudotojui.\nElektroninio pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustatymuose]], bus rodomas kaip el. pašto siuntėjo adresas, tam, kad gavėjas galėtų jums iškart atsakyti.",
+       "emailpagetext": "Jūs galite pasinaudoti šiuo pavyzdžiu, norėdami nusiųsti elektroninį laišką {{GENDER:$1|šiam naudotojui|šiai naudotojai}}.\nElektroninio pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustatymuose]], bus rodomas kaip el. pašto siuntėjo adresas tam, kad gavėjas galėtų tiesiogiai jums atsakyti.",
        "defemailsubject": "{{SITENAME}} el. pašto iš vartotojo \" $1 \"",
        "usermaildisabled": "Naudotojo elektroninis paštas išjungtas",
        "usermaildisabledtext": "Jūs negalite siūlsti el. laiško kitiems šio wiki projekto naudotojams.",
        "emailuserfooter": "Šis el. laiškas buvo išsiųstas naudotojo $1 naudotojui $2 naudojant „{{int:emailuser}}“ funkciją {{SITENAME}}.",
        "usermessage-summary": "Paliekamas sistemos pranešimas.",
        "usermessage-editor": "Sistemos pranešėjas",
-       "watchlist": "Stebimų sąrašas",
+       "watchlist": "Stebimų sąrašas",
        "mywatchlist": "Stebimų sąrašas",
-       "watchlistfor2": "Naudotojo $1 $2",
+       "watchlistfor2": "Naudotojas: $1 $2",
        "nowatchlist": "Neturite nei vieno stebimo puslapio.",
        "watchlistanontext": "Prašome prisijungti, kad peržiūrėtumėte ar pakeistumėte elementus savo stebimųjų sąraše.",
        "watchnologin": "Neprisijungęs",
        "addwatch": "Pridėti į stebimųjų sąrašą",
        "addedwatchtext": "\"[[:$1]]\" ir jo aptarimo puslapis buvo įtraukti į Jūsų [[Special:Watchlist|stebėjimo sąrašą]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" ir su juo susijęs puslapis buvo įtraukti į Jūsų [[Special:Watchlist|stebimųjų sąrašą]].",
        "addedwatchtext-short": "Puslapis „$1“ pridėtas į jūsų stebimųjų sąrašą.",
        "removewatch": "Pašalinti iš stebimųjų sąrašo",
        "removedwatchtext": "\"[[:$1]]\" ir jo aptarimo puslapis buvo pašalinti iš Jūsų [[Special:Watchlist|stebėjimo sąrašo]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" ir su juo susijęs puslapis buvo pašalinti iš Jūsų [[Special:Watchlist|stebimųjų sąrašo]].",
        "removedwatchtext-short": "Puslapis „$1“ pašalintas iš jūsų stebimųjų sąrašo.",
        "watch": "Stebėti",
        "watchthispage": "Stebėti šį puslapį",
        "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ų}}, neskaičiuojant aptarimų puslapių.",
        "wlheader-enotif": "El. pašto pranešimai yra įjungti.",
        "wlheader-showupdated": "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
        "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.",
        "enotif_lastvisited": "Užeikite į $1, jei norite matyti pakeitimus nuo paskutiniojo apsilankymo.",
        "enotif_lastdiff": "Užeikite į $1, jei norite pamatyti šį pakeitimą.",
        "enotif_anon_editor": "anoniminis naudotojas $1",
-       "enotif_body": "$WATCHINGUSERNAME,\n\n\n$PAGEEDITDATE {{SITENAME}} projekte $PAGEEDITOR $CHANGEDORCREATED puslapį „$PAGETITLE“, dabartinę versiją rasite adresu $PAGETITLE_URL.\n\n$NEWPAGE\n\nRedaguotojo komentaras: $PAGESUMMARY $PAGEMINOREDIT\n\nSusisiekti su redaguotoju:\nel. paštu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDaugiau pranešimų apie vėlesnius pakeitimus nebus siunčiama, jei neapsilankysite puslapyje.\nJūs taip pat galite išjungti pranešimo žymę visiems jūsų stebimiems puslapiams savo stebimųjų sąraše.\n\n Jūsų draugiškoji projekto {{SITENAME}} pranešimų sistema\n\n--\nNorėdami pakeisti e-paštu siunčiamų pranešimų nustatymus, užeikite į\n{{canonicalurl:{{#special:Preferences}}}}\n\nNorėdami pakeisti stebimų puslapių nustatymus, užeikite į\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nNorėdami puslapį iš stebimų puslapių sąrašo, užeikite į\n$UNWATCHURL\n\nAtsiliepimai ir pagalba:\n$HELPPAGE",
+       "enotif_body": "$WATCHINGUSERNAME,\n\n\n$PAGEEDITDATE {{SITENAME}} projekte $PAGEEDITOR $CHANGEDORCREATED puslapį „$PAGETITLE“, dabartinę versiją rasite adresu $PAGETITLE_URL.\n\n$NEWPAGE\n\nRedaguotojo komentaras: $PAGESUMMARY $PAGEMINOREDIT\n\nSusisiekti su redaguotoju:\nel. paštu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDaugiau pranešimų apie vėlesnius pakeitimus nebus siunčiama, jei neapsilankysite puslapyje.\nJūs taip pat galite išjungti pranešimo žymę visiems jūsų stebimiems puslapiams savo stebimųjų sąraše.\n\n Jūsų draugiškoji projekto {{SITENAME}} pranešimų sistema\n\n--\nNorėdami pakeisti e-paštu siunčiamų pranešimų nustatymus, užeikite į\n{{canonicalurl:{{#special:Preferences}}}}\n\nNorėdami pakeisti stebimųjų puslapių nustatymus, užeikite į\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nNorėdami puslapį iš stebimųjų puslapių sąrašo, užeikite į\n$UNWATCHURL\n\nAtsiliepimai ir pagalba:\n$HELPPAGE",
        "created": "sukurė",
        "changed": "pakeitė",
        "deletepage": "Trinti puslapį",
        "delete-toobig": "Šis puslapis turi ilgą keitimų istoriją, daugiau nei $1 {{PLURAL:$1|revizija|revizijos|revizijų}}. Tokių puslapių trynimas yra apribotas, kad būtų išvengta atsitiktinio {{SITENAME}} žlugdymo.",
        "delete-warning-toobig": "Šis puslapis turi ilgą keitimų istoriją, daugiau nei $1 {{PLURAL:$1|revizija|revizijos|revizijų}}. Trinant jis gali sutrikdyti {{SITENAME}} duomenų bazės operacijas; būkite atsargūs.",
        "deleteprotected": "Jūs šio puslapio ištrinti negalite, nes jis apsaugotas.",
-       "deleting-backlinks-warning": "'''Dėmesio:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Kiti puslapiai]] nurodo ar įtraukia puslapį, kurį ruošiatės trinti.",
+       "deleting-backlinks-warning": "<strong>Dėmesio:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Kiti puslapiai]] nurodo ar įtraukia puslapį, kurį ruošiatės trinti.",
        "rollback": "Atmesti keitimus",
        "rollbacklink": "atmesti",
        "rollbacklinkcount": "atmesti $1 {{PLURAL:$1|keitimą|keitimus}}",
        "rollbacklinkcount-morethan": "atmesti daugiau nei $1 {{PLURAL:$1|keitimą|keitimų}}",
        "rollbackfailed": "Atmetimas nepavyko",
+       "rollback-missingrevision": "Nepavyko įkelti versijos duomenų.",
        "cantrollback": "Negalima atmesti redagavimo; paskutinis keitęs naudotojas yra šio puslapio autorius.",
        "alreadyrolled": "Nepavyko atmesti paskutinio [[User:$2|$2]] ([[User talk:$2|Aptarimas]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) daryto puslapio [[:$1]] keitimo;\nkažkas jau pakeitė puslapį arba suspėjo pirmas atmesti keitimą.\n\nPaskutimas keitimas darytas naudotojo [[User:$3|$3]] ([[User talk:$3|Aptarimas]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Pateiktas toks keitimo paaiškinimas: <em>$1</em>.",
        "revertpage": "Atmestas [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarimas]]) pakeitimas; sugrąžinta [[User:$1|$1]] versija",
        "revertpage-nouser": "Atversti pakeitimai paslėpto vartotojo, grąžino prieš tai buvusią versiją {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Atmesti $1 pakeitimai;\ngrąžinta prieš tai buvusi $2 versija.",
+       "rollback-success-notify": "Atmesti $1 pakeitimai;\ngrąžinta prieš tai buvusi $2 versija. [$3 Rodyti skirtumus]",
        "sessionfailure-title": "Sesijos klaida",
        "sessionfailure": "Atrodo yra problemų su jūsų prisijungimo sesija; šis veiksmas buvo atšauktas kaip atsargumo priemonė prieš sesijos vogimą.\nPrašome paspausti „atgal“ ir perkraukite puslapį iš kurio atėjote, ir pamėginkite vėl.",
        "changecontentmodel": "Keisti puslapio turinio modelį",
        "changecontentmodel-cannot-convert": "Turinys [[:$1]] negali būti konvertuotas į $2 tipą.",
        "changecontentmodel-nodirectediting": "$1 turinio modelis nepalaiko tiesioginio redagavimo",
        "changecontentmodel-emptymodels-title": "Nėra prieinamų turinio modelių",
+       "changecontentmodel-emptymodels-text": "[[:$1]] turinys negali būti konvertuotas į jokį tipą.",
        "log-name-contentmodel": "Turinio modelio kaitos istorija",
        "log-description-contentmodel": "Įvykiai susiję su puslapio turinio modeliu",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|sukūrė}} puslapį $3, naudodamas nestandartinį turinio modelį \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|atnaujino}} puslapio $3 turinio modelį iš $4 į $5",
        "logentry-contentmodel-change-revertlink": "atšaukti",
        "logentry-contentmodel-change-revert": "atšaukti",
        "undeletehistorynoadmin": "Šis puslapis buvo ištrintas. Žemiau rodoma trynimo priežastis bei kas redagavo puslapį iki ištrynimo. Ištrintų puslapių tekstas yra galimas tik administratoriams.",
        "undelete-revision": "Ištrinta $1 versija, kurią $4 d. $5 sukūrė $3:",
        "undeleterevision-missing": "Neteisinga arba dingusi versija. Jūs turbūt turite blogą nuorodą, arba versija buvo atkurta arba pašalinta iš archyvo.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|Viena versija|$1 versijos}} negalėjo būti atkurtos, nes {{PLURAL:$1|jos|jų}} <code>rev_id</code> jau buvo naudojamas.",
        "undelete-nodiff": "Nerasta jokių ankstesnių versijų.",
        "undeletebtn": "Atkurti",
        "undeletelink": "žiūrėti/atkurti",
        "contributions-title": "{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis",
        "mycontris": "Indėlis",
        "anoncontribs": "Indėlis",
-       "contribsub2": "Dėl {{GENDER:$3|$1}} ($2)",
+       "contribsub2": "Naudotojas: {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Naudotojo paskyra „$1“ neužregistruota.",
        "nocontribs": "Jokie keitimai neatitiko šių kriterijų.",
        "uctop": "(dabartinis)",
        "sp-contributions-newbies": "Rodyti tik naujų paskyrų keitimus",
        "sp-contributions-newbies-sub": "Neseniai prisiregistravusieji",
        "sp-contributions-newbies-title": "Naujai užsiregistravusių naudotojų indėlis",
-       "sp-contributions-blocklog": "Blokavimų sąrašas",
-       "sp-contributions-suppresslog": "ištrintas naudotojo indėlis",
-       "sp-contributions-deleted": "ištrintas naudotojo indėlis",
+       "sp-contributions-blocklog": "blokavimų sąrašas",
+       "sp-contributions-suppresslog": "ištrintas {{GENDER:$1|naudotojo|naudotojos}} indėlis",
+       "sp-contributions-deleted": "ištrintas {{GENDER:$1|naudotojo|naudotojos}} indėlis",
        "sp-contributions-uploads": "įkėlimai",
-       "sp-contributions-logs": "Specialiųjų veiksmų sąrašas",
+       "sp-contributions-logs": "specialiųjų veiksmų sąrašas",
        "sp-contributions-talk": "Aptarimas",
        "sp-contributions-userrights": "naudotojų teisių valdymas",
        "sp-contributions-blocked-notice": "Šis naudotojas šiuo metu užblokuotas.\nPateikiamas paskutinis blokavimo istorijos įrašas.",
        "sp-contributions-blocked-notice-anon": "Šis IP adresas yra užblokuotas.\nPaskutinis blokavimo įrašas pateikiamas žemiau:",
-       "sp-contributions-search": "Ieškoti įnašo",
+       "sp-contributions-search": "Ieškoti indėlio",
        "sp-contributions-username": "IP adresas arba naudotojo vardas:",
        "sp-contributions-toponly": "Rodyti tik paskutinius keitimus",
        "sp-contributions-newonly": "Rodyti tik tuos keitimus, kuriais sukurti nauji straipsniai",
-       "sp-contributions-hideminor": "Slėpti nedidelius pakeitimus",
+       "sp-contributions-hideminor": "Slėpti smulkius pakeitimus",
        "sp-contributions-submit": "Ieškoti",
        "whatlinkshere": "Susiję puslapiai",
        "whatlinkshere-title": "Puslapiai, kurie nurodo į „$1“",
        "movenosubpage": "Šis puslapis neturi subpuslapių.",
        "movereason": "Priežastis:",
        "revertmove": "atmesti",
-       "delete_and_move_text": "==Reikia ištrinti==\n\nPaskirties puslapis „[[:$1]]“ jau yra. Ar norite jį ištrinti, kad galėtumėte pervardinti?",
+       "delete_and_move_text": "Paskirties puslapis „[[:$1]]“ jau yra. Ar norite jį ištrinti, kad galėtumėte pervardinti?",
        "delete_and_move_confirm": "Taip, trinti puslapį",
        "delete_and_move_reason": "Ištrinta dėl perkėlimo iš \"[[$1]]\"",
        "selfmove": "Šaltinio ir paskirties pavadinimai yra tokie patys; negalima pervardinti puslapio į save.",
        "move-leave-redirect": "Pervadinant palikti nukreipimą",
        "protectedpagemovewarning": "'''Dėmesio:''' Šis puslapis buvo užrakintas, kad tik naudotojai su administratoriaus teisėmis galėtų jį pervadinti.\nNaujausias įrašas žurnale yra pateiktas žemiau:",
        "semiprotectedpagemovewarning": "'''Pastaba''': Šis puslapis buvo užrakintas, kad tik registruoti naudotojai galėtų jį redaguoti.\nNaujausias įrašas žurnale yra pateiktas žemiau:",
-       "move-over-sharedrepo": "== Rinkmena jau yra ==\n[[:$1]] esti bendrojoje saugykloje. Įkėlus rinkmeną šiuo pavadinimu, ji pakeis bendrąją rinkmeną.",
+       "move-over-sharedrepo": "[[:$1]] esti bendrojoje saugykloje. Įkėlus rinkmeną šiuo pavadinimu, ji pakeis bendrąją rinkmeną.",
        "file-exists-sharedrepo": "Pasirinktas failo pavadinimas jau yra naudojamas bendrojoje saugykloje.\nPrašome pasirinkti kitą pavadinimą.",
        "export": "Eksportuoti puslapius",
        "exporttext": "Galite eksportuoti vieno puslapio tekstą ir istoriją ar kelių puslapių vienu metu tame pačiame XML atsakyme.\nŠie puslapiai galės būti importuojami į kitą projektą, veikiantį MediaWiki pagrindu, per [[Special:Import|importo puslapį]].\n\nNorėdami eksportuoti puslapius, įveskite pavadinimus žemiau esančiame tekstiniame lauke po vieną pavadinimą eilutėje, taip pat pasirinkite ar norite eksportuoti ir istoriją ar tik dabartinę versiją su paskutinio redagavimo informacija.\n\nPastaruoju atveju, jūs taip pat galite naudoti nuorodą, pvz. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] puslapiui „[[{{MediaWiki:Mainpage}}]]“.",
        "import-nonewrevisions": "Nebuvo importuotos jokios versijos (visos jau buvo įkeltos arba praleistos dėl klaidų).",
        "xml-error-string": "$1 $2 eilutėje, $3 stulpelyje ($4 baitas): $5",
        "import-upload": "Įkelti XML duomenis",
-       "import-token-mismatch": "Sesijos duomenys prarasti. Bandykite iš naujo.",
+       "import-token-mismatch": "Sesijos duomenys prarasti.\n\nGali būti, kad esate atsijungęs. <strong>Prašome patikrinti, ar vis dar esate prisijungęs, ir pabandyti iš naujo</strong>.\nJei ir toliau nepavyksta, pamėginkite [[Special:UserLogout|atsijungti]] ir vėl prisijungti, taip pat patikrinkite, ar jūsų naršyklė priima šios svetainės slapukus.",
        "import-invalid-interwiki": "Nepavyko importuoti iš nurodyto wiki projekto.",
        "import-error-edit": "Puslapis \"$1\" nebuvo įkeltas, nes jūs neturite teisės jį redaguoti.",
        "import-error-create": "Puslapis „$1“ nebuvo importuotas, nes jūs neturite teisės jį sukurti.",
        "confirm-unwatch-button": "Gerai",
        "confirm-unwatch-top": "Pašalinti šį puslapį iš jūsų stebimųjų sąrašo?",
        "confirm-rollback-button": "Gerai",
+       "confirm-rollback-top": "Atmesti šio puslapio pakeitimus?",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "← ankstesnis puslapis",
        "imgmultipagenext": "kitas puslapis →",
        "lag-warn-high": "Dėl didelio duomenų bazės atsilikimo pakeitimai, naujesni nei $1 {{PLURAL:$1|sekundė|sekundės|sekundžių}}, šiame sąraše gali būti nerodomi.",
        "watchlistedit-normal-title": "Redaguoti stebimųjų sąrašą",
        "watchlistedit-normal-legend": "Šalinti puslapius iš stebimųjų sąrašo",
-       "watchlistedit-normal-explain": "Žemiau yra rodomi puslapiai jūsų stebimųjų sąraše.\nNorėdami pašalinti puslapį, prie jo uždėkite varnelė ir paspauskite „{{int:Watchlistedit-normal-submit}}“.\nJūs taip pat galite [[Special:EditWatchlist/raw|redaguoti grynąjį stebimųjų sąrašą]].",
+       "watchlistedit-normal-explain": "Žemiau yra rodomi puslapiai jūsų stebimųjų sąraše.\nNorėdami pašalinti puslapį, pažymėkite greta esančią varnelę ir paspauskite „{{int:Watchlistedit-normal-submit}}“.\nJūs taip pat galite [[Special:EditWatchlist/raw|redaguoti grynąjį stebimųjų sąrašą]].",
        "watchlistedit-normal-submit": "Šalinti puslapius",
        "watchlistedit-normal-done": "$1 {{PLURAL:$1|puslapis buvo pašalintas|puslapiai buvo pašalinti|puslapių buvo pašalinta}} iš jūsų stebimųjų sąrašo:",
        "watchlistedit-raw-title": "Redaguoti grynąjį stebimųjų sąrašą",
        "redirect-file": "Failo vardas",
        "redirect-logid": "Žurnalo įrašo ID",
        "redirect-not-exists": "Vertė nėra nustatyta",
-       "fileduplicatesearch": "Ieškoti dublikuotų failų",
+       "fileduplicatesearch": "Ieškoti pasikartojančių failų",
        "fileduplicatesearch-summary": "Pasikartojančių failų paieška pagal jų kontrolinę sumą.",
        "fileduplicatesearch-filename": "Failo vardas:",
        "fileduplicatesearch-submit": "Ieškoti",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|perkėlė}} puslapį $3 į $4 be nukreipimo",
        "logentry-move-move_redir": "$1 {{GENDER:$2|perkėlė}} puslapį $3 į $4 (anksčiau buvo nukreipiamasis)",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|pervadino}} puslapį $3 į $4, nesukurdamas nukreipimo",
-       "logentry-patrol-patrol": "$1 {{GENDER:$2|payžėmjo}} versiją $4 puslapio $3 kaip patruliuojama",
-       "logentry-patrol-patrol-auto": "$1 automatiškai {{GENDER:$2|pažymėjo}} versiją $4 puslapio $3 kaip patruliuojama",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|pažymėjo}} kaip patikrintą puslapio $3 versiją $4",
+       "logentry-patrol-patrol-auto": "$1 automatiškai {{GENDER:$2|pažymėjo}} kaip patikrintą puslapio $3 versiją $4",
        "logentry-newusers-newusers": "Vartotojo paskyra $1 buvo {{GENDER:$2|sukurta}}",
        "logentry-newusers-create": "$1 sukūrė naudotojo paskyrą",
        "logentry-newusers-create2": "Vartotojo paskyra $3 buvo {{GENDER:$2|sukurta}} $1",
        "feedback-useragent": "Vartotojo veiksnys:",
        "searchsuggest-search": "Ieškoti",
        "searchsuggest-containing": "turintys",
+       "api-error-autoblocked": "Jūsų IP adresas buvo automatiškai užblokuotas, nes jį naudojo užblokuotas naudotojas.",
        "api-error-badaccess-groups": "Jums neleidžiama įkelti failus į šią wiki.",
        "api-error-badtoken": "Vidinė klaida: blogai atpažinimo ženklas.",
+       "api-error-blocked": "Jus buvote užblokuotas, kad negalėtumėte redaguoti.",
        "api-error-copyuploaddisabled": "Siuntimas pagal URL yra išjungtas šiame serveryje.",
        "api-error-duplicate": "Jau {{PLURAL:$1|yra kitas failas|yra kiti failai}} puslapyje su tuo pačiu turiniu.",
        "api-error-duplicate-archive": "Jau {{PLURAL:$1|buvo kitas failas|buvo kitų failų}} puslapyje su tuo pačiu turiniu, bet {{PLURAL:$1|buvo ištrintas|buvo ištrinti}}.",
        "api-error-nomodule": "Vidinė klaida: nėra nustatytas įkėlimų modulis.",
        "api-error-ok-but-empty": "Vidinė klaida: nėra atsakymo iš serverio.",
        "api-error-overwrite": "Perrašymas esamą failą neleidžiamas.",
+       "api-error-ratelimited": "Jūs per trumpą laiko tarpą bandote įkelti daugiau failų, nei leidžiama šiame projekte.\nPabandykite dar kartą po keleto minučių.",
        "api-error-stashfailed": "Vidinė klaida: serveriui nepavyko išsaugoti laikinąjį failą.",
        "api-error-publishfailed": "Vidinė klaida: serveriui nepavyko paskelbti laikino failo.",
        "api-error-stasherror": "Įvyko klaida keliant failą į laikyklą.",
        "api-error-unknownerror": "Nežinoma klaida: \"$1\"",
        "api-error-uploaddisabled": "Įkėlimas išjungtas šioje wiki.",
        "api-error-verification-error": "Šis failas gali būti sugadintas arba turi neteisingą papildinį.",
+       "api-error-was-deleted": "Failas tokiu pavadinimu anksčiau jau yra buvęs įkeltas, o paskui ištrintas.",
        "duration-seconds": "$1 {{PLURAL:$1|sekundė|sekundės|sekundžių}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutė|minutės|minučių}}",
        "duration-hours": "$1 {{PLURAL:$1|valanda|valandos|valandų}}",
        "expand_templates_generate_xml": "Rodyti XML nagrinėjimo medį",
        "expand_templates_generate_rawhtml": "Rodyti gryną HTML",
        "expand_templates_preview": "Peržiūra",
-       "expand_templates_preview_fail_html": "<em>Nes {{SITENAME}} turi įgalinta gryną HTML ir įvyko sesijos duomenų praradimas, peržiūra yra paslėpta kaip atsargos priemonė prieš JavaScript atakas.</em>\n\n<strong>Jei tai teisėtas peržiūros bandymas, prašome bandyti dar kartą.</strong>\nJei tai vistiek neveikia, pabandykite [[Special:UserLogout|atsijungti]] ir vėl prisijungti.",
+       "expand_templates_preview_fail_html": "<em>Kadangi {{SITENAME}} turi įgalinta gryną HTML ir įvyko sesijos duomenų praradimas, peržiūra yra paslėpta kaip atsargos priemonė prieš JavaScript atakas.</em>\n\n<strong>Jei tai teisėtas peržiūros bandymas, prašome bandyti dar kartą.</strong>\nJei ir toliau neveikia, pabandykite [[Special:UserLogout|atsijungti]] ir vėl prisijungti, taip pat patikrinkite, ar jūsų naršyklė priima šios svetainės slapukus.",
        "expand_templates_preview_fail_html_anon": "<em>Nes {{SITENAME}} turi įgalinta gryną HTML ir jūs esate neprisijungęs, peržiūra paslėpta kaip atsargumo priemonė prieš JavaScript atakas.</em>\n\n<strong>Jei tai teisėtas peržiūros bandymas prašome [[Special:UserLogin|prisijungti]] ir bandyti vėl.</strong>",
        "expand_templates_input_missing": "Turite pateikti bent truputį įvesties teksto.",
        "pagelanguage": "Keisti puslapio kalbą",
        "log-action-filter-rights-autopromote": "Automatinis keitimas",
        "log-action-filter-upload-upload": "Naujas įkėlimas",
        "log-action-filter-upload-overwrite": "Kelti iš naujo",
+       "authmanager-authn-not-in-progress": "Autentifikavimas nevyksta arba buvo prarasti sesijos duomenys. Prašome pradėti iš naujo.",
        "authmanager-create-disabled": "Paskyros kūrimas yra išjungtas.",
        "authmanager-create-from-login": "Norėdami sukurti paskyrą užpildykite laukelius žemiau.",
+       "authmanager-create-not-in-progress": "Paskyros kūrimas nevyksta arba buvo prarasti sesijos duomenys. Prašome pradėti iš naujo.",
+       "authmanager-link-not-in-progress": "Paskyrų susiejimas nevyksta arba buvo prarasti sesijos duomenys. Prašome pradėti iš naujo.",
        "authmanager-authplugin-setpass-failed-title": "Slaptažodžio keitimas nepavyko",
        "authmanager-authplugin-setpass-bad-domain": "Negalimas domenas.",
        "authmanager-autocreate-noperm": "Automatinis paskyros kūrimas neleidžiamas.",
        "authmanager-provider-password": "Autentifikacija slaptažodžiu",
        "authmanager-provider-password-domain": "Autentifikavimas slaptažodžiu ir domenu",
        "authmanager-provider-temporarypassword": "Laikinas slaptažodis",
+       "authprovider-confirmlink-message": "Remiantis naujausiais jūsų prisijungimo bandymais, šios paskyros gali būti susietos su jūsų wiki paskyra. Jas susieję, galėsite prisijungti per šias paskyras. Prašome pasirinkti, kurios iš jų turėtų būti susietos.",
        "authprovider-confirmlink-request-label": "Paskyros, kurios turėtų būti susietos",
        "authprovider-confirmlink-success-line": "$1: Susieta sėkmingai.",
        "authprovider-confirmlink-failed": "Paskyros susiejimas nebuvo visiškai sėkmingas: $1",
        "authprovider-resetpass-skip-label": "Praleisti",
        "authprovider-resetpass-skip-help": "Praleisti slaptažodžio perstatymą.",
        "specialpage-securitylevel-not-allowed-title": "Neleidžiama",
+       "specialpage-securitylevel-not-allowed": "Apgailestaujame, tačiau jūs negalite naudotis šiuo puslapiu, nes nepavyko patvirtinti jūsų tapatybės.",
        "cannotauth-not-allowed-title": "Teisė nesuteikta",
        "cannotauth-not-allowed": "Jūs negalite naudotis šiuo puslapiu",
        "credentialsform-account": "Paskyros vardas:",
index 612b02a..dd81bea 100644 (file)
        "userrights-no-interwiki": "Tev nav atļaujas izmainīt dalībnieku tiesības citos wiki.",
        "userrights-nodatabase": "Datubāze $1 neeksistē vai nav lokāla.",
        "userrights-nologin": "Tev ir [[Special:UserLogin|jāieiet iekšā]] kā adminam, lai varētu izmainīt dalībnieku grupas.",
-       "userrights-notallowed": "Jūsu lietotāja kontam nav atļaujas pievienot vai noņemt lietotāju tiesības.",
+       "userrights-notallowed": "Tev nav atļaujas pievienot vai noņemt dalībnieku tiesības.",
        "userrights-changeable-col": "Grupas, kuras tu vari izmainīt",
        "userrights-unchangeable-col": "Grupas, kuras tu nevari izmainīt",
        "group": "Grupa:",
        "activeusers-hidesysops": "Paslēpt administratorus",
        "activeusers-noresult": "Neviens dalībnieks nav atrasts.",
        "activeusers-submit": "Parādīt aktīvos dalībniekus",
-       "listgrouprights": "Lietotāju grupu tiesības",
+       "listgrouprights": "Dalībnieku grupu tiesības",
        "listgrouprights-summary": "Šis ir šajā viki definēto dalībnieku grupu uzskaitījums, kopā ar tām atbilstošajām piekļuves tiesībām.\nPapildu informāciju par katru individuālu piekļuves tiesību veidu, iespējams, var atrast [[{{MediaWiki:Listgrouprights-helppage}}|šeit]].",
        "listgrouprights-group": "Grupa",
        "listgrouprights-rights": "Tiesības",
index c1006b7..d4eeb0c 100644 (file)
        "oct": "Шыжа",
        "nov": "Кылме",
        "dec": "Теле",
-       "pagecategories": "{{PLURAL:$1|Категорий|Категорий}}",
+       "pagecategories": "{{PLURAL:$1|Категорий|Категорий-влак}}",
        "category_header": "\"$1\" категорийыште лаштык-влак",
        "subcategories": "Ӱлылкатегорий-влак",
        "category-media-header": "\"$1\" категорийыште файл-влак",
        "category-empty": "''Ты жаплан тиде категорийыште нимоат уке.''",
        "hidden-categories": "{{PLURAL:$1|Шылтыме категорий|Шылтыме категорий-влак}}",
        "hidden-category-category": "Шылтымо категорий-влак",
-       "category-subcat-count": "{{PLURAL:$2|Тиде категорийыш ик ӱлылкатегорий гына пура.|{{PLURAL:$1|1=Тыгай $1 ӱлылкатегорий|Тыгане $1 ӱлылкатегорий-влак}} тиде категорийыште, чыла $2.}}",
-       "category-article-count": "{{PLURAL:$2|Тиде категорийыш ик лаштык гына пура.|{{PLURAL:$1|1=Тыгай $1 лаштык|Тыгане $1 лаштык-влак}} тиде категорийыште, чыла $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|Тиде категорийыш ик ӱлылкатегорий гына пура.|{{PLURAL:$1|1=Тыгай лӱман $1 ӱлылкатегорий}} тиде категорийыште верланен, чылажге $2 уло.}}",
+       "category-article-count": "{{PLURAL:$2|Тиде категорийыш ик лаштык гына пура.|{{PLURAL:$1|1=$1 лаштыкым ончыктымо}} тиде категорийыште, чылажге $2 уло.}}",
        "category-file-count": "{{PLURAL:$2|Тиде категорийыш ик лаштык гына пура.|{{PLURAL:$1|1=$1 лаштык|$1 лаштык}} тиде категорийыште, чылажге $2.}}",
        "listingcontinuesabbrev": "(умбакыжым)",
        "noindex-category": "Шотыш налдыме лаштык-влак",
        "actions": "Сомылка-влак",
        "namespaces": "Лӱм-влак ора",
        "variants": "Вариант-влак",
+       "navigation-heading": "Навигаций",
        "errorpagetitle": "Йоҥылыш",
        "returnto": "$1 деке пӧртылаш.",
        "tagline": "{{SITENAME}} гыч",
        "nstab-template": "Ямдылык",
        "nstab-help": "Полыш лаштык",
        "nstab-category": "Категорий",
+       "mainpage-nstab": "Тӱҥ лаштык",
        "nosuchspecialpage": "Тыгай спецлаштык уке.",
        "error": "Йоҥылыш",
        "databaseerror-error": "Йоҥылыш: $1",
        "yourpasswordagain": "Шолыпмутым угыч пуртымаш:",
        "createacct-yourpasswordagain": "Шолыпмутым пеҥгыдемде",
        "createacct-yourpasswordagain-ph": "Шолыпмутым угыч пурто",
-       "remembermypassword": "Тиде компьютерыште мыйым шарнаш (эн шуко $1 {{PLURAL:$1|1=кечылан|кечылан}})",
        "yourdomainname": "Тендан домен:",
        "login": "Шке денет палдаре",
        "nav-login-createaccount": "Пураш/Регистрацийым эрте",
        "preview": "Ончылгоч ончымаш",
        "showpreview": "Ончылгоч ончымаш",
        "showdiff": "Тӧрлатымашым ончыкташ",
-       "anoneditwarning": "'''Тӱткӧ лий:''': Тый авторизацийым эртен отыл. Тыйын IP-адресет лаштыкын вашталтымаш эртымгорныштыжо возалт кодеш.",
+       "anoneditwarning": "'''Тӱткӧ лий:''': Тый авторизацийым эртен отыл. Тыйын IP-адресет лаштыкын вашталтымаш историйыштыже возалт кодеш. Шке лӱмет ден пурет але регистрацийым эртет гын, шкаланет пашам ышташ йӧнлырак лиеш.",
        "summary-preview": "Тӧрлатымаш нерген ончылгоч ончымаш:",
        "accmailtitle": "Шолыпмут колтымо.",
        "newarticle": "(У)",
        "newarticletext": "Тыгай лӱман лаштык уке.\nЛаштыкым ышташлан ӱлнӧ возаш тӱҥал (сайынрак палашлан [$1 полшыкым] ончал).\nТый тышке йонгылыш логалынат гын, браузерыште '''шенгек''' полдышым темдал.",
-       "noarticletext": "Ð\9aÑ\8bзÑ\8bÑ\82Ñ\81е Ð¶Ð°Ð¿Ð»Ð°Ð½ Ñ\82иде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bÑ\88Ñ\82е Ð½Ð¸Ð¼Ð¾Ð¼ Ð²Ð¾Ð·Ñ\8bмо Ð¾Ð³Ñ\8bл.\nТÑ\8bй Ñ\82иде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²ÐµÑ\81 Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влакÑ\8bÑ\88Ñ\82е [[Special:Search/{{PAGENAME}}|кÑ\8bÑ\87алÑ\8bн]] ÐºÐµÑ\80Ñ\82аÑ\82, Ð°Ð»Ðµ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ð¶Ñ\83Ñ\80нал-влакÑ\8bÑ\88Ñ\82е ÐºÑ\8bÑ\87алÑ\8bн] ÐºÐµÑ\80Ñ\82аÑ\82, Ð°Ð»Ðµ [{{fullurl:{{FULLPAGENAME}}|action=edit}} Ñ\82Ñ\8bгай Ð»Ó±Ð¼Ð°Ð½ Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм Ñ\8bÑ\88Ñ\82аÑ\88] кертат</span>.",
+       "noarticletext": "Ð\9aÑ\8bзÑ\8bÑ\82Ñ\81е Ð¶Ð°Ð¿Ð»Ð°Ð½ Ñ\82иде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bÑ\88Ñ\82е Ð½Ð¸Ð¼Ð¾Ð¼ Ð²Ð¾Ð·Ñ\8bмо Ð¾Ð³Ñ\8bл.\nТÑ\8bй Ñ\82иде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²ÐµÑ\81 Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влакÑ\8bÑ\88Ñ\82е [[Special:Search/{{PAGENAME}}|кÑ\8bÑ\87алÑ\8bн]] ÐºÐµÑ\80Ñ\82аÑ\82, Ð°Ð»Ðµ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ð¶Ñ\83Ñ\80нал-влакÑ\8bÑ\88Ñ\82е ÐºÑ\8bÑ\87алÑ\8bн] ÐºÐµÑ\80Ñ\82аÑ\82, Ð°Ð»Ðµ [{{fullurl:{{FULLPAGENAME}}|action=edit}} Ñ\82Ñ\8bгай Ð»Ó±Ð¼Ð°Ð½ Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм Ñ\8bÑ\88Ñ\82ен] кертат</span>.",
        "clearyourcache": "'''Замечание.''' Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.\n* '''Firefox / Safari:''' Удерживая клавишу ''Shift'', нажмите на панели инструментов ''Обновить'' либо нажмите ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac)\n* '''Google Chrome:''' Нажмите ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)\n* '''Internet Explorer:''' Удерживая ''Ctrl'', нажмите ''Обновить'' либо нажмите ''Ctrl-F5''\n* '''Opera:''' Выберите очистку кэша в меню ''Инструменты → Настройки''",
        "previewnote": "'''Тиде ончылгоч ончымаш гына;\nвашталтыш-влакым эше аралыме огыл!'''",
        "editing": "Тӧрлаталтеш $1",
        "templatesusedpreview": "Тиде лаштыкыште кучылтмо {{PLURAL:$1|1=ямыдылык|ямдылык-влак}}:",
        "template-protected": "(тӧрлаташ чарыме)",
        "template-semiprotected": "(верын аралыме)",
-       "hiddencategories": "Тиде лаштык $1 {{PLURAL:$1|1=шылтыме категорийыш|шылтыме категорийыш}} лектеш:",
-       "permissionserrorstext-withaction": "Тыйын '''$2''' кертмашет шагал. Тиде {{PLURAL:$1|1=амал ден|амал дене}}:",
+       "hiddencategories": "Тиде лаштык $1 {{PLURAL:$1|1=шылтыме категорий-влак}} радамыш пура:",
+       "permissionserrorstext-withaction": "'''$2''' пашам ыштен от керт. {{PLURAL:$1|1=Амалже}} тыгай:",
        "recreate-moveddeleted-warn": "'''Йолташ, тиде лаштыкым тиддеч ончыч шӧреныт.''' Тудым илаҥдарыме деч ончыч, тыгай лаштык кӱлешак мо - тергыман. Ӱлнырак шӧрымаш да лӱм вашталтымаш журнал-влакым шергал лекташ лиеш.",
        "moveddeleted-notice": "Тиде лаштык шӧралтын.\nЛаштыклан шӧрымӧ да кусарыме нерген журнал ӱлнӧ ончыктымо.",
        "viewpagelogs": "Тиде лаштыклан журнал-влакым ончыкташ",
        "currentrev": "Кызытсе версий",
        "currentrev-asof": "$1 кызытсе версий",
        "revisionasof": "$1 версий",
-       "revision-info": "$1; $2 деч версий",
+       "revision-info": "$1 деч версий; {{GENDER:$6|$2}}$7",
        "previousrevision": "← Ончычсо версий",
        "nextrevision": "Весе →",
        "currentrevisionlink": "Кызытсе",
        "prevn": "кодшо {{PLURAL:$1|$1}}",
        "nextn": "весе {{PLURAL:$1|$1}}",
        "prevn-title": "Кодшо $1 {{PLURAL:$1|результат}}",
-       "nextn-title": "Ð\92еÑ\81е $1 {{PLURAL:$1|лекÑ\82Ñ\8bÑ\88|лекÑ\82Ñ\8bÑ\88}}",
-       "shown-title": "Лаштыкыште $1 {{PLURAL:$1|1=возымаш|возымашым}} ончыкташ",
+       "nextn-title": "ЭÑ\88е $1 {{PLURAL:$1|лаÑ\88Ñ\82Ñ\8bкÑ\8bм}}",
+       "shown-title": "Лаштыкыште $1 {{PLURAL:$1|1=возымашым}} ончыкташ",
        "viewprevnext": "Ончал ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-new": "'''Тиде вики-проектыште «[[:$1]]» лӱман лаштыкым ышташ!'''",
+       "searchmenu-new": "<strong>'''Тиде вики-проектыште «[[:$1]]» лӱман лаштыкым ышташ!'''</strong>\n{{PLURAL:$2|0=|Тыйын йодмет почеш кычалын муымо лаштыкым ончал.}}",
        "searchprofile-articles": "Возымо лаштык-влак",
        "searchprofile-images": "Мультимедий",
        "searchprofile-everything": "Чыла",
        "searchprofile-advanced-tooltip": "Искать в заданных пространствах имён",
        "search-result-size": "$1 ({{PLURAL:$2|1 мут|$2 мут}})",
        "search-result-category-size": "$1 {{PLURAL:$1|вхождение|вхождения|вхождений}} ($2 {{PLURAL:$2|подкатегория|подкатегории|подкатегорий}}, $3 {{PLURAL:$3|файл|файла|файлов}}).",
-       "search-redirect": "($1 Ð²ÐµÑ\81 Ð²ÐµÑ\80е ÐºÐ¾Ð»Ñ\82Ñ\8bмаÑ\88)",
+       "search-redirect": "($1 Ð³Ñ\8bÑ\87 ÐºÐ¾Ð»Ñ\82Ñ\8bмо)",
        "search-section": "(ужаш $1)",
        "search-suggest": "Але те $1 возынеда ыле",
        "search-interwiki-caption": "Родо проект-влак",
        "recentchanges-label-bot": "Тиде тӧрлатымашым бот ыштен",
        "recentchanges-label-unpatrolled": "Тиде тӧрлатымашым нигӧ терген огыл",
        "recentchanges-legend-heading": "<strong>Легенде:</strong>",
-       "recentchanges-legend-newpage": "$1 - у лаштык",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (тыгак [[Special:NewPages|у лаштык-влак лӱмерым]] ончо)",
        "rcnotefrom": "Ниже перечислены изменения с '''$2''' (не более '''$1''').",
        "rclistfrom": "$3 $2 гыч тӱҥалын у вашталтымашым ончыкташ",
        "rcshowhideminor": "Изи тӧрлатымашым $1",
        "rcshowhideminor-hide": "шылташ",
        "rcshowhidebots": "Бот-влакым $1",
        "rcshowhidebots-show": "ончыкташ",
-       "rcshowhideliu": "Шолып пайдаланыше-влакым $1",
+       "rcshowhideliu": "$1 шолып пайдаланыше",
        "rcshowhideliu-hide": "шылташ",
        "rcshowhideanons": "Ончыкталтше пайдаланыше-влакым $1",
        "rcshowhideanons-hide": "шылташ",
        "filehist-filesize": "Файлын кугытшо",
        "filehist-comment": "Файл нерген:",
        "imagelinks": "Файлым кучылтмаш",
-       "linkstoimage": "Тиде {{PLURAL:$1|1=$1 лаштык саде файл дене кылдалтын|$1 лаштык-влак саде файл дене кылдалтыныт}}:",
+       "linkstoimage": "Тиде {{PLURAL:$1|1=$1 лаштык саде файл дене кылдалтын}}:",
        "nolinkstoimage": "Тиде файл дене кылдалтше ик лаштыкат уке.",
        "sharedupload": "Тиде файлын верже: $1, туге гынат, тудым моло веренат кучылташ лиеш.",
        "uploadnewversion-linktext": "Тиде файлын у версийжым пурташ",
        "brokenredirects-edit": "тӧрлаташ",
        "brokenredirects-delete": "шӧраш",
        "withoutinterwiki-submit": "ончыкташ",
-       "nbytes": "$1 {{PLURAL:$1|байт|байт}}",
-       "nmembers": "$1 {{PLURAL:$1|1=лаштык|лаштык-влак}}",
+       "nbytes": "$1 {{PLURAL:$1|байт}}",
+       "nmembers": "$1 {{PLURAL:$1|1=лаштык}}",
        "lonelypages": "Тулык лаштык-влак",
        "wantedcategories": "Ыштыман категорий-влак",
        "wantedpages": "Ыштышаш лаштык-влак",
        "whatlinkshere-next": "{{PLURAL:$1|вес|$1 вес}}",
        "whatlinkshere-links": "← кылвер-влак",
        "whatlinkshere-hideredirs": "вес вере колтымаш-влакым $1",
-       "whatlinkshere-hidetrans": "пуртымашым $1",
-       "whatlinkshere-hidelinks": "кылвер-влакым $1",
+       "whatlinkshere-hidetrans": "$1 пуртымаш",
+       "whatlinkshere-hidelinks": "$1 кылвер",
        "whatlinkshere-hideimages": "сӱрет деке кылвер-влакым $1",
        "whatlinkshere-filters": "Фильтр-влак",
        "blockip": "Пайдаланышылан йӧным петыраш",
        "allmessages-filter-all": "Чыла",
        "thumbnail-more": "Кугемдаш",
        "thumbnail_error": "Изи сӱретым ыштыме годым йоҥылыш: $1",
-       "tooltip-pt-userpage": "Тыйын лаштыкет",
-       "tooltip-pt-mytalk": "Тыйын каҥашымаш лаштыкет",
-       "tooltip-pt-preferences": "Мыйын келыштарымашем",
+       "tooltip-pt-userpage": "{{GENDER:|Тыйын}} лаштыкет",
+       "tooltip-pt-mytalk": "{{GENDER:|Тыйын}} каҥашымаш лаштыкет",
+       "tooltip-pt-preferences": "{{GENDER:|Тыйын}} келыштарымашет",
        "tooltip-pt-watchlist": "Мыйын эскерыме лаштык-влак лӱмер",
-       "tooltip-pt-mycontris": "Тыйын пашатым эскерыме лаштык",
+       "tooltip-pt-mycontris": "{{GENDER:|Тыйын}} пашатым эскерыме лаштык",
        "tooltip-pt-login": "Тыште регистрацийым эртен кертат. Регистраций деч поснаат пашам ышташ лиеш.",
        "tooltip-pt-logout": "Системе гыч лекташ",
+       "tooltip-pt-createaccount": "Ме тыланда регистрацийым эрташ да системыш пураш темлена.",
        "tooltip-ca-talk": "Лаштыкыште возымым каҥашаш",
-       "tooltip-ca-edit": "Тый тиде лаштыкым тӧрлатен кертат. Лаштыкым аралыме деч ончыч тудым тергаш ит мондо.",
+       "tooltip-ca-edit": "Тиде лаштыкым тӧрлаташ",
        "tooltip-ca-addsection": "У ужашым тӱҥалаш",
        "tooltip-ca-viewsource": "Тиде лаштыкым аралыме.\nТый тудын тӱҥалтыш текстшым ончалын кертат.",
        "tooltip-ca-history": "Лаштыкын ондаксе тӧрлатымаш",
        "tooltip-t-recentchangeslinked": "Тиде лаштык дене кылдалтше пытартыш тӧрлатымаш-влак",
        "tooltip-feed-rss": "Тиде лаштыклан RSS-кыл",
        "tooltip-feed-atom": "Тиде лаштыклан Atom-кыл",
-       "tooltip-t-contributions": "Пайдаланышын ыштыме пашажым ончалаш",
+       "tooltip-t-contributions": "{{GENDER:$1|Пайдаланышын ыштыме пашажым}} ончалаш",
        "tooltip-t-emailuser": "Тиде пайдаланышылан электрон серышым возаш",
        "tooltip-t-upload": "Файл-влакым пурташ",
        "tooltip-t-specialpages": "Лӱмын ыштыме лаштык-влак",
        "tooltip-t-permalink": "Тиде лашткыш кондышо кылвер (ссылка)",
        "tooltip-ca-nstab-main": "Лаштыкыште возымым ончыкташ",
        "tooltip-ca-nstab-user": "Пайдаланышын лаштыкшым ончалаш",
-       "tooltip-ca-nstab-special": "Тиде лӱмын ыштыме лаштык, тудым тый тӧрлатен от керт",
+       "tooltip-ca-nstab-special": "Тиде спецлаштык, тый тудым тӧрлатен от керт",
        "tooltip-ca-nstab-project": "Проект нерген лаштыкым ончыкташ",
        "tooltip-ca-nstab-image": "Файлын лаштыкшым ончалаш",
        "tooltip-ca-nstab-template": "Ямдылыкым ончыкташ",
        "tooltip-watch": "Тиде лаштыкым эскерымаш лаштыкышкет ешараш",
        "tooltip-rollback": "\"Пӧртылаш\" ик темдалтыш дене пытартыш пайдаланышын тӧрлатымашым мӧҥгешла пӧртылеш",
        "tooltip-undo": "\"Чараш\" тиде тӧрлатымашым мӧҥгешла пӧртыла да ончылгоч ончымашым почеш.\nТый тӧрлатымаш амалже нерген возымо верыште  возын кертат.",
+       "pageinfo-toolboxlink": "Лаштык нерген",
        "previousdiff": "← Ончычсо тӧрлатымаш-влак",
        "nextdiff": "Вес тӧрлатымаш →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|1=лаштык|лаштык}}",
        "file-info-size": "$1 × $2 пиксел, файлын кугытшо: $3, MIME-тип: $4",
        "file-nohires": "Кугурак чаплык уке.",
        "svg-long-desc": "SVG файл, шкенжын кугытшо: $1 × $2 пиксел, файлын кугытшо: $3",
-       "show-big-image": "ШкенжÑ\8bн Ñ\87аплÑ\8bкÑ\88е",
+       "show-big-image": "ТӱҥалÑ\82Ñ\8bÑ\88 Ñ\84айл",
        "show-big-image-size": "$1 × $2 пиксел",
        "newimages-legend": "Фильтр",
        "ilsubmit": "Кычал",
index 389d307..022f07f 100644 (file)
@@ -57,7 +57,7 @@
        "tog-enotifminoredits": "ചെറുതിരുത്തുകൾക്കും എനിക്ക് ഇമെയിൽ അയയ്ക്കുക",
        "tog-enotifrevealaddr": "അറിയിപ്പ് മെയിലുകളിൽ എന്റെ ഇമെയിൽ വിലാസം വെളിവാക്കാൻ അനുവദിക്കുക",
        "tog-shownumberswatching": "ശ്രദ്ധിക്കുന്ന ഉപയോക്താക്കളുടെ എണ്ണം കാണിക്കുക",
-       "tog-oldsig": "നിലവിലുള്ള ഒപ്പ്:",
+       "tog-oldsig": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´¨à´¿à´²à´µà´¿à´²àµ\81à´³àµ\8dà´³ à´\92à´ªàµ\8dà´ªàµ\8d:",
        "tog-fancysig": "ഒപ്പ് ഒരു വിക്കി എഴുത്തായി പരിഗണിക്കുക (കണ്ണി സ്വയം ചേർക്കേണ്ടതില്ല)",
        "tog-uselivepreview": "തത്സമയ പ്രിവ്യൂ ഉപയോഗപ്പെടുത്തുക",
        "tog-forceeditsummary": "തിരുത്തുകളുടെ ചുരുക്കം നൽകിയില്ലെങ്കിൽ എന്നെ ഓർമ്മിപ്പിക്കുക",
        "yourpasswordagain": "രഹസ്യവാക്ക് ഒരിക്കൽക്കൂടി:",
        "createacct-yourpasswordagain": "രഹസ്യവാക്ക് സ്ഥിരീകരിക്കുക",
        "createacct-yourpasswordagain-ph": "രഹസ്യവാക്ക് വീണ്ടും നൽകുക",
-       "remembermypassword": "എന്റെ പ്രവേശനം ഈ ബ്രൗസറിൽ ({{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}) ഓർത്തുവെക്കുക",
        "userlogin-remembermypassword": "ഞാൻ പ്രവേശിച്ചതായിത്തന്നെ ഓർത്തിരിക്കുക",
        "userlogin-signwithsecure": "സുരക്ഷിത കണക്ഷൻ ഉപയോഗിക്കുക",
        "cannotloginnow-title": "ഇപ്പോൾ പ്രവേശിക്കാൻ കഴിയില്ല",
        "botpasswords-label-delete": "മായ്ക്കുക",
        "botpasswords-label-resetpassword": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക",
        "botpasswords-label-grants": "ബാധകമായ അനുമതികൾ:",
-       "botpasswords-label-restrictions": "ഉപയോഗത്തിന്റെ പരിമിതപ്പെടുത്തലുകൾ:",
        "botpasswords-label-grants-column": "അനുവദിച്ചിരിക്കുന്നവ",
        "resetpass_forbidden": "രഹസ്യവാക്കുകൾ മാറ്റുന്നത് അനുവദിക്കുന്നില്ല",
        "resetpass-no-info": "ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.",
        "htmlform-title-not-exists": "$1 നിലവിലില്ല.",
        "htmlform-user-not-exists": "<strong>$1</strong> നിലവിലില്ല.",
        "htmlform-user-not-valid": "<strong>$1</strong> സാധുതയുള്ള ഉപയോക്തൃനാമമല്ല.",
-       "sqlite-has-fts": "പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയുള്ള $1",
-       "sqlite-no-fts": "പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയില്ലാത്ത $1",
        "logentry-delete-delete": "$3 എന്ന താൾ $1 {{GENDER:$2|മായ്ച്ചിരിക്കുന്നു}}",
        "logentry-delete-restore": "$3 എന്ന താൾ $1 {{GENDER:$2|പുനഃസ്ഥാപിച്ചിരിക്കുന്നു}}",
        "logentry-delete-event": "$3 എന്ന {{PLURAL:$5|രേഖയിലെ മാറ്റത്തിന്റെ|രേഖയിലെ $5 മാറ്റങ്ങളുടെ}} ദർശനീയത $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}: $4",
        "feedback-external-bug-report-button": "ഒരു സാങ്കേതിക കർത്തവ്യം ചേർക്കുക",
        "feedback-dialog-title": "അഭിപ്രായം സമർപ്പിക്കുക",
        "feedback-dialog-intro": "താങ്കളുടെ അഭിപ്രായം സമർപ്പിക്കാൻ താങ്കൾക്ക് താഴെയുള്ള ലളിതമായ ഫോം ഉപയോഗിക്കാം. താങ്കളുടെ കുറിപ്പ് \"$1\" എന്ന താളിൽ താങ്കളുടെ ഉപയോക്തൃനാമത്തോടൊപ്പം ചേർക്കപ്പെടുന്നതാണ്.",
-       "feedback-error-title": "പിഴവ്",
        "feedback-error1": "പിഴവ്: എ.പി.ഐ.യിൽ നിന്നും തിരിച്ചറിയാനാകാത്ത ഫലം",
        "feedback-error2": "പിഴവ്: തിരുത്തൽ പരാജയപ്പെട്ടു",
        "feedback-error3": "പിഴവ്: എ.പി.ഐ.യിൽ നിന്നും യാതൊരു പ്രതികരണവുമില്ല",
index 97f653d..7bae28c 100644 (file)
@@ -13,7 +13,8 @@
                        "Игорь Бродский",
                        "아라",
                        "Denö",
-                       "Macofe"
+                       "Macofe",
+                       "Rueter"
                ]
        },
        "tog-underline": "Сюлмавома петнень алга черькстамс:",
        "category-file-count-limited": "{{PLURAL:$1|Те файлась|Неть $1 файлатне}} вановиця категориянтень кандови.",
        "listingcontinuesabbrev": "поладксозо моли",
        "index-category": "Индекс марто лопатне",
-       "noindex-category": "Индекстэме лопатне",
+       "noindex-category": "Индекстэме лопат",
        "broken-file-category": "Лопат, конатнесэ файлань яжазь сюлмавомапеть",
        "about": "Эстедензэ",
        "article": "Потмокслопа",
        "nstab-template": "Лопа парцун",
        "nstab-help": "Лезкс лопа",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Прявтлопа",
        "nosuchaction": "Истямо тев арась",
        "nosuchspecialpage": "Истямо башка лопа арась",
        "nospecialpagetext": "<strong>Лопась, конань вешик, арась.</strong>\n\nВант те лемрисьменть [[Special:SpecialPages|{{int:specialpages}}]].",
        "yourpasswordagain": "Омбоцеде сёрмадык кирдицянь леметь:",
        "createacct-yourpasswordagain": "Кемекстык салававалонть",
        "createacct-yourpasswordagain-ph": "Совавтык салававалонть одов",
-       "remembermypassword": "Кирдемс мельсэ совамо валом те бравзерсэнть (сех кувать $1 {{PLURAL:$1|чи|чить}})",
        "userlogin-remembermypassword": "Кирдемизь совавтозекс",
        "userlogin-signwithsecure": "Нолдак тевс ванстозь сюлмавкс",
        "yourdomainname": "Эсеть доменэть:",
        "preview": "Васнянь неевтезэ",
        "showpreview": "Максомс васнянь невтевкс",
        "showdiff": "Невтемс мезе полавтовсь",
-       "anoneditwarning": "'''Ванок:''' Зярс эзить сова. IP адресэть совавтови те лопанть витнема-петнема икелькс умантень.",
+       "anoneditwarning": "<strong>Ванок!</strong> Зярс эзить сова. IP адресэть карми неявомо весенень карминдерят витнеме-петнеме. <strong>[$1 Совиндерят]</strong> эли <strong>[$2 шкиндерят совамо тарка]</strong>, весе витнема-петнема теветь аравтовить совамовалот лемс истя кода и лия изнявксоткак.",
        "missingcommenttext": "Инеськеть мелеть-арьсемат путта тезэнь алов.",
        "summary-preview": "Цётомань седеикелев вановкс:",
        "subject-preview": "Темань/коняксонь васнянь невтема:",
        "post-expand-template-argument-warning": "'''Ванок''': Те лопасонть ули лопапарцунонь вейке эли седе ламо аргумент, конась вельть покш. Сеть аргументтнэ нардазь.",
        "post-expand-template-argument-category": "Лопатнесэ улить лопа парцунонь нардань аргументт",
        "parser-template-loop-warning": "Лопа парцунсто \"чары реве\" муевсь: [[$1]]",
-       "cantcreateaccounttitle": "Сёрмадома таркынесь а тееви",
        "viewpagelogs": "Ванномс те лопас совамодо-лисемадо тевть",
        "nohistory": "Те лопанть витнемадо-петнемадо икелькс умазо арась.",
        "currentrev": "Тевате лиякстомтома",
        "searchprofile-advanced-tooltip": "Вешнемс башка теезь лемпотмотнестэ",
        "search-result-size": "$1 ({{PLURAL:$2|1 вал|$2 валт}})",
        "search-result-category-size": "{{PLURAL:$1|1 совицязо|$1 совицянзо}} ({{PLURAL:$2|1 явкскатегориязо|$2 явкскатегориянзо}}, {{PLURAL:$3|1 файла|$3 файлат}})",
-       "search-redirect": "(йутавтт $1-с)",
+       "search-redirect": "(ютавтт $1 лопасто)",
        "search-section": "(пелькс $1)",
        "search-suggest": "Истя мерикскелить: $1",
        "search-interwiki-caption": "Дугакс проектт",
        "right-upload": "Ёвкстамс файлат",
        "right-reupload": "Одонь сёрмадомга уликс файланть нардамс",
        "right-upload_by_url": "Ёвкстамс файлат URL адресстэ",
+       "right-writeapi": "Кода нолдамс тевс сёрмадома API-нть",
        "right-delete": "Нардамс лопатнень",
        "right-bigdelete": "Нардамс кувака икелькс ума марто лопатнень",
        "right-browsearchive": "Вешнемс нардань файлатнесэ",
        "newpageletter": "О",
        "boteditletter": "б",
        "rc_categories_any": "Кочказетнень эйстэ кодамо-понгсь",
+       "rc-change-size-new": "Полавтнемадонть мейле {{PLURAL:$1|байттнэде}}: $1",
        "newsectionsummary": "/* $1 */ од пелькс",
        "rc-enhanced-expand": "Невтемс седе ламо тень ланга",
        "rc-enhanced-hide": "Кекшемс келейстэ ёвтазенть",
        "whatlinkshere-prev": "{{PLURAL:$1|седе икелень|седе икелень $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|сыця|сыця $1}}",
        "whatlinkshere-links": "← сюлмавомапеть",
-       "whatlinkshere-hideredirs": "$1 ютавты козонь-козонь",
-       "whatlinkshere-hidetrans": "$1 сюлмавозь пелькстнэнь",
-       "whatlinkshere-hidelinks": "$1 сюлмавома петь",
+       "whatlinkshere-hideredirs": "лияв-лияв ютавтовкстнэде $1",
+       "whatlinkshere-hidetrans": "сюлмавозь пелькстнэде $1",
+       "whatlinkshere-hidelinks": "сюлмавома петнеде $1",
        "whatlinkshere-hideimages": "$1 файланть сюлмавомапензэ",
        "whatlinkshere-filters": "Фильтрат",
        "block": "Аравтомс теицянть саймас",
        "tooltip-pt-mycontris": "Мезесэ лездынь мезе путынь",
        "tooltip-pt-login": "Совавтовлить эсь прят тезэнь, арась мелеть, иля.",
        "tooltip-pt-logout": "Лисемс",
+       "tooltip-pt-createaccount": "Меревлинек тонеть совамо таркань шкамодо-совамодо, арась мелеть, иля",
        "tooltip-ca-talk": "Кортавтома пек паро лопадонть",
        "tooltip-ca-edit": "Витнемс-петнемс те лопанть",
        "tooltip-ca-addsection": "Ушодомс од явкс.",
        "tooltip-ca-nstab-main": "Ваномс потмо лопанзо",
        "tooltip-ca-nstab-user": "Ваномс теицянь лопанть",
        "tooltip-ca-nstab-media": "Ваномс медиа лопанть",
-       "tooltip-ca-nstab-special": "Те Ð±Ð°Ñ\88ка Ñ\82евенÑ\8c Ð»Ð¾Ð¿Ð°Ñ\81Ñ\8c, Ñ\81онÑ\81Ñ\8c Ð»Ð¾Ð¿Ð°Ñ\81Ñ\8c Ð° Ð²Ð¸Ñ\82неви-пеÑ\82неви",
+       "tooltip-ca-nstab-special": "Те Ð±Ð°Ñ\88ка Ñ\82евенÑ\8c Ð»Ð¾Ð¿Ð°Ñ\81Ñ\8c, Ñ\82е Ð»Ð¾Ð¿Ð°Ð½Ñ\82Ñ\8c Ð° Ð²Ð¸Ñ\82неÑ\81ак-пеÑ\82неÑ\81ак",
        "tooltip-ca-nstab-project": "Ваннынк проетной лопанть",
        "tooltip-ca-nstab-image": "Ванык файлань лопанть",
        "tooltip-ca-nstab-mediawiki": "Ваномс системань пачтямнэнть",
        "pageinfo-subpages-name": "Те лопанть явкслопанзо",
        "pageinfo-edits": "Зяроксть витнезь-петнезь",
        "pageinfo-authors": "Весемезэ зяро авторонзо",
+       "pageinfo-toolboxlink": "Лопадо иформация",
        "markaspatrolleddiff": "Тешкстамс ванстнемань ютазекс",
        "markaspatrolledtext": "Тешкстамс те лопанть ванстнемань ютазекс",
        "markedaspatrolled": "Тешкстазь ванстнемань ютазекс",
        "file-nohires": "Арась версия покш разрешения марто.",
        "svg-long-desc": "SVG файла, $1 × $2 пиксельть, файланть покшолмазо: $3",
        "show-big-image": "Васень файла",
+       "show-big-image-size": "$1 × $2 пиксель",
        "file-info-gif-looped": "кирьксэс аравтозь",
        "file-info-png-looped": "кирьксэс аравтозь",
        "newimages": "Од файлатьнень галлереясь",
index c72ae68..0b49df5 100644 (file)
        "nextrevision": "Khah-sin ê siu-tēng-pún→",
        "currentrevisionlink": "khoàⁿ siōng sin ê siu-tēng-pún",
        "cur": "taⁿ",
-       "next": "下一个",
+       "next": "āu",
        "last": "chêng",
        "page_first": "Tùi thâu-chêng",
        "page_last": "Tùi āu-piah",
index d403668..f356b98 100644 (file)
        "versionrequired": "MediaWiki-versjon $1 er påkrevd",
        "versionrequiredtext": "MediaWiki-versjon $1 er nødvendig for å bruke denne siden. Se [[Special:Version|versjonsiden]]",
        "ok": "OK",
+       "pagetitle": "$1 – {{SITENAME}}",
        "retrievedfrom": "Hentet fra «$1»",
        "youhavenewmessages": "Du har $1 ($2).",
        "youhavenewmessagesfromusers": "Du har $1 fra {{PLURAL:$3|en annen bruker| $3 brukere}} ($2).",
index 0d7ce83..9c59829 100644 (file)
        "retrievedfrom": " \"$1\" बाट निकालिएको",
        "youhavenewmessages": "तपाईंको लागि ($2) मा  $1 छ ।",
        "youhavenewmessagesfromusers": "तपाईंको लागि {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्ताहरू}} का $1 छन् । ($2)",
-       "youhavenewmessagesmanyusers": "तपाà¤\88à¤\81लाई धेरै प्रयोगकर्ताहरू($2) बाट $1 छ ।",
+       "youhavenewmessagesmanyusers": "तपाà¤\88à¤\82लाई धेरै प्रयोगकर्ताहरू($2) बाट $1 छ ।",
        "newmessageslinkplural": "{{PLURAL:$1|एउटा नयाँ सन्देश|999=नयाँ सन्देशहरू}}",
        "newmessagesdifflinkplural": "अन्तिम {{PLURAL:$1|परिवर्तन|999=परिवर्तनहरू}}",
        "youhavenewmessagesmulti": "तपाईंको लागि $1 मा  नयाँ सन्देशहरू छन्",
        "nstab-project": "आयोजना पृष्ठ",
        "nstab-image": "फाइल",
        "nstab-mediawiki": "सन्देश",
-       "nstab-template": "ढाँचा (टेम्प्लेट)",
+       "nstab-template": "ढाँचा",
        "nstab-help": "सहायता पृष्ठ",
        "nstab-category": "श्रेणी",
        "mainpage-nstab": "मुख्य पृष्ठ",
        "namespaceprotected": " '''$1'''  नेमस्पेसमा रहेका पृष्ठहरू सम्पादन गर्ने अनुमति यहाँलाई छैन ।",
        "customcssprotected": "तपाईंलाई यो  पृष्ठ सम्पादन गर्ने अनुमति छैन, किनकी यसमा कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
        "customjsprotected": "तपाईंलाई यो जाभास्कृप्ट पृष्ठ सम्पादन गर्ने अनुमति छैन, किनकी यसमा कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
-       "mycustomcssprotected": "यस CSSपà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\81लाई अनुमति छैन ।",
-       "mycustomjsprotected": "यस JavaScript à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\81लाई अनुमति छैन ।",
+       "mycustomcssprotected": "यà¥\8b CSSपà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\82लाई अनुमति छैन ।",
+       "mycustomjsprotected": "यà¥\8b à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\82लाई अनुमति छैन ।",
        "myprivateinfoprotected": "तपाईँसँग तपाईँको निजी जानकारीहरू सम्पादन गर्ने अनुमती छैन",
-       "mypreferencesprotected": "तपाà¤\88à¤\81सà¤\81à¤\97 à¤¤à¤ªà¤¾à¤\88à¤\81को अभिरुचीहरू सम्पादन गर्ने अनुमती छैन",
+       "mypreferencesprotected": "तपाà¤\88à¤\82सà¤\81à¤\97 à¤¤à¤ªà¤¾à¤\88à¤\82को अभिरुचीहरू सम्पादन गर्ने अनुमती छैन",
        "ns-specialprotected": "विशेष पृष्ठहरू सम्पादन गर्न सकिदैन।",
        "titleprotected": "[[User:$1|$1]]द्वारा यो शीर्षक निर्माणहुनबाट जोगाइएको छ।\nकारण <em>$2</em> हो ।",
        "filereadonlyerror": "फाइल \"$1\" लाई परिवर्तन गर्न सकिँदैन किन भने फाइल भण्डार  \"$2\" केवल पढ्ने स्थिति (read-only mode)मा छ।\n\nयसलाई सुरक्षित गर्ने प्रवन्धकले  यो कारण दिएकाछन् : ''$3''।",
        "createacct-reason-ph": "किन तपाईं नयाँ खाता खोलिरहनु भएको हो ?",
        "createacct-submit": "तपाईँको खाता सिर्जना गर्नुहोस",
        "createacct-another-submit": "खाता खोल्नुहोस्",
-       "createacct-benefit-heading": "{{SITENAME}} à¤¤à¤ªà¤¾à¤\88à¤\81 जस्तै मानिसहरूद्वारा सिर्जना गरिएको हो ।",
+       "createacct-benefit-heading": "{{SITENAME}} à¤¤à¤ªà¤¾à¤\88à¤\82 जस्तै मानिसहरूद्वारा सिर्जना गरिएको हो ।",
        "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन|सम्पादनहरू}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठ|पृष्ठहरू}}",
        "createacct-benefit-body3": "हालैका {{PLURAL:$1|योगदानकर्ता|योगदानकर्ताहरू}}",
        "loginerror": "प्रवेश त्रुटि",
        "createacct-error": "खाता बनाउँदा त्रुटि",
        "createaccounterror": "खाता बनाउन सकिएन: $1",
-       "nocookiesnew": "तपाà¤\88à¤\81à¤\95à¥\8b à¤\96ाता à¤¬à¤¨à¤¾à¤\87यà¥\8b, à¤¤à¤° à¤¤à¤ªà¤¾à¤\88à¤\81 à¤ªà¥\8dरवà¥\87श à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\9bà¥\88न à¥¤\n{{SITENAME}} à¤²à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\8dरवà¥\87श à¤\97राà¤\89न à¤\95à¥\81à¤\95à¥\80हरà¥\82 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dà¤\9b à¥¤\nतपाà¤\88à¤\81à¤\95ा à¤\95à¥\81à¤\95à¥\80हरà¥\82 à¤¨à¤¿à¤¸à¥\8dà¤\95à¥\8dरिय à¤\9bनà¥\8d।\nà¤\95à¥\83पया à¤¸à¤\95à¥\8dरिय à¤¬à¤¨à¤¾à¤\87 , à¤¨à¤¾à¤® à¤° à¤ªà¥\8dरवà¥\87शशव्द राखी प्रवेश गर्नुहोला ।",
-       "nocookieslogin": "{{SITENAME}} à¤²à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\8dरवà¥\87श à¤\97राà¤\89न à¤\95à¥\81à¤\95à¥\80हरà¥\82 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dà¤\9b à¥¤ à¤¤à¤ªà¤¾à¤\88à¤\81à¤\95à¥\8b à¤\95à¥\81à¤\95à¥\80हरà¥\82 à¤¨à¤¿à¤¸à¥\8dà¤\95à¥\8dरिय à¤\97रिà¤\8fà¤\95à¥\8b à¤\9b। à¤\95à¥\83पया à¤¸à¤\95à¥\8dरिय à¤¬à¤¨à¤¾à¤\87 , à¤¨à¤¾à¤® à¤° à¤ªà¥\8dरवà¥\87शशव्द राखी प्रवेश गर्नुहोला ।",
+       "nocookiesnew": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\96ाता à¤¬à¤¨à¤¾à¤\87यà¥\8b, à¤¤à¤° à¤¤à¤ªà¤¾à¤\88à¤\82 à¤ªà¥\8dरवà¥\87श à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\9bà¥\88न à¥¤\n{{SITENAME}} à¤²à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\8dरवà¥\87श à¤\97राà¤\89न à¤\95à¥\81à¤\95à¥\80हरà¥\82 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dà¤\9b à¥¤\nतपाà¤\88à¤\82à¤\95ा à¤\95à¥\81à¤\95à¥\80हरà¥\82 à¤¨à¤¿à¤¸à¥\8dà¤\95à¥\8dरिय à¤\9bनà¥\8d à¥¤\nà¤\95à¥\83पया à¤¸à¤\95à¥\8dरिय à¤¬à¤¨à¤¾à¤\87 , à¤¨à¤¾à¤® à¤° à¤ªà¥\8dरवà¥\87शशब्द राखी प्रवेश गर्नुहोला ।",
+       "nocookieslogin": "{{SITENAME}} à¤²à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\8dरवà¥\87श à¤\97राà¤\89न à¤\95à¥\81à¤\95à¥\80हरà¥\82 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dà¤\9b à¥¤ à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤\95à¥\81à¤\95à¥\80हरà¥\82 à¤¨à¤¿à¤¸à¥\8dà¤\95à¥\8dरिय à¤\97रिà¤\8fà¤\95à¥\8b à¤\9b à¥¤ à¤\95à¥\83पया à¤¸à¤\95à¥\8dरिय à¤¬à¤¨à¤¾à¤\87 , à¤¨à¤¾à¤® à¤° à¤ªà¥\8dरवà¥\87शशब्द राखी प्रवेश गर्नुहोला ।",
        "nocookiesfornew": "प्रयोगकर्ताको खाता निर्माण गरिएन, हामीले यसको मूल स्रोत निर्धारण गर्न सकेनौं।\nनिश्चित गर्नुहोस् तपाईंले कुकी सक्रिय गर्नुभएको छ, पुनः यस पृष्ठलाई खोल्ने प्रयास गर्नुहोस्।",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "तपाईंले सही प्रयोगकर्ता नाम दिनु भएन।",
        "passwordtooshort": "पासवर्ड कम्तिमा {{PLURAL:$1|१ अक्षर|$1 अक्षरहरू}}को हुनुपर्छ।",
        "passwordtoolong": "पासवर्ड {{PLURAL:$1|१ अक्षर|$1 अक्षरहरू}} भन्दा लामो हुनु हुदैन ।",
        "password-name-match": "तपाईँको प्रवेशशव्द प्रयोगकर्ता नाम भन्दा फरक हुनुपर्छ ।",
-       "password-login-forbidden": "यà¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤° à¤ªà¥\8dरवà¥\87श à¤¶à¤µ्द वर्जित गरिएकोछ ।",
+       "password-login-forbidden": "यà¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤° à¤ªà¥\8dरवà¥\87श à¤¶à¤¬्द वर्जित गरिएकोछ ।",
        "mailmypassword": "पासवर्ड पूर्वनिर्धारित गर्नुहोस्",
        "passwordremindertitle": "{{SITENAME}}को लागि नयाँ अस्थायी पासवर्ड",
-       "passwordremindertext": "à¤\95सà¥\88लà¥\87 (सायद à¤¤à¤ªà¤¾à¤\88à¤\81, IP à¤ à¥\87à¤\97ाना $1 à¤¬à¤¾à¤\9f), {{SITENAME}}($4) à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\8dरवà¥\87सशबà¥\8dद à¤\85नà¥\81रà¥\8bध à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\9b à¥¤ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता \"$2\" à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¨à¤¯à¤¾à¤\81 à¤\85सà¥\8dथायà¥\80 à¤ªà¥\8dरवà¥\87सशबà¥\8dद \"$3\"तयार à¤ªà¤¾à¤°à¤¿à¤\8fà¤\95à¥\8b à¤\9b à¥¤ à¤¯à¤¦à¤¿ à¤¯à¥\8b à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤\87à¤\9aà¥\8dà¤\9bामा à¤­à¤\8fà¤\95à¥\8b à¤­à¤\8f à¤\85हिलà¥\87 à¤¤à¤ªà¤¾à¤\88à¤\81लà¥\87 à¤ªà¥\8dरवà¥\87शà¤\97रà¥\80 à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\8dरवà¥\87सशबà¥\8dद à¤\9bानà¥\8dनà¥\81 à¤ªà¤°à¥\8dनà¥\87 à¤¹à¥\81नà¥\8dà¤\9b।\nतपाà¤\88à¤\82à¤\95à¥\8b à¤\85सà¥\8dथायà¥\80 à¤ªà¥\8dरवà¥\87सशबà¥\8dद  {{PLURAL:$5|à¤\8fà¤\95 à¤¦à¤¿à¤¨|$5 à¤¦à¤¿à¤¨à¤¹à¤°à¥\82 à¤ªà¤\9bि}} à¤\85मानà¥\8dय à¤¹à¥\81नà¥\87à¤\9b à¥¤\n\nयदि à¤\95à¥\8bहà¥\80 à¤\85रà¥\81लà¥\87 à¤¨à¥\88 à¤\85नà¥\81रà¥\8bध à¤\97रà¥\87à¤\95à¥\8b à¤¹à¥\8b à¤­à¤¨à¥\87 , à¤¯à¤¾ à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤\86फà¥\8dनà¥\8b à¤ªà¥\8dरवà¥\87सशबà¥\8dद à¤¸à¤®à¥\8dà¤\9dिनà¥\81 à¤­à¤¯à¥\8b à¤­à¤¨à¥\87, à¤\85थवा\nतà¥\8dयसलाà¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤\9aाहनà¥\81हà¥\81नà¥\8dन à¤­à¤¨à¥\87, à¤¤à¤ªà¤¾à¤\88à¤\81लà¥\87 à¤¯à¥\8b à¤¸à¤¨à¥\8dदà¥\87सà¤\95à¥\8b à¤µà¥\87वासà¥\8dता à¤\97रà¥\8dनसà¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¤° à¤ªà¥\81रानà¥\88 à¤ªà¥\8dरवà¥\87सशब्द प्रयोग गरिरहन सक्नुहुन्छ ।",
+       "passwordremindertext": "à¤\95सà¥\88लà¥\87 (सायद à¤¤à¤ªà¤¾à¤\88à¤\82, IP à¤ à¥\87à¤\97ाना $1 à¤¬à¤¾à¤\9f), {{SITENAME}}($4) à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\8dरवà¥\87शशबà¥\8dद à¤\85नà¥\81रà¥\8bध à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\9b à¥¤ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता \"$2\" à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¨à¤¯à¤¾à¤\81 à¤\85सà¥\8dथायà¥\80 à¤ªà¥\8dरवà¥\87शशबà¥\8dद \"$3\"तयार à¤ªà¤¾à¤°à¤¿à¤\8fà¤\95à¥\8b à¤\9b à¥¤ à¤¯à¤¦à¤¿ à¤¯à¥\8b à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤\87à¤\9aà¥\8dà¤\9bामा à¤­à¤\8fà¤\95à¥\8b à¤­à¤\8f à¤\85हिलà¥\87 à¤¤à¤ªà¤¾à¤\88à¤\81लà¥\87 à¤ªà¥\8dरवà¥\87शà¤\97रà¥\80 à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\8dरवà¥\87शशबà¥\8dद à¤\9bानà¥\8dनà¥\81 à¤ªà¤°à¥\8dनà¥\87 à¤¹à¥\81नà¥\8dà¤\9b à¥¤\nतपाà¤\88à¤\82à¤\95à¥\8b à¤\85सà¥\8dथायà¥\80 à¤ªà¥\8dरवà¥\87शशबà¥\8dद  {{PLURAL:$5|à¤\8fà¤\95 à¤¦à¤¿à¤¨|$5 à¤¦à¤¿à¤¨à¤¹à¤°à¥\82 à¤ªà¤\9bि}} à¤\85मानà¥\8dय à¤¹à¥\81नà¥\87à¤\9b à¥¤\n\nयदि à¤\95à¥\8bहà¥\80 à¤\85रà¥\81लà¥\87 à¤¨à¥\88 à¤\85नà¥\81रà¥\8bध à¤\97रà¥\87à¤\95à¥\8b à¤¹à¥\8b à¤­à¤¨à¥\87 , à¤¯à¤¾ à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤\86फà¥\8dनà¥\8b à¤ªà¥\8dरवà¥\87शशबà¥\8dद à¤¸à¤®à¥\8dà¤\9dिनà¥\81 à¤­à¤¯à¥\8b à¤­à¤¨à¥\87, à¤\85थवा\nतà¥\8dयसलाà¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤\9aाहनà¥\81हà¥\81नà¥\8dन à¤­à¤¨à¥\87, à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤¯à¥\8b à¤¸à¤¨à¥\8dदà¥\87शà¤\95à¥\8b à¤µà¥\87वासà¥\8dता à¤\97रà¥\8dनसà¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¤° à¤ªà¥\81रानà¥\88 à¤ªà¥\8dरवà¥\87शशब्द प्रयोग गरिरहन सक्नुहुन्छ ।",
        "noemail": "प्रयोगकर्ता  \"$1\"को लागि कुनै पनि इ-मेल दर्ता गरिएको छैन ।",
        "noemailcreate": "तपाईंले सही ई-मेल ठेगाना दिनुपर्छ",
        "passwordsent": "\"$1\" को लागि दर्ता गरिएको ई-मेल ठेगानामा एक प्रवेशशव्द पठाइएको छ।\nकृपया त्यसलाई प्राप्त गरेपछि प्रवेश गर्नुहोला ।",
        "blocked-mailpassword": "तपाईंको IP ठेगानालाई सम्पादनगर्नबाट रोक लगाइएको छ, र त्यसैले दुरुपयोग रोक्नको लागि प्रवेसशब्द पुनर्लाभ प्रक्रिया प्रयोग गर्न अनुमति छैन ।",
-       "eauthentsent": "दिà¤\87à¤\8fà¤\95à¥\8b à¤\87मà¥\87ल à¤ à¥\87à¤\97ानामा à¤\87मà¥\87ल à¤ªà¤ à¤¾à¤\87à¤\8fà¤\95à¥\8b à¤\9b à¥¤\nतपाà¤\88à¤\81à¤\95à¥\8b à¤\96ातामा à¤\85रà¥\81 à¤\87मà¥\87ल à¤ªà¤ à¤\89नà¥\81 à¤\85à¤\98ि , à¤\87मà¥\87लमा à¤²à¥\87à¤\96िà¤\8fà¤\95à¥\8b à¤®à¤¾à¤°à¥\8dà¤\97दरà¥\8dशन à¤\85नà¥\81सार , à¤¤à¥\8dयà¥\8b à¤\96ाता à¤¤à¤ªà¤¾à¤\88à¤\81कै हो भनेर निश्चित गर्नु पर्नेछ ।",
+       "eauthentsent": "दिà¤\87à¤\8fà¤\95à¥\8b à¤\87मà¥\87ल à¤ à¥\87à¤\97ानामा à¤\87मà¥\87ल à¤ªà¤ à¤¾à¤\87à¤\8fà¤\95à¥\8b à¤\9b à¥¤\nतपाà¤\88à¤\82à¤\95à¥\8b à¤\96ातामा à¤\85रà¥\81 à¤\87मà¥\87ल à¤ªà¤ à¤\89नà¥\81 à¤\85à¤\98ि , à¤\87मà¥\87लमा à¤²à¥\87à¤\96िà¤\8fà¤\95à¥\8b à¤®à¤¾à¤°à¥\8dà¤\97दरà¥\8dशन à¤\85नà¥\81सार , à¤¤à¥\8dयà¥\8b à¤\96ाता à¤¤à¤ªà¤¾à¤\88à¤\82कै हो भनेर निश्चित गर्नु पर्नेछ ।",
        "throttled-mailpassword": "बितेको {{PLURAL:$1|घण्टा|$1 घण्टाहरु}} भित्र एउटा पासवर्ड अनुस्मारक पठाई सकिएको छ।\nदुरुपयोगबाट बचाउकोलागि प्रत्येक {{PLURAL:$1|घण्टा|$1 घण्टाहरु}}मा केवल एउटा पासवर्ड अनुस्मारक पठाइन्छ।",
        "mailerror": " चिठी :$1 पठाउँदा त्रुटी भयो",
        "acct_creation_throttle_hit": "तपाईंको आईपी ठेगानाबाट आएका आगन्तुकद्वारा बितेको चौबिस घण्टामा यस विकिमा {{PLURAL:$1|एउटा खाता बनाइसकिएको छ|$1 खाताहरु बनाइसकिएका छन्}}, यस समयावधिमा यति नैं अधिकतम सीमा हो।\nअतः यस समय यस आईपी ठेगानाको प्रयोग गर्ने आगन्तुकले अरु खाता खोल्न सक्नेछैनन्।",
        "resetpass_header": "खाताको पासवर्ड परिवर्तन गर्ने",
        "oldpassword": "पुरानो पासवर्ड:",
        "newpassword": "नयाँ पासवर्ड:",
-       "retypenew": "पà¥\8dरवà¥\87श à¤¶à¤µ्द पुन: दिनुहोस् :",
+       "retypenew": "पà¥\8dरवà¥\87श à¤¶à¤¬्द पुन: दिनुहोस् :",
        "resetpass_submit": "पासवर्ड व्यवस्थित गरी र प्रवेशगर्ने",
        "changepassword-success": "तपाईँको पासवर्ड सफलतापूर्वक परिवर्तन भयो!",
        "changepassword-throttled": "तपाईंले भर्खरै धेरै पल्ट प्रवेश (लग इन)को निम्ति प्रयास गर्नुभएको छ। \nकृपया $1 पर्खेर मात्र प्रयास गर्नुहोस्।",
        "resetpass-no-info": "यो पृष्ठ सिधै हेर्नको लागि तपाईँले प्रवेश गर्नुपर्छ ।",
        "resetpass-submit-loggedin": "प्रवेसशब्द परिवर्तन गर्ने",
        "resetpass-submit-cancel": "रद्द गर्ने",
-       "resetpass-wrong-oldpass": "à¤\85सà¥\8dथायà¥\80 à¤\85थवा à¤¹à¤¾à¤²à¤¿à¤\8fà¤\95à¥\8b à¤ªà¥\8dरवà¥\87सशबà¥\8dद à¤\85मानà¥\8dय\nतपाà¤\88à¤\82लà¥\87 à¤\85à¤\98िबाà¤\9f à¤¨à¥\88à¤\82 à¤ªà¥\8dरवà¥\87सशबà¥\8dद à¤¸à¤«à¤²à¤¤à¤¾ à¤ªà¥\82रà¥\8dवà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रिसà¤\95à¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¹à¥\8b à¤µà¤¾ à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\8dरवà¥\87सशब्दको निम्ति निवेदन गर्नुभएकोछ।",
+       "resetpass-wrong-oldpass": "à¤\85सà¥\8dथायà¥\80 à¤\85थवा à¤¹à¤¾à¤²à¤¿à¤\8fà¤\95à¥\8b à¤ªà¥\8dरवà¥\87श à¤¶à¤¬à¥\8dद à¤\85मानà¥\8dय\nतपाà¤\88à¤\82लà¥\87 à¤\85à¤\98िबाà¤\9f à¤¨à¥\88à¤\82 à¤ªà¥\8dरवà¥\87श à¤¶à¤¬à¥\8dद à¤¸à¤«à¤²à¤¤à¤¾ à¤ªà¥\82रà¥\8dवà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रिसà¤\95à¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¹à¥\8b à¤µà¤¾ à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\8dरवà¥\87श शब्दको निम्ति निवेदन गर्नुभएकोछ।",
        "resetpass-recycled": "कृपया वर्तमान पासर्वड भन्दा फरक पासर्वडलाई पुनः मिलाउनुहोस् ।",
        "resetpass-temp-emailed": "तपाईं अस्थाई इमेल कोडले प्रवेश गर्नुभएको छ।\nप्रवेश सफल पार्नका लागि, तपाईंले यहाँ एउटा नयाँ पासवर्ड राख्नु पर्नेछ:",
        "resetpass-temp-password": "अस्थाइ पासवर्ड",
        "passwordreset": "प्रवेशशव्द पुनः तय गर्ने",
        "passwordreset-text-one": "इमेल मार्फल अस्थायी पासवर्ड प्राप्त गर्नको लागी यस फारमलाई पूर्ण रूपमा भर्नुहोस् ।",
        "passwordreset-text-many": "{{PLURAL:$1|कृपया यहाँ मध्ये एउटा क्षेत्र भरि अस्थाई पासवर्ड इमेल मार्फत प्राप्त गर्नुहोस।}}",
-       "passwordreset-disabled": "पà¥\8dरवà¥\87श à¤¶à¤µà¥\8dद à¤ªà¥\81नà¤\83 à¤¨à¤¿à¤°à¥\8dधारण à¤\97रà¥\8dनà¥\87 à¤µà¥\8dयवसà¥\8dथा à¤¯à¤¸ à¤µà¤¿à¤\95िमा à¤¨à¤¿à¤¸à¥\8dà¤\95à¥\8dरिय à¤ªà¤¾à¤°à¤¿à¤\8fà¤\95à¥\8b à¤\9b।",
+       "passwordreset-disabled": "पà¥\8dरवà¥\87श à¤¶à¤¬à¥\8dद à¤ªà¥\81नà¤\83 à¤¨à¤¿à¤°à¥\8dधारण à¤\97रà¥\8dनà¥\87 à¤µà¥\8dयवसà¥\8dथा à¤¯à¤¸ à¤µà¤¿à¤\95िमा à¤¨à¤¿à¤¸à¥\8dà¤\95à¥\8dरिय à¤ªà¤¾à¤°à¤¿à¤\8fà¤\95à¥\8b à¤\9b ।",
        "passwordreset-emaildisabled": "इमेल सुविधा यस विकिमा निस्क्रिय बनाइएको छ ।",
        "passwordreset-username": "प्रयोगकर्ता नाम:",
        "passwordreset-domain": "डोमेन",
        "hiddencategories": "यो पृष्ठ निम्न {{PLURAL:$1|1 लुकाइएको श्रेणी|$1 लुकाइएका श्रेणीहरू}}को सदस्य हो :",
        "edittools": "<!-- Text here will be shown below edit and upload forms. -->",
        "edittools-upload": "-",
-       "nocreatetext": "{{SITENAME}} à¤²à¥\87 à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\83षà¥\8dठ à¤¸à¥\83à¤\9cना à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\87 à¤\95à¥\8dषमतामा à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\8fà¤\95à¥\8b à¤\9b।\nतपाà¤\88à¤\81 à¤ªà¤\9bाडि à¤\9cानà¥\81 à¤­à¤\87 à¤°à¤¹à¤¿à¤\86à¤\8fà¤\95à¥\8b à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनसà¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b , à¤\85थवा [[Special:UserLogin|पà¥\8dरवà¥\87श à¤\97रà¥\8dनà¥\81हà¥\8bस à¤¯à¤¾ à¤¨à¤¯à¤¾à¤\81 à¤\96ाता à¤¸à¥\83à¤\9cना à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d ]]।",
-       "nocreate-loggedin": "नयाà¤\81 à¤ªà¥\83षà¥\8dठ à¤¸à¥\83à¤\9cनाà¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\81लाई अनुमति छैन ।",
+       "nocreatetext": "{{SITENAME}} à¤²à¥\87 à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\83षà¥\8dठ à¤¸à¥\83à¤\9cना à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\87 à¤\95à¥\8dषमतामा à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\8fà¤\95à¥\8b à¤\9b।\nतपाà¤\88à¤\82 à¤ªà¤\9bाडि à¤\97à¤\8fर à¤¯à¤¹à¤¾à¤\81 à¤°à¤¹à¥\87à¤\95ा à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनसà¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b , à¤\85थवा [[Special:UserLogin|पà¥\8dरवà¥\87श à¤\97रà¥\8dनà¥\81हà¥\8bस à¤¯à¤¾ à¤¨à¤¯à¤¾à¤\81 à¤\96ाता à¤\96à¥\8bलà¥\8dनà¥\81हà¥\8bसà¥\8d]]।",
+       "nocreate-loggedin": "नयाà¤\81 à¤ªà¥\83षà¥\8dठ à¤¸à¥\83à¤\9cनाà¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\82लाई अनुमति छैन ।",
        "sectioneditnotsupported-title": "खण्ड सम्पादन असमर्थित",
        "sectioneditnotsupported-text": "यस पृष्ठमा खण्ड सम्पादन असमर्थित",
        "permissionserrors": "अनुमति नभएको",
-       "permissionserrorstext": "तपाà¤\88à¤\81लाà¤\88 à¤¯à¤¸à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\85नà¥\81मति à¤\9bà¥\88न ,निमà¥\8dन {{PLURAL:$1|à¤\95ारण|à¤\95ारणहरà¥\81}}ले गर्दा:",
-       "permissionserrorstext-withaction": "$2 à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\81लाà¤\88 à¤\85नà¥\81मति à¤\9bà¥\88न , à¤¨à¤¿à¤®à¥\8dन {{PLURAL:$1|à¤\95ारणलà¥\87|à¤\95ारणहरà¥\81ले}} गर्दा :",
+       "permissionserrorstext": "तपाà¤\88à¤\81लाà¤\88 à¤¯à¤¸à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\85नà¥\81मति à¤\9bà¥\88न ,निमà¥\8dन {{PLURAL:$1|à¤\95ारण|à¤\95ारणहरà¥\82}}ले गर्दा:",
+       "permissionserrorstext-withaction": "$2 à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88लाà¤\88 à¤\85नà¥\81मति à¤\9bà¥\88न , à¤¨à¤¿à¤®à¥\8dन {{PLURAL:$1|à¤\95ारणलà¥\87|à¤\95ारणहरà¥\82ले}} गर्दा :",
        "recreate-moveddeleted-warn": "'''चेतावनी: तपाईं अघिबाट मेटिएको पृष्ठ पुनर्निर्माण गर्नुहुँदैछ'''\n\nतपाईंको विचारमा के यो उचित छ कि यसको सम्पादन जारी राखियोस्, \nयस पृष्ठको मेटिएको र सारिएको लग सुविधाको निम्ति यहाँ दिइएकोछ :",
        "moveddeleted-notice": "पृष्ठ मेटिएको छ ।\nमेटिएका तथा सारिएका पृष्ठहरूको सूची तल सन्दर्भको लागि दिइएको छ ।",
        "log-fulllog": "पूरा लग हेर्नुहोस्",
        "duplicate-args-category-desc": "पेज जस्तै तर्कहरूको नक्क्लको उपयोग गर्ने ढाँचा कल, जस्तै <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> र <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''चेतावनी:''' यस पृष्टका अति धेरै संख्याका महँगा पार्सर फंक्सन कल्स (expensive parser function calls)  छन्।\nयसमा $2 भन्दा कम {{PLURAL:$2|कल|कल्स}} हुनुपर्छ,  यहाँ {{PLURAL:$1|अहिले $1 कल छ|अहिले $1 कल्स छ्न्}}.",
        "expensive-parserfunction-category": "अति धेरै मेहनत पर्ने '''पार्सर फङ्सन कल'''हरू भएका पृष्ठहरू",
-       "post-expand-template-inclusion-warning": "'''à¤\9aà¥\87तावनà¥\80:''' à¤¸à¤®à¥\87à¤\9fà¥\8dनà¥\81परà¥\8dनà¥\87 à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f(नमà¥\81ना) à¤\86à¤\95ार à¤\85ति à¤ à¥\82लà¥\8b à¤\9b।\nà¤\95à¥\87हà¥\80 à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9fहरà¥\81(नमà¥\81नाहरà¥\81) समेटिने छैनन् ।",
+       "post-expand-template-inclusion-warning": "'''à¤\9aà¥\87तावनà¥\80:''' à¤¸à¤®à¥\87à¤\9fà¥\8dनà¥\81परà¥\8dनà¥\87 à¤¢à¤¾à¤\81à¤\9aा (नमà¥\81ना) à¤\86à¤\95ार à¤\85ति à¤ à¥\82लà¥\8b à¤\9b à¥¤\nà¤\95à¥\87हà¥\80 à¤¢à¤¾à¤\81à¤\9aाहरà¥\82 (नमà¥\81नाहरà¥\82) समेटिने छैनन् ।",
        "post-expand-template-inclusion-category": "यस्ता पृष्ठहरू जहाँ ढाँचा (टेम्पलेट) राख्ने सिमा हुनुपर्ने भन्दा बढि छ ।",
-       "post-expand-template-argument-warning": "'''à¤\9aà¥\87तावनà¥\80:''' à¤¯à¥\8b à¤ªà¥\83षà¥\8dठà¤\95मा à¤\95मà¥\8dतिमा à¤\8fà¤\95 à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f à¤®à¤¾à¤¨ à¤°à¤¹à¥\87à¤\95à¥\8b à¤\9b à¤\9cसà¤\95à¥\8b à¤§à¥\87रà¥\88 à¤ à¥\82लà¥\8b à¤¬à¤¢à¥\8bतà¥\8dतरà¥\80 à¤\86à¤\95ार à¤°à¤¹à¥\87à¤\95à¥\8b à¤\9b।\nयसà¥\8dता à¤®à¤¾à¤¨à¤¹à¤°à¥\81 हटाइएका छन् ।",
+       "post-expand-template-argument-warning": "'''à¤\9aà¥\87तावनà¥\80:''' à¤¯à¥\8b à¤ªà¥\83षà¥\8dठमा à¤\95मà¥\8dतिमा à¤\8fà¤\95 à¤¢à¤¾à¤\81à¤\9aा à¤®à¤¾à¤¨ à¤°à¤¹à¥\87à¤\95à¥\8b à¤\9b à¤\9cसà¤\95à¥\8b à¤§à¥\87रà¥\88 à¤ à¥\82लà¥\8b à¤¬à¤¢à¥\8bतà¥\8dतरà¥\80 à¤\86à¤\95ार à¤°à¤¹à¥\87à¤\95à¥\8b à¤\9b à¥¤\nयसà¥\8dता à¤®à¤¾à¤¨à¤¹à¤°à¥\82 हटाइएका छन् ।",
        "post-expand-template-argument-category": "मेटिएका ढाँचाहरूसँग सम्बन्ध रहेका पृष्ठहरू",
        "parser-template-loop-warning": "ढाँचागत ग़ाँठो पर्‍यो : [[$1]]",
        "parser-template-recursion-depth-warning": "ढाँचा पुन:चक्र गहिराई सिमा ($1) भन्दा बढि भयो",
        "revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
        "revdelete-nooldid-text": "यस क्रियालाई गर्नको लागि तपाईंले लक्ष्य अवतरण दिनु भएको छैन, वा तपाईंले दिएको अवतरण अस्तित्वमा छैन वा तपाईं सद्य अवतरणलाई लुकाउने प्रयत्न गर्दै हुनुहुन्छ।",
        "revdelete-no-file": "खुलाइएको पृष्ठ अस्तित्वमा छैन",
-       "revdelete-show-file-confirm": "तपाà¤\88à¤\81 $2 बाट $3 मा मेटिएको फाइल \"<nowiki>$1</nowiki>\" को पुनरावलोकन हेर्न चाहनुहुन्छ भन्ने कुरामा निश्चित हुनुहुन्छ ?",
+       "revdelete-show-file-confirm": "तपाà¤\88à¤\82 $2 बाट $3 मा मेटिएको फाइल \"<nowiki>$1</nowiki>\" को पुनरावलोकन हेर्न चाहनुहुन्छ भन्ने कुरामा निश्चित हुनुहुन्छ ?",
        "revdelete-show-file-submit": "हो",
        "revdelete-selected-text": "[[:$2]] को {{PLURAL:$1|छानिएको संशोधन|छानिएका संशोधनहरू}}:",
        "revdelete-selected-file": "[[:$2]] को {{PLURAL:$1|छानिएको फाइल संस्करण|छानिएका फाइल संस्करणहरू}}:",
        "revdelete-no-change": "'''चेतावनी:''' $2, $1मिति भइको वस्तुको पहिले नै अनुरोध गरे अनुसारको दृश्य सेटिङ्गहरु छन् ।",
        "revdelete-concurrent-change": " $2, $1 मिति गरिएको वस्तु परिवर्तन गर्न सकिएन: यसको स्थितीले तपाईंले परिवर्तन गर्नलाग्नुहुँदा कोहीअरुले नै परिवर्तन गरेजस्तो देखाउँछ\nकृपया लगहरू हेर्नुहोला ।",
        "revdelete-only-restricted": "$2, $1 मिति भएको वस्तु लुकाउदा त्रुटी भएको छ:तपाईंले वस्तुहरूलाई प्रवन्धकहरूको दृष्टीबाट दमन गर्न सक्नुहुन्न अझ कुनै पनि अरु दृष्टी विकल्पहरू नछानीकन।",
-       "revdelete-reason-dropdown": "मà¥\87à¤\9fाà¤\89नà¤\95ा à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\95ारणहरà¥\81\n** à¤\95पà¥\80राà¤\87à¤\9f à¤\89लà¥\8dलà¤\82à¤\98न\n** à¤\85नà¥\81à¤\9aित à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\9cानà¤\95ारà¥\80\n** à¤\85नà¥\81à¤\9aित à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤®\n** à¤¸à¤\82भावित अपमानजनक जानकारी",
+       "revdelete-reason-dropdown": "मà¥\87à¤\9fाà¤\89नà¤\95ा à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\95ारणहरà¥\82\n** à¤\95पà¥\80राà¤\87à¤\9f à¤\89लà¥\8dलà¤\99à¥\8dà¤\98न\n** à¤\85नà¥\81à¤\9aित à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\9cानà¤\95ारà¥\80\n** à¤\85नà¥\81à¤\9aित à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤®\n** à¤¸à¤®à¥\8dभावित अपमानजनक जानकारी",
        "revdelete-otherreason": "अन्य/थप कारण:",
        "revdelete-reasonotherlist": "अरु कारण",
        "revdelete-edit-reasonlist": "मेट्ने कार्यहरु सम्पादन गर्ने",
        "prefs-resetpass": "प्रवेश शब्द परिवर्तन",
        "prefs-changeemail": "इमेल परिवर्तन गर्ने",
        "prefs-setemail": "इमेल ठेगाना प्रविष्ट गर्ने",
-       "prefs-email": "इमेल  विकल्पहरु",
+       "prefs-email": "इमेल विकल्पहरू",
        "prefs-rendering": "स्वरुप",
        "saveprefs": "संग्रह",
        "restoreprefs": "सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमा)",
        "timezoneregion-europe": "युरोप",
        "timezoneregion-indian": "हिन्द महासागर",
        "timezoneregion-pacific": "प्राशान्त महासागर",
-       "allowemail": "à¤\85रà¥\81 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\81बाà¤\9f à¤ªà¥\8dरापà¥\8dत à¤¹à¥\81नà¥\87 à¤\88मà¥\87ल enable गर्नुहोस् ।",
+       "allowemail": "à¤\85रà¥\81 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82बाà¤\9f à¤ªà¥\8dरापà¥\8dत à¤¹à¥\81नà¥\87 à¤\88मà¥\87ल à¤¸à¤\95à¥\8dषम गर्नुहोस् ।",
        "prefs-searchoptions": "खोज्ने",
        "prefs-namespaces": "नेमस्पेसेज",
        "default": "पूर्वनिर्धारित",
        "prefs-custom-css": "अनुकुलित CSS",
        "prefs-custom-js": "अनुकुलित JS",
        "prefs-common-css-js": "साझा CSS/जाभा स्क्रिप्ट सबै त्वचा(स्किन)को लागि:",
-       "prefs-reset-intro": "तपाà¤\88à¤\81 यो पृष्ठलाई आफ्नो अभिरुचीहरू साइट पूर्वावस्थामा फर्काउन प्रयोग गर्न सक्नुहुन्छ । त्यस पछि यसलाई रद्द गर्न सक्नुहुन्न ।",
+       "prefs-reset-intro": "तपाà¤\88à¤\82 यो पृष्ठलाई आफ्नो अभिरुचीहरू साइट पूर्वावस्थामा फर्काउन प्रयोग गर्न सक्नुहुन्छ । त्यस पछि यसलाई रद्द गर्न सक्नुहुन्न ।",
        "prefs-emailconfirm-label": "इ-मेल एकिन प्रक्रिया :",
        "youremail": "ईमेल",
        "username": "{{GENDER:$1|प्रयोगकर्ता नाम}}:",
        "prefs-help-gender": "यो जानकारी दिनु वैकल्पिक छ।\nयो सफ्टवेयरमा लिङ्गको आधारमा तपाईंको लागि सहि सम्बोधन गर्नको निमित्त हुन्छ।\nयो जानकारी सार्वजनिक गरिनेछ।",
        "email": "ईमेल",
        "prefs-help-realname": "वास्तविक नाम ऐच्छिक हो ।\nतपाईंले खुलाउनु भएको खण्डमा तपाईंको कामको श्रेय दिनको लागि यसको प्रयोग गरिने छ ।",
-       "prefs-help-email": "à¤\87मà¥\87ल à¤ à¥\87à¤\97ाना à¤\90à¤\9aà¥\8dà¤\9bिà¤\95 à¤¹à¥\8b, à¤¤à¤°  à¤ªà¥\8dरवà¥\87श à¤¶à¤µà¥\8dदà¤\95à¥\8b à¤ªà¥\81नरà¥\8dसà¥\8dथापनाà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\86वशà¥\8dयà¤\95ता à¤\9b, à¤\95à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤ªà¥\8dरवà¥\87श à¤¶à¤µà¥\8dद à¤­à¥\81लà¥\8dनà¥\81 à¤¹à¥\81नà¥\8dथà¥\8dयà¥\8b।",
-       "prefs-help-email-others": "तपाà¤\88à¤\82लà¥\87 à¤¯à¥\8b à¤ªà¤¨à¤¿ à¤\9aयन à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¤\95ि à¤\85रà¥\81हरà¥\81लà¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤ªà¤°à¤¿à¤\9aय à¤¨à¤ªà¤¾à¤\88 à¤¤à¤ªà¤¾à¤\88à¤\82सित à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\85थवा à¤µà¤¾à¤°à¥\8dतालाप à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤®à¤¾à¤§à¥\8dयमलà¥\87 à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤°à¤¾à¤\96à¥\81नà¥\8d à¥¤",
+       "prefs-help-email": "à¤\87मà¥\87ल à¤ à¥\87à¤\97ाना à¤\90à¤\9aà¥\8dà¤\9bिà¤\95 à¤¹à¥\8b, à¤¤à¤°  à¤ªà¥\8dरवà¥\87श à¤¶à¤¬à¥\8dदà¤\95à¥\8b à¤ªà¥\81नरà¥\8dसà¥\8dथापनाà¤\95ा à¤²à¤¾à¤\97ि à¤\86वशà¥\8dयà¤\95ता à¤\9b, à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤ªà¥\8dरवà¥\87श à¤¶à¤¬à¥\8dद à¤¤ à¤\95à¥\87 à¤­à¥\81लà¥\8dनà¥\81 à¤¹à¥\81नà¥\8dथà¥\8dयà¥\8b ।",
+       "prefs-help-email-others": "तपाईंले यो पनि चयन गर्न सक्नुहुन्छ कि अरुले तपाईंको परिचय नपाई तपाईंसित तपाईंको प्रयोगकर्ता अथवा वार्तालाप पृष्ठको माध्यमले सम्पर्क राखुन् ।",
        "prefs-help-email-required": "इमेल ठेगामा चाहिन्छ ।",
        "prefs-info": "साधारण जानकारी",
        "prefs-i18n": "अन्तर्राष्ट्रियकरण",
        "prefs-editor": "सम्पादक",
        "prefs-preview": "पूर्वावलोकन",
        "prefs-advancedrc": "उन्नत विकल्पहरू",
-       "prefs-advancedrendering": "à¤\89नà¥\8dनत à¤µà¤¿à¤\95लà¥\8dपहरà¥\81",
+       "prefs-advancedrendering": "à¤\89नà¥\8dनत à¤µà¤¿à¤\95लà¥\8dपहरà¥\82",
        "prefs-advancedsearchoptions": "उन्नत विकल्पहरू",
        "prefs-advancedwatchlist": "उन्नत विकल्पहरू",
        "prefs-displayrc": "प्रदर्शन विकल्पहरू",
        "right-patrolmarks": "हालका सम्पादन पट्रोल(गस्ती) चिनो लगाउने",
        "right-unwatchedpages": "निगरानी नगरिएका पृष्ठहरूको सूची हेर्ने",
        "right-mergehistory": "पृष्ठका इतिहासहरु बुझाउने",
-       "right-userrights": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤\85धिà¤\95ारहरà¥\81 सम्पादन गर्ने",
+       "right-userrights": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤\85धिà¤\95ारहरà¥\82 सम्पादन गर्ने",
        "right-userrights-interwiki": "अरु विकिहरूमा प्रयोगकर्ताहरूको अधिकार सम्पादन गर्ने",
        "right-siteadmin": "डेटाबेसको ताल्चामार्ने र ताल्चाखोल्ने",
        "right-override-export-depth": "गहिराइ ५ सम्मको लिंक गरिएका पृष्ठहरू सहित निर्यात गर्ने",
        "action-autopatrol": "तपाईंको सम्पादनलाई गश्त रुपमा दाग दिनुहोस्",
        "action-unwatchedpages": "अवलोकन नगरिएका  पृष्ठहरूको सूची हेर्ने",
        "action-mergehistory": "यस पृष्ठको इतिहासलाई मिसाउने",
-       "action-userrights": "सबà¥\88 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤\85धिà¤\95ारहरà¥\81 सम्पादन गर्ने",
+       "action-userrights": "सबà¥\88 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤\85धिà¤\95ारहरà¥\82 सम्पादन गर्ने",
        "action-userrights-interwiki": "अरु विकिका प्रयोगकर्ताहरूको प्रयोगकर्ता अधिकारलाई सम्पादन गर्ने",
        "action-siteadmin": "डेटाबेस बन्दगर्ने वा खोल्ने",
        "action-sendemail": "इमेलहरु पठाउने",
        "action-editmywatchlist": "तपाईँको निगरानी सुची सम्पादन गर्नुहोस",
        "action-viewmywatchlist": "तपाईँको निगरानी सुची हेर्नुहोस",
-       "action-viewmyprivateinfo": "तपाà¤\88à¤\81को व्यक्तिगत जानकारी हेर्नुहोस",
+       "action-viewmyprivateinfo": "तपाà¤\88à¤\82को व्यक्तिगत जानकारी हेर्नुहोस",
        "action-editmyprivateinfo": "तपाईँको व्यक्तिगत जानकारी सम्पादन गर्नुहोस",
        "action-editcontentmodel": "पृष्ठको सामग्री नमुना सम्पादन",
        "action-managechangetags": "डाटाबेसबाट ट्यागहरू बनाउने र मेटाउने",
        "destfilename": "गन्तव्य फाइलनाम :",
        "upload-maxfilesize": "अधिकतम फाइल आकार : $1",
        "upload-description": "फाइल वर्णन",
-       "upload-options": "à¤\89रà¥\8dधà¥\8dवभरण à¤µà¤¿à¤\95लà¥\8dपहरà¥\81",
+       "upload-options": "à¤\89रà¥\8dधà¥\8dवभरण à¤µà¤¿à¤\95लà¥\8dपहरà¥\82",
        "watchthisupload": "यो पृष्ठ निगरानी गर्नुहोस्",
        "filewasdeleted": "यस नामको एक फाइल पहिले पनि अपलोड गरे पछि हटाई सकिएको छ।\nपुनः अपलोड गर्नु पूर्व तपाईं $1 लाई राम्रोसँग जाँच गर्नुहोला।",
        "filename-bad-prefix": "तपाईं जुन फाइल अपलोड गर्दै हुनुहुन्छ त्यसको नाम <strong>\"$1\"</strong>बाट शुरू हुन्छ, जुन डिजिटल क्यामराद्वारा दिइएको नाम हो।\nकृपया यस फाइलको लागि कुनै दोश्रो अधिक जानकारीयुक्त नाम छान्नुहोस्।",
        "filedelete-success-old": "<strong>[[Media:$1|$1]]</strong> को संस्करणलाघ $3, $2 हुने गरि मेटाइएको छ ।",
        "filedelete-nofile": "'''$1''' अस्तित्वमा छैन ।",
        "filedelete-nofile-old": "<strong>$1</strong> को तपाईंद्वारा दिइएको विशेषताहरू सहितको सङ्ग्रहित अवतरण छैन।",
-       "filedelete-otherreason": "à¤\85नà¥\8dय/थप à¤\95ारणहरà¥\81:",
+       "filedelete-otherreason": "à¤\85नà¥\8dय/थप à¤\95ारणहरà¥\82:",
        "filedelete-reason-otherlist": "अरु कारण",
-       "filedelete-reason-dropdown": "*मà¥\87à¤\9fà¥\8dनà¥\81à¤\95ा à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\95ारणहरà¥\81\n** कपी राइट उल्लघन\n** सारिएको फाइल",
+       "filedelete-reason-dropdown": "*मà¥\87à¤\9fà¥\8dनà¥\81à¤\95ा à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\95ारणहरà¥\82\n** कपी राइट उल्लघन\n** सारिएको फाइल",
        "filedelete-edit-reasonlist": "मेट्नका कारण संपादन गर्नुहोस्।",
        "filedelete-maintenance": "रखरखाव चलिरहेको हुँदा अस्थायी रुपमा फाइलहरू मेटाउने र मेटाइएकोलाई पुनर्बहाली गर्न निष्क्रिय गरिएकोछ।",
        "filedelete-maintenance-title": "फाइल मेट्न सकिएन",
        "listduplicatedfiles": "दोरोएको फाइलहरूको सूची",
        "listduplicatedfiles-summary": "यो एउटा यस्तो फाइलहरूको सूची हो जसको नवीनतम संस्करण दोश्रो फाइलहरूको नवीनतम संस्करणको प्रतिलिपि हो । मात्रै स्थानीय फाइलहरूलाई विचार गरिएको छ।",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] को [[$3|{{PLURAL:$2|दोहोरो फाइल|$2 दोहोरो फाइलहरू}}]] छ ।",
-       "unusedtemplates": "पà¥\8dरयà¥\8bà¤\97 à¤¨à¤\97रिà¤\8fà¤\95à¥\8b à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f",
+       "unusedtemplates": "पà¥\8dरयà¥\8bà¤\97 à¤¨à¤\97रिà¤\8fà¤\95à¥\8b à¤¢à¤¾à¤\81à¤\9aाहरà¥\82",
        "unusedtemplatestext": "यस पृष्ठमा {{ns:template}} नामस्थान भएको ती सबै पृष्ठ समावेश छन् जुन कुनै अन्य पृष्ठमा सामेल छैनन्। यसलाई हटाउनभन्दा पहिले यी ढाँचाहरूको र लिङ्कहरूलाई जाँच गर्नुहोला।",
        "unusedtemplateswlh": "अन्य कड़ीहरु",
        "randompage": "कुनै एक लेख",
        "uncategorizedpages": "श्रेणीकरण नभएका पृष्ठहरू",
        "uncategorizedcategories": "श्रेणीकरण नभएका श्रेणीहरू",
        "uncategorizedimages": "श्रेणीकरण नभएका फाइलहरू",
-       "uncategorizedtemplates": "शà¥\8dरà¥\87णà¥\80à¤\95रण à¤¨à¤­à¤\8fà¤\95ा à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9fहरà¥\81",
+       "uncategorizedtemplates": "शà¥\8dरà¥\87णà¥\80à¤\95रण à¤¨à¤­à¤\8fà¤\95ा à¤¢à¤¾à¤\81à¤\9aाहरà¥\82",
        "unusedcategories": "प्रयोग नभएका श्रेणीहरू",
        "unusedimages": "प्रयोग नभएका फाइलहरू",
        "wantedcategories": "माग भएका श्रेणीहरू",
        "wantedfiletext-cat-noforeign": "निम्नलिखित फाइल प्रयोगमा छ तर यहाँ छैन। यस अतिरिक्त, पृष्ठ जुन यस गैर-अवस्थित फाइलहरूलाई सङ्ग्रह गरेका छन् त्यसको सूची [[:$1]]मा छ।",
        "wantedfiletext-nocat": "निम्न फाइलहरू प्रयोगमा छन् तर यहाँ छैन । वाह्य भण्डारहरूको फाइलहरू उपस्थित भए पनि सूचीमा हुन सक्छ। यस्तो कुनै पनि गलत प्रविष्टिहरू <del>काटिएको हुनेछ</del>।",
        "wantedfiletext-nocat-noforeign": "तलका फाइलहरू प्रयोगमा भए पनि उपलब्ध छैन् ।",
-       "wantedtemplates": "माà¤\97 à¤­à¤\8fà¤\95ा à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9fहरà¥\81",
+       "wantedtemplates": "माà¤\97 à¤­à¤\8fà¤\95ा à¤¢à¤¾à¤\81à¤\9aाहरà¥\82",
        "mostlinked": "सबैभन्दा बढि लिंक भएको पृष्ठ",
        "mostlinkedcategories": "सबैभन्दा बढी लिंक भएका श्रेणीहरू",
        "mostlinkedtemplates": "सबैभन्दा बढि ट्रान्सक्ल्युडेड पृष्ठहरू",
        "protectedpages-submit": "पानाहरू देखाउनुहोस्",
        "protectedpages-unknown-timestamp": "अज्ञात",
        "protectedpages-unknown-performer": "अज्ञात प्रयोगकर्ता",
-       "protectedtitles": "सà¥\81रà¤\95à¥\8dषा à¤\97रिà¤\8fà¤\95ा à¤¶à¤¿à¤°à¥\8dषà¤\95हरà¥\81",
+       "protectedtitles": "सà¥\81रà¤\95à¥\8dषित à¤\97रिà¤\8fà¤\95ा à¤¶à¤¿à¤°à¥\8dषà¤\95हरà¥\82",
        "protectedtitles-summary": "यो पृष्ठ ती सबै पृष्ठहरूको सूची दिन्छ जुन अब सुरक्षित छन्। ती सबै पृष्ठहरूको सूची जान्नका लागि जुन बनाउनबाट सुरक्षित गरिएका छन्, हेर्नुहोस [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]",
        "protectedtitlesempty": "दिइएको प्यारामिटर प्रयोग गरि सुरक्षा गरिएका शीर्षकहरु छैनन् ।",
        "protectedtitles-submit": "शीर्षकहरू देखाउनुहोस्",
        "activeusers-noresult": "प्रयोगकर्ताहरू भेटिएनन्।",
        "activeusers-submit": "सक्रिय प्रयोगकर्ताहरू देखाउनुहोस्",
        "listgrouprights": "प्रयोगकर्ता समूह अधिकार",
-       "listgrouprights-summary": "निमà¥\8dन à¤¸à¥\82à¤\9aà¥\80 à¤¯à¤¸ à¤µà¤¿à¤\95िमा à¤ªà¤°à¤¿à¤­à¤¾à¤·à¤¿à¤¤ à¤¸à¤®à¥\82हहरà¥\81 à¤° à¤¤à¤¿à¤¨à¥\80हरà¥\81लà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\87 à¤¸à¤\82बदà¥\8dध  à¤\85धिà¤\95ारहरà¥\81à¤\95à¥\8b à¤¹à¥\8b।\nयसमा à¤¨à¤¿à¤\9cà¥\80 à¤\85धिà¤\95ारहरà¥\81को बारेमा [[{{MediaWiki:Listgrouprights-helppage}}|अतिरिक्त सूचना]] हुनसक्छ।",
+       "listgrouprights-summary": "निमà¥\8dन à¤¸à¥\82à¤\9aà¥\80 à¤¯à¤¸ à¤µà¤¿à¤\95िमा à¤ªà¤°à¤¿à¤­à¤¾à¤·à¤¿à¤¤ à¤¸à¤®à¥\82हहरà¥\82 à¤° à¤¤à¤¿à¤¨à¥\80हरà¥\82लà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\87 à¤¸à¤\82बदà¥\8dध  à¤\85धिà¤\95ारहरà¥\82à¤\95à¥\8b à¤¹à¥\8b à¥¤\nयसमा à¤¨à¤¿à¤\9cà¥\80 à¤\85धिà¤\95ारहरà¥\82को बारेमा [[{{MediaWiki:Listgrouprights-helppage}}|अतिरिक्त सूचना]] हुनसक्छ।",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">प्रदान गरिएका अधिकारहरू</span>\n* <span class=\"listgrouprights-revoked\">फिर्ता गरिएका अधिकारहरू</span>",
        "listgrouprights-group": "समूह",
-       "listgrouprights-rights": "à¤\85धिà¤\95ारहरà¥\81",
-       "listgrouprights-helppage": "Help:सामà¥\82हिà¤\95 à¤\85धिà¤\95ारहरà¥\81",
+       "listgrouprights-rights": "à¤\85धिà¤\95ारहरà¥\82",
+       "listgrouprights-helppage": "Help:सामà¥\82हिà¤\95 à¤\85धिà¤\95ारहरà¥\82",
        "listgrouprights-members": "(सदस्यहरूको सूची)",
        "listgrouprights-addgroup": "{{PLURAL:$2|समूह|समूहहरु}}: $1 थप्ने",
        "listgrouprights-removegroup": "{{PLURAL:$2|समूह|समूहहरु}}: $1 हटाउने",
        "usermaildisabledtext": "यस विकिमा तपाईं अरु प्रयोगकर्तालाई ई-मेल पठाउन सक्नुहुन्न",
        "noemailtitle": "ईमेल ठेगाना नभएको",
        "noemailtext": "प्रयोगकर्ताले सही ई-मेल ठेगाना दर्शाएको छैन।",
-       "nowikiemailtext": "यà¥\80 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतालà¥\87 à¤\85रà¥\81 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\81बाट ई-मेल स्वीकार नगर्ने छनोट गरेकाछन्।",
+       "nowikiemailtext": "यà¥\80 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतालà¥\87 à¤\85रà¥\81 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82बाट ई-मेल स्वीकार नगर्ने छनोट गरेकाछन्।",
        "emailnotarget": "प्राप्तकर्ताको रुपमा नभएको अथवा अमान्य प्रयोगकर्ता।",
        "emailtarget": "प्राप्तकर्ताको प्रयोगकर्ता नाम हाल्नुहोस्",
        "emailusername": "प्रयोगकर्ता-नाम:",
        "emailmessage": "सन्देश:",
        "emailsend": "पठाउनुहोस्",
        "emailccme": "मेरो सन्देशको एउटा प्रति मलाई ई-मेल गरिदिनुहोस्।",
-       "emailccsubject": "तपाà¤\88à¤\81को सन्देशको प्रतिलिपि  $1: $2लाई",
+       "emailccsubject": "तपाà¤\88à¤\82को सन्देशको प्रतिलिपि  $1: $2लाई",
        "emailsent": "इमेल पठाईयो",
        "emailsenttext": "तपाईंको ई-मेल सन्देश पठाइयो।",
        "emailuserfooter": "यो ईमेल $1 ले $2 लाई \"ई-मेल प्रयोगकर्ता\" कार्यानुरुप {{SITENAME}}मा पठाएको थियो।",
        "deletecomment": "कारण :",
        "deleteotherreason": "अरू/थप कारणहरू :",
        "deletereasonotherlist": "अरु कारण",
-       "deletereason-dropdown": "*मà¥\87à¤\9fà¥\8dनà¤\95ा à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\95ारणहरà¥\81\n** à¤¸à¥\8dपà¥\8dयाम\n** à¤¹à¥\81लà¥\8dयाहापन(Vandalism) \n** à¤ªà¥\8dरतिलिपà¥\80 à¤\85धिà¤\95ार à¤\89लà¥\8dलà¤\82घन\n** लेखकको अनुरोध\n** टुटेको अनुप्रेषण",
+       "deletereason-dropdown": "*मà¥\87à¤\9fà¥\8dनà¤\95ा à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\95ारणहरà¥\82\n** à¤¸à¥\8dपà¥\8dयाम\n** à¤¹à¥\81लà¥\8dयाहापन(Vandalism) \n** à¤ªà¥\8dरतिलिपà¥\80 à¤\85धिà¤\95ार à¤\89लà¥\8dलà¤\99à¥\8dघन\n** लेखकको अनुरोध\n** टुटेको अनुप्रेषण",
        "delete-edit-reasonlist": "मेट्नुको कारण सम्पादन गर्नुहोस्",
        "delete-toobig": "यो पृष्ठको सम्पादन इतिहास धेरै र  $1 {{PLURAL:$1|पुनरावलोक|पुनरावलोकहरू}}भन्दा बढी रहेको छ।\n {{SITENAME}}मा दुर्घटनाको कारणले गडबडी आउनसक्ने कुरालाई रोक्न यस्ता पृष्ठहरूलाई मेट्नबाट निषेध गरिएको छ ।",
        "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.",
        "protectexpiry": "सकिने:",
        "protect_expiry_invalid": "सकिने समयावधि अमान्य ।",
        "protect_expiry_old": "समाप्ती समय बितिसक्यो ।",
-       "protect-unchain-permissions": "à¤\86à¤\97ामà¥\80 à¤¸à¥\81रà¤\95à¥\8dषा à¤µà¤¿à¤\95लà¥\8dपहरà¥\81 खोल्ने",
-       "protect-text": "तपाà¤\88à¤\81  यहाँ '''$1''' पृष्ठको सुरक्षा स्तर हेर्न र परिवर्तन गर्न सक्नुहुन्छ ।",
+       "protect-unchain-permissions": "à¤\86à¤\97ामà¥\80 à¤¸à¥\81रà¤\95à¥\8dषा à¤µà¤¿à¤\95लà¥\8dपहरà¥\82 खोल्ने",
+       "protect-text": "तपाà¤\88à¤\82  यहाँ '''$1''' पृष्ठको सुरक्षा स्तर हेर्न र परिवर्तन गर्न सक्नुहुन्छ ।",
        "protect-locked-blocked": "तपाईं प्रतिबन्धित भएको अवस्थामा सुरक्षा स्तरमा परिवर्तन गर्न सक्नुहुन्न।\nपृष्ठ <strong>$1</strong> को वर्तमान स्थिति यो छ:",
        "protect-locked-dblock": "डेटाबेसमा सक्रिय बन्देज भएको कारणले सुरक्षा स्तरमा कुनै परिवर्तन गर्न सकिंदैन।\nपृष्ठ <strong>$1</strong> को वर्तमान स्थिति यो छ:",
        "protect-locked-access": "तपाईँको खातालाई पृष्ठको सुरक्षा स्तरहरू परिवर्तन गर्ने अनुमति छैन ।\n'''$1''पृष्ठको हालको स्थिति  निम्न छ :",
        "protect-expiring-local": "समाप्ति समय $1",
        "protect-expiry-indefinite": "अनिश्चित काल",
        "protect-cascade": "यो पृष्ठमा संलग्न सुरक्षित पृष्ठहरू(लामबद्द सुरक्षा)",
-       "protect-cantedit": "तपाà¤\88à¤\81 à¤¯à¤¸ à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤¸à¥\81रà¤\95à¥\8dषा à¤¸à¥\8dतर à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dन , à¤\95िन à¤\95ि à¤¤à¤ªà¤¾à¤\88à¤\81लाà¤\88 à¤¯à¤¸à¤\95à¥\8b à¤¸à¤®à¥\8dपादनà¤\95à¥\8b अनुमति छैन ।",
+       "protect-cantedit": "तपाà¤\88à¤\82 à¤¯à¤¸ à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤¸à¥\81रà¤\95à¥\8dषा à¤¸à¥\8dतर à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dन , à¤\95िन à¤\95ि à¤¤à¤ªà¤¾à¤\88à¤\82लाà¤\88 à¤¯à¥\8b à¤\95ाम à¤\97रà¥\8dन अनुमति छैन ।",
        "protect-othertime": "अरु समय :",
        "protect-othertime-op": "अरु समय",
        "protect-existing-expiry": "वर्तमान समय सीमा :$3, $2",
        "protect-existing-expiry-infinity": "वर्तमान समाप्त समयः अनन्त",
-       "protect-otherreason": "à¤\85रà¥\81/थप à¤\95ारणहरà¥\81 :",
+       "protect-otherreason": "à¤\85रà¥\81/थप à¤\95ारणहरà¥\82 :",
        "protect-otherreason-op": "अरु कारण",
-       "protect-dropdown": "*सामानà¥\8dय à¤¸à¥\81रà¤\95à¥\8dषाà¤\95ा à¤\95ारणहरà¥\81\n** अत्यधिक बर्बरता\n** अत्यधिक अचाहिंदा सन्देश\n** जवाबी सम्पादन-झगडा\n** अधिकतम खोलिने पृष्ठ",
-       "protect-edit-reasonlist": "सà¥\81रà¤\95à¥\8dषाà¤\95à¥\8b à¤\95ारणहरà¥\81 सम्पादन गर्नुहोस्",
+       "protect-dropdown": "*सामानà¥\8dय à¤¸à¥\81रà¤\95à¥\8dषाà¤\95ा à¤\95ारणहरà¥\82\n** अत्यधिक बर्बरता\n** अत्यधिक अचाहिंदा सन्देश\n** जवाबी सम्पादन-झगडा\n** अधिकतम खोलिने पृष्ठ",
+       "protect-edit-reasonlist": "सà¥\81रà¤\95à¥\8dषाà¤\95à¥\8b à¤\95ारणहरà¥\82 सम्पादन गर्नुहोस्",
        "protect-expiry-options": " १ घण्टा:1 hour, १ दिन :1 day, १ हप्ता:1 week, २ हप्ता:2 weeks, १ महिना:1 month, ३ महिना:3 months,६ महिना:6 months, १ वर्ष:1 year, अनिश्चितकाल:infinite",
        "restriction-type": "अनुमति:",
        "restriction-level": "प्रतिबन्ध स्तरः",
        "moveuserpage-warning": "'''चेतावनी:''' तपाईंले प्रयोगकर्ता पृष्ठ सार्न आँट्नु भएकोछ। कृपया याद राख्नुहोस् पृष्ठ मात्र सारिने छ र प्रयोगकर्ताको अर्को नाम राख्न '''सकिंदैन'''।",
        "movecategorypage-warning": "<strong>चेतावनी:</strong> तपाईं एउटा श्रेणी पृष्ठलाई स्थानान्तरित गर्न जादै हुनुहुन्छ। याद राख्नुहोस् कि मात्रै यो पृष्ठ स्थानान्तरित हुनेछ र पुरानो श्रेणीमा सामेल पृष्ठ नयाँ श्रेणी अन्तर्गत <em>जाने</em> छैन।",
        "movenologintext": "पृष्ठ सार्नको लागि तपाईं दर्ता गरिएको र [[Special:UserLogin|प्रवेश गरेको]] प्रयोगकर्ता हुनुपर्छ ।",
-       "movenotallowed": "तपाà¤\88à¤\81लाई पृष्ठ सार्ने अनुमति छैन",
-       "movenotallowedfile": "फाà¤\87ल à¤¹à¤\9fाà¤\89नà¥\87 à¤\85नà¥\81मति à¤¤à¤ªà¤¾à¤\88à¤\81लाई  छैन।",
+       "movenotallowed": "तपाà¤\88à¤\82लाई पृष्ठ सार्ने अनुमति छैन",
+       "movenotallowedfile": "फाà¤\87ल à¤¹à¤\9fाà¤\89नà¥\87 à¤\85नà¥\81मति à¤¤à¤ªà¤¾à¤\88à¤\82लाई  छैन।",
        "cant-move-user-page": "तपाईसँग प्रयोगकर्ता पृष्ठहरू सार्न अनुमती छैन (सहपृष्ठहरू बाहेक)",
        "cant-move-to-user-page": "तपाईंलाई पृष्ठहरू प्रयोगकर्ता पृष्ठमा सार्न अनुमती छैन (प्रयोगकर्ता सहपृष्ठहरूमा बाहेक)",
        "cant-move-category-page": "तपाईंलाई श्रेणीको पृष्ठहरू सार्ने अनुमति छैन ।",
        "import-interwiki-sourcewiki": "श्रोत विकिः",
        "import-interwiki-sourcepage": "श्रोत पृष्ठः",
        "import-interwiki-history": "यो पृष्ठकोलागि सबै इतिहास संशोधनहरू प्रतिलिपि गर्ने",
-       "import-interwiki-templates": "सबà¥\88 à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9fहरà¥\81(नमà¥\81ना) समेट्ने",
+       "import-interwiki-templates": "सबà¥\88 à¤¢à¤¾à¤\81à¤\9aा समेट्ने",
        "import-interwiki-submit": "आयात",
        "import-mapping-default": "पूर्वनिर्धारित स्थानहरूमा आयात",
        "import-mapping-namespace": "नेमस्पेसमा आयातः",
        "javascripttest-pagetext-unknownaction": "अज्ञात कारवाही \"$1\" ।",
        "javascripttest-qunit-intro": "mediawiki.org मा [$1 जाँचको कागजात] हेर्नुहोस् ।",
        "tooltip-pt-userpage": "{{GENDER:| तपाईंको प्रयोगकर्ता}} पृष्ठ",
-       "tooltip-pt-anonuserpage": "तपाà¤\88à¤\81 जुन IP ठेगानाको रुपमा सम्पादन गर्दै हुनुहुन्छ , त्यसको प्रयोगकर्ता पृष्ठ निम्न छ :",
+       "tooltip-pt-anonuserpage": "तपाà¤\88à¤\82 जुन IP ठेगानाको रुपमा सम्पादन गर्दै हुनुहुन्छ , त्यसको प्रयोगकर्ता पृष्ठ निम्न छ :",
        "tooltip-pt-mytalk": "{{GENDER:|तपाईंको}} वार्ता पृष्ठ",
        "tooltip-pt-anontalk": "यो IP ठेगानाबाट गरिएका सम्पादनका बारेमा बार्तालाप",
        "tooltip-pt-preferences": "{{GENDER:|तपाईंका}} अभिरुचिहरू",
        "exif-dc-date": "मिति(हरू)",
        "exif-dc-publisher": "प्रकाशक",
        "exif-dc-relation": "सम्वन्धित मेडिया",
-       "exif-dc-rights": "à¤\85धिà¤\95ारहरà¥\81",
+       "exif-dc-rights": "à¤\85धिà¤\95ारहरà¥\82",
        "exif-dc-source": "स्रोत मेडिया",
        "exif-dc-type": "मेडियाको प्रकार",
        "exif-rating-rejected": "अस्विकृत",
        "confirmemail_invalidated": "ई मेल ठेगाना रद्द भएको पुष्टिकरण",
        "invalidateemail": "इमेल यकिन कार्य रद्द गर्नुहोस्",
        "scarytranscludedisabled": "[अन्तरविकि दस्तावेज अन्तरकरण निस्क्रिय]",
-       "scarytranscludefailed": "[ $1à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f ल्याउन असफल]",
+       "scarytranscludefailed": "[ $1à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¢à¤¾à¤\81à¤\9aा ल्याउन असफल]",
        "scarytranscludefailed-httpstatus": "[$1 को लागि ढाँचा पाउन सकिएन, त्रुटि: HTTP $2]",
        "scarytranscludetoolong": "[URL अति लामो छ ]",
        "deletedwhileediting": "'''चेतावनी''': तपाईंले सम्पादन सुरु गरेपछि यो पृष्ठ मेटिएकोछ!",
        "specialpages": "विशेष पृष्ठ",
        "specialpages-note-top": "आदर्श वाक्य",
        "specialpages-note": "* साधारण विशेष पृष्ठहरू।\n* <span class=\"mw-specialpagerestricted\">निषेधित विशेष पृष्ठहरू।</span>",
-       "specialpages-group-maintenance": "मरà¥\8dमत à¤ªà¥\8dरतिवà¥\87दनहरà¥\81",
+       "specialpages-group-maintenance": "मरà¥\8dमत à¤ªà¥\8dरतिवà¥\87दनहरà¥\82",
        "specialpages-group-other": "अरू विशेष पृष्ठहरू",
        "specialpages-group-login": "प्रवेश गर्ने / नयाँ खाता बनाउने",
        "specialpages-group-changes": "भर्खरैका परिवर्तन र लगहरू",
        "specialpages-group-media": "मिडिया प्रतिवेदन र उर्ध्वभरणहरू",
-       "specialpages-group-users": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤° à¤\85धिà¤\95ारहरà¥\81",
+       "specialpages-group-users": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤° à¤\85धिà¤\95ारहरà¥\82",
        "specialpages-group-highuse": "उच्च प्रयोग भएका पृष्ठहरू",
        "specialpages-group-pages": "पृष्ठहरूको सूची:",
        "specialpages-group-pagetools": "पृष्ठ उपकरणहरू",
-       "specialpages-group-wiki": "डà¥\87à¤\9fा à¤° à¤\94à¤\9cारहरà¥\81",
+       "specialpages-group-wiki": "डà¥\87à¤\9fा à¤° à¤\94à¤\9cारहरà¥\82",
        "specialpages-group-redirects": "विशेष पृष्ठमा पठाउने",
        "specialpages-group-spam": "स्पाम उपकरणहरू",
        "specialpages-group-developer": "विकासकर्ता उपकरणहरू",
        "tags-activate": "सक्रिय गर्ने",
        "tags-deactivate": "निष्क्रिय गर्ने",
        "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरू}}",
-       "tags-manage-no-permission": "à¤\9fà¥\8dयाà¤\97 à¤®à¤¿à¤²à¤¾à¤¨ à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\81लाà¤\88 à¤\85नà¥\81मति à¤\9bà¥\88न।",
+       "tags-manage-no-permission": "à¤\9fà¥\8dयाà¤\97 à¤®à¤¿à¤²à¤¾à¤¨ à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\82लाà¤\88 à¤\85नà¥\81मति à¤\9bà¥\88न ।",
        "tags-create-heading": "नयाँ ट्याग बनाउने",
        "tags-create-explanation": "पुनः निर्धारित रूपले, नवनिर्मित ट्याग प्रयोगकर्ताहरू र बोटहरूको लागी रहनेछ।",
        "tags-create-tag-name": "ट्याग नाम:",
index 34419b4..8f06a69 100644 (file)
        "apisandbox-results-fixtoken-fail": "Het ophalen van het token van type \"$1\" is mislukt.",
        "apisandbox-alert-page": "Velden op deze pagina zijn niet geldig.",
        "apisandbox-alert-field": "De waarde van dit veld is niet geldig.",
+       "apisandbox-continue-clear": "Wissen",
        "booksources": "Boekinformatie",
        "booksources-search-legend": "Bronnen en gegevens over een boek zoeken",
        "booksources-search": "Zoeken",
        "sp-contributions-newbies-title": "Bijdragen van nieuwe gebruikers",
        "sp-contributions-blocklog": "blokkeerlogboek",
        "sp-contributions-suppresslog": "onderdrukte gebruikersbijdragen",
-       "sp-contributions-deleted": "verwijderde {{GENDER:$1|bijdragen}}",
+       "sp-contributions-deleted": "verwijderde {{GENDER:$1|gebruiker}}sbijdragen",
        "sp-contributions-uploads": "uploads",
        "sp-contributions-logs": "logboeken",
        "sp-contributions-talk": "overleg",
        "htmlform-cloner-create": "Meer toevoegen",
        "htmlform-cloner-delete": "Verwijderen",
        "htmlform-cloner-required": "Ten minste één waarde is vereist.",
+       "htmlform-date-placeholder": "JJJJ-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "JJJJ-MM-DD HH:MM:SS",
        "htmlform-title-badnamespace": "[[:$1]] bevindt zich niet in de naamruimte \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" is geen paginanaam die aangemaakt kan worden",
        "htmlform-title-not-exists": "$1 bestaat niet.",
index 417110e..b92995c 100644 (file)
        "newarticle": "(Ny)",
        "newarticletext": "Du har følgt ei lenkje til ei side som ikkje finst enno.\nFor å opprette sida, kan du skrive i boksen under (sjå [$1 hjelpesida] for meir informasjon).\nHamna du her ved ein feil, klikk på '''attende'''-knappen i nettlesaren din.",
        "anontalkpagetext": "----''Dette er ei diskusjonsside for ein anonym brukar som ikkje har oppretta konto eller ikkje har logga inn.\nVi er difor nøydde til å bruke den numeriske IP-adressa til å identifisere brukaren. Same IP-adresse kan vere knytt til fleire brukarar. Om du er ein anonym brukar og meiner at du har fått irrelevante kommentarar på ei slik side, [[Special:CreateAccount|opprett ein brukarkonto]] eller [[Special:UserLogin|logg inn]] slik at vi unngår framtidige forvekslingar med andre anonyme brukarar.''",
-       "noarticletext": "Det er nett no ikkje noko tekst på denne sida.\nDu kan [[Special:Search/{{PAGENAME}}|søkja etter sidetittelen]] i andre sider, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søkja i dei relaterte loggane]\neller [{{fullurl:{{FULLPAGENAME}}|action=edit}} endra denne sida]</span>.",
+       "noarticletext": "Det er nett no ikkje noko tekst på denne sida.\nDu kan [[Special:Search/{{PAGENAME}}|søkja etter sidetittelen]] i andre sider, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søkja i dei relaterte loggane]\neller [{{fullurl:{{FULLPAGENAME}}|action=edit}} opprette denne sida]</span>.",
        "noarticletext-nopermission": "Der er nett no ikkje noko tekst på denne sida.\nDu kan [[Special:Search/{{PAGENAME}}|søkja etter sidetittelen]] i andre sider\neller <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søkja i dei relaterte loggane]</span>, men du har ikkje løyve til å oppretta denne sida.",
        "missing-revision": "Versjonen #$1 av sida med namnet «{{FULLPAGENAME}}» finst ikkje.\n\nDette skriv seg som oftast frå at ei forelda historikklenkje vart fylgd til ei side som er sletta.\nDetaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "userpage-userdoesnotexist": "Brukarkontoen «<nowiki>$1</nowiki>» finst ikkje. Vil du verkeleg opprette/endre denne sida?",
        "searchprofile-advanced-tooltip": "Søk i visse namnerom",
        "search-result-size": "$1 ({{PLURAL:$2|eitt|$2}} ord)",
        "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategoriar}}, {{PLURAL:$3|1 fil|$3 filer}})",
-       "search-redirect": "(omdirigering $1)",
+       "search-redirect": "(omdirigering frå $1)",
        "search-section": "(bolken $1)",
        "search-category": "(kategorien $1)",
        "search-suggest": "Meinte du: «$1»",
        "feedback-subject": "Emne:",
        "feedback-submit": "Send",
        "feedback-thanks": "Takk! Attendemeldinga di er lagd inn på sida «[$2 $1]».",
-       "searchsuggest-search": "Søk",
+       "searchsuggest-search": "Søk i {{SITENAME}}",
        "searchsuggest-containing": "som inneheld …",
        "api-error-badaccess-groups": "Du har ikkje løyve til å lasta opp filer til wikien.",
        "api-error-badtoken": "Intern feil: ugild token.",
index ef0bd68..b77db9d 100644 (file)
        "searchprofile-everything-tooltip": "Eči kaikil sivuloil (dai paginois)",
        "searchprofile-advanced-tooltip": "Eči nämmien nimitiloin keskes",
        "search-result-size": "$1 ({{PLURAL:$2|1 sana|$2 sanua}})",
-       "search-redirect": "(siirretty $1)",
+       "search-redirect": "(siirretty sivus $1)",
        "search-section": "(alalugu $1)",
        "search-category": "(kategourii $1)",
        "search-suggest": "Tarkoititgo: $1",
index 619a3dc..849c619 100644 (file)
        "rcshowhidemine": "ମୋର ସମ୍ପାଦନା $1",
        "rcshowhidemine-show": "ଦେଖାଇବେ",
        "rcshowhidemine-hide": "ଲୁଚାଇବେ",
+       "rcshowhidecategorization": "$1 ପୃଷ୍ଠା ଶ୍ରେଣୀବିଭାଗ",
        "rclinks": "ଗଲା $2 ଦିନର $1 ବଦଳଗୁଡ଼ିକୁ ଦେଖାଇବେ<br />$3",
        "diff": "ଅଦଳ ବଦଳ",
        "hist": "ଇତିହାସ",
        "wlheader-showupdated": "ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ '''ମୋଟା ଅକ୍ଷର'''ରେ ଦେଖାଯାଉଅଛି ।",
        "wlnote": "$3, $4 ଅନୁସାରେ ବିଗତ {{PLURAL:$2|ଘଣ୍ଟାକରେ|<strong>$2</strong> ଘଣ୍ଟାରେ}}{{PLURAL:$1|ଶେଷ ବଦଳ|ଶେଷ <strong>$1</strong> ବଦଳ ତଳେ ଦିଆଗଲା}} ।",
        "wlshowlast": "ଗତ $1 ଘଣ୍ଟା $2 ଦିନ ଦେଖାନ୍ତୁ",
+       "wlshowhidecategorization": "ପୃଷ୍ଠା ଶ୍ରେଣୀବିଭାଗ",
        "watchlist-options": "ଦେଖଣା ବିକଳ୍ପସବୁ",
        "watching": "ଦେଖୁଛି...",
        "unwatching": "ଦେଖୁନାହିଁ...",
index f3c7034..41ddef5 100644 (file)
        "category-file-count-limited": "W tej kategorii {{PLURAL:$1|jest 1 plik|są $1 pliki|jest $1 plików}}.",
        "listingcontinuesabbrev": "cd.",
        "index-category": "Strony indeksowane",
-       "noindex-category": "Strony nieindeksowane",
+       "noindex-category": "Strony niezindeksowane",
        "broken-file-category": "Strony z odwołaniami do nieistniejących plików",
        "about": "O {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "article": "artykuł",
        "changecontentmodel-success-text": "Typ zawartości [[:$1]] został zmieniony.",
        "changecontentmodel-cannot-convert": "Zawartość [[:$1]] nie może być przekształcona do typu $2.",
        "changecontentmodel-nodirectediting": "Model zawartości $1 nie obsługuje bezpośredniego edytowania",
+       "changecontentmodel-emptymodels-title": "Nie ma dostępnych modeli treści",
        "changecontentmodel-emptymodels-text": "Zawartość [[:$1]] nie może być przekształcona do żadnego typu.",
        "log-name-contentmodel": "Rejestr zmian modelu zawartości",
        "log-description-contentmodel": "Wydarzenia związane z modelami zawartości stron",
        "newimages-showbots": "Pokaż pliki przesłane przez boty",
        "newimages-hidepatrolled": "Ukryj sprawdzone pliki",
        "noimages": "Brak plików do pokazania.",
+       "gallery-slideshow-toggle": "Przełączanie miniatur",
        "ilsubmit": "Szukaj",
        "bydate": "według daty",
        "sp-newimages-showfrom": "pokaż nowe pliki począwszy od $2, $1",
        "tag-filter-submit": "Filtr",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Znacznik|Znaczniki}}]]: $2)",
        "tag-mw-contentmodelchange": "zmiana modelu zawartości",
+       "tag-mw-contentmodelchange-description": "Edycje, które [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel zmieniają model zawartości] strony",
        "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",
        "feedback-thanks": "Dziękujemy! Twoja opinia została opublikowana na stronie \"[$2 $1]\".",
        "feedback-thanks-title": "Dziękujemy!",
        "feedback-useragent": "Aplikacja klienta:",
-       "searchsuggest-search": "Szukaj",
+       "searchsuggest-search": "Przeszukaj {{GRAMMAR:B.lp|{{SITENAME}}}}",
        "searchsuggest-containing": "zawierające...",
        "api-error-autoblocked": "Twój adres IP został automatycznie zablokowany, ponieważ był używany przez zablokowanego użytkownika.",
        "api-error-badaccess-groups": "Nie masz uprawnień aby przesyłać pliki do tej wiki.",
        "linkaccounts-submit": "Połącz konta",
        "unlinkaccounts": "Odłącz konta",
        "unlinkaccounts-success": "Konta zostały odłączone.",
+       "userjsispublic": "Uwaga: Podstrony z kodem JavaScript są widoczne publicznie i nie powinny zawierać poufnych danych.",
        "restrictionsfield-badip": "Nieprawidłowy adres IP lub zakres adresów: $1",
-       "restrictionsfield-label": "Dozwolone zakresy adresów IP:"
+       "restrictionsfield-label": "Dozwolone zakresy adresów IP:",
+       "restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 384ec28..55f2cd0 100644 (file)
        "botpasswords-update-failed": "Falha ao atualizar o nome do robô \"$1\". Será que foi eliminado?",
        "botpasswords-created-title": "Criada palavra-passe para o robô",
        "botpasswords-created-body": "A palavra-passe de robô para o robô \"$1\" do utilizador \"$2\" foi criada.",
-       "botpasswords-updated-title": "A palavra-passe de robô foi actualizada.",
+       "botpasswords-updated-title": "A palavra-passe de robô foi atualizada.",
        "botpasswords-updated-body": "O robô palavra-passe para o nome do robô \"$1\" do utilizador \"$2\" foi atualizado.",
        "botpasswords-deleted-title": "Palavra-passe de robô eliminada",
        "botpasswords-deleted-body": "O robô palavra-passe para o nome do robô \"$1\"do utilizador \"$2\" foi eliminado.",
        "explainconflict": "A página foi alterada por alguém desde que começou a editá-la.\nA caixa de texto abaixo mostra o texto existente neste momento.\nAs suas mudanças são mostradas na área ao fundo da página.\nTerá de reintegrar as suas mudanças no texto da caixa abaixo.\n'''Só''' o texto desta caixa será gravado quando clicar \"{{int:savearticle}}\".",
        "yourtext": "O seu texto",
        "storedversion": "Versão gravada",
-       "nonunicodebrowser": "'''Aviso: O seu navegador não é compatível com as especificações Unicode.\nFoi activado um sistema de edição alternativo que lhe permite editar as páginas com segurança: os caracteres não-ASCII aparecerão na caixa de edição no formato de códigos hexadecimais.'''",
+       "nonunicodebrowser": "<strong>Aviso: O seu navegador não é compatível com as especificações Unicode.</strong>\nFoi ativado um sistema de edição alternativo que lhe permite editar as páginas com segurança: os caracteres não-ASCII aparecerão na caixa de edição no formato de códigos hexadecimais.",
        "editingold": "'''Aviso: Está a editar uma revisão desatualizada desta página.'''\nSe gravar, todas as mudanças feitas a partir desta revisão serão perdidas.",
        "yourdiff": "Diferenças",
        "copyrightwarning": "Note, por favor, que todas as suas contribuições na {{SITENAME}} são consideradas publicadas nos termos da licença $2 (consulte $1 para mais detalhes).\nSe não deseja que o seu texto possa ser inexoravelmente editado e redistribuído, não o envie.\nGarante-nos também que isto é algo escrito por si, ou copiado do domínio público ou de outra fonte de teor livre.<br />\n'''Não envie conteúdos cujos direitos de autor estão protegidos, sem ter a devida permissão!'''",
        "grant-group-file-interaction": "Interagir com conteúdo multimédia",
        "grant-group-watchlist-interaction": "Interagir com a sua lista de vigiados",
        "grant-group-email": "Enviar correio electrónico",
-       "grant-group-high-volume": "Realizar actividades em grande quantidade",
+       "grant-group-high-volume": "Realizar atividades em grande quantidade",
        "grant-group-customization": "Personalização e preferências",
        "grant-group-administration": "Executar acções administrativas",
        "grant-group-private-information": "Aceder aos seus dados privados",
-       "grant-group-other": "Actividade diversa",
+       "grant-group-other": "Atividades diversas",
        "grant-blockusers": "Bloquear e desbloquear utilizadores",
        "grant-createaccount": "Criar contas",
        "grant-createeditmovepage": "Criar, editar e mover páginas",
        "nocredits": "Não há informação disponível sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
        "spamprotectiontext": "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.\nEste bloqueio foi provavelmente causado por uma ligação para um sítio externo que consta da lista negra.",
-       "spamprotectionmatch": "O seguinte texto activou o filtro de spam: $1",
+       "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",
        "pageinfo-redirectsto-info": "informação",
        "pageinfo-contentpage": "Contada como página de conteúdo",
        "pageinfo-contentpage-yes": "Sim",
-       "pageinfo-protect-cascading": "A protecção é em cascata a partir daqui",
+       "pageinfo-protect-cascading": "A proteção é em cascata a partir daqui",
        "pageinfo-protect-cascading-yes": "Sim",
        "pageinfo-protect-cascading-from": "As proteções são em cascata a partir de",
        "pageinfo-category-info": "Informações da categoria",
        "newimages-showbots": "Mostrar carregamentos feitos por robôs",
        "newimages-hidepatrolled": "Ocultar carregamentos patrulhados",
        "noimages": "Nada para ver.",
+       "gallery-slideshow-toggle": "Alternar miniaturas",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "sp-newimages-showfrom": "Mostrar novos ficheiros a partir das $2 de $1",
        "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 {{SITENAME}}",
-       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio electrónico em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e activar\nas funcionalidades de correio electrónico em {{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 electró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 em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e ativar\nas funcionalidades de correio eletrónico em {{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 em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra o 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\" em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{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_invalidated": "Confirmação de endereço de correio eletrónico cancelada",
        "scarytranscludefailed-httpstatus": "[Não foi possível obter a predefinição a partir de $1: HTTP $2]",
        "scarytranscludetoolong": "[URL longa demais]",
        "deletedwhileediting": "<strong>AVISO:</strong> Esta página foi eliminada depois de ter começado a editá-la!",
-       "confirmrecreate": "Depois de ter começado a editar esta página, {{GENDER:$2|o utilizador|a utilizadora|o(a) utilizador(a)}} [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou-a pelo seguinte motivo:\n: <em>$2</em>\nPor favor, confirme que quer realmente recriar esta página.",
+       "confirmrecreate": "Depois de ter começado a editar esta página, {{GENDER:$1|o utilizador|a utilizadora|o(a) utilizador(a)}} [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou-a pelo seguinte motivo:\n: <em>$2</em>\nPor favor, confirme que quer realmente recriar esta página.",
        "confirmrecreate-noreason": "{{GENDER:$1|O utilizador|A utilizadora|O(a) utilizador(a)}} [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou esta página depois de ter começado a editá-la. Confirme que deseja recriar a página, por favor.",
        "recreate": "Recriar",
        "confirm_purge_button": "OK",
        "version-license-not-found": "Não foi encontrada informação detalhada da licença para esta extensão.",
        "version-credits-title": "Créditos de autoria da extensão $1",
        "version-credits-not-found": "Não foi encontrada informação detalhada dos créditos para esta extensão.",
-       "version-poweredby-credits": "Este é um wiki <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
+       "version-poweredby-credits": "Esta é uma wiki <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
        "version-poweredby-others": "outros",
        "version-poweredby-translators": "os tradutores da translatewiki.net",
        "version-credits-summary": "Gostaríamos de reconhecer as seguintes pessoas pela sua contribuição para o [[Special:Version|MediaWiki]].",
        "feedback-thanks": "Obrigado! O seu comentário foi adicionado à página \"[$2 $1]\".",
        "feedback-thanks-title": "Obrigado!",
        "feedback-useragent": "Agente de utilizador:",
-       "searchsuggest-search": "Pesquisa",
+       "searchsuggest-search": "Pesquisar em {{SITENAME}}",
        "searchsuggest-containing": "contendo...",
        "api-error-autoblocked": "O seu endereço de IP foi bloqueado automaticamente, pois foi utilizado por um utilizador bloqueado.",
        "api-error-badaccess-groups": "Não tem permissão para enviar ficheiros para esta wiki.",
        "usercssispublic": "Nota: As subpáginas de CSS não devem conter dados confidenciais porque podem ser vistas por outros utilizadores.",
        "restrictionsfield-badip": "Endereço IP (ou gama de endereços IP) inválido: $1",
        "restrictionsfield-label": "Gamas de endereços IP permitidas:",
-       "restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para activar todos,\nuse<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para ativar todos,\nuse<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index a124d83..a934741 100644 (file)
        "newimages-showbots": "Used as label for a checkbox. When checked, [[Special:NewImages]] will also display uploads by users in the bots group.",
        "newimages-hidepatrolled": "Used as label for a checkbox. When checked, [[Special:NewImages]] will not display patrolled uploads.\n\nCf. {{msg-mw|tog-hidepatrolled}} and {{msg-mw|apihelp-feedrecentchanges-param-hidepatrolled}}.",
        "noimages": "This is shown on the special page [[Special:NewImages]], when there aren't any recently uploaded files.",
+       "gallery-slideshow-toggle": "Tooltip for the icon that toggles thumbnails on a slideshow  gallery.",
        "ilsubmit": "Used as label for input box in the MIMESearch form on [[Special:MIMESearch]].\n\nSee also:\n* {{msg-mw|Mimesearch|page title}}\n* {{msg-mw|Mimetype|label for input box}}\n{{Identical|Search}}",
        "bydate": "{{Identical|Date}}",
        "sp-newimages-showfrom": "This is a link on [[Special:NewImages]] which takes you to a gallery of the newest files.\n* $1 is a date (example: ''19 March 2008'')\n* $2 is a time (example: ''12:15'')",
        "feedback-thanks": "Thanks message, appears if feedback was successful. Parameters:\n* $1 - \"Feedback\"\n* $2 - Feedback page URL",
        "feedback-thanks-title": "The title of the thank you dialog at the end of the submission process.\n{{Identical|Thank you}}",
        "feedback-useragent": "A label denoting the user agent in the feedback that is posted to the feedback page.\n{{Identical|User agent}}",
-       "searchsuggest-search": "Greyed out default text in the simple search box in the Vector skin. (It disappears and lets the user enter the requested search terms when the search box receives focus.)\n\n{{Identical|Search}}",
+       "searchsuggest-search": "Greyed out default text in the simple search box in the Vector skin. (It disappears and lets the user enter the requested search terms when the search box receives focus.)\n{{Identical|Search}}",
        "searchsuggest-containing": "Label used in the special item of the search suggestions list which gives the user an option to perform a full text search for the term.",
        "api-error-autoblocked": "API error message that can be used for client side localisation of API errors.\n\nCf. {{msg-mw|Autoblockedtext}}.",
        "api-error-badaccess-groups": "API error message that can be used for client side localisation of API errors.",
        "usercssispublic": "A reminder to users that CSS subpages are not preferences but normal pages, and thus can be viewed by other users and the general public. This message is shown to a user whenever they are editing a subpage in their own user-space that ends in .css. See also {{msg-mw|userjsispublic}}",
        "restrictionsfield-badip": "An error message shown when one entered an invalid IP address or range in a restrictions field (such as Special:BotPassword). $1 is the IP address.",
        "restrictionsfield-label": "Field label shown for restriction fields (e.g. on Special:BotPassword).",
-       "restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword)."
+       "restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword).",
+       "edit-error-short": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-long}}\n{{Identical|Error}}",
+       "edit-error-long": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-short}}\n{{Identical|Error}}"
 }
index 98f7e64..5cce849 100644 (file)
        "sp-contributions-username": "Adresă IP sau nume de utilizator:",
        "sp-contributions-toponly": "Afișează numai versiunile recente",
        "sp-contributions-newonly": "Afișează numai modificările care au dus la crearea de pagini",
+       "sp-contributions-hideminor": "Ascunde modificările minore",
        "sp-contributions-submit": "Căutare",
        "whatlinkshere": "Ce trimite aici",
        "whatlinkshere-title": "Pagini care conțin legături spre „$1”",
        "autosumm-replace": "Pagină înlocuită cu „$1”",
        "autoredircomment": "Redirecționat înspre [[$1]]",
        "autosumm-new": "Pagină nouă: $1",
-       "autosumm-newblank": "A creat o pagină goală",
+       "autosumm-newblank": "Creat o pagină goală",
        "size-bytes": "{{PLURAL:$1|un octet|$1 octeți|$1 de octeți}}",
        "size-pixel": "$1 {{PLURAL:$1|pixel|pixeli|de pixeli}}",
        "lag-warn-normal": "Modificările mai noi de $1 {{PLURAL:$1|secondă|seconde}} pot să nu apară în listă.",
index 23c7739..c521225 100644 (file)
        "newimages-showbots": "Показать загрузки ботов",
        "newimages-hidepatrolled": "Скрыть отпатрулированные загрузки",
        "noimages": "Изображения отсутствуют.",
+       "gallery-slideshow-toggle": "Переключить миниатюры",
        "ilsubmit": "Найти",
        "bydate": "по дате",
        "sp-newimages-showfrom": "Показать новые файлы, начиная с $2, $1",
        "feedback-thanks": "Спасибо! Ваш отзыв размещён на странице «[$2 $1]».",
        "feedback-thanks-title": "Спасибо!",
        "feedback-useragent": "Браузер:",
-       "searchsuggest-search": "Ð\9fоиÑ\81к",
+       "searchsuggest-search": "Ð\98Ñ\81каÑ\82Ñ\8c Ð² {{grammar:prepositional|{{SITENAME}}}}",
        "searchsuggest-containing": "содержащие…",
        "api-error-autoblocked": "Ваш IP-адрес был автоматически заблокирован, потому что он был использован заблокированным участником.",
        "api-error-badaccess-groups": "Вам не разрешено загружать файлы в эту вики.",
index bf9746d..547099b 100644 (file)
@@ -67,8 +67,8 @@
        "march": "مارچ",
        "april": "اپريل",
        "may_long": "مَئي",
-       "june": "جÙ\8fÙ\88Ù\86Ù\90",
-       "july": "جÙ\8fÙ\88Ù\84اءÙ\90",
+       "june": "جÙ\88Ù\86",
+       "july": "جولاءِ",
        "august": "آگسٽ",
        "september": "سيپٽمبر",
        "october": "آڪٽوبر",
@@ -80,7 +80,7 @@
        "april-gen": "اپريل",
        "may-gen": "مَئي",
        "june-gen": "جُونِ",
-       "july-gen": "جÙ\8fÙ\88Ù\84اءÙ\90",
+       "july-gen": "جولاءِ",
        "august-gen": "آگسٽ",
        "september-gen": "سيپٽمبر",
        "october-gen": "آڪٽوبر",
@@ -90,9 +90,9 @@
        "feb": "فيبروري",
        "mar": "مارچ",
        "apr": "اپريل",
-       "may": "مَئي",
-       "jun": "جÙ\8fÙ\88Ù\86Ù\90",
-       "jul": "جÙ\8fÙ\88Ù\84اءÙ\90",
+       "may": "مئي",
+       "jun": "جÙ\88Ù\86",
+       "jul": "جولاءِ",
        "aug": "آگسٽ",
        "sep": "سيپٽمبر",
        "oct": "آڪٽوبر",
        "category-article-count-limited": "هيٺِون {{PLURAL:$1|صفحو آهي|$1 صفحا آهن}} تازي زمري ۾.",
        "category-file-count": "{{PLURAL:$2|هن زمري ۾ صرف هيٺيون فائيل آهي.|هيٺيون يا هيٺيان {{PLURAL:$1|فائيل آهي|$1 فائيل آهن}} هن زمري ۾، سمورن $2 مان.}}",
        "category-file-count-limited": "هيٺيون يا هيٺيان {{PLURAL:$1|فائيل آهي|$1 فائيل آهن}} هن تازي زمري ۾.",
-       "listingcontinuesabbrev": "جاري..",
+       "listingcontinuesabbrev": "جاري.",
        "index-category": "ڏسڻيل صفحا",
        "noindex-category": "غير-ڏسڻيل صفحا",
        "broken-file-category": "فائيل جي ٽٽل ڳنڍڻن وارا صفحا",
        "moredotdotdot": "اڃا...",
        "morenotlisted": "ھي فھرست نامڪمل بہ ٿي سگھي ٿي.",
        "mypage": "منهنجو صفحو",
-       "mytalk": "ڳالهہ ٻول",
+       "mytalk": "بحث",
        "anontalk": "ڳالھ ٻولھ",
        "navigation": "رهنمائي",
        "and": "&#32؛۽",
        "faq": "ڪپس",
        "faqpage": "Project:ڪپوس",
        "actions": "فعل",
-       "namespaces": "نانءُ پولار:",
+       "namespaces": "نانءُپولارَ",
        "variants": "بَدَلَ",
        "navigation-heading": "رهنما مينيو",
        "errorpagetitle": "چُڪَ",
        "search": "ڳولا",
        "searchbutton": "ڳوليو",
        "go": "کوليو",
-       "searcharticle": "کوليو",
+       "searcharticle": "وڃو",
        "history": "صفحي جي سوانح",
        "history_short": "سوانح",
        "printableversion": "ڇپائتو پرت",
        "permalink": "مسقتل ڳنڍڻو",
        "print": "ڇاپيو",
-       "view": "نگاهہ",
+       "view": "ڏسو",
        "view-foreign": "$1 تي ڏسو",
        "edit": "سنواريو",
        "edit-local": "مقامي تشريح کي ترميميو",
        "otherlanguages": "ٻين ٻولين ۾",
        "redirectedfrom": "($1 کان چوريل)",
        "redirectpagesub": "چوريل صفحو",
-       "redirectto": "ڏانهن چوريو",
+       "redirectto": "ڏانھن چوريو:",
        "lastmodifiedat": "هيءُ صفحو آخري دفعو $2، $1ع تي سنواريو ويو هو.",
        "viewcount": "هيءُ صفحو {{PLURAL:$1|دفعو|$1 دفعا}} ڏسجي چڪو آهي.",
        "protectedpage": "تحفظيل صفحو",
-       "jumpto": "ڏانهن ٽپ ڏيو",
+       "jumpto": "ڏانھن ٽپ ڏيو:",
        "jumptonavigation": "رهنمائي",
        "jumptosearch": "ڳولا",
        "generic-pool-error": "معذرت سان سرور هاڻي تمام گھڻو سُڪ آهي.\nتمام گھڻا يوزر هتي موجود آهن.\nمهرباني ڪري ٿورو ترسي پوءِ ڪوشش ڪريو.",
        "copyright": "ڪجھہ ٻيو ڄاڻايل نہ هجڻ جي صورت ۾ سمورو مواد $1 تحت ميسر ڪجي ٿو.",
        "copyrightpage": "{{ns:project}}:حق ۽ واسطا",
        "currentevents": "ھاڻوڪا واقعا",
-       "currentevents-url": "Project: اعداد",
+       "currentevents-url": "Project:ھاڻوڪا واقعا",
        "disclaimers": "غيرجوابداريناما",
        "disclaimerpage": "Project:عام غيرجوابدارينامو",
        "edithelp": "مدد براءِ ترميم",
        "helppage-top-gethelp": "مدد",
-       "mainpage": "مُک صفحو",
-       "mainpage-description": "مُک صفحو",
+       "mainpage": "مک صفحو",
+       "mainpage-description": "مک صفحو",
        "policy-url": "Project:پاليسي",
        "portal": "نياتي باب",
        "portal-url": "Project:نياتي باب",
        "editlink": "سنواريو",
        "viewsourcelink": "ڪوڊ ڏسو",
        "editsectionhint": "سنواريو سيڪشن: $1",
-       "toc": "فهرست",
+       "toc": "فھرست",
        "showtoc": "ڏيکاريو",
        "hidetoc": "لڪايو",
        "collapsible-collapse": "بند ڪريو",
        "site-atom-feed": "$1 اڻو روان رسد",
        "page-rss-feed": "\"$1\" RSS برق مواد",
        "page-atom-feed": "\"$1\" اڻو روان رسد",
-       "red-link-title": "$1 (صفحو وجود نہ ٿو رکي)",
+       "red-link-title": "$1 (صفحو وجود نٿو رکي)",
        "sort-descending": "لهندڙ ترتيب ڏيو",
        "sort-ascending": "چڙهندڙ ترتيب ڏيو",
        "nstab-main": "صفحو",
        "userlogin-yourname-ph": "پنهنجو يوزرنانءُ ڄاڻايو",
        "createacct-another-username-ph": "يُوزرنانءُ ڄاڻايو",
        "yourpassword": "ڳجھو لفظ:",
-       "userlogin-yourpassword": "ڳجھو لفظ",
-       "userlogin-yourpassword-ph": "پنهنجو ڳجھو لفظ ڄاڻايو",
-       "createacct-yourpassword-ph": "ڳجھو لفظ ڄاڻايو",
+       "userlogin-yourpassword": "ڳجھولفظ",
+       "userlogin-yourpassword-ph": "پنهنجو ڳجھولفظ ڄاڻايو",
+       "createacct-yourpassword-ph": "ڳجھولفظ ڄاڻايو",
        "yourpasswordagain": "يُوزرنان ٻيهر ٽائيپ ڪريو:",
        "createacct-yourpasswordagain": "ڳجھي لفظ جي خاطري ڪريو",
-       "createacct-yourpasswordagain-ph": "ٻيهر ڳجھو لفظ داخل ڪريو",
-       "userlogin-remembermypassword": "مون کي لاگ اِن رکو",
+       "createacct-yourpasswordagain-ph": "ٻيھر ڳجھولفظ داخل ڪريو",
+       "userlogin-remembermypassword": "مون کي داخل ٿيل رکو",
        "userlogin-signwithsecure": "محفوظ ڳانڍاپو استعمال ڪريو",
        "cannotloginnow-title": "ھاڻي لاگ ان نٿو ڪري سگھجي",
        "cannotloginnow-text": "$1 استعمال ڪرڻ دوران لاگ ان ڪرڻ ممڪن نہ آھي.",
        "yourdomainname": "توهان جو ميدان:",
        "password-change-forbidden": "هن وڪِي تي توهان ڳجھو لفظ بدلائي نہ ٿا سگھو.",
-       "login": "لاگ اِن",
+       "login": "داخل ٿيو",
        "nav-login-createaccount": "لاگ اِن ٿيو / کاتو کوليو",
        "userlogin": "لاگ اِن ٿيو / کاتو کوليو",
        "userloginnocreate": "لاگ اِن",
        "logout": "لاگ آئوٽ",
        "userlogout": "لاگ آئوٽ",
        "notloggedin": "لاگ اِن ٿيل ناهيو",
-       "userlogin-noaccount": "کاتو نہ ٿا رکو؟",
+       "userlogin-noaccount": "کاتو نٿا رکو؟",
        "userlogin-joinproject": "{{SITENAME}} ۾ شامل ٿيو",
        "nologin": " کاتو نہ ٿا رکو؟ '''$1'''.",
        "nologinlink": "نئون کاتو کوليو",
        "gotaccount": "ڇا اڳي ئي کاتو رکو ٿا؟ '''$1'''.",
        "gotaccountlink": "لاگ اِن",
        "userlogin-resetlink": "پنهنجي لاگ اِن جا تفصيل وساري ويٺا؟",
-       "userlogin-resetpassword-link": "ڳجھو لفظ وساري ويٺا آهيو؟",
-       "userlogin-helplink2": "لاگ اِن ٿيڻ ۾ مدد",
+       "userlogin-resetpassword-link": "ڳجھولفظ وساري ويٺا آهيو؟",
+       "userlogin-helplink2": "داخل ٿيڻ ۾ مدد",
        "userlogin-createanother": "ٻيو کاتو کوليو",
        "createacct-emailrequired": "برق ٽپال پتو",
        "createacct-emailoptional": "برق ٽپال پتو (مرضيءَ موجب)",
        "login-migrated-generic": "توهان جو کاتو لڏي چڪو آهي، ۽ هن وڪيءَ تي توهان جو يُوزنانءُ هاڻي وجود نہ ٿو رکي.",
        "loginlanguagelabel": "ٻولي: $1",
        "createacct-another-realname-tip": "اصل نالو ڄاڻائڻ اختياري آهي. جيڪڏهن توهان اصل نالو ڄاڻايو ٿا، تہ اهو توهان کي توهان جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
-       "pt-login": "لاگ ان ٿيو",
-       "pt-login-button": "لاگ اِن",
+       "pt-login": "داخل ٿيو",
+       "pt-login-button": "داخل ٿيو",
        "pt-createaccount": "کاتو کوليو",
-       "pt-userlogout": "Ù\84اگ Ø¢Ø¦Ù\88Ù½",
+       "pt-userlogout": "ٻاھر Ù\86ڪرÙ\88",
        "php-mail-error-unknown": "پي ايڇ پي جي  ڪاڄ اندر اڻڄاتل چُڪَ.",
        "user-mail-no-addy": "برق ٽپال پتو ڄاڻائڻ کان سواءِ برق ٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
        "changepassword": "ڳجھو لفظ تبديل ڪريو",
        "watchthis": "هيءُ صفحو سانڍيو",
        "savearticle": "صفحو سانڍيو",
        "preview": "پيش نگاهہ",
-       "showpreview": "پيش نگاهہ",
+       "showpreview": "پيش نگاھ",
        "showdiff": "تبديليون ڏيکاريو",
-       "anoneditwarning": "<strong>خبردار:</strong> توهان لاگ اِن ٿيل نہ آهيو. جيڪڏهن توهان ڪي ترميمون ڪيون تہ هن صفحي جي سوانح ۾ توهان جو آءِ پي پتو درج ڪيو ويندو. جي توهان <strong>[$1 لاگ اِن]</strong> ٿيو ٿا <strong>[$2 کاتو کوليو] </strong> ٿا، تہ توهان جو ترميمون توهان جي يوزرنانءُ سن منسوب ڪيون وينديون، جنهن جا ٻيا بہ فائدا ٿي سگھن ٿا.",
+       "anoneditwarning": "<strong>خبردار:</strong> توهان لاگ اِن ٿيل نہ آهيو. جيڪڏهن توهان ڪي ترميمون ڪيون تہ هن صفحي جي سوانح ۾ توهان جو آءِ پي پتو درج ڪيو ويندو. جي توهان <strong>[$1 داخل]</strong> ٿيو ٿا < يا strong>[$2 کاتو کوليو] </strong> ٿا، تہ توهان جو ترميمون توهان جي يوزرنانءُ سن منسوب ڪيون وينديون، جنهن جا ٻيا بہ فائدا ٿي سگھن ٿا.",
        "anonpreviewwarning": "توهان لاگ اِن ٿيل نہ آهيو. جيڪڏهن توهان صفحي ۾ تبديليون سانڍيون تہ اهڙين تبديلين ساڻ توهان جو آءِ پي پتو درج ڪيو ويندو.",
        "missingcommenttext": "براءِ مهرباني هيٺ پنهنجا تاثرات درج ڪندا.",
        "summary-preview": "تت تي پيش نگاهہ:",
        "confirmedittext": "صفحا سنوارڻ کان اڳ توهان کي پنهنجي ايميل پتي جي تصديق ڪرڻي پوندي. مهرباني ڪري [[Special:Preferences|use preferences]] ذريعي پنهنجو ايميل پتو ڄاڻايو ۽ تصديقيو.",
        "nosuchsectiontitle": "سيڪشن نٿو لهي سگهي",
        "loginreqtitle": "لاگ اِن گھربل آهي",
-       "loginreqlink": "لاگ اِن",
+       "loginreqlink": "داخل ٿيو",
        "loginreqpagetext": "ٻيا صفحا ڏسڻ لاءِ مهرباني ڪري $1",
        "accmailtitle": "ڳجھو لفظ اماڻجي چڪو.",
        "newarticle": "(نئون)",
-       "newarticletext": "توهان اهڙي صفحي جو ڳنڍڻو وٺي هتي پهتا آهيو، جيڪو اڃا وجود نہ ٿو رکي. اهڙو صفحو جوڙڻ لاءِ هيٺين باڪس ۾ ٽائيپ ڪرڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا). جي توهان هتي غلطيءَ ۾ اچي ويا آهيو تہ رڳو پنهنجي جهانگُوءَ جو '''back''' بٽڻ ڪلڪ ڪندا.",
+       "newarticletext": "توهان اهڙي صفحي جو ڳنڍڻو وٺي هتي پهتا آهيو، جيڪو اڃا وجود نٿو رکي.\nاهڙو صفحو جوڙڻ لاءِ، هيٺين باڪس ۾ ٽائيپ ڪرڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا).\nجي توهان هتي غلطيءَ ۾ اچي ويا آهيو، تہ رڳو پنهنجي جهانگُوءَ جو <strong>back</strong> تي ٽڙڪ ڪريو.",
        "noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي.\nتوهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا،  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
        "userpage-userdoesnotexist-view": "يُوزر کاتو $1 درج ٿيل نہ آهي.",
        "blocked-notice-logextract": "هيءَ يُوزر في‌الحال بندشيل آهي. تازو بندش لاگ حوالي طور پيش ڪجي ٿو:",
        "note": "<strong>نوٽ:</strong>",
        "previewnote": "<strong>'''هيءَ محظ پيش نگاهہ آهي.</strong> ترميمون اڃا سانڍجوين ناهن!'''",
        "continue-editing": "ترميم گاھ ڏانهن وڃو",
-       "editing": "زير ترميم $1",
+       "editing": "$1 سنواريندي",
        "creating": "$1 سرجيندي",
        "editingsection": "زير ترميم $1 (سيڪشن)",
        "editingcomment": "ترميم هيٺ $1 (نئون سيڪشن)",
        "searchprofile-everything-tooltip": "سموري مواد ۾ ڳوليو",
        "searchprofile-advanced-tooltip": "مرضيءَ جي نانءُپولارن ۾ ڳوليو",
        "search-result-size": "$1 ({{PLURAL:$2|لفظُ|$2 لفظَ}})",
-       "search-redirect": "($1 کي چوريو)",
+       "search-redirect": "($1 کان چوريو)",
        "search-section": "(سيڪشن $1)",
        "search-category": "(ذمرو $1)",
        "search-suggest": "ڇا توهان جو مطلب $1 آهي؟",
        "recentchanges-legend": "تازين تبديلين جو آپشن",
        "recentchanges-summary": "هن صفحي تي وڪيءَ ۾ ڪيل تازيون ترين ترميمون ڏيکاريو.",
        "recentchanges-feed-description": "ۡهن روان رسد ۾ آيل تازيون تبديليون لهو",
-       "recentchanges-label-newpage": "هن ترميم سان نئون صفحو جڙيو.",
-       "recentchanges-label-minor": "هيءُ هڪ معمولي ترميم آهي.",
+       "recentchanges-label-newpage": "هن ترميم سان نئون صفحو جڙيو",
+       "recentchanges-label-minor": "هيء هڪ معمولي ترميم آهي",
        "recentchanges-label-bot": "هيءُ ترميم بوٽ عمل ۾ آندي.",
+       "recentchanges-label-unpatrolled": "ھن ترميم جو اڃان گشت نہ ڪيو ويو آھي",
        "recentchanges-label-plusminus": "هن صفحي جي ماپ ۾ هيترين ٻاٺڻين جو ڦير آيو آهي",
-       "recentchanges-legend-heading": "<strong>\"ڪنجي.</strong>",
+       "recentchanges-legend-heading": "<strong>ڪنجي:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (پڻ ڏسو [[Special:NewPages|نون صفحن جي فهرست]])",
        "recentchanges-submit": "ڏيکاريو",
        "rcnotefrom": "هيٺ {{PLURAL:$5|تبديلي آهي|تبديليون آهن}} کان <strong>$3, $4</strong> (تائين <strong>$1</strong> ) ڏيکاريل آهن.",
        "rclistfrom": "$3 $2 کان شروع ٿيندڙ نيون تبديليون",
        "rcshowhideminor": "$1 معمولي ترميمون",
-       "rcshowhideminor-show": "نمايو",
+       "rcshowhideminor-show": "ڏيکاريو",
        "rcshowhideminor-hide": "لڪايو",
        "rcshowhidebots": "$1 بوٽس",
-       "rcshowhidebots-show": "نمايو",
+       "rcshowhidebots-show": "ڏيکاريو",
        "rcshowhidebots-hide": "لڪايو",
        "rcshowhideliu": "$1 کاتيدار يوزرس",
        "rcshowhideliu-show": "ڏيکاريو",
        "rcshowhideliu-hide": "لڪايو",
        "rcshowhideanons": "$1 نامعلوم يُوزرس",
-       "rcshowhideanons-show": "نمايو",
+       "rcshowhideanons-show": "ڏيکاريو",
        "rcshowhideanons-hide": "لڪايو",
        "rcshowhidepatr": "$1 تاڻيل ترميمون",
        "rcshowhidepatr-show": "ڏيکاريو",
        "rcshowhidepatr-hide": "لڪايو",
-       "rcshowhidemine": "منهنجون ترميمون $1",
-       "rcshowhidemine-show": "نمايو",
+       "rcshowhidemine": "منھنجون ترميمون $1",
+       "rcshowhidemine-show": "ڏيکاريو",
        "rcshowhidemine-hide": "لڪايو",
        "rcshowhidecategorization": "$1 صفحاتي زمراڪاري",
        "rcshowhidecategorization-show": "ڏيکاريو",
        "withoutinterwiki-legend": "اڳياڙي",
        "withoutinterwiki-submit": "نمايو",
        "fewestrevisions": "گھٽانگھٽ ترميميل صفحا",
-       "nbytes": "$1 {{PLURAL:$1|ٻاٽڻ|ٻاٽڻيون}}",
+       "nbytes": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}}",
        "ncategories": "$1 {{PLURAL:$1|زمرو|زمرا}}",
        "ninterwikis": "$1 {{PLURAL:$1|بين‌الوڪي}}",
        "nlinks": "$1 {{PLURAL:$1|ڳنڍڻو|ڳنڍڻا}}",
        "emailsent": "برق ٽپال اماڻجي چڪي",
        "emailsenttext": "توهان جو برق ٽپال نياپو اماڻجي چڪو آهي.",
        "watchlist": "ٽيٽ فهرست",
-       "mywatchlist": "Ù½Ù\8aÙ½ Ù\81Ù\87رست",
+       "mywatchlist": "Ù\86ظرھÙ\8aÙº Ù\81Ú¾رست",
        "addwatch": "ٽيٽ فهرست ۾ شامل ڪريو",
        "addedwatchtext": "صفحو\"[[:$1]]\" ان جي بحث وارو صفحو اوهان جي [[Special:Watchlist|ٽيٽ فهرست]] ۾ شامل ڪيو ويو آهي.",
        "removewatch": "ٽيٽ فهرست مان خارج ڪريو",
        "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي [[Special:Watchlist|ٽيٽ فهرست]] مان هٽي چڪو آهي.",
        "removedwatchtext-short": "\"صفحو بعنوان \"$1\" توهان جي ٽيٽ فهرست مان هٽي چڪو آهي.\"",
-       "watch": "Ù½Ù\8aÙ½Ù\8aو",
+       "watch": "Ù\86ظرھÙ\8aÙº Ø±Ú©و",
        "watchthispage": "هيءُ صفحو ٽيٽيو",
        "unwatch": "اڻ ٽيٽيو",
        "unwatchthispage": "ٽيٽڻ ڇڏيو",
        "contribsub2": "{{GENDER:$3|$1}} ($2) لاءِ",
        "contributions-userdoesnotexist": "يُوزر کاتو \"$1\" درج ٿيل نہ آهي.",
        "uctop": "(هاڻوڪو)",
-       "month": "Ù\85Ù\87Ù\8aÙ\86Ù\88 (۽ اڳوڻيون):",
-       "year": "سال (۽ اڳوڻيون):",
+       "month": "Ù\85Ù\87Ù\8aÙ\86Ù\8a Ú©Ø§Ù\86 (۽ اڳوڻيون):",
+       "year": "سال کان (۽ اڳوڻيون):",
        "sp-contributions-newbies": "صرف نون کاتن جون ڀاڱيداريون ڏيکاريو",
        "sp-contributions-newbies-sub": "نون کاتن لاءِ",
        "sp-contributions-newbies-title": "نون کاتن جي لاءِ يوزر جون ڀاڱيداريون",
        "tooltip-pt-userpage": "{{GENDER:|توھانجو يوزر}} صفحو",
        "tooltip-pt-mytalk": "{{GENDER:|توھانجو}} يوزر صفحو",
        "tooltip-pt-preferences": "{{GENDER:|توھانجون}} ترجيحات",
-       "tooltip-pt-watchlist": "توهان جي ٽيٽ فهرست ۾ شامل صفحا",
+       "tooltip-pt-watchlist": "توھان جي تبديلين جي نظرھيٺ صفحن جي فھرست",
        "tooltip-pt-mycontris": "{{GENDER:|توھانجي}} ڀاڱيدارين جي فھرست",
-       "tooltip-pt-login": "توهان کي همٿائجي ٿو تہ توهان لاگ اِن ٿيو، بهرحال اهو لازمي نہ آهي.",
-       "tooltip-pt-logout": "Ù\84اگ Ø¢Ø¦Ù\88Ù½",
-       "tooltip-pt-createaccount": "کاتو کولڻ ۽ لاگ اِن ٿيڻ تي توهان کي همٿايو ويندو؛  جيتوڻيڪ، اهو ضروري نہ آهي",
+       "tooltip-pt-login": "توھان کي ھمٿائجي ٿو تہ توهان داخل ٿيو؛ بھرحال، اھو لازمي ناھي",
+       "tooltip-pt-logout": "ٻاھر Ù\86ڪرÙ\88",
+       "tooltip-pt-createaccount": "کاتو کولڻ ۽ داخل ٿيڻ تي توھان کي ھمٿايو وڃي ٿو؛  جيتوڻيڪ، اهو ضروري ناھي",
        "tooltip-ca-talk": "موادي صفحي تي بحث",
        "tooltip-ca-edit": "هيءُ صفحو سنواريو",
        "tooltip-ca-addsection": "نئون سيڪشن شروع ڪريو",
        "tooltip-ca-protect": "هيءُ صفحو تحفظيو",
        "tooltip-ca-delete": "هيءُ صفحو ڊاهيو",
        "tooltip-ca-move": "هيءُ صفحو چوريو",
-       "tooltip-ca-watch": "Ù\87Ù\8aØ¡Ù\8f ØµÙ\81Ø­Ù\88 Ù¾Ù\86Ù\87Ù\86جÙ\8a Ù½Ù\8aÙ½ Ù\81Ù\87رست ۾ شامل ڪريو",
+       "tooltip-ca-watch": "Ù\87Ù\8aØ¡Ù\8f ØµÙ\81Ø­Ù\88 Ù¾Ù\86Ù\87Ù\86جÙ\8a Ù\86ظرھÙ\8aÙº Ù\81Ú¾رست ۾ شامل ڪريو",
        "tooltip-ca-unwatch": "هيءُ صفحو پنهنجي ٽيٽ فهرست تان هٽايو",
        "tooltip-search": "{{SITENAME}} ۾ ڳوليو",
        "tooltip-search-go": "تز ان ئي نالي سان ڪو صفحو موجود آهي تہ کوليو",
        "tooltip-p-logo": "مک صفحو گھمو",
        "tooltip-n-mainpage": "مک صفحو گھمو",
        "tooltip-n-mainpage-description": "مک صفحو گھمو",
-       "tooltip-n-portal": "هن رٿا بابت، توهان ڇا ٿا ڪري سگھو، ڪهڙي شَي ڪٿي ملندي",
-       "tooltip-n-currentevents": "تازن واقعن تي تفصيلي ڄاڻ لهو",
-       "tooltip-n-recentchanges": "هن وڪيءَ ۾ تازين تبديلين جي فهرست.",
-       "tooltip-n-randompage": "بلاترتيب ڪو بہ صفحو اتاريو",
-       "tooltip-n-help": "ڳولي لهڻ جي جاءِ",
-       "tooltip-t-whatlinkshere": "هتان ڳنڍيل سمورا وڪي صفحا",
+       "tooltip-n-portal": "ھن رٿا بابت، توھان ڇا ٿا ڪري سگھو، شيون ڪٿي ڳولھجن",
+       "tooltip-n-currentevents": "تازن واقعن تي تفصيلي ڄاڻ لھو",
+       "tooltip-n-recentchanges": "ھن وڪيءَ ۾ تازين تبديلين جي فھرست",
+       "tooltip-n-randompage": "ڪو بہ بلاترتيب صفحو اتاريو",
+       "tooltip-n-help": "ڳولي لھڻ جي جاءِ",
+       "tooltip-t-whatlinkshere": "ھتان ڳنڍيل سمورن وڪي صفحن جي فھرست",
        "tooltip-t-recentchangeslinked": "ويجھڙائيءَ ۾ صفحن ۾ ٿيل تبديليون هن صفحي سان ڳنڍيل آهن",
        "tooltip-feed-atom": "هن صفحي لاءِ ايٽم فيڊ",
        "tooltip-t-contributions": "{{GENDER:$1|ھن يوزر}} جي ڀاڱيدارين جي فھرست",
        "tooltip-t-permalink": "صفحي جي ان نظرثاليءَ ڏانهن مستقل ڳنڍڻو",
        "tooltip-ca-nstab-main": "مواد جي صفحي کي ڏسو",
        "tooltip-ca-nstab-user": "هن جو يُوزر صفحو ڏسو",
-       "tooltip-ca-nstab-special": "هيءُ خاص صفحو آهي، ان ۾ ترميم ڪري نہ ٿي سگھجي.",
+       "tooltip-ca-nstab-special": "هيءُ خاص صفحو آهي، ان ۾ ترميم ڪري نٿي سگھجي",
        "tooltip-ca-nstab-project": "رٿائي صفحو ڏسو",
        "tooltip-ca-nstab-image": "هن فائيل جو صفحو ڏسو",
        "tooltip-ca-nstab-template": "سانچو ڏسو",
        "tooltip-ca-nstab-category": "هن زمري جو صفحو ڏسو",
        "tooltip-minoredit": "ان کي هڪ معمولي ترميم ڄاڻايو",
        "tooltip-save": "پنهنجون ڪيل تبديليون سانڍيو",
-       "tooltip-preview": "سانڍڻ کان اڳ براءِ مهرباني پنهنجي تبديلين تي پيش نگاهه وجھندا!",
+       "tooltip-preview": "پنھنجي تبديلين تي نگاھ وجھو. براءِ مھرباني اھو سانڍڻ کان اڳ ڪندا.",
        "tooltip-diff": "پنهنجون ڪيل تبديليون ڏسو.",
        "tooltip-compareselectedversions": "هن صفحي جن ٻن چونڊيل پرتن درميان تفاوت ڏسو.",
        "tooltip-watch": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪريو",
        "file-nohires": "اڃا سنهو تحلل ميسر ناهي.",
        "svg-long-desc": "ايس وي جي فائيل، اٽڪل $1 × $2 عڪسلون، فائيل سائيز: $3",
        "show-big-image": "اصلوڪو فائيل",
-       "show-big-image-preview": "هن پيش نگاهہ جي ماپ: $1",
+       "show-big-image-preview": "هن پيش نگاھ جي ماپ: $1",
        "show-big-image-other": "ٻيا {{PLURAL:$2|تحلل}}:$1",
        "show-big-image-size": "$1*$2 پڪزلس",
        "newimages": "نون فائيلن جي گيلري",
        "watchlisttools-view": "لاڳاپيل تبديليون ڏسو",
        "watchlisttools-edit": "ٽيٽ فهرست ڏسو ۽ سنواريو",
        "watchlisttools-raw": "ڪچي ٽيٽ فهرست سنواريو",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ڳالهہ]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ڳالھ]])",
        "version": "ڀيرو",
        "version-extensions": "تنصيب شده توسيعات",
        "version-skins": "تنصيب شده چَمڙيون",
        "feedback-subject": "موضوع:",
        "feedback-submit": "جمع ڪرايو",
        "feedback-thanks-title": "توهان جي مهرباني!",
-       "searchsuggest-search": "ڳوليو",
+       "searchsuggest-search": "ڳوليو {{SITENAME}}",
        "api-error-filename-tooshort": "فائيل‌نانءَُ هيڪاندو ننڍو آهي.",
        "api-error-unclassified": "ڪا اڻجاتل چُڪَ واقع ٿي.",
        "api-error-unknown-code": "اڻڄاتل چُڪَ: \"$1\".",
index 36470f5..194e8af 100644 (file)
        "newimages-showbots": "Prikaži nalaganja botov",
        "newimages-hidepatrolled": "Skrij nadzorovana nalaganja",
        "noimages": "Nič ni videti.",
+       "gallery-slideshow-toggle": "Preklopi sličice",
        "ilsubmit": "Išči",
        "bydate": "po datumu",
        "sp-newimages-showfrom": "Prikaži datoteke, naložene od $2, $1 naprej",
        "feedback-thanks": "Havala! Vaše povratne informacije smo objavili na strani »[$2 $1]«.",
        "feedback-thanks-title": "Hvala!",
        "feedback-useragent": "Uporabniški agent:",
-       "searchsuggest-search": "Iskanje",
+       "searchsuggest-search": "Iskanje po {{GRAMMAR:dajalnik|{{SITENAME}}}}",
        "searchsuggest-containing": "vsebujoč ...",
        "api-error-autoblocked": "Vaš IP-naslov smo samodejno blokirali, saj ga je uporabljal blokiran uporabnik.",
        "api-error-badaccess-groups": "Nalaganje datotek na ta wiki vam ni dovoljeno.",
        "usercssispublic": "Pomnite: Podstrani CSS naj ne vsebujejo zaupnih podatkov, saj so vidne tudi drugim uporabnikom.",
        "restrictionsfield-badip": "Neveljaven IP-naslov ali obseg: $1",
        "restrictionsfield-label": "Dovoljeni IP-obsegi:",
-       "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "edit-error-short": "Napaka: $1",
+       "edit-error-long": "Napake:\n\n$1"
 }
index c82f7ff..2697621 100644 (file)
@@ -49,6 +49,7 @@
        "tog-watchdefault": "Shto faqet dhe skedat e redaktuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchmoves": "Shto faqet dhe skedat e zhvendosura prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchdeletion": "Shto faqet dhe skedat e grisura prej meje tek lista e faqeve  nën mbikqyrje",
+       "tog-watchuploads": "Shtoni fotografitë e rreja që ngarkoj në listën mbikëqyrëse",
        "tog-watchrollback": "Shto faqet ku unë kam kryer një rikthim tek lista ime mbikqyrëse",
        "tog-minordefault": "Shëno të gjitha redaktimet si të vogla automatikisht",
        "tog-previewontop": "Trego se si do të duket faqja mbi kutinë redaktimit",
@@ -58,7 +59,7 @@
        "tog-enotifminoredits": "Më njofto me email edhe kur ka redaktime të vogla të faqeve dhe skedave",
        "tog-enotifrevealaddr": "Trego adresën time të emailit në emailet njoftuese",
        "tog-shownumberswatching": "Trego numrin e përdoruesve që vëzhgojnë këtë faqe",
-       "tog-oldsig": "Nënshkrimi ekzistues:",
+       "tog-oldsig": "Nënshkrimi juaj ekzistues:",
        "tog-fancysig": "Mbaje nënshkrimin si wikitekst (pa lidhje automatike)",
        "tog-uselivepreview": "Trego parapamjen drejtpërdrejt",
        "tog-forceeditsummary": "Më njofto kur përmbledhjen e redaktimit e lë bosh",
@@ -66,6 +67,7 @@
        "tog-watchlisthidebots": "Fshih redaktimet e robotëve nga lista e faqeve të vëzhguara",
        "tog-watchlisthideminor": "Fshih redaktimet e vogla nga lista e faqeve të vëzhguara",
        "tog-watchlisthideliu": "Fshih redaktimet e përdoruesve nga lista e faqeve të vëzhguara",
+       "tog-watchlistreloadautomatically": "Rifreskoni listën mbikëqyrëse automatikisht sa herë një filtër ndryshohet (JavaScript e domosdoshme)",
        "tog-watchlisthideanons": "Fshih redaktimet përdoruesve anonim nga lista e faqeve të vëzhguara",
        "tog-watchlisthidepatrolled": "Fshih redaktimet e vrojtuara nga lista e faqeve të vëzhguara",
        "tog-watchlisthidecategorization": "Fshih kategorizimin e faqeve",
        "newwindow": "(hapet në një dritare të re)",
        "cancel": "Anulo",
        "moredotdotdot": "Më shumë...",
-       "morenotlisted": "Kjo listë nuk është e plotë.",
+       "morenotlisted": "Kjo listë mund të mos jetë e plotë.",
        "mypage": "Faqja",
        "mytalk": "Diskuto",
        "anontalk": "Diskutimi",
        "yourpasswordagain": "Fusni fjalëkalimin përsëri",
        "createacct-yourpasswordagain": "Konfirmoni fjalëkalimin",
        "createacct-yourpasswordagain-ph": "Shtypni fjalëkalimin përsëri",
-       "remembermypassword": "Mbaj mënd fjalëkalimin tim për tërë vizitat e ardhshme (për një kohë maksimale prej $1 {{PLURAL:$1|dite|ditësh}})",
        "userlogin-remembermypassword": "Më mbaj të kyçur",
        "userlogin-signwithsecure": "Përdor lidhje të sigurtë",
        "yourdomainname": "Faqja juaj",
        "minoredit": "Ky është një redaktim i vogël",
        "watchthis": "Vëzhgoje këtë faqe",
        "savearticle": "Kryej ndryshimet",
+       "savechanges": "Ruaj ndryshimet",
        "publishpage": "Publiko faqen",
        "publishchanges": "Publiko ndryshimet",
        "preview": "Shqyrto",
        "defaultmessagetext": "Teksti i porosisë së parazgjedhur",
        "invalid-content-data": "Të pavlefshme të dhënave e përmbajtjes",
        "editwarning-warning": "Duke e lënë këtë faqe mund të shkaktojë ju për të humbur të gjitha ndryshimet që keni bërë ju.\nNëse ju jeni regjistruar, ju mund të çaktivizoni këtë paralajmërim në \"{{int:prefs-editing}}\" seksionin e preferencave tuaja.",
+       "content-model-wikitext": "wikitekst",
        "content-model-text": "tekst i thejshtë",
        "content-model-javascript": "JavaScript",
        "content-json-empty-object": "Objekt bosh",
        "content-json-empty-array": "Fushë boshe",
+       "deprecated-self-close-category": "Faqet përdorin tag HTML mbyllës jo të sakt",
        "expensive-parserfunction-warning": "Kujdes: Kjo faqe ka shumë kërkesa që kërkojnë analizë gramatikore të kushtueshme për sistemin.\n\nDuhet të ketë më pakë se $2, {{PLURAL:$2|kërkesë|kërkesa}}, kurse tani {{PLURAL:$1|është $1 kërkesë|janë $1 kërkesa}}.",
        "expensive-parserfunction-category": "Faqe me shumë shprehje të kushtueshmë për analizë gramatikore",
        "post-expand-template-inclusion-warning": "'''Kujdes''': Numri i shablloneve që perfshihen është shumë i madh.\nDisa shabllone nuk do të përfshihen.",
        "columns": "Kollona:",
        "searchresultshead": "Kërkimi",
        "stub-threshold": "Kufiri për formatin e <a href=\"#\" class=\"stub\">lidhjeve cung</a> (B):",
+       "stub-threshold-sample-link": "shembull",
        "stub-threshold-disabled": "Çaktivizuar",
        "recentchangesdays": "Numri i ditëve të treguara në ndryshime së fundmi:",
        "recentchangesdays-max": "(maksimum $1 {{PLURAL:$1|dit|ditë}})",
        "right-managechangetags": "Krijoni dhe fshini [[Special:Tags|tags]] nga baza e të dhënave",
        "right-applychangetags": "Aplikoni [[Special:Tags|tags]] së bashku me ndryshimet",
        "right-changetags": "Shtoni dhe të largoni në mënyrë arbitrare [[Special:Tags|tags]] në rishikimet individuale dhe regjistrimet e historikut",
+       "grant-group-email": "Dërgoni email",
+       "grant-group-administration": "Kryej veprime administrative",
+       "grant-group-private-information": "Qasu të dhënave private në lidhje me ju",
+       "grant-group-other": "Veprimtari të ndryshme",
        "grant-blockusers": "Blloko dhe zhblloko përdoruesit",
+       "grant-createaccount": "Krijo llogari",
+       "grant-createeditmovepage": "Krijoni, redaktoni, dhe lëvizni faqet",
+       "grant-editmywatchlist": "Redaktoni listën tuaj mbikqyrëse",
+       "grant-editpage": "Redaktoni faqet ekzistuese",
+       "grant-editprotected": "Redakto faqet e mbrojtura",
        "newuserlogpage": "Regjistri i llogarive",
        "newuserlogpagetext": "Ky është një regjistër i llogarive të fundit që janë hapur",
        "rightslog": "Regjistri i privilegjeve të përdoruesit",
        "recentchanges-label-plusminus": "Madhësia e faqes ndryshoi me këtë numër bajtësh",
        "recentchanges-legend-heading": "<strong>Legjenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (shiko gjithashtu [[Special:NewPages|listën e faqeve të reja]])",
+       "recentchanges-submit": "Shfaq",
        "rcnotefrom": "Më poshtë {{PLURAL:$5|është shfaqur ndryshimi|janë shfaqur ndryshimet}} që nga <strong>$3, $4</strong> (deri në <strong>$1</strong>).",
        "rclistfrom": "Tregon ndryshime së fundmi duke filluar nga $3 $2",
        "rcshowhideminor": "$1 redaktimet e vogla",
        "rcshowhidemine": "$1 redaktimet e mia",
        "rcshowhidemine-show": "Shfaq",
        "rcshowhidemine-hide": "Fshih",
+       "rcshowhidecategorization-show": "Shfaq",
+       "rcshowhidecategorization-hide": "Fshih",
        "rclinks": "Trego $1 ndryshime gjatë $2 ditëve<br />$3",
        "diff": "ndrysh",
        "hist": "hist",
        "upload-copy-upload-invalid-domain": "Ngarkesat e kopjimit nuk janë në dispozicion nga ky domein.",
        "upload-dialog-title": "Ngarko skedën",
        "upload-dialog-button-cancel": "Anulo",
+       "upload-dialog-button-back": "Prapa",
        "upload-dialog-button-done": "Mbyll",
        "upload-dialog-button-save": "Ruaj",
        "upload-dialog-button-upload": "Ngarko",
+       "upload-form-label-infoform-title": "Detaje",
+       "upload-form-label-infoform-name": "Emri",
+       "upload-form-label-usage-title": "Përdorimi",
+       "upload-form-label-usage-filename": "Emri i skedarit",
+       "upload-form-label-own-work": "Kjo është e puna ime",
+       "upload-form-label-infoform-categories": "Kategoritë",
+       "upload-form-label-infoform-date": "Data",
        "backend-fail-stream": "Nuk mund të kalojë skedën $1.",
        "backend-fail-backup": "Nuk mund të rezervojë skedën $1.",
        "backend-fail-notexists": "Skeda $1 nuk ekziston.",
        "license": "Licencimi:",
        "license-header": "Licencimi:",
        "nolicense": "Asnjë nuk është zgjedhur",
+       "licenses-edit": "Redakto opsionet e licencës",
        "license-nopreview": "(Nuk ka parapamje)",
        "upload_source_url": " (URL e vlefshme, publikisht e përdorshme)",
        "upload_source_file": " (skeda në kompjuterin tuaj)",
        "mostrevisions": "Artikuj më të redaktuar",
        "prefixindex": "Të gjitha faqet me parashtesa",
        "prefixindex-namespace": "Të gjitha faqet me parashtesë (hapësira $1)",
+       "prefixindex-submit": "Shfaq",
        "shortpages": "Artikuj të shkurtër",
        "longpages": "Artikuj të gjatë",
        "deadendpages": "Artikuj pa rrugëdalje",
        "protectedpages": "Faqe të mbrojtura",
        "protectedpages-indef": "Vetëm mbrojtjet pa afat",
        "protectedpages-cascade": "Vetëm mbrojtjet",
+       "protectedpages-noredirect": "Fshih përcjellimet",
        "protectedpagesempty": "Nuk ka faqe të mbrojtura me të dhënat e kërkuara.",
        "protectedpages-page": "Faqja",
        "protectedpages-expiry": "Skadon",
        "protectedpages-reason": "Arsyeja",
+       "protectedpages-submit": "Shfaq faqet",
+       "protectedpages-unknown-timestamp": "E panjohur",
+       "protectedpages-unknown-performer": "Përdorues i panjohur",
        "protectedtitles": "Titujt e mbrojtur",
+       "protectedtitles-summary": "Kjo faqe liston titujt që aktualisht janë të mbrojtura nga krijimi. Për një listë të faqeve ekzistuese që janë të mbrojtura, shih [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Asnjë titull i mbrojtur nuk u gjet në këtë hapësirë.",
+       "protectedtitles-submit": "Shfaq titujt",
        "listusers": "Lista e përdoruesve",
        "listusers-editsonly": "Trego vetëm përdoruesit me redaktime",
        "listusers-creationsort": "Radhiti sipas datës së krijimit",
        "usereditcount": "$1 {{PLURAL:$1|redaktim|redaktime}}",
        "usercreated": "{{GENDER:$3|Krijuar}} më $1 në $2",
        "newpages": "Artikuj të rinj",
+       "newpages-submit": "Shfaq",
        "newpages-username": "Përdoruesi:",
        "ancientpages": "Artikuj më të vjetër",
        "move": "Zhvendose",
        "pager-older-n": "{{PLURAL:$1|1 më i vjetër|$1 më të vjetra}}",
        "suppress": "Shtypur",
        "querypage-disabled": "Kjo faqe speciale është çaktivizuar për arsye të performancës.",
+       "apihelp": "API ndihmë",
        "apihelp-no-such-module": "Moduli \"$1\" nuk u gjet.",
+       "apisandbox": "API livadhi",
+       "apisandbox-jsonly": "JavaScript është e domosdoshme që të përdorni API livadhi.",
+       "apisandbox-api-disabled": "API nuk është në dispozicion për këtë faqe.",
+       "apisandbox-unfullscreen": "Shfaq faqen",
+       "apisandbox-submit": "Bëj kërkesë",
+       "apisandbox-reset": "Pastro",
+       "apisandbox-retry": "Riprovo",
+       "apisandbox-examples": "Shembuj",
+       "apisandbox-dynamic-parameters": "Parametra shtesë",
+       "apisandbox-dynamic-parameters-add-label": "Shto parametër:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Emri i parametrit",
+       "apisandbox-results": "Rezultatet",
        "booksources": "Burime librash",
        "booksources-search-legend": "Kërkim burimor librash",
        "booksources-search": "Kërko",
        "htmlform-submit": "Dërgo",
        "htmlform-reset": "Zhbëj ndryshimin",
        "htmlform-selectorother-other": "Gjitha",
-       "sqlite-has-fts": "$1 me mbështetje të kërkimit me teskt të plotë",
-       "sqlite-no-fts": "$1 pa mbështetje të kërkimit me teskt të plotë",
        "logentry-delete-delete": "$1 {{GENDER:$2|grisi}} faqen $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|riktheu}} faqen $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|e një ngjarjeje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
index 4ce76d9..b6beebe 100644 (file)
        "upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.",
        "upload-dialog-title": "Отпремање датотека",
        "upload-dialog-button-cancel": "Откажи",
+       "upload-dialog-button-back": "Назад",
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Сачувај",
        "upload-dialog-button-upload": "Пошаљи",
index b32f6ba..6638c84 100644 (file)
        "newimages-showbots": "Visa uppladdningar av botar",
        "newimages-hidepatrolled": "Dölj patrullerade uppladdningar",
        "noimages": "Ingenting att se.",
+       "gallery-slideshow-toggle": "Växla miniatyrer",
        "ilsubmit": "Sök",
        "bydate": "efter datum",
        "sp-newimages-showfrom": "Visa nya filer från och med kl. $2 den $1",
        "feedback-thanks": "Tack! Din feedback har skickats till sidan \"[$2 $1]\".",
        "feedback-thanks-title": "Tack!",
        "feedback-useragent": "Användaragent:",
-       "searchsuggest-search": "Sök",
+       "searchsuggest-search": "Sök på {{SITENAME}}",
        "searchsuggest-containing": "innehåller...",
        "api-error-autoblocked": "Din IP-adress har blockerats automatiskt eftersom den har använts av en blockerad användare.",
        "api-error-badaccess-groups": "Du får inte ladda upp filer till denna wiki.",
index 6ec9371..73a8101 100644 (file)
@@ -52,7 +52,7 @@
        "tog-enotifminoredits": "పేజీలు మరియు దస్త్రాలలో జరిగే చిన్న మార్పులకు కూడా నాకు ఈ-మెయిలును పంపు",
        "tog-enotifrevealaddr": "గమనింపు మెయిళ్ళలో నా ఈ-మెయిలు చిరునామాను చూపించు",
        "tog-shownumberswatching": "వీక్షకుల సంఖ్యను చూపు",
-       "tog-oldsig": "ప్రస్తుత సంతకం:",
+       "tog-oldsig": "à°®à±\80 à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤ à°¸à°\82à°¤à°\95à°\82:",
        "tog-fancysig": "సంతకాన్ని వికీపాఠ్యంగా తీసుకో (ఆటోమెటిక్‌ లింకు లేకుండా)",
        "tog-uselivepreview": "తాజా మునుజూపును వాడు",
        "tog-forceeditsummary": "దిద్దుబాటు సారాంశం ఖాళీగా ఉంటే ఆ విషయాన్ని నాకు సూచించు",
@@ -60,6 +60,7 @@
        "tog-watchlisthidebots": "బాట్లు చేసిన మార్పులను నా వీక్షణా జాబితాలో చూపించొద్దు",
        "tog-watchlisthideminor": "చిన్న మార్పులను నా వీక్షణా జాబితాలో చూపించొద్దు",
        "tog-watchlisthideliu": "లాగిన్ ఐన వాడుకరులు చేసే మార్పులను వీక్షణా జాబితాలో చూపించకు",
+       "tog-watchlistreloadautomatically": "ఫిల్టరు మారినప్పుడెల్లా వీక్షణ జాబితాను తిరిగి లోడు చెయ్యి (JavaScript అవసరం)",
        "tog-watchlisthideanons": "అజ్ఞాత వాడుకరుల మార్పులను వీక్షణా జాబితాలో చూపించకు",
        "tog-watchlisthidepatrolled": "నిఘా ఉన్న మార్పులను వీక్షణజాబితా నుంచి దాచిపెట్టు",
        "tog-watchlisthidecategorization": "పేజీ వర్గీకరణను దాచు",
        "newwindow": "(కొత్త కిటికీలో వస్తుంది)",
        "cancel": "రద్దుచేయి",
        "moredotdotdot": "ఇంకా...",
-       "morenotlisted": "à°\88 à°\9cాబితా à°¸à°\82à°ªà±\82à°°à±\8dà°£à°\82 à°\95ాదà±\81.",
+       "morenotlisted": "బహà±\81శా à°\88 à°\9cాబితా à°\85à°¸à°\82à°ªà±\82à°°à±\8dà°£à°\82.",
        "mypage": "పుట",
        "mytalk": "చర్చ",
        "anontalk": "చర్చ",
        "mypreferencesprotected": "మీ అభీష్టాలను సవరించేందుకు మీకు అనుమతి లేదు.",
        "ns-specialprotected": "ప్రత్యేక పేజీలపై దిద్దుబాట్లు చేయలేరు.",
        "titleprotected": "[[User:$1|$1]] ఈ శీర్షికని సృష్టించకుండా ఇది సంరక్షించబడింది.\nఅందుకు ఇచ్చిన కారణం: <em>$2</em>.",
-       "filereadonlyerror": "à°«à±\88à°²à±\81 à°\96à°\9cానా \"$2\" à°°à±\80à°¡à±\8d-à°\93à°¨à±\8dà°²à±\80 à°¸à±\8dథితిలà±\8b à°\89à°\82à°¡à°\9fà°\82 à°\9aà±\87à°¤ \"$1\" à°«à±\88à°²à±\81à°²à±\8b à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\86à°¯à±\8dయలà±\87à°\95à°ªà±\8bయాà°\82.\n\nదానిà°\95à°¿ à°¤à°¾à°³à°\82 à°µà±\87సిన à°\85ధిà°\95ారి ఇచ్చిన వివరణ ఇది: \"$3\".",
+       "filereadonlyerror": "à°«à±\88à°²à±\81 à°\96à°\9cానా \"$2\" à°°à±\80à°¡à±\8d-à°\93à°¨à±\8dà°²à±\80 à°¸à±\8dథితిలà±\8b à°\89à°\82à°¡à°\9fà°\82 à°\9aà±\87à°¤ \"$1\" à°«à±\88à°²à±\81à°²à±\8b à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\86à°¯à±\8dయలà±\87à°\95à°ªà±\8bయాà°\82.\n\nదానిà°\95à°¿ à°¤à°¾à°³à°\82 à°µà±\87సిన à°¸à°¿à°¸à±\8dà°\9fà°®à±\81 à°¨à°¿à°°à±\8dవాహà°\95à±\81à°¡à±\81 ఇచ్చిన వివరణ ఇది: \"$3\".",
        "invalidtitle-knownnamespace": "పేరుబరి \"$2\", పాఠ్యము \"$3\" తో కూడిన ఈ శీర్షిక చెల్లనిది",
        "invalidtitle-unknownnamespace": "అపరిచితమైన పేరుబరి సంఖ్య \"$1\", పాఠ్యము \"$2\" తో కూడిన ఈ శీర్షిక చెల్లనిది",
        "exception-nologin": "లాగినై లేరు",
        "createacct-yourpasswordagain-ph": "సంకేతపదాన్ని మళ్ళీ ఇవ్వండి",
        "userlogin-remembermypassword": "నన్ను లాగిన్ చేసే ఉంచు",
        "userlogin-signwithsecure": "సురక్షిత కనెక్షను వాడు",
+       "cannotlogin-title": "లాగిన్ చెయ్యలేకున్నాం",
        "cannotloginnow-title": "ఇప్పుడు లాగిన్ అవలేరు",
        "cannotloginnow-text": "$1 ను వాడుతూండగా లాగౌట్ అవలేరు.",
+       "cannotcreateaccount-title": "ఖాతాలను సృష్టించలేము",
+       "cannotcreateaccount-text": "ఈ వికీలో నేరుగా ఖాతాలను సృష్టించడం సశక్తం చెయ్యలేదు.",
        "yourdomainname": "మీ డోమైను",
        "password-change-forbidden": "ఈ వికీలో మీరు సంకేతపదాలను మార్చలేరు.",
        "externaldberror": "డేటాబేసు అధీకరణలో లోపం జరిగింది లేదా మీ బయటి ఖాతాను తాజాకరించడానికి మీకు అనుమతి లేదు.",
        "eauthentsent": "ఇచ్చిన ఈ-మెయిలు అడ్రసుకు ధృవీకరణ మెయిలు పంపించాం.\nఇకపై మేము ఆ ఖాతాకు మెయిలు పంపాలంటే, ముందుగా మీరు ఆ మెయిల్లో సూచించినట్లుగా చేసి, ఈ చిరునామా మీదేనని ధృవీకరించాలి.",
        "throttled-mailpassword": "గడచిన {{PLURAL:$1|ఒక గంటలో|$1 గంటల్లో}} సంకేతపదం మార్చినట్లుగా ఒక మెయిలు పంపించివున్నాం.\nదుశ్చర్యలను నివారించేందుకు గాను, {{PLURAL:$1|ఒక గంటకు|$1 గంటలకు}} ఒక్కసారి మాత్రమే సంకేతపదం మార్పు మెయిలు పంపిస్తాము.",
        "mailerror": "మెయిలు పంపించడంలో లోపం: $1",
-       "acct_creation_throttle_hit": "మీ ఐపీ చిరునామా వాడుతున్న ఈ వికీ సందర్శకులు గత ఒక్క రోజులో {{PLURAL:$1|1 ఖాతాని|$1 ఖాతాలను}} సృష్టించారు, ఈ కాల వ్యవధిలో అది గరిష్ఠ పరిమితి.\nఅందువల్ల, ఈ ఐపీని వాడుతున్న సందర్శకులు ప్రస్తుతానికి ఇంక ఖాతాలని సృష్టించలేరు.",
+       "acct_creation_throttle_hit": "మీ ఐపీ చిరునామా వాడుతున్న ఈ వికీ సందర్శకులు గత $2 లో {{PLURAL:$1|1 ఖాతాను|$1 ఖాతాలను}} సృష్టించారు. ఈ కాల వ్యవధిలో అది గరిష్ఠ పరిమితి.\nఫలితంగా, ఈ ఐపీని వాడుతున్న సందర్శకులు ప్రస్తుతానికి ఇక ఖాతాలని సృష్టించలేరు.",
        "emailauthenticated": "మీ ఈ-మెయిలు చిరునామా $2న $3కి ధృవీకరింపబడింది.",
        "emailnotauthenticated": "మీ ఈ-మెయిలు చిరునామాను ఇంకా ధృవీకరించలేదు. \nకింద పేర్కొన్న అంశాలకు సంబంధించి ఎటువంటి ఈ-మెయిలునూ పంపించము.",
        "noemailprefs": "ఈ అంశాలు పని చెయ్యడానికి మీ అభిరుచుల్లో ఈమెయిలు చిరునామా ఇవ్వండి.",
        "passwordreset-emailelement": "వాడుకరిపేరు: \n$1\n\nతాత్కాలిక సంకేతపదం: \n$2",
        "passwordreset-emailsentemail": "ఈ ఈమెయిలు చిరునామా మీ ఖాతాకు అనుసంధించి ఉంటే, సంకేతపదం మార్పు ఈమెయిలు పంపించబడుతుంది.",
        "passwordreset-emailsentusername": "ఈ వాడుకరిపేరుకు ఏదైనా ఈమెయిలు చిరునామా అనుసంధించి ఉంటే, సంకేతపదం మార్పు ఈమెయిలు పంపించబడుతుంది.",
-       "passwordreset-emailsent-capture2": "à°¸à°\82à°\95à±\87తపదà°\82 à°®à°¾à°°à±\8dà°ªà±\81 {{PLURAL:$1|à°\88à°®à±\86యిలà±\81à°¨à±\81|à°\88à°®à±\86యిళà±\8dళనà±\81}} à°ªà°\82పిà°\82à°\9aà°¾à°\82. {{PLURAL:$1|వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\81, à°¸à°\82à°\95à±\87తపదానà±\8dని|వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\8dà°²à±\81, à°¸à°\82à°\95à±\87తపదాల à°\9cాబితానà±\81}} à°\95à°¿à°\82à°¦ చూపించాం.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|వాడà±\81à°\95à°°à°¿à°\95à°¿}} à°\88à°®à±\86యిలà±\81 à°ªà°\82పడà°\82 à°µà°¿à°«à°²à°®à±\88à°\82ది: $1 {{PLURAL:$3|వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\81, à°¸à°\82à°\95à±\87తపదానà±\8dని|వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\8dà°²à±\81, à°¸à°\82à°\95à±\87తపదాల à°\9cాబితానà±\81}} à°\95à°¿à°\82à°¦ చూపించాం.",
+       "passwordreset-emailsent-capture2": "à°¸à°\82à°\95à±\87తపదà°\82 à°®à°¾à°°à±\8dà°ªà±\81 {{PLURAL:$1|à°\88à°®à±\86యిలà±\81à°¨à±\81|à°\88à°®à±\86యిళà±\8dళనà±\81}} à°ªà°\82పిà°\82à°\9aà°¾à°\82. {{PLURAL:$1|వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\81, à°¸à°\82à°\95à±\87తపదానà±\8dని|వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\8dà°²à±\81, à°¸à°\82à°\95à±\87తపదాల à°\9cాబితానà±\81}} à°\87à°\95à±\8dà°\95à°¡ చూపించాం.",
+       "passwordreset-emailerror-capture2": "{{GENDER:$2|వాడà±\81à°\95à°°à°¿à°\95à°¿}} à°\88à°®à±\86యిలà±\81 à°ªà°\82పడà°\82 à°µà°¿à°«à°²à°®à±\88à°\82ది: $1 {{PLURAL:$3|వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\81, à°¸à°\82à°\95à±\87తపదానà±\8dని|వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\8dà°²à±\81, à°¸à°\82à°\95à±\87తపదాల à°\9cాబితానà±\81}} à°\87à°\95à±\8dà°\95à°¡ చూపించాం.",
        "passwordreset-invalideamil": "తప్పు ఈ-మెయిలు చిరునామా",
        "passwordreset-nodata": "వాడుకరిపేరుగానీ, ఈ-మెయిలు చిరునామా గానీ ఇవ్వలేదు",
        "changeemail": "ఈ-మెయిలు చిరునామా మార్పు లేదా తొలగింపు",
        "searchprofile-advanced-tooltip": "కస్టం నేంస్పేసులలో వెదుకు",
        "search-result-size": "$1 ({{PLURAL:$2|1 పదం|$2 పదాలు}})",
        "search-result-category-size": "{{PLURAL:$1|1 సభ్యుడు|$1 సభ్యులు}} ({{PLURAL:$2|1 ఉవవర్గం|$2 ఉపవర్గాలు}}, {{PLURAL:$3|1 దస్త్రం|$3 దస్త్రాలు}})",
-       "search-redirect": "(దారిమార్పు $1)",
+       "search-redirect": "($1 నుండి దారిమార్పు)",
        "search-section": "(విభాగం $1)",
        "search-category": "(వర్గం $1)",
        "search-file-match": "(ఫైలు విషయంతో సరిపోలుతోంది)",
        "search-suggest": "మీరు అంటున్నది ఇదా: $1",
+       "search-rewritten": "$1 కు ఫలితాలు చూపిస్తున్నాం. లేదంటే $2 కోసం వెతకండి.",
        "search-interwiki-caption": "సోదర ప్రాజెక్టులు",
        "search-interwiki-default": "$1 నుండి ఫలితాలు:",
        "search-interwiki-more": "(మరిన్ని)",
        "listusers": "వాడుకరుల జాబితా",
        "listusers-editsonly": "మార్పులు చేసిన వాడుకరులను మాత్రమే చూపించు",
        "listusers-creationsort": "చేరిన తేదీ క్రమంలో చూపించు",
-       "listusers-desc": "అవోహణ క్రమంలో పేర్చు",
+       "listusers-desc": "à°\85వరà±\8bహణ à°\95à±\8dà°°à°®à°\82à°²à±\8b à°ªà±\87à°°à±\8dà°\9aà±\81",
        "usereditcount": "$1 {{PLURAL:$1|మార్పు|మార్పులు}}",
        "usercreated": "$1 న $2కి {{GENDER:$3|చేరారు}}",
        "newpages": "కొత్త పేజీలు",
index 80aca5a..aef8f30 100644 (file)
        "talk": "Tartışma",
        "views": "Görünümler",
        "toolbox": "Araçlar",
+       "tool-link-userrights": "Kullanıcı haklarını değiştir",
+       "tool-link-emailuser": "Bu kullanıcıya e-posta gönder",
        "userpage": "Kullanıcı sayfasını görüntüle",
        "projectpage": "Proje sayfasını görüntüle",
        "imagepage": "Dosya sayfasını görüntüle",
        "upload-copy-upload-invalid-domain": "Kopya yüklemeler bu etki alanında mevcut değil.",
        "upload-dialog-title": "Dosya Yükle",
        "upload-dialog-button-cancel": "İptal",
+       "upload-dialog-button-back": "Geri",
        "upload-dialog-button-done": "Yapıldı",
        "upload-dialog-button-save": "Kaydet",
        "upload-dialog-button-upload": "Yükle",
        "apisandbox-retry": "Tekrar dene",
        "apisandbox-helpurls": "Yardım bağlantıları",
        "apisandbox-examples": "Örnekler",
+       "apisandbox-dynamic-parameters-add-label": "Parametre ekle:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Parametre adı",
        "apisandbox-results": "Sonuçlar",
        "apisandbox-request-url-label": "İstek URL:",
        "apisandbox-request-time": "İstek zamanı: $1",
        "changecontentmodel-title-label": "Sayfa başlığı",
        "changecontentmodel-model-label": "Yeni içerik modeli",
        "changecontentmodel-reason-label": "Gerekçe:",
+       "changecontentmodel-submit": "Değiştir",
        "changecontentmodel-success-title": "İçerik modeli değiştirildi",
        "changecontentmodel-success-text": "İçerik türü [[:$1]] olarak değiştirildi.",
        "logentry-contentmodel-change-revertlink": "Eski haline döndür",
        "pageinfo-article-id": "Sayfa ID",
        "pageinfo-language": "Sayfa içeriğinin dili",
        "pageinfo-content-model": "Sayfa içerik modeli",
+       "pageinfo-content-model-change": "değiştir",
        "pageinfo-robot-policy": "Robotlar tarafından endeksleniyor",
        "pageinfo-robot-index": "İzin verilmiş",
        "pageinfo-robot-noindex": "İzin verilmedi",
        "htmlform-cloner-create": "Daha fazla ekle",
        "htmlform-cloner-delete": "Sil",
        "htmlform-cloner-required": "En az bir değer gereklidir.",
+       "htmlform-date-placeholder": "YYYY-AA-GG",
+       "htmlform-time-placeholder": "SS:DD:SS",
+       "htmlform-datetime-placeholder": "YYYY-AA-GG SS:DD:SS",
        "htmlform-title-not-creatable": "\"$1\"oluşturulabilir bir sayfa ismi değil.",
        "htmlform-title-not-exists": "$1 mevcut değil.",
        "htmlform-user-not-exists": "<strong>$1</strong> mevcut değil.",
        "feedback-external-bug-report-button": "Teknik hata raporu ilet",
        "feedback-dialog-title": "Geribildirim gönder",
        "feedback-dialog-intro": "Geribildirimde bulunmak için aşağıdaki basit formu kullanabilirsiniz. Yorumunuz kullanıcı adınızla beraber \"$1\" sayfasına eklenecektir.",
-       "feedback-error-title": "Hata",
        "feedback-error1": "Hata: Bilinmeyen API sonucu",
        "feedback-error2": "Hata: Düzenleme başarısız oldu",
        "feedback-error3": "Hata: API'den yanıt yok",
index 66f355d..2646d2c 100644 (file)
@@ -66,7 +66,8 @@
                        "Mix Gerder",
                        "E.belykh",
                        "Visem",
-                       "MMH"
+                       "MMH",
+                       "Олександр"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "searchprofile-advanced-tooltip": "Шукати в заданих просторах назв",
        "search-result-size": "$1 ($2 {{PLURAL:$2|слово|слова|слів}})",
        "search-result-category-size": "{{PLURAL:$1|$1 елемент|$1 елементи|$1 елементів}} ({{PLURAL:$2|$2 підкатегорія|$2 підкатегорії|$2 підкатегорій}}, {{PLURAL:$3|$3 файл|$3 файли|$3 файлів}})",
-       "search-redirect": "(перенаправлення $1)",
+       "search-redirect": "(перенаправлення з $1)",
        "search-section": "(розділ $1)",
        "search-category": "(категорія $1)",
        "search-file-match": "(збігається із вмістом файлу)",
        "newimages-showbots": "Показати завантаження ботами",
        "newimages-hidepatrolled": "Приховати відпатрульовані завантаження",
        "noimages": "Файли відсутні.",
+       "gallery-slideshow-toggle": "Перемикання мініатюр",
        "ilsubmit": "Шукати",
        "bydate": "за датою",
        "sp-newimages-showfrom": "Показати нові зображення, починаючи з $2, $1",
        "feedback-thanks": "Дякуємо! Ваші відгук розміщено на сторінці \"[$2 $1]\".",
        "feedback-thanks-title": "Дякуємо!",
        "feedback-useragent": "User Agent:",
-       "searchsuggest-search": "Пошук",
+       "searchsuggest-search": "Пошук у {{grammar:prepositional|{{SITENAME}}}}",
        "searchsuggest-containing": "що містять...",
        "api-error-autoblocked": "Вашу IP-адресу було заблоковано автоматично, тому що її використовував заблокований користувач.",
        "api-error-badaccess-groups": "Вам не дозволено завантажувати файли до цього вікіпроекту.",
index 1a15bf2..ccc7825 100644 (file)
        "talk": "Thảo luận",
        "views": "Các hiển thị",
        "toolbox": "Công cụ",
+       "tool-link-userrights": "Thay đổi nhóm {{GENDER:$1}}người dùng",
+       "tool-link-emailuser": "Gửi thư cho {{GENDER:$1}}người dùng này",
        "userpage": "Xem trang thành viên",
        "projectpage": "Xem trang dự án",
        "imagepage": "Xem trang tập tin",
        "createacct-yourpasswordagain-ph": "Nhập mật khẩu lần nữa",
        "userlogin-remembermypassword": "Giữ trạng thái đăng nhập",
        "userlogin-signwithsecure": "Sử dụng kết nối an toàn",
+       "cannotlogin-title": "Không thể đăng nhập",
+       "cannotlogin-text": "Không thể nào đăng nhập.",
        "cannotloginnow-title": "Không thể đăng nhập lúc này",
        "cannotloginnow-text": "Không thể đăng nhập khi đang dùng $1.",
+       "cannotcreateaccount-title": "Không thể mở tài khoản",
+       "cannotcreateaccount-text": "Chức năng mở tài khoản trực tiếp không được kích hoạt tại wiki này.",
        "yourdomainname": "Tên miền của bạn:",
        "password-change-forbidden": "Bạn không thể đổi mật khẩu trên wiki này.",
        "externaldberror": "Có lỗi khi xác nhận cơ sở dữ liệu bên ngoài hoặc bạn không được phép cập nhật tài khoản bên ngoài.",
        "invalid-content-data": "Dữ liệu nội dung không hợp lệ",
        "content-not-allowed-here": "Không cho phép đưa nội dung “$1” vào trang [[$2]]",
        "editwarning-warning": "Rời khỏi trang này sẽ khiến bạn mất các sửa đổi đã thực hiện.\nNếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “{{int:prefs-editing}}” trong tùy chọn cá nhân.",
+       "editpage-invalidcontentmodel-title": "Không hỗ trợ mô hình nội dung",
+       "editpage-invalidcontentmodel-text": "Mô hình nội dung “$1” không được hỗ trợ.",
        "editpage-notsupportedcontentformat-title": "Không hỗ trợ định dạng nội dung",
        "editpage-notsupportedcontentformat-text": "Kiểu nội dung $2 không hỗ trợ định dạng nội dung $1.",
        "content-model-wikitext": "mã wiki",
        "searchprofile-advanced-tooltip": "Tìm trong không gian tên tùy chọn",
        "search-result-size": "$1 ({{PLURAL:$2|1 từ|$2 từ}})",
        "search-result-category-size": "$1 trang thành viên ($2 thể loại con, $3 tập tin)",
-       "search-redirect": "(đổi hướng $1)",
+       "search-redirect": "(đổi hướng từ $1)",
        "search-section": "(đề mục $1)",
        "search-category": "(thể loại $1)",
        "search-file-match": "(khớp nội dung tập tin)",
        "upload-dialog-disabled": "Chức năng tải lên tập tin qua hộp thoại này bị tắt trong wiki này.",
        "upload-dialog-title": "Tải tập tin lên",
        "upload-dialog-button-cancel": "Hủy bỏ",
+       "upload-dialog-button-back": "Quay lại",
        "upload-dialog-button-done": "Xong",
        "upload-dialog-button-save": "Lưu",
        "upload-dialog-button-upload": "Tải lên",
        "apisandbox-results-fixtoken-fail": "Thất bại khi lấy dấu hiệu “$1”.",
        "apisandbox-alert-page": "Các miền trên Trang này là không hợp lệ.",
        "apisandbox-alert-field": "Giá trị của miền này là không hợp lệ.",
+       "apisandbox-continue": "Tiếp tục",
+       "apisandbox-continue-clear": "Đặt lại",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} sẽ [https://www.mediawiki.org/wiki/API:Query#Continuing_queries tiếp tục] lời yêu cầu cuối cùng; {{int:apisandbox-continue-clear}} sẽ đặt lại các tham số có liên quan đến chức năng tiếp tục yêu cầu.",
        "booksources": "Nguồn sách",
        "booksources-search-legend": "Tìm kiếm nguồn sách",
        "booksources-search": "Tìm kiếm",
        "pageinfo-article-id": "Mã số trang",
        "pageinfo-language": "Ngôn ngữ nội dung trang",
        "pageinfo-content-model": "Kiểu nội dung trang",
+       "pageinfo-content-model-change": "thay đổi",
        "pageinfo-robot-policy": "Ghi chỉ mục bởi robot",
        "pageinfo-robot-index": "Cho phép",
        "pageinfo-robot-noindex": "Không cho phép",
        "tag-filter": "Bộ lọc [[Special:Tags|thẻ]]:",
        "tag-filter-submit": "Bộ lọc",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1}}Thẻ]]: $2)",
+       "tag-mw-contentmodelchange": "thay đổi mô hình nội dung",
+       "tag-mw-contentmodelchange-description": "Sửa đổi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel thay đổi mô hình nội dung] của trang",
        "tags-title": "Thẻ đánh dấu",
        "tags-intro": "Trang này liệt kê các thẻ đánh dấu mà phần mềm dùng nó để đánh dấu một sửa đổi, và ý nghĩa của nó.",
        "tags-tag": "Tên thẻ",
        "htmlform-cloner-create": "Tiếp tục thêm",
        "htmlform-cloner-delete": "Loại bỏ",
        "htmlform-cloner-required": "Cần ít nhất một giá trị.",
+       "htmlform-date-placeholder": "YYYY-MM-DD (năm-tháng-ngày)",
+       "htmlform-time-placeholder": "HH:MM:SS (giờ:phút:giây)",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS (năm-tháng-ngày giờ:phút:giây)",
+       "htmlform-date-invalid": "Giá trị bạn chỉ định không phải là một ngày được công nhận. Hãy thử sử dụng định dạng YYYY-MM-DD (năm-tháng-ngày).",
+       "htmlform-time-invalid": "Giá trị bạn chỉ định không phải là một giờ được công nhận. Hãy thử sử dụng định dạng HH:MM:SS (giờ:phút:giây).",
+       "htmlform-datetime-invalid": "Giá trị bạn chỉ định không phải là một ngày giờ được công nhận. Hãy thử sử dụng định dạng YYYY-MM-DD HH:MM:SS (năm-tháng-ngày giờ:phút:giây).",
+       "htmlform-date-toolow": "Giá trị bạn chỉ định là trước ngày được phép là $1.",
+       "htmlform-date-toohigh": "Giá trị bạn chỉ định là sau ngày được phép là $1.",
+       "htmlform-time-toolow": "Giá trị bạn chỉ định là trước giờ được phép là $1.",
+       "htmlform-time-toohigh": "Giá trị bạn chỉ định là sau giờ được phép là $1.",
+       "htmlform-datetime-toolow": "Giá trị bạn chỉ định là trước ngày giờ được phép là $1.",
+       "htmlform-datetime-toohigh": "Giá trị bạn chỉ định là sau ngày giờ được phép là $1.",
        "htmlform-title-badnamespace": "[[:$1]] không phải trong không gian tên “{{ns:$2}}”.",
        "htmlform-title-not-creatable": "Không cho phép tạo ra trang với tên “$1”",
        "htmlform-title-not-exists": "$1 không tồn tại.",
        "unlinkaccounts-success": "Đã gỡ liên kết tài khoản.",
        "authenticationdatachange-ignored": "Tác vụ thay đổi dữ liệu xác thực không được xử lý. Có lẽ nhà cung cấp chưa được cấu hình?",
        "userjsispublic": "Xin lưu ý: Các trang con JavaScript không nên chứa dữ liệu bí mật, vì những người dùng khác có thể xem các trang này.",
-       "usercssispublic": "Xin lưu ý: Các trang con CSS không nên chứa dữ liệu bí mật, vì những người dùng khác có thể xem các trang này."
+       "usercssispublic": "Xin lưu ý: Các trang con CSS không nên chứa dữ liệu bí mật, vì những người dùng khác có thể xem các trang này.",
+       "restrictionsfield-badip": "Địa chỉ hoặc dải IP không hợp lệ: $1.",
+       "restrictionsfield-label": "Các dải IP được cho phép:",
+       "restrictionsfield-help": "Mỗi dòng một địa chỉ IP hoặc dải CIDR. Để kích hoạt tất cả mọi địa chỉ IP, sử dụng<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index d11a639..84edb29 100644 (file)
        "nstab-template": "Näüdüs",
        "nstab-help": "Oppus",
        "nstab-category": "Katõgooria",
+       "mainpage-nstab": "Pääleht",
        "nosuchaction": "Säänest tallitust olõ-i.",
        "nosuchactiontext": "Seo aadrõsi manoq käüvä tallitus om viganõ.\nVõimalik, et sa kirotit aadrõsi võlssi vai pruugõt vigast linki.\nNiisama või taa ollaq {{SITENAME}} tarkvara viga.",
        "nosuchspecialpage": "Säänest tallituslehekülge olõ-i.",
        "yourpasswordagain": "Kirodaq viilkõrd salasõna",
        "createacct-yourpasswordagain": "Kinnüdäq uma salasõna",
        "createacct-yourpasswordagain-ph": "Kirodaq salasõna vahtsõst",
-       "remembermypassword": "Jätäq salasõna miilde (kooniq $1 {{PLURAL:$1|pääväs|pääväs}})",
        "userlogin-remembermypassword": "Jääq uma nimega sisse",
        "userlogin-signwithsecure": "Pruugiq kaidsõtut võrgoütistüst",
        "yourdomainname": "Võrgonimi",
        "undo-success": "Tagasivõtminõ läts' kõrda. Kaeq üle, kas taa om tuu, midä sa tetäq tahtsõt ja pästäq muutusõq.",
        "undo-failure": "Tagasivõtminõ lää-s kõrda samal aol tettüide muutmiisi vastaolo peräst. Võit muutusõq käsilde tagasi võttaq.",
        "undo-summary": "Tagasi võet muutminõ #$1, mink tekk' [[Special:Contributions/$2|$2]] ([[User talk:$2|Arotus]])",
-       "cantcreateaccounttitle": "Pruukjanime luuminõ lää-s kõrda",
        "cantcreateaccount-text": "Pruukjanime luuminõ taa puutri võrgoaadrõsi päält ('''$1''') om ärq keelet. Kiildjä: [[User:$3|$3]].\n\n$3 kirjäpant põhjus: ''$2''",
        "viewpagelogs": "Kaeq seo lehe muutmisnimekirjä.",
        "nohistory": "Seo leheküle pääl ei olõq vanõmbit kujjõ.",
        "searchprofile-advanced-tooltip": "Otsiq etteannõtuist nimeruumõst",
        "search-result-size": "$1 ({{PLURAL:$2|1 sõna|$2 sõnna}})",
        "search-result-category-size": "{{PLURAL:$1|1 lehekülg|$1 lehekülge}} ({{PLURAL:$2|1 alambkatõgooria|$2 alambkatõgooriat}}, {{PLURAL:$3|1 fail|$3 faili}})",
-       "search-redirect": "(ümbresaatminõ $1)",
+       "search-redirect": "(ümbresaatminõ lehelt $1)",
        "search-section": "(alljago $1)",
        "search-suggest": "Kas mõtlit: $1",
        "search-interwiki-caption": "Sõsarprojektiq",
        "contributions": "{{GENDER:$1|Pruukja}} toimõndusõq",
        "contributions-title": "Pruukja $1 toimõndusõq",
        "mycontris": "Hindä kirotusõq",
+       "anoncontribs": "Hindä kirotusõq",
        "contribsub2": "Pruukja {{GENDER:$3|$1}} ($2) toimõndusõq",
        "nocontribs": "Sääntsit muutmiisi es lövväq.",
        "uctop": "(parhillanõ)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|kujo|kujjo}} lehest $2",
        "tooltip-pt-userpage": "Suq pruukjaleht",
        "tooltip-pt-anonuserpage": "Su puutri võrgoaadrõsi pruukjaleht",
-       "tooltip-pt-mytalk": "Mu arotusleht",
+       "tooltip-pt-mytalk": "{{GENDER:|Muq arotusleht}}",
        "tooltip-pt-anontalk": "Arotus taa puutri võrgoaadrõsi päält tettüisi toimõnduisi üle",
-       "tooltip-pt-preferences": "Mu säädmiseq",
+       "tooltip-pt-preferences": "{{GENDER:|Mu säädmiseq}}",
        "tooltip-pt-watchlist": "Nimekiri lehist, mil tahtnuq silmä pääl hoitaq",
        "tooltip-pt-mycontris": "Suq toimõnduisi nimekiri",
        "tooltip-pt-login": "Mineq nimega sisse vai tiiq hindäle pruukjanimi (soovitav).",
        "tooltip-pt-logout": "Mineq nime alt vällä",
        "tooltip-pt-createaccount": "Tuu olõ-õi joht kohustuslik, a sul tasos luvvaq konto ja nimega sisse minnäq.",
        "tooltip-ca-talk": "Arotus lehe sisu üle",
-       "tooltip-ca-edit": "Saa võit taad lehte toimõndaq.",
+       "tooltip-ca-edit": "Toimõndaq seod lehte",
        "tooltip-ca-addsection": "Tiiq vahtsõnõ alljago",
        "tooltip-ca-viewsource": "Taa om kaidsõt leht. Saat kaiaq õnnõ taa lättekuudi.",
        "tooltip-ca-history": "Taa lehe vanõmbaq kujoq.",
        "tooltip-t-recentchangeslinked": "Viimädseq muutmisõq lehile, mink pääle näüdätäs linkega seo lehe päält",
        "tooltip-feed-rss": "Taa lehe RSS-kujo",
        "tooltip-feed-atom": "Taa lehe Atom-kujo",
-       "tooltip-t-contributions": "Näütäq taa pruukja toimõnduisi nimekirjä",
+       "tooltip-t-contributions": "Näütäq {{GENDER:$1|seo pruukja}} toimõnduisi nimekirjä",
        "tooltip-t-emailuser": "Saadaq taalõ pruukjalõ e-kiri",
        "tooltip-t-upload": "Laadiq üles teedüstüid",
        "tooltip-t-specialpages": "Näütäq tallituslehekülgi",
        "tooltip-ca-nstab-main": "Näütäq sisulehekülge",
        "tooltip-ca-nstab-user": "Näütäq pruukjalehekülge",
        "tooltip-ca-nstab-media": "Näütäq meediälehekülge",
-       "tooltip-ca-nstab-special": "Taa om tallituslehekülg",
+       "tooltip-ca-nstab-special": "Seo om tallituslehekülg, seod saa-ai toimõndaq",
        "tooltip-ca-nstab-project": "Näütäq projektilehekülge",
        "tooltip-ca-nstab-image": "Näütäq teedüstü lehekülge",
        "tooltip-ca-nstab-mediawiki": "Näütäq tallitusteedüst",
        "spambot_username": "MediaWiki prahihäötäjä",
        "spam_reverting": "Tagasi pööret viimädse kujo pääle, koh olõ-i linke lehele $1",
        "spam_blanking": "Kõigin kujõn oll' linke lehele $1. Leht tühäs tett.",
-       "simpleantispam-label": "Rämpspostikontroll.\n'''ÄRQ''' täütkuq seod väljä!",
+       "simpleantispam-label": "Rämpspostikontroll.\n<strong>Ärq täütkuq</strong> seod väljä!",
        "pageinfo-toolboxlink": "Leheküle andmõq",
        "markaspatrolleddiff": "Märgiq ülekaetus",
        "markaspatrolledtext": "Märgiq toimõndus ülekaetus",
index e3b9494..320a8b2 100644 (file)
        "namespaces": "命名空间",
        "variants": "变种",
        "navigation-heading": "导航菜单",
-       "errorpagetitle": "出错",
+       "errorpagetitle": "错误",
        "returnto": "返回至$1。",
        "tagline": "来自{{SITENAME}}",
        "help": "帮助",
        "nosuchactiontext": "URL指定的操作无效。您可能输入了错误的URL地址,或是点击了错误的链接。这也可能表明{{SITENAME}}使用的软件存在漏洞。",
        "nosuchspecialpage": "此特殊页面不存在",
        "nospecialpagetext": "<strong>您请求了一个无效的特殊页面。</strong>\n\n有效的特殊页面的列表可以在[[Special:SpecialPages|{{int:specialpages}}]]找到。",
-       "error": "出错",
+       "error": "错误",
        "databaseerror": "数据库错误",
        "databaseerror-text": "出现数据库查询错误。这可能表示软件中存在漏洞。",
        "databaseerror-textcl": "出现数据库查询错误。",
        "newimages-showbots": "显示机器人上传",
        "newimages-hidepatrolled": "隐藏已巡查的上传",
        "noimages": "无可查看文件。",
+       "gallery-slideshow-toggle": "开启/关闭缩略图",
        "ilsubmit": "搜索",
        "bydate": "按日期",
        "sp-newimages-showfrom": "从$1 $2开始显示新文件",
        "confirm-rollback-button": "确定",
        "confirm-rollback-top": "回退此页面的编辑么?",
        "semicolon-separator": ";",
-       "comma-separator": "",
+       "comma-separator": "",
        "colon-separator": ":",
        "pipe-separator": "&#32;|&#32;",
        "word-separator": "",
        "feedback-thanks": "谢谢!您的反馈已发布至页面“[$2 $1]”。",
        "feedback-thanks-title": "谢谢您!",
        "feedback-useragent": "用户代理:",
-       "searchsuggest-search": "搜索",
+       "searchsuggest-search": "搜索{{SITENAME}}",
        "searchsuggest-containing": "含有...",
        "api-error-autoblocked": "您的IP地址已被自动封禁,因为它曾被一位已封禁用户使用。",
        "api-error-badaccess-groups": "您没有将文件上传到此 wiki 的权限。",
        "usercssispublic": "请注意:CSS子页面不应包含机密数据,因为它们可以被其他用户查看。",
        "restrictionsfield-badip": "无效的IP地址或段:$1",
        "restrictionsfield-label": "允许的IP段:",
-       "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用所有,可使用<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用所有,可使用<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "edit-error-short": "错误:$1",
+       "edit-error-long": "错误:\n\n$1"
 }
index f791979..f1692a4 100644 (file)
        "confirm-rollback-button": "確定",
        "confirm-rollback-top": "還原編輯到此頁面?",
        "semicolon-separator": ";",
-       "comma-separator": "",
+       "comma-separator": "",
        "colon-separator": ":",
        "word-separator": "",
        "parentheses": " ($1)",
index 108f777..5d846ea 100644 (file)
@@ -7,11 +7,11 @@
  * @file
  *
  * @author Akoppad
- * @author Ashwath Mattur <ashwatham@gmail.com> http://en.wikipedia.org/wiki/User:Ashwatham
+ * @author Ashwath Mattur <ashwatham@gmail.com> https://en.wikipedia.org/wiki/User:Ashwatham
  * @author Dimension10
  * @author Dipin
  * @author HPN
- * @author Hari Prasad Nadig <hpnadig@gmail.com> http://en.wikipedia.org/wiki/User:Hpnadig
+ * @author Hari Prasad Nadig <hpnadig@gmail.com> https://en.wikipedia.org/wiki/User:Hpnadig
  * @author Kaganer
  * @author Ktkaushik
  * @author M G Harish
index b8ae8d7..5ceafd1 100644 (file)
@@ -38,8 +38,8 @@
  * @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
  *
- * @see http://meta.wikimedia.org/w/index.php?title=LanguageNn.php&action=history
- * @see http://nn.wikipedia.org/w/index.php?title=Brukar:Dittaeva/LanguageNn.php&action=history
+ * @see https://meta.wikimedia.org/w/index.php?title=LanguageNn.php&action=history
+ * @see https://nn.wikipedia.org/w/index.php?title=Brukar:Dittaeva/LanguageNn.php&action=history
  */
 
 $datePreferences = [
index 0c89c05..7e9220c 100644 (file)
@@ -4,10 +4,10 @@
 # doxygen (www.doxygen.org) for MediaWiki.
 #
 # Some placeholders have been added for MediaWiki usage:
-# {{OUTPUT_DIRECTORY}}
-# {{CURRENT_VERSION}}
-# {{STRIP_FROM_PATH}}
-# {{INPUT}}
+# OUTPUT_DIRECTORY = {{OUTPUT_DIRECTORY}}
+# CURRENT_VERSION  = {{CURRENT_VERSION}}
+# STRIP_FROM_PATH  = {{STRIP_FROM_PATH}}
+# INPUT            = {{INPUT}}
 #
 # To generate documentation run: php mwdocgen.php --no-extensions
 
index 9740ef2..2262338 100644 (file)
@@ -63,7 +63,10 @@ class AddRFCAndPMIDInterwiki extends LoggedUpdateMaintenance {
                                [ 'iw_prefix' ],
                                [
                                        'iw_prefix' => 'rfc',
-                                       'iw_url' => 'https://tools.ietf.org/html/rfc$1'
+                                       'iw_url' => 'https://tools.ietf.org/html/rfc$1',
+                                       'iw_api' => '',
+                                       'iw_wikiid' => '',
+                                       'iw_local' => 0,
                                ],
                                __METHOD__
                        );
@@ -74,6 +77,9 @@ class AddRFCAndPMIDInterwiki extends LoggedUpdateMaintenance {
                        [
                                'iw_prefix' => 'pmid',
                                'iw_url' => 'https://www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract',
+                               'iw_api' => '',
+                               'iw_wikiid' => '',
+                               'iw_local' => 0,
                        ],
                        __METHOD__,
                        // If there's already a pmid interwiki link, don't
@@ -84,3 +90,6 @@ class AddRFCAndPMIDInterwiki extends LoggedUpdateMaintenance {
                return true;
        }
 }
+
+$maintClass = 'AddRFCAndPMIDInterwiki';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/archives/patch-rc_ip_modify.sql b/maintenance/archives/patch-rc_ip_modify.sql
new file mode 100644 (file)
index 0000000..e889b5c
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE /*_*/recentchanges MODIFY COLUMN rc_ip varbinary(40) NOT NULL default '';
index 97c8954..cdef7e0 100644 (file)
@@ -63,7 +63,8 @@ if ( $ext == 'php' || $ext == 'php5' ) {
        return true;
 }
 $mime = false;
-$lines = explode( "\n", file_get_contents( "includes/mime.types" ) );
+// Borrow mime type file from MimeAnalyzer
+$lines = explode( "\n", file_get_contents( "includes/libs/mime/mime.types" ) );
 foreach ( $lines as $line ) {
        $exts = explode( " ", $line );
        $mime = array_shift( $exts );
index e7c8e49..2e4a15d 100644 (file)
@@ -1725,6 +1725,9 @@ return [
                        'oojs-ui-core',
                        'oojs-ui-widgets',
                        'oojs-ui.styles.icons-media'
+               ],
+               'messages' => [
+                       'gallery-slideshow-toggle'
                ]
        ],
        'mediawiki.page.ready' => [
@@ -1809,11 +1812,13 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.apisandbox.styles' => [
+               'targets' => [ 'desktop', 'mobile' ],
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.apisandbox.top.css',
        ],
        'mediawiki.special.apisandbox' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.apisandbox.css',
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.apisandbox.js',
+               'targets' => [ 'desktop', 'mobile' ],
                'dependencies' => [
                        'mediawiki.api',
                        'mediawiki.jqueryMsg',
index ac60e8f..eef3846 100644 (file)
                        };
                        // Default toggle link. Only build it when needed to avoid jQuery memory leaks (event data).
                        buildDefaultToggleLink = function () {
-                               return $( '<a href="#"></a>' )
+                               return $( '<a>' )
+                                       .attr( {
+                                               role: 'button',
+                                               tabindex: 0
+                                       } )
                                        .text( collapseText )
                                        .wrap( '<span class="mw-collapsible-toggle"></span>' )
                                                .parent()
index 4c75e33..a3a82d5 100644 (file)
 
                $link = $( '<a>' )
                .text( showText )
-               .attr( 'href', '#' )
-               .click( function () {
-                       if ( $table.hasClass( 'collapsed' ) ) {
-                               $( this ).text( hideText );
-                       } else {
-                               $( this ).text( showText );
+               .attr( {
+                       role: 'button',
+                       tabindex: 0
+               } )
+               .on( 'click keypress', function ( e ) {
+                       if (
+                               e.type === 'click' ||
+                               e.type === 'keypress' && e.which === 13
+                       ) {
+                               if ( $table.hasClass( 'collapsed' ) ) {
+                                       $( this ).text( hideText );
+                               } else {
+                                       $( this ).text( showText );
+                               }
+                               $table.toggleClass( 'expanded collapsed' );
                        }
-                       $table.toggleClass( 'expanded collapsed' );
-                       return false;
                } );
 
                $col.append( $link );
index d387a2d..ec94df3 100644 (file)
  * Hide all the elements irrelevant for printing
  */
 .noprint,
-div#jump-to-nav,
+#jump-to-nav,
 .mw-jump,
-div.top,
-div#column-one,
+#column-one,
 .mw-editsection,
 .mw-editsection-like,
 #footer-places,
@@ -21,12 +20,12 @@ div#column-one,
 .usermessage,
 .patrollink,
 .ns-0 .mw-redirectedfrom,
-div.magnify,
+.magnify,
 #mw-navigation,
 #siteNotice,
 /* Deprecated, changed in core */
-div#f-poweredbyico,
-div#f-copyrightico,
+#f-poweredbyico,
+#f-copyrightico,
 li#about,
 li#disclaimer,
 li#mobileview,
@@ -228,7 +227,7 @@ div.floatleft p {
        font-style: italic;
 }
 
-div.center {
+.center {
        text-align: center;
 }
 
@@ -246,7 +245,7 @@ div.thumb {
 div.thumbinner {
        background-color: #fff;
        border: 1pt solid #ccc;
-       padding: 3px !important;
+       padding: 3px;
        font-size: 94%;
        text-align: center;
        /* new block formatting context,
@@ -262,7 +261,7 @@ html .thumbcaption {
        border: none;
        text-align: left;
        line-height: 1.4em;
-       padding: 3px !important;
+       padding: 3px;
        font-size: 94%;
 }
 
@@ -325,10 +324,6 @@ table.listing td {
        border-collapse: collapse;
 }
 
-a.sortheader {
-       margin: 0 0.3em;
-}
-
 /**
  * Categories
  */
index 7b0b071..5fbfb85 100644 (file)
@@ -11,6 +11,7 @@ a {
        text-decoration: none;
        color: #0645ad;
        background: none;
+       cursor: pointer; /* Always cursor:pointer even without href */
 }
 
 a:visited {
index 2517605..99f6c13 100644 (file)
        z-index: 100;
 }
 
+.mw-apisandbox-fullscreen .mw-apisandbox-container {
+       border-width: 1px 0 0 0;
+       border-radius: 0;
+}
+
 .mw-apisandbox-spacer {
        display: inline-block;
        height: 1px;
index 3959900..98ed3ee 100644 (file)
                init: function () {
                        var $toolbar;
 
+                       ApiSandbox.isFullscreen = false;
+
                        $content = $( '#mw-apisandbox' );
 
                        windowManager = new OO.ui.WindowManager();
                 * Toggle "fullscreen" mode
                 */
                toggleFullscreen: function () {
-                       var $body = $( document.body );
+                       var $body = $( document.body ),
+                               $ui = $( '#mw-apisandbox-ui' );
+
+                       ApiSandbox.isFullscreen = !ApiSandbox.isFullscreen;
 
-                       $body.toggleClass( 'mw-apisandbox-fullscreen' );
-                       if ( $body.hasClass( 'mw-apisandbox-fullscreen' ) ) {
+                       $body.toggleClass( 'mw-apisandbox-fullscreen', ApiSandbox.isFullscreen );
+                       $ui.toggleClass( 'mw-body-content', ApiSandbox.isFullscreen );
+                       if ( ApiSandbox.isFullscreen ) {
                                fullscreenButton.setLabel( mw.message( 'apisandbox-unfullscreen' ).text() );
                                fullscreenButton.setTitle( mw.message( 'apisandbox-unfullscreen-tooltip' ).text() );
-                               $body.append( $( '#mw-apisandbox-ui' ) );
+                               $body.append( $ui );
                        } else {
                                fullscreenButton.setLabel( mw.message( 'apisandbox-fullscreen' ).text() );
                                fullscreenButton.setTitle( mw.message( 'apisandbox-fullscreen-tooltip' ).text() );
-                               $content.append( $( '#mw-apisandbox-ui' ) );
+                               $content.append( $ui );
                        }
                        ApiSandbox.resizePanel();
                },
                        var height = $( window ).height(),
                                contentTop = $content.offset().top;
 
-                       if ( $( document.body ).hasClass( 'mw-apisandbox-fullscreen' ) ) {
+                       if ( ApiSandbox.isFullscreen ) {
                                height -= panel.$element.offset().top - $( '#mw-apisandbox-ui' ).offset().top;
                                panel.$element.height( height - 1 );
                        } else {
index 5bb69b8..4c4e129 100644 (file)
@@ -6,15 +6,14 @@
 .mixin-mw-ui-anchor-styles( @mainColor ) {
        color: @mainColor;
 
-       // Hover state
        &:hover {
                color: lighten( @mainColor, @colorLightenPercentage );
        }
-       // Focus and active states
+
        &:focus,
        &:active {
                color: darken( @mainColor, @colorDarkenPercentage );
-               outline: none; // outline fix
+               outline: 0;
        }
 
        // Quiet mode is gray at first
 /*
 Anchors
 
-The anchor base type can be applied to A elements when a basic context styling needs to be given to a link, without
-having to assign it as a button type. mw-ui-anchor only changes the text color, and should not be used in combination
-with other base classes, such as mw-ui-button.
+The anchor base type can be applied to `a` elements when a basic context styling needs to be given to a link, without
+having to assign it as a button type. `.mw-ui-anchor` only changes the text color, and should not be used in combination
+with other base classes, such as `.mw-ui-button`.
+
 
 Markup:
 <a href="#" class="mw-ui-anchor mw-ui-progressive">Progressive</a>
-<a href="#" class="mw-ui-anchor mw-ui-constructive">Constructive</a>
 <a href="#" class="mw-ui-anchor mw-ui-destructive">Destructive</a>
 
 .mw-ui-quiet - Quiet until interaction.
@@ -46,13 +45,14 @@ Styleguide 6.2.
                .mixin-mw-ui-anchor-styles( @colorProgressive );
        }
 
-       &.mw-ui-constructive {
-               .mixin-mw-ui-anchor-styles( @colorConstructive );
-       }
-
        &.mw-ui-destructive {
                .mixin-mw-ui-anchor-styles( @colorDestructive );
        }
+
+       //`.mw-ui-constructive` is deprecated; consolidated with `progressive`, see T110555
+       &.mw-ui-constructive {
+               .mixin-mw-ui-anchor-styles( @colorConstructive );
+       }
 }
 
 /*
index a281e67..85795f4 100644 (file)
        //
        // Use progressive buttons for actions which lead to a next step in the process.
        // .mw-ui-constructive is deprecated; consolidated with `progressive`, see T110555
-       // .mw-ui-primary is deprecated, kept for compatibility.
        //
        // Markup:
        // <div>
        //
        // Styleguide 2.1.1.
        &.mw-ui-progressive,
-       &.mw-ui-constructive,
-       &.mw-ui-primary {
+       &.mw-ui-constructive {
                .button-colors-primary( @colorProgressive, @colorProgressiveHighlight, @colorProgressiveActive );
 
                &.mw-ui-quiet {
index 90e769e..8bddb3a 100644 (file)
@@ -4,11 +4,6 @@
 @import "mediawiki.ui/variables";
 @import "mediawiki.ui/mixins";
 
-// Placeholder text styling helper
-.field-placeholder-styling() {
-       font-style: italic;
-       font-weight: normal;
-}
 // Text inputs
 //
 // Apply the mw-ui-input class to input and textarea fields.
 //
 // Styleguide 1.1.
 .mw-ui-input {
+       background-color: #fff;
        .box-sizing( border-box );
        display: block;
        width: 100%;
        border: 1px solid @colorFieldBorder;
        border-radius: @borderRadius;
        padding: 0.3em 0.3em 0.3em 0.6em;
+       // necessary for smooth transition
+       box-shadow: inset 0 0 0 0.1em #fff;
        font-family: inherit;
        font-size: inherit;
        line-height: inherit;
        vertical-align: middle;
 
-       // Placeholder text styling must be set individually for each browser @winter
-       &::-webkit-input-placeholder { // webkit
-               .field-placeholder-styling;
+       // Normalize & style placeholder text, see T139034
+       // Placeholder styles can't be grouped, otherwise they're ignored as invalid.
+
+       // Placeholder mixin
+       .mixin-placeholder() {
+               color: @colorGray7;
+               font-style: italic;
+       }
+       // Firefox 4-18
+       &:-moz-placeholder { // stylelint-disable-line selector-no-vendor-prefix
+               .mixin-placeholder;
+               opacity: 1;
+       }
+       // Firefox 19-
+       &::-moz-placeholder { // stylelint-disable-line selector-no-vendor-prefix
+               .mixin-placeholder;
+               opacity: 1;
        }
-       &::-moz-placeholder { // FF 4-18
-               .field-placeholder-styling;
+       // Internet Explorer 10-11
+       &:-ms-input-placeholder { // stylelint-disable-line selector-no-vendor-prefix
+               .mixin-placeholder;
        }
-       &:-moz-placeholder { // FF >= 19
-               .field-placeholder-styling;
+       // WebKit, Blink, Edge
+       // Don't set `opacity < 1`, see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/3901363/
+       &::-webkit-input-placeholder { // stylelint-disable-line selector-no-vendor-prefix
+               .mixin-placeholder;
        }
-       &:-ms-input-placeholder { // IE >= 10
-               .field-placeholder-styling;
+       // W3C Standard Selectors Level 4
+       &:placeholder-shown {
+               .mixin-placeholder;
        }
 
-       // Remove red outline from inputs which have required field and invalid content.
-       // This is a Firefox only issue
+       // Firefox: Remove red outline when `required` attribute set and invalid content.
        // See https://developer.mozilla.org/en-US/docs/Web/CSS/:invalid
-       // This should be above :focus so focus behaviour takes preference
+       // This should come before `:focus` so latter rules take preference.
        &:invalid {
                box-shadow: none;
        }
 
+       &:hover {
+               border-color: @colorGray7;
+       }
+
        &:focus {
                border-color: @colorProgressive;
                box-shadow: inset 0 0 0 1px @colorProgressive;
                outline: 0;
        }
 
+       // `:not()` is used exclusively for `transition`s as both are not supported by IE < 9.
+       &:not( :disabled ) {
+               .transition( ~'color 100ms, border-color 100ms, box-shadow 100ms' );
+       }
+
        &:disabled {
                border-color: @colorGray14;
                color: @colorGray12;
                // Correct the odd appearance in Chrome and Safari 5
                -webkit-appearance: textfield;
 
-               // Remove proprietary clear button in IE 10-11
+               // Remove proprietary clear button in IE 10-11, Edge 12+
                &::-ms-clear {
                        display: none;
                }
index b25b2d4..222586f 100644 (file)
                                        }
                                        req = new mw.Api().get( params );
                                        promiseAbortObject.abort = req.abort.bind( req ); // TODO ew
-                                       return req;
+                                       return req.then( function ( ret ) {
+                                               if ( ret.query === undefined ) {
+                                                       ret = new mw.Api().get( { action: 'query', titles: query } );
+                                                       promiseAbortObject.abort = ret.abort.bind( ret );
+                                               }
+                                               return ret;
+                                       } );
                                }
                        } ).promise( promiseAbortObject );
                } else {
                                continue;
                        }
                        pageData[ suggestionPage.title ] = {
+                               known: suggestionPage.known !== undefined,
                                missing: suggestionPage.missing !== undefined,
                                redirect: suggestionPage.redirect !== undefined,
                                disambiguation: OO.getProp( suggestionPage, 'pageprops', 'disambiguation' ) !== undefined,
                        for ( i = 0, len = redirects.length; i < len; i++ ) {
                                pageData[ redirects[ i ] ] = {
                                        missing: false,
+                                       known: true,
                                        redirect: true,
                                        disambiguation: false,
                                        description: mw.msg( 'mw-widgets-titleinput-description-redirect', suggestionPage.title ),
                // If not found, run value through mw.Title to avoid treating a match as a
                // mismatch where normalisation would make them matching (bug 48476)
 
-               pageExistsExact = titles.indexOf( this.getQueryValue() ) !== -1;
+               pageExistsExact = (
+                       Object.prototype.hasOwnProperty.call( pageData, this.getQueryValue() ) &&
+                       (
+                               !pageData[ this.getQueryValue() ].missing ||
+                               pageData[ this.getQueryValue() ].known
+                       )
+               );
                pageExists = pageExistsExact || (
-                       titleObj && titles.indexOf( titleObj.getPrefixedText() ) !== -1
+                       titleObj &&
+                       Object.prototype.hasOwnProperty.call( pageData, titleObj.getPrefixedText() ) &&
+                       (
+                               !pageData[ titleObj.getPrefixedText() ].missing ||
+                               pageData[ titleObj.getPrefixedText() ].known
+                       )
                );
 
                if ( !pageExists ) {
                        pageData[ this.getQueryValue() ] = {
-                               missing: true, redirect: false, disambiguation: false,
+                               missing: true, known: false, redirect: false, disambiguation: false,
                                description: mw.msg( 'mw-widgets-titleinput-description-new-page' )
                        };
                }
index ad1069f..49ff411 100644 (file)
@@ -7,14 +7,14 @@
        /**
         * An implementation of Jenkins' one-at-a-time hash.
         *
-        * @see http://en.wikipedia.org/wiki/Jenkins_hash_function
+        * @see https://en.wikipedia.org/wiki/Jenkins_hash_function
         *
         * @param {string} string String to hash
         * @return {number} The hash as a 32-bit unsigned integer
         * @ignore
         *
         * @author Ori Livneh <ori@wikimedia.org>
-        * @see http://jsbin.com/kejewi/4/watch?js,console
+        * @see https://jsbin.com/kejewi/4/watch?js,console
         */
        function hashString( string ) {
                var hash = 0,
index 44b9117..2646cff 100644 (file)
                        } else {
                                $el = $( '<a>' );
                                if ( typeof arg === 'function' ) {
-                                       $el.attr( 'href', '#' )
-                                       .click( function ( e ) {
-                                               e.preventDefault();
+                                       $el.attr( {
+                                               role: 'button',
+                                               tabindex: 0
                                        } )
-                                       .click( arg );
+                                       .on( 'click keypress', function ( e ) {
+                                               if (
+                                                       e.type === 'click' ||
+                                                       e.type === 'keypress' && e.which === 13
+                                               ) {
+                                                       arg.call( this, e );
+                                               }
+                                       } );
                                } else {
                                        $el.attr( 'href', textify( arg ) );
                                }
index c7715e5..f878e42 100644 (file)
                                logged.add( trace );
                                return true;
                        }
-                       Object.defineProperty( obj, key, {
-                               configurable: true,
-                               enumerable: true,
-                               get: function () {
-                                       if ( uniqueTrace() ) {
-                                               mw.track( 'mw.deprecate', key );
-                                               mw.log.warn( msg );
-                                       }
-                                       return val;
-                               },
-                               set: function ( newVal ) {
-                                       if ( uniqueTrace() ) {
-                                               mw.track( 'mw.deprecate', key );
-                                               mw.log.warn( msg );
+                       // Support: Safari 5.0
+                       // Throws "not supported on DOM Objects" for Node or Element objects (incl. document)
+                       // Safari 4.0 doesn't have this method, and it was fixed in Safari 5.1.
+                       try {
+                               Object.defineProperty( obj, key, {
+                                       configurable: true,
+                                       enumerable: true,
+                                       get: function () {
+                                               if ( uniqueTrace() ) {
+                                                       mw.track( 'mw.deprecate', key );
+                                                       mw.log.warn( msg );
+                                               }
+                                               return val;
+                                       },
+                                       set: function ( newVal ) {
+                                               if ( uniqueTrace() ) {
+                                                       mw.track( 'mw.deprecate', key );
+                                                       mw.log.warn( msg );
+                                               }
+                                               val = newVal;
                                        }
-                                       val = newVal;
-                               }
-                       } );
-
+                               } );
+                       } catch ( err ) {
+                               obj[ key ] = val;
+                       }
                };
 
                return log;
                                }
                        }
 
+                       /**
+                        * Make a versioned key for a specific module.
+                        *
+                        * @private
+                        * @param {string} module Module name
+                        * @return {string|null} Module key in format '`[name]@[version]`',
+                        *  or null if the module does not exist
+                        */
+                       function getModuleKey( module ) {
+                               return hasOwn.call( registry, module ) ?
+                                       ( module + '@' + registry[ module ].version ) : null;
+                       }
+
+                       /**
+                        * @private
+                        * @param {string} key Module name or '`[name]@[version]`'
+                        * @return {Object}
+                        */
+                       function splitModuleKey( key ) {
+                               var index = key.indexOf( '@' );
+                               if ( index === -1 ) {
+                                       return { name: key };
+                               }
+                               return {
+                                       name: key.slice( 0, index ),
+                                       version: key.slice( index )
+                               };
+                       }
+
                        /* Public Members */
                        return {
                                /**
                                 * When #load() or #using() requests one or more modules, the server
                                 * response contain calls to this function.
                                 *
-                                * @param {string} module Name of module
+                                * @param {string} module Name of module and current module version. Formatted
+                                *  as '`[name]@[version]`". This version should match the requested version
+                                *  (from #batchRequest and #registry). This avoids race conditions (T117587).
+                                *  For back-compat with MediaWiki 1.27 and earlier, the version may be omitted.
                                 * @param {Function|Array|string} [script] Function with module code, list of URLs
                                 *  to load via `<script src>`, or string of module code for `$.globalEval()`.
                                 * @param {Object} [style] Should follow one of the following patterns:
                                 * @param {Object} [templates] List of key/value pairs to be added to mw#templates.
                                 */
                                implement: function ( module, script, style, messages, templates ) {
+                                       var split = splitModuleKey( module ),
+                                               name = split.name,
+                                               version = split.version;
                                        // Automatically register module
-                                       if ( !hasOwn.call( registry, module ) ) {
-                                               mw.loader.register( module );
+                                       if ( !hasOwn.call( registry, name ) ) {
+                                               mw.loader.register( name );
                                        }
                                        // Check for duplicate implementation
-                                       if ( hasOwn.call( registry, module ) && registry[ module ].script !== undefined ) {
-                                               throw new Error( 'module already implemented: ' + module );
+                                       if ( hasOwn.call( registry, name ) && registry[ name ].script !== undefined ) {
+                                               throw new Error( 'module already implemented: ' + name );
+                                       }
+                                       if ( version ) {
+                                               // Without this reset, if there is a version mismatch between the
+                                               // requested and received module version, then mw.loader.store would
+                                               // cache the response under the requested key. Thus poisoning the cache
+                                               // indefinitely with a stale value. (T117587)
+                                               registry[ name ].version = version;
                                        }
                                        // Attach components
-                                       registry[ module ].script = script || null;
-                                       registry[ module ].style = style || null;
-                                       registry[ module ].messages = messages || null;
-                                       registry[ module ].templates = templates || null;
+                                       registry[ name ].script = script || null;
+                                       registry[ name ].style = style || null;
+                                       registry[ name ].messages = messages || null;
+                                       registry[ name ].templates = templates || null;
                                        // The module may already have been marked as erroneous
-                                       if ( $.inArray( registry[ module ].state, [ 'error', 'missing' ] ) === -1 ) {
-                                               registry[ module ].state = 'loaded';
-                                               if ( allReady( registry[ module ].dependencies ) ) {
-                                                       execute( module );
+                                       if ( $.inArray( registry[ name ].state, [ 'error', 'missing' ] ) === -1 ) {
+                                               registry[ name ].state = 'loaded';
+                                               if ( allReady( registry[ name ].dependencies ) ) {
+                                                       execute( name );
                                                }
                                        }
                                },
 
                                        MODULE_SIZE_MAX: 100 * 1000,
 
-                                       // The contents of the store, mapping '[module name]@[version]' keys
+                                       // The contents of the store, mapping '[name]@[version]' keys
                                        // to module implementations.
                                        items: {},
 
                                                ].join( ':' );
                                        },
 
-                                       /**
-                                        * Get a key for a specific module. The key format is '[name]@[version]'.
-                                        *
-                                        * @param {string} module Module name
-                                        * @return {string|null} Module key or null if module does not exist
-                                        */
-                                       getModuleKey: function ( module ) {
-                                               return hasOwn.call( registry, module ) ?
-                                                       ( module + '@' + registry[ module ].version ) : null;
-                                       },
-
                                        /**
                                         * Initialize the store.
                                         *
                                                        return false;
                                                }
 
-                                               key = mw.loader.store.getModuleKey( module );
+                                               key = getModuleKey( module );
                                                if ( key in mw.loader.store.items ) {
                                                        mw.loader.store.stats.hits++;
                                                        return mw.loader.store.items[ key ];
                                                        return false;
                                                }
 
-                                               key = mw.loader.store.getModuleKey( module );
+                                               key = getModuleKey( module );
 
                                                if (
                                                        // Already stored a copy of this exact version
 
                                                try {
                                                        args = [
-                                                               JSON.stringify( module ),
+                                                               JSON.stringify( key ),
                                                                typeof descriptor.script === 'function' ?
                                                                        String( descriptor.script ) :
                                                                        JSON.stringify( descriptor.script ),
 
                                                for ( key in mw.loader.store.items ) {
                                                        module = key.slice( 0, key.indexOf( '@' ) );
-                                                       if ( mw.loader.store.getModuleKey( module ) !== key ) {
+                                                       if ( getModuleKey( module ) !== key ) {
                                                                mw.loader.store.stats.expired++;
                                                                delete mw.loader.store.items[ key ];
                                                        } else if ( mw.loader.store.items[ key ].length > mw.loader.store.MODULE_SIZE_MAX ) {
index 7bf73b6..0955c23 100644 (file)
@@ -10,8 +10,7 @@
                $tocList = $toc.find( 'ul' ).eq( 0 );
 
                // Hide/show the table of contents element
-               function toggleToc( e ) {
-                       e.preventDefault();
+               function toggleToc() {
                        if ( $tocList.is( ':hidden' ) ) {
                                $tocList.slideDown( 'fast' );
                                $tocToggleLink.text( mw.msg( 'hidetoc' ) );
                if ( $toc.length && $tocTitle.length && $tocList.length && !$tocToggleLink.length ) {
                        hideToc = mw.cookie.get( 'hidetoc' ) === '1';
 
-                       $tocToggleLink = $( '<a href="#" id="togglelink"></a>' )
+                       $tocToggleLink = $( '<a role="button" tabindex="0" id="togglelink"></a>' )
                                .text( mw.msg( hideToc ? 'showtoc' : 'hidetoc' ) )
-                               .click( toggleToc );
+                               .on( 'click keypress', function ( e ) {
+                                       if (
+                                               e.type === 'click' ||
+                                               e.type === 'keypress' && e.which === 13
+                                       ) {
+                                               toggleToc();
+                                       }
+                               } );
 
                        $tocTitle.append(
                                $tocToggleLink
index 3b2c86e..cf448b0 100644 (file)
 
                toggle = new OO.ui.ButtonWidget( {
                        framed: false,
-                       icon: 'imageGallery'
+                       icon: 'imageGallery',
+                       title: mw.msg( 'gallery-slideshow-toggle' )
                } ).on( 'click', this.toggleThumbnails.bind( this ) );
 
                interfaceElements = new OO.ui.PanelLayout( {
                // Show thumbnail stretched to the right size while the image loads
                this.$thumbnail = imageLi.find( 'img' );
                this.$img.attr( 'src', this.$thumbnail.attr( 'src' ) );
+               this.$img.attr( 'alt', this.$thumbnail.attr( 'alt' ) );
                this.$imgLink.attr( 'href', imageLi.find( 'a' ).eq( 0 ).attr( 'href' ) );
                this.setImageSize();
 
index f0eb12e..8eb1fd5 100644 (file)
@@ -4,6 +4,11 @@ use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 
 abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
+       // Version hash for a blank file module.
+       // Result of ResourceLoader::makeHash(), ResourceLoaderTestModule
+       // and ResourceLoaderFileModule::getDefinitionSummary().
+       const BLANK_VERSION = '09p30q0';
+
        /**
         * @param string $lang
         * @param string $dir
index f054c0e..0ff903f 100644 (file)
@@ -319,6 +319,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'LinkRenderer' => [ 'LinkRenderer', LinkRenderer::class ],
                        'LinkRendererFactory' => [ 'LinkRendererFactory', LinkRendererFactory::class ],
                        '_MediaWikiTitleCodec' => [ '_MediaWikiTitleCodec', MediaWikiTitleCodec::class ],
+                       'MimeAnalyzer' => [ 'MimeAnalyzer', MimeAnalyzer::class ],
                        'TitleFormatter' => [ 'TitleFormatter', TitleFormatter::class ],
                        'TitleParser' => [ 'TitleParser', TitleParser::class ],
                        'ProxyLookup' => [ 'ProxyLookup', ProxyLookup::class ],
diff --git a/tests/phpunit/includes/MimeMagicTest.php b/tests/phpunit/includes/MimeMagicTest.php
deleted file mode 100644 (file)
index e00cf0c..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-class MimeMagicTest extends PHPUnit_Framework_TestCase {
-
-       /** @var MimeMagic */
-       private $mimeMagic;
-
-       function setUp() {
-               $this->mimeMagic = MimeMagic::singleton();
-               parent::setUp();
-       }
-
-       /**
-        * @dataProvider providerImproveTypeFromExtension
-        * @param string $ext File extension (no leading dot)
-        * @param string $oldMime Initially detected MIME
-        * @param string $expectedMime MIME type after taking extension into account
-        */
-       function testImproveTypeFromExtension( $ext, $oldMime, $expectedMime ) {
-               $actualMime = $this->mimeMagic->improveTypeFromExtension( $oldMime, $ext );
-               $this->assertEquals( $expectedMime, $actualMime );
-       }
-
-       function providerImproveTypeFromExtension() {
-               return [
-                       [ 'gif', 'image/gif', 'image/gif' ],
-                       [ 'gif', 'unknown/unknown', 'unknown/unknown' ],
-                       [ 'wrl', 'unknown/unknown', 'model/vrml' ],
-                       [ 'txt', 'text/plain', 'text/plain' ],
-                       [ 'csv', 'text/plain', 'text/csv' ],
-                       [ 'tsv', 'text/plain', 'text/tab-separated-values' ],
-                       [ 'js', 'text/javascript', 'application/javascript' ],
-                       [ 'js', 'application/x-javascript', 'application/javascript' ],
-                       [ 'json', 'text/plain', 'application/json' ],
-                       [ 'foo', 'application/x-opc+zip', 'application/zip' ],
-                       [ 'docx', 'application/x-opc+zip',
-                               'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ],
-                       [ 'djvu', 'image/x-djvu', 'image/vnd.djvu' ],
-                       [ 'wav', 'audio/wav', 'audio/wav' ],
-               ];
-       }
-
-       /**
-        * Test to make sure that encoder=ffmpeg2theora doesn't trigger
-        * MEDIATYPE_VIDEO (bug 63584)
-        */
-       function testOggRecognize() {
-               $oggFile = __DIR__ . '/../data/media/say-test.ogg';
-               $actualType = $this->mimeMagic->getMediaType( $oggFile, 'application/ogg' );
-               $this->assertEquals( $actualType, MEDIATYPE_AUDIO );
-       }
-}
index f80f512..52e20bd 100644 (file)
@@ -50,7 +50,7 @@ class XmlSelectTest extends MediaWikiTestCase {
                        /**
                         * Values are set following a 3-bit Gray code where two successive
                         * values differ by only one value.
-                        * See http://en.wikipedia.org/wiki/Gray_code
+                        * See https://en.wikipedia.org/wiki/Gray_code
                         */
                        #      $name   $id    $default
                        [ false, false, false, '<select></select>' ],
index 97681eb..ea8c9ca 100644 (file)
@@ -188,7 +188,6 @@ class ApiLoginTest extends ApiTestCase {
                $this->assertArrayHasKey( "login", $data[0] );
                $this->assertArrayHasKey( "result", $data[0]['login'] );
                $this->assertEquals( "Success", $data[0]['login']['result'] );
-               $this->assertArrayHasKey( 'lgtoken', $data[0]['login'] );
        }
 
        public function testBotPassword() {
diff --git a/tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php b/tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php
new file mode 100644 (file)
index 0000000..85927a3
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+class MimeMagicTest extends PHPUnit_Framework_TestCase {
+       /** @var MimeAnalyzer */
+       private $mimeAnalyzer;
+
+       function setUp() {
+               global $IP;
+
+               $this->mimeAnalyzer = new MimeAnalyzer( [
+                       'infoFile' => $IP . "/includes/libs/mime/mime.info",
+                       'typeFile' => $IP . "/includes/libs/mime/mime.types",
+                       'xmlTypes' => [
+                               'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
+                               'svg' => 'image/svg+xml',
+                               'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
+                               'http://www.w3.org/1999/xhtml:html' => 'text/html', // application/xhtml+xml?
+                               'html' => 'text/html', // application/xhtml+xml?
+                       ]
+               ] );
+               parent::setUp();
+       }
+
+       /**
+        * @dataProvider providerImproveTypeFromExtension
+        * @param string $ext File extension (no leading dot)
+        * @param string $oldMime Initially detected MIME
+        * @param string $expectedMime MIME type after taking extension into account
+        */
+       function testImproveTypeFromExtension( $ext, $oldMime, $expectedMime ) {
+               $actualMime = $this->mimeAnalyzer->improveTypeFromExtension( $oldMime, $ext );
+               $this->assertEquals( $expectedMime, $actualMime );
+       }
+
+       function providerImproveTypeFromExtension() {
+               return [
+                       [ 'gif', 'image/gif', 'image/gif' ],
+                       [ 'gif', 'unknown/unknown', 'unknown/unknown' ],
+                       [ 'wrl', 'unknown/unknown', 'model/vrml' ],
+                       [ 'txt', 'text/plain', 'text/plain' ],
+                       [ 'csv', 'text/plain', 'text/csv' ],
+                       [ 'tsv', 'text/plain', 'text/tab-separated-values' ],
+                       [ 'js', 'text/javascript', 'application/javascript' ],
+                       [ 'js', 'application/x-javascript', 'application/javascript' ],
+                       [ 'json', 'text/plain', 'application/json' ],
+                       [ 'foo', 'application/x-opc+zip', 'application/zip' ],
+                       [ 'docx', 'application/x-opc+zip',
+                               'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ],
+                       [ 'djvu', 'image/x-djvu', 'image/vnd.djvu' ],
+                       [ 'wav', 'audio/wav', 'audio/wav' ],
+               ];
+       }
+
+       /**
+        * Test to make sure that encoder=ffmpeg2theora doesn't trigger
+        * MEDIATYPE_VIDEO (bug 63584)
+        */
+       function testOggRecognize() {
+               $oggFile = __DIR__ . '/../../../data/media/say-test.ogg';
+               $actualType = $this->mimeAnalyzer->getMediaType( $oggFile, 'application/ogg' );
+               $this->assertEquals( $actualType, MEDIATYPE_AUDIO );
+       }
+}
index f43a3f3..4e455f7 100644 (file)
@@ -252,7 +252,7 @@ class WANObjectCacheTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider getMultiWithSetCallback_provider
-        * @covers WANObjectCache::geMultitWithSetCallback()
+        * @covers WANObjectCache::getMultiWithSetCallback()
         * @covers WANObjectCache::makeMultiKeys()
         * @param array $extOpts
         * @param bool $versioned
index 6710b19..c491e6b 100644 (file)
@@ -210,10 +210,10 @@ class PreprocessorTest extends MediaWikiTestCase {
        public static function provideFiles() {
                // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                return self::addClassArg( [
-                       [ "QuoteQuran" ], # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC BY-SA by Striver
-                       [ "Factorial" ], # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC BY-SA by Polonium
-                       [ "All_system_messages" ], # http://tl.wiktionary.org/w/index.php?title=Suleras:All_system_messages&oldid=2765 GPL text generated by MediaWiki
-                       [ "Fundraising" ], # http://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC BY-SA, copied there by Sky Harbor.
+                       [ "QuoteQuran" ], # https://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC BY-SA by Striver
+                       [ "Factorial" ], # https://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC BY-SA by Polonium
+                       [ "All_system_messages" ], # https://tl.wiktionary.org/w/index.php?title=Suleras:All_system_messages&oldid=2765 GPL text generated by MediaWiki
+                       [ "Fundraising" ], # https://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC BY-SA, copied there by Sky Harbor.
                        [ "NestedTemplates" ], # bug 27936
                ] );
                // @codingStandardsIgnoreEnd
index 0965b9f..d2a0724 100644 (file)
@@ -5,6 +5,12 @@
  */
 class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
 
+       protected static function expandVariables( $text ) {
+               return strtr( $text, [
+                       '{blankVer}' => ResourceLoaderTestCase::BLANK_VERSION
+               ] );
+       }
+
        protected static function makeContext( $extraQuery = [] ) {
                $conf = new HashConfig( [
                        'ResourceLoaderSources' => [],
@@ -165,7 +171,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                        . '<script>(window.RLQ=window.RLQ||[]).push(function(){'
                        . 'mw.config.set({"key":"value"});'
                        . 'mw.loader.state({"test.exempt":"ready","test.private.top":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.scripts.top":"loading"});'
-                       . 'mw.loader.implement("test.private.top",function($,jQuery,require,module){},{"css":[]});'
+                       . 'mw.loader.implement("test.private.top@{blankVer}",function($,jQuery,require,module){},{"css":[]});'
                        . 'mw.loader.load(["test.top"]);'
                        . 'mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts.top\u0026only=scripts\u0026skin=fallback");'
                        . '});</script>' . "\n"
@@ -173,6 +179,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                        . '<style>.private{}</style>' . "\n"
                        . '<script async="" src="/w/load.php?debug=false&amp;lang=nl&amp;modules=startup&amp;only=scripts&amp;skin=fallback"></script>';
                // @codingStandardsIgnoreEnd
+               $expected = self::expandVariables( $expected );
 
                $this->assertEquals( $expected, $client->getHeadHtml() );
        }
@@ -197,11 +204,12 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
 
                // @codingStandardsIgnoreStart Generic.Files.LineLength
                $expected = '<script>(window.RLQ=window.RLQ||[]).push(function(){'
-                       . 'mw.loader.implement("test.private.bottom",function($,jQuery,require,module){},{"css":[]});'
+                       . 'mw.loader.implement("test.private.bottom@{blankVer}",function($,jQuery,require,module){},{"css":[]});'
                        . 'mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts\u0026only=scripts\u0026skin=fallback");'
                        . 'mw.loader.load(["test"]);'
                        . '});</script>';
                // @codingStandardsIgnoreEnd
+               $expected = self::expandVariables( $expected );
 
                $this->assertEquals( $expected, $client->getBodyHtml() );
        }
@@ -225,7 +233,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                                'context' => [],
                                'modules' => [ 'test.private.top' ],
                                'only' => ResourceLoaderModule::TYPE_COMBINED,
-                               'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.implement("test.private.top",function($,jQuery,require,module){},{"css":[]});});</script>',
+                               'output' => '<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.implement("test.private.top@{blankVer}",function($,jQuery,require,module){},{"css":[]});});</script>',
                        ],
                        [
                                'context' => [],
@@ -273,6 +281,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                $context = self::makeContext( $extraQuery );
                $context->getResourceLoader()->register( self::makeSampleModules() );
                $actual = ResourceLoaderClientHtml::makeLoad( $context, $modules, $type );
+               $expected = self::expandVariables( $expected );
                $this->assertEquals( $expected, (string)$actual );
        }
 }
index ab1323e..1b756be 100644 (file)
@@ -2,14 +2,9 @@
 
 class ResourceLoaderStartUpModuleTest extends ResourceLoaderTestCase {
 
-       // Version hash for a blank file module.
-       // Result of ResourceLoader::makeHash(), ResourceLoaderTestModule
-       // and ResourceLoaderFileModule::getDefinitionSummary().
-       protected static $blankVersion = '09p30q0';
-
        protected static function expandPlaceholders( $text ) {
                return strtr( $text, [
-                       '{blankVer}' => self::$blankVersion
+                       '{blankVer}' => self::BLANK_VERSION
                ] );
        }
 
index 206e608..9a1823b 100644 (file)
@@ -14,7 +14,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
         *  - berm
         *  - []LuCkY[]
         *  - Emperyan
-        * @see http://en.wikipedia.org/wiki/Dotted_and_dotless_I
+        * @see https://en.wikipedia.org/wiki/Dotted_and_dotless_I
         * @dataProvider provideDottedAndDotlessI
         * @covers Language::ucfirst
         * @covers Language::lcfirst
@@ -49,7 +49,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
                        [ 'lcfirst', 'i', 'lower', 'i' ],
 
                        # A real example taken from bug 28040 using
-                       # http://tr.wikipedia.org/wiki/%C4%B0Phone
+                       # https://tr.wikipedia.org/wiki/%C4%B0Phone
                        [ 'lcfirst', 'iPhone', 'lower', 'iPhone' ],
 
                        # next case is valid in Turkish but are different words if we
index 7133039..caaef83 100644 (file)
                );
                assert.htmlEqual(
                        formatParse( 'external-link-replace', function () {} ),
-                       'Foo <a href="#">bar</a>',
+                       'Foo <a role="button" tabindex="0">bar</a>',
                        'External link message processed as function when format is \'parse\''
                );
 
index b69c9e8..bfac513 100644 (file)
@@ -1,5 +1,12 @@
 ( function ( mw, $ ) {
-       QUnit.module( 'mediawiki (mw.loader)' );
+       QUnit.module( 'mediawiki (mw.loader)', QUnit.newMwEnvironment( {
+               setup: function () {
+                       mw.loader.store.enabled = false;
+               },
+               teardown: function () {
+                       mw.loader.store.enabled = false;
+               }
+       } ) );
 
        mw.loader.addSource(
                'testloader',
                } );
        } );
 
+       QUnit.test( 'Stale response caching - T117587', function ( assert ) {
+               var count = 0;
+               mw.loader.store.enabled = true;
+               mw.loader.register( 'test.stale', 'v2' );
+               assert.strictEqual( mw.loader.store.get( 'test.stale' ), false, 'Not in store' );
+
+               mw.loader.implement( 'test.stale@v1', function () {
+                       count++;
+               } );
+
+               return mw.loader.using( 'test.stale' )
+                       .then( function () {
+                               assert.strictEqual( count, 1 );
+                               assert.strictEqual( mw.loader.getState( 'test.stale' ), 'ready' );
+                               assert.ok( mw.loader.store.get( 'test.stale' ), 'In store' );
+                       } )
+                       .then( function () {
+                               // Reset run time, but keep mw.loader.store
+                               mw.loader.moduleRegistry[ 'test.stale' ].script = undefined;
+                               mw.loader.moduleRegistry[ 'test.stale' ].state = 'registered';
+                               mw.loader.moduleRegistry[ 'test.stale' ].version = 'v2';
+
+                               // Module was stored correctly as v1
+                               // On future navigations, it will be ignored until evicted
+                               assert.strictEqual( mw.loader.store.get( 'test.stale' ), false, 'Not in store' );
+                       } );
+       } );
+
+       QUnit.test( 'Stale response caching - backcompat', function ( assert ) {
+               var count = 0;
+               mw.loader.store.enabled = true;
+               mw.loader.register( 'test.stalebc', 'v2' );
+               assert.strictEqual( mw.loader.store.get( 'test.stalebc' ), false, 'Not in store' );
+
+               mw.loader.implement( 'test.stalebc', function () {
+                       count++;
+               } );
+
+               return mw.loader.using( 'test.stalebc' )
+                       .then( function () {
+                               assert.strictEqual( count, 1 );
+                               assert.strictEqual( mw.loader.getState( 'test.stalebc' ), 'ready' );
+                               assert.ok( mw.loader.store.get( 'test.stalebc' ), 'In store' );
+                       } )
+                       .then( function () {
+                               // Reset run time, but keep mw.loader.store
+                               mw.loader.moduleRegistry[ 'test.stalebc' ].script = undefined;
+                               mw.loader.moduleRegistry[ 'test.stalebc' ].state = 'registered';
+                               mw.loader.moduleRegistry[ 'test.stalebc' ].version = 'v2';
+
+                               // Legacy behaviour is storing under the expected version,
+                               // which woudl lead to whitewashing and stale values (T117587).
+                               assert.ok( mw.loader.store.get( 'test.stalebc' ), 'In store' );
+                       } );
+       } );
+
        QUnit.test( 'require()', 6, function ( assert ) {
                mw.loader.register( [
                        [ 'test.require1', '0' ],