Merge "Make Title::getFirstRevision() ignore the rev_timestamp index"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 29 Mar 2017 16:23:38 +0000 (16:23 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 29 Mar 2017 16:23:38 +0000 (16:23 +0000)
160 files changed:
RELEASE-NOTES-1.29
autoload.php
includes/Block.php
includes/CategoryFinder.php
includes/Defines.php
includes/MediaWiki.php
includes/MergeHistory.php
includes/Revision.php
includes/RevisionList.php
includes/SiteStats.php
includes/Title.php
includes/WatchedItemQueryService.php
includes/WatchedItemQueryServiceExtension.php
includes/WatchedItemStore.php
includes/actions/PurgeAction.php
includes/actions/ViewAction.php
includes/api/ApiBase.php
includes/api/ApiPageSet.php
includes/api/ApiPurge.php
includes/api/ApiQueryAllImages.php
includes/cache/BacklinkCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/localisation/LCStoreDB.php
includes/changes/ChangesListBooleanFilter.php
includes/changes/ChangesListStringOptionsFilterGroup.php
includes/changetags/ChangeTagsList.php
includes/changetags/ChangeTagsLogList.php
includes/changetags/ChangeTagsRevisionList.php
includes/db/CloneDatabase.php
includes/db/ORAResult.php
includes/deferred/AtomicSectionUpdate.php
includes/deferred/AutoCommitUpdate.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksDeletionUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/MWCallableUpdate.php
includes/deferred/SiteStatsUpdate.php
includes/deferred/SqlDataUpdate.php
includes/deferred/WANCacheReapUpdate.php
includes/export/WikiExporter.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/lockmanager/MySqlLockManager.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/LocalFile.php
includes/http/MWHttpRequest.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/i18n/br.json
includes/jobqueue/JobQueueDB.php
includes/jobqueue/utils/PurgeJobUtils.php
includes/libs/lockmanager/DBLockManager.php
includes/libs/rdbms/connectionmanager/ConnectionManager.php
includes/libs/rdbms/database/DBConnRef.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/IMaintainableDatabase.php
includes/libs/rdbms/database/MaintainableDBConnRef.php
includes/libs/rdbms/database/resultwrapper/ResultWrapper.php
includes/libs/rdbms/defines.php
includes/libs/rdbms/exception/DBConnectionError.php
includes/libs/rdbms/exception/DBError.php
includes/libs/rdbms/exception/DBExpectedError.php
includes/libs/rdbms/exception/DBQueryError.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/lbfactory/LBFactoryMulti.php
includes/libs/rdbms/lbfactory/LBFactorySimple.php
includes/libs/rdbms/lbfactory/LBFactorySingle.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php
includes/libs/rdbms/loadmonitor/LoadMonitor.php
includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/PageArchive.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/pager/IndexPager.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelArchiveList.php
includes/revisiondelete/RevDelArchivedFileList.php
includes/revisiondelete/RevDelFileItem.php
includes/revisiondelete/RevDelFileList.php
includes/revisiondelete/RevDelLogList.php
includes/revisiondelete/RevDelRevisionList.php
includes/revisiondelete/RevisionDeleteUser.php
includes/search/SearchDatabase.php
includes/search/SearchEngineFactory.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/ImageQueryPage.php
includes/specialpage/PageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/ImageListPager.php
includes/specials/pagers/NewFilesPager.php
includes/user/UserGroupMembership.php
includes/user/UserRightsProxy.php
includes/utils/BatchRowIterator.php
includes/utils/BatchRowWriter.php
languages/i18n/atj.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/he.json
languages/i18n/ja.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/oc.json
languages/i18n/pl.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sc.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/tr.json
languages/i18n/zh-hans.json
maintenance/Maintenance.php
maintenance/backup.inc
maintenance/cleanupRemovedModules.php
maintenance/purgeModuleDeps.php
maintenance/refreshLinks.php
maintenance/runBatchedQuery.php
maintenance/sql.php
resources/Resources.php
resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js [deleted file]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
tests/parser/DbTestRecorder.php
tests/parser/ParserTestRunner.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/http/HttpTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php

index bb57a9e..ab75375 100644 (file)
@@ -269,6 +269,9 @@ changes to languages because of Phabricator reports.
 * WikiRevision::$fileIsTemp was deprecated.
 * WikiRevision::$importer was deprecated.
 * WikiRevision::$user was deprecated.
+* Article::getLastPurgeTimestamp(), WikiPage::getLastPurgeTimestamp(), and the
+  WikiPage::PURGE_* constants are deprecated, and the functions will always
+  return false. They were a hack for an issue that has since been fixed.
 
 == Compatibility ==
 
index 4ffaa11..b53c7ae 100644 (file)
@@ -1596,9 +1596,11 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\FakeResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php',
        'Wikimedia\\Rdbms\\Field' => __DIR__ . '/includes/libs/rdbms/field/Field.php',
        'Wikimedia\\Rdbms\\IBlob' => __DIR__ . '/includes/libs/rdbms/encasing/IBlob.php',
+       'Wikimedia\\Rdbms\\IDatabase' => __DIR__ . '/includes/libs/rdbms/database/IDatabase.php',
        'Wikimedia\\Rdbms\\ILBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/ILBFactory.php',
        'Wikimedia\\Rdbms\\ILoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/ILoadBalancer.php',
        'Wikimedia\\Rdbms\\ILoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/ILoadMonitor.php',
+       'Wikimedia\\Rdbms\\IMaintainableDatabase' => __DIR__ . '/includes/libs/rdbms/database/IMaintainableDatabase.php',
        'Wikimedia\\Rdbms\\IResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php',
        'Wikimedia\\Rdbms\\LBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactory.php',
        'Wikimedia\\Rdbms\\LBFactoryMulti' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactoryMulti.php',
index cf6642a..b6b3ae0 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
 class Block {
index 504b35f..595cf95 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * The "CategoryFinder" class takes a list of articles, creates an internal
  * representation of all their parent categories (as well as parents of
index bd92ff0..6bc70ed 100644 (file)
@@ -24,6 +24,8 @@ require_once __DIR__ . '/libs/mime/defines.php';
 require_once __DIR__ . '/libs/rdbms/defines.php';
 require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @defgroup Constants MediaWiki constants
  */
index 521c02c..ef0563e 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use Psr\Log\LoggerInterface;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ChronologyProtector;
 use Wikimedia\Rdbms\LBFactory;
@@ -942,24 +943,45 @@ class MediaWiki {
                        $n = intval( $jobRunRate );
                }
 
-               $runJobsLogger = LoggerFactory::getInstance( 'runJobs' );
+               $logger = LoggerFactory::getInstance( 'runJobs' );
 
-               // Fall back to running the job(s) while the user waits if needed
-               if ( !$this->config->get( 'RunJobsAsync' ) ) {
-                       $runner = new JobRunner( $runJobsLogger );
-                       $runner->run( [ 'maxJobs' => $n ] );
-                       return;
-               }
-
-               // Do not send request if there are probably no jobs
                try {
-                       $group = JobQueueGroup::singleton();
-                       if ( !$group->queuesHaveJobs( JobQueueGroup::TYPE_DEFAULT ) ) {
-                               return;
+                       if ( $this->config->get( 'RunJobsAsync' ) ) {
+                               // Send an HTTP request to the job RPC entry point if possible
+                               $invokedWithSuccess = $this->triggerAsyncJobs( $n, $logger );
+                               if ( !$invokedWithSuccess ) {
+                                       // Fall back to blocking on running the job(s)
+                                       $logger->warning( "Jobs switched to blocking; Special:RunJobs disabled" );
+                                       $this->triggerSyncJobs( $n, $logger );
+                               }
+                       } else {
+                               $this->triggerSyncJobs( $n, $logger );
                        }
                } catch ( JobQueueError $e ) {
+                       // Do not make the site unavailable (T88312)
                        MWExceptionHandler::logException( $e );
-                       return; // do not make the site unavailable
+               }
+       }
+
+       /**
+        * @param integer $n Number of jobs to try to run
+        * @param LoggerInterface $runJobsLogger
+        */
+       private function triggerSyncJobs( $n, LoggerInterface $runJobsLogger ) {
+               $runner = new JobRunner( $runJobsLogger );
+               $runner->run( [ 'maxJobs' => $n ] );
+       }
+
+       /**
+        * @param integer $n Number of jobs to try to run
+        * @param LoggerInterface $runJobsLogger
+        * @return bool Success
+        */
+       private function triggerAsyncJobs( $n, LoggerInterface $runJobsLogger ) {
+               // Do not send request if there are probably no jobs
+               $group = JobQueueGroup::singleton();
+               if ( !$group->queuesHaveJobs( JobQueueGroup::TYPE_DEFAULT ) ) {
+                       return true;
                }
 
                $query = [ 'title' => 'Special:RunJobs',
@@ -1026,12 +1048,6 @@ class MediaWiki {
                        $runJobsLogger->error( "Failed to start cron API (socket error $errno): $errstr" );
                }
 
-               // Fall back to running the job(s) while the user waits if needed
-               if ( !$invokedWithSuccess ) {
-                       $runJobsLogger->warning( "Jobs switched to blocking; Special:RunJobs disabled" );
-
-                       $runner = new JobRunner( $runJobsLogger );
-                       $runner->run( [ 'maxJobs'  => $n ] );
-               }
+               return $invokedWithSuccess;
        }
 }
index 8cf3af1..cc589c9 100644 (file)
@@ -25,6 +25,7 @@
  * @file
  */
 use Wikimedia\Timestamp\TimestampException;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Handles the backend logic of merging the histories of two
index 486abd8..bae974f 100644 (file)
@@ -19,6 +19,8 @@
  *
  * @file
  */
+
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
index d909a65..ccdedb8 100644 (file)
@@ -22,6 +22,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * List for revision table items for a single page
@@ -36,7 +37,7 @@ abstract class RevisionListBase extends ContextSource implements Iterator {
        /** @var ResultWrapper|bool */
        protected $res;
 
-       /** @var bool|object */
+       /** @var bool|Revision */
        protected $current;
 
        /**
index 105a581..bc6b842 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Static accessor class for site_stats and related things
  */
index 0c5835c..98d5e0a 100644 (file)
@@ -21,6 +21,8 @@
  *
  * @file
  */
+
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\Interwiki\InterwikiLookup;
 use MediaWiki\MediaWikiServices;
index bc57049..ba77074 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\LoadBalancer;
index 6301576..93d5033 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Extension mechanism for WatchedItemQueryService
index caa3fdb..70fdbf1 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
 use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
index 942b731..b2002ff 100644 (file)
@@ -42,7 +42,7 @@ class PurgeAction extends FormAction {
        }
 
        public function onSubmit( $data ) {
-               return $this->page->doPurge( WikiPage::PURGE_ALL );
+               return $this->page->doPurge();
        }
 
        public function show() {
index 0ba964f..134b8a4 100644 (file)
@@ -58,9 +58,6 @@ class ViewAction extends FormlessAction {
                                $touched = null;
                        }
 
-                       // If a page was purged on HTTP GET, relect that timestamp to avoid sending 304s
-                       $touched = max( $touched, $this->page->getLastPurgeTimestamp() );
-
                        // Send HTTP 304 if the IMS matches or otherwise set expiry/last-modified headers
                        if ( $touched && $this->getOutput()->checkLastModified( $touched ) ) {
                                wfDebug( __METHOD__ . ": done 304\n" );
index c03faf0..fec4234 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * This abstract class implements many basic API functions, and is the base of
  * all API classes.
index 7d16af8..85c6860 100644 (file)
@@ -25,6 +25,7 @@
  */
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * This class contains a list of pages that the client has requested.
index 3124638..407497e 100644 (file)
@@ -56,7 +56,7 @@ class ApiPurge extends ApiBase {
                        $page = WikiPage::factory( $title );
                        if ( !$user->pingLimiter( 'purge' ) ) {
                                // Directly purge and skip the UI part of purge()
-                               $page->doPurge( WikiPage::PURGE_ALL );
+                               $page->doPurge();
                                $r['purged'] = true;
                        } else {
                                $this->addWarning( 'apierror-ratelimited' );
index ef6bb6a..8ce122c 100644 (file)
@@ -26,6 +26,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Query module to enumerate all available pages.
  *
@@ -85,6 +87,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                $db = $this->getDB();
 
                $params = $this->extractRequestParams();
+               $userId = !is_null( $params['user'] ) ? User::idFromName( $params['user'] ) : null;
 
                // Table and return fields
                $this->addTables( 'image' );
@@ -189,7 +192,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
                        // Image filters
                        if ( !is_null( $params['user'] ) ) {
-                               $this->addWhereFld( 'img_user_text', $params['user'] );
+                               if ( $userId ) {
+                                       $this->addWhereFld( 'img_user', $userId );
+                               } else {
+                                       $this->addWhereFld( 'img_user_text', $params['user'] );
+                               }
                        }
                        if ( $params['filterbots'] != 'all' ) {
                                $this->addTables( 'user_groups' );
@@ -269,7 +276,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                if ( $params['sort'] == 'timestamp' ) {
                        $this->addOption( 'ORDER BY', 'img_timestamp' . $sortFlag );
                        if ( !is_null( $params['user'] ) ) {
-                               $this->addOption( 'USE INDEX', [ 'image' => 'img_usertext_timestamp' ] );
+                               if ( $userId ) {
+                                       $this->addOption( 'USE INDEX', [ 'image' => 'img_user_timestamp' ] );
+                               } else {
+                                       $this->addOption( 'USE INDEX', [ 'image' => 'img_usertext_timestamp' ] );
+                               }
                        } else {
                                $this->addOption( 'USE INDEX', [ 'image' => 'img_timestamp' ] );
                        }
index 0a07a93..7215606 100644 (file)
@@ -28,6 +28,7 @@
 
 use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class for fetching backlink lists, approximate backlink counts and
index 77ab2d5..57d4581 100644 (file)
@@ -23,6 +23,7 @@
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class representing a list of titles
index b720dec..57f66f1 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Cache
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 
index e7e2d10..52611ec 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * LCStore implementation which uses the standard DB functions to store data.
  * This will work on any MediaWiki installation.
index b6be1f9..d0c4b77 100644 (file)
@@ -22,6 +22,8 @@
  * @author Matthew Flaschen
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * An individual filter in a boolean group
  *
index befc213..86ae33f 100644 (file)
@@ -22,6 +22,8 @@
  * @author Matthew Flaschen
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Represents a filter group with multiple string options. They are passed to the server as
  * a single form parameter separated by a delimiter.  The parameter name is the
index dd8bab9..a37f5f2 100644 (file)
@@ -49,8 +49,9 @@ abstract class ChangeTagsList extends RevisionListBase {
                                $className = 'ChangeTagsLogList';
                                break;
                        default:
-                               throw new Exception( "Class $className requested, but does not exist" );
+                               throw new Exception( "Class $typeName requested, but does not exist" );
                }
+
                return new $className( $context, $title, $ids );
        }
 
index 480aace..271005f 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Change tagging
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Stores a list of taggable log entries.
  * @since 1.25
index 8eae238..a0248c6 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Change tagging
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Stores a list of taggable revisions.
  * @since 1.25
index c4921e2..809b660 100644 (file)
@@ -24,6 +24,7 @@
  * @ingroup Database
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 class CloneDatabase {
        /** @var string Table prefix for cloning */
index 07c6fc7..fbbc962 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * The oci8 extension is fairly weak and doesn't support oci_num_rows, among
  * other things. We use a wrapper class to handle that and other
index 6585575..8b62989 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Deferrable Update for closure/callback updates via IDatabase::doAtomicSection()
  * @since 1.27
index d61dec2..f9297af 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Deferrable Update for closure/callback updates that should use auto-commit mode
  * @since 1.28
index 0a9755d..bbe8687 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\LBFactory;
 use Wikimedia\Rdbms\LoadBalancer;
index 7215696..ca29078 100644 (file)
@@ -21,6 +21,7 @@
  */
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Update object handling the cleanup of links tables after a page was deleted.
index 0133f19..5697960 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
index 5247e97..5b822af 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Deferrable Update for closure/callback
  */
index 7426624..aefa7f5 100644 (file)
@@ -19,6 +19,7 @@
  */
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Assert\Assert;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class for handling updates to the site_stats table
index 25e8841..2411bef 100644 (file)
@@ -21,6 +21,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @deprecated Since 1.28 Use DataUpdate directly, injecting the database
  */
index 33ddc59..b12af19 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use Psr\Log\LoggerInterface;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class for fixing stale WANObjectCache keys using a purge event source
index e41ab54..a307468 100644 (file)
@@ -28,6 +28,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup SpecialPage Dump
index d907c30..0b7c5b6 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * DB accessable external objects.
index 62e635d..d09c245 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Version of FileJournal that logs to a DB table
index 5936e7d..8510d0c 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * MySQL version of DBLockManager that supports shared locks.
  *
index 3e88508..29c017c 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup FileRepo
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A foreign repository with an accessible MediaWiki database
  *
index d5e29ab..9c92bc0 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A repository that stores files in the local filesystem and registers them
index a633fd2..c109fba 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use \MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class to represent a local file in the wiki's own database
index 8d58ce5..88cc510 100644 (file)
@@ -609,19 +609,17 @@ class MWHttpRequest implements LoggerAwareInterface {
                                }
                        }
 
-                       if ( $foundRelativeURI ) {
-                               if ( $domain ) {
-                                       return $domain . $locations[$countLocations - 1];
-                               } else {
-                                       $url = parse_url( $this->url );
-                                       if ( isset( $url['host'] ) ) {
-                                               return $url['scheme'] . '://' . $url['host'] .
-                                                       $locations[$countLocations - 1];
-                                       }
-                               }
-                       } else {
+                       if ( !$foundRelativeURI ) {
                                return $locations[$countLocations - 1];
                        }
+                       if ( $domain ) {
+                               return $domain . $locations[$countLocations - 1];
+                       }
+                       $url = parse_url( $this->url );
+                       if ( isset( $url['host'] ) ) {
+                               return $url['scheme'] . '://' . $url['host'] .
+                                       $locations[$countLocations - 1];
+                       }
                }
 
                return $this->url;
index 0305535..22717fc 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Deployment
  */
 use Wikimedia\Rdbms\LBFactorySingle;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Base class for DBMS-specific installation helper classes.
index 98d354c..8913c77 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Deployment
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
 require_once __DIR__ . '/../../maintenance/Maintenance.php';
index 69d8f78..9aa9572 100644 (file)
        "config-db-install-help": "Merkañ anv an implijer hag ar ger-tremen a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad an argerzh staliañ.",
        "config-db-account-lock": "Implijout ar memes anv implijer ha ger-tremen e-kerzh oberiadurioù boutin",
        "config-db-wiki-account": "Kont implijer evit oberiadurioù boutin",
+       "config-db-wiki-help": "Merkañ an anv-implijer hag ar ger-tremen a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad oberiadurioù normal ar wiki.\nMa n'eus ket eus ar gont ha ma'z eus gwirioù a-walc'h gant ar gont staliañ, e vo krouet ar gont implijer-mañ gant al live gwirioù rekis izelañ evit gallout lakaat ar wiki da vont en-dro.",
        "config-db-prefix": "Rakrann taolennoù an diaz roadennoù :",
+       "config-db-prefix-help": "Mard eo ret deoc'h rannañ un diaz roadennoù gant meur a wiki, pe etre MediaWiki hag un arload benak all e c'hallit dibab ouzhpennañ ur rakger da holl anvioù an taolennoù kuit na vije tabutoù.\nArabat ober gant esaouennoù.\n\nPeurliesañ e vez laosket goullo ar vaezienn-mañ.",
        "config-mysql-old": "Rekis eo MySQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.",
        "config-db-port": "Porzh an diaz roadennoù :",
        "config-db-schema": "Brastres evit MediaWiki",
        "config-db-schema-help": "Peurliesañ e vo digudenn ar chema-mañ.\nArabat cheñch anezho ma n'hoc'h eus ket ezhomm d'en ober.",
        "config-pg-test-error": "N'haller ket kevreañ ouzh an diaz-titouroù '''$1''' : $2",
        "config-sqlite-dir": "Kavlec'h roadennoù SQLite :",
+       "config-sqlite-dir-help": "Stokañ a ra SQLite an holl roadennoù en ur restr nemetken.\n\nE-pad ar staliañ, rankout a ra ar servijer web gallout skrivañ er c'havlec'h pourchaset ganeoc'h.\n\nNe zlefe <strong>ket</strong> bezañ tizhadus dre ar web; setu perak ne lakaomp ket anezhañ el lec'h m'emañ ho restroù PHP.\n\nSkivañ a raio ar stalier ur restr <code>.htaccess</code> war un dro gantañ met ma c'hoarvez ur fazi e c'hallfe unan bennak tapout krog en ho roadennoù.\nKement-se a sell ouzh ar roadennoù implijer (chomlec'hioù postel, gerioù-tremen hachet) hag ouzh an adweladennoù diverket ha takadoù gwarzeet all eus ar wiki.\n\nEn em soñjit ha ne vefe ket gwelloc'h lakaat an diaz roadennoù en un tu bennak all, da skouer e <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Esaouenn stokañ (\"tablespace\") dre ziouer :",
        "config-oracle-temp-ts": "Esaouenn stokañ (''tablespace'') da c'hortoz :",
        "config-type-mysql": "MySQL (pe kenglotus)",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "Skoret eo ar reizhiadoù diaz titouroù da-heul gant MediaWiki :\n\n$1\n\nMa ne welit ket amañ dindan ar reizhiad diaz titouroù a fell deoc'h ober ganti, heuilhit an titouroù a-us (s.o. al liammoù) evit gweredekaat ar skorañ.",
-       "config-dbsupport-mysql": "* $1 eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ ([http://www.php.net/manual/en/mysql.installation.php penaos kempunañ PHP gant skor MySQL])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ. Mont a ra MediaWiki en-dro gant [{{int:version-db-mariadb-url}} MariaDB] ha [{{int:version-db-percona-url}} Percona Server] ivez, kenglotus o-daou gant MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Penaos kempunañ PHP gant skor MySQL])",
        "config-dbsupport-postgres": "* Ur reizhiad diaz titouroù brudet ha digor eo $1. Gallout a ra ober evit MySQL ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL]). Gallout a ra bezañ un nebeud drein bihan enni ha n'eo ket erbedet he implijout en un endro produiñ.",
        "config-dbsupport-sqlite": "* $1 zo ur reizhiad diaz titouroù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
        "config-dbsupport-oracle": "* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])",
index 2f58947..8c4017b 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @author Aaron Schulz
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
index d76d866..ba80c8e 100644 (file)
@@ -20,6 +20,7 @@
  *
  * @file
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
 class PurgeJobUtils {
index b17b1a0..8ef8196 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup LockManager
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Version of LockManager based on using named/row DB locks.
  *
index fc00965..4e42476 100644 (file)
@@ -4,7 +4,6 @@ namespace Wikimedia\Rdbms;
 
 use Database;
 use DBConnRef;
-use IDatabase;
 use InvalidArgumentException;
 
 /**
index fc3ebe0..e96fe5b 100644 (file)
@@ -3,6 +3,7 @@
 use Wikimedia\Rdbms\DatabaseDomain;
 use Wikimedia\Rdbms\ILoadBalancer;
 use Wikimedia\Rdbms\DBMasterPos;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Helper class to handle automatically marking connections as reusable (via RAII pattern)
index 92adaf9..beb38bc 100644 (file)
@@ -33,6 +33,8 @@ use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\DBMasterPos;
 use Wikimedia\Rdbms\Blob;
 use Wikimedia\Timestamp\ConvertibleTimestamp;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
  * Relational database abstraction object
@@ -366,7 +368,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                $class = 'Database' . ucfirst( $driver );
-               if ( class_exists( $class ) && is_subclass_of( $class, 'IDatabase' ) ) {
+               if ( class_exists( $class ) && is_subclass_of( $class, IDatabase::class ) ) {
                        // Resolve some defaults for b/c
                        $p['host'] = isset( $p['host'] ) ? $p['host'] : false;
                        $p['user'] = isset( $p['user'] ) ? $p['user'] : false;
index 6bc870b..0b146cd 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
 use Wikimedia\ScopedCallback;
-use Wikimedia\Rdbms\Blob;
-use Wikimedia\Rdbms\LikeMatch;
-use Wikimedia\Rdbms\DBMasterPos;
-use Wikimedia\Rdbms\Field;
-use Wikimedia\Rdbms\IResultWrapper;
+use DBError;
+use DBConnectionError;
+use DBUnexpectedError;
+use DBQueryError;
+use Exception;
+use RuntimeException;
+use UnexpectedValueException;
+use stdClass;
 
 /**
  * Basic database interface for live and lazy-loaded relation database handles
@@ -1802,3 +1807,5 @@ interface IDatabase {
         */
        public function setTableAliases( array $aliases );
 }
+
+class_alias( 'Wikimedia\Rdbms\IDatabase', 'IDatabase' );
index 43cec28..138cf2d 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
+use Exception;
+use RuntimeException;
+use DBUnexpectedError;
 
 /**
  * Advanced database interface for IDatabase handles that include maintenance methods
@@ -206,3 +211,5 @@ interface IMaintainableDatabase extends IDatabase {
                $oldName, $newName, $temporary = false, $fname = __METHOD__
        );
 }
+
+class_alias( 'Wikimedia\Rdbms\IMaintainableDatabase', 'IMaintainableDatabase' );
index fa3ddf9..b5ff575 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Helper class to handle automatically marking connections as reusable (via RAII pattern)
  * as well handling deferring the actual network connection until the handle is used
index c3367e7..cbc8ca3 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use Wikimedia\Rdbms\ILoadBalancer;
+use Wikimedia\Rdbms\IDatabase;
 
 /**@{
  * Database related constants
index 47f8c96..dca1302 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup Database
index 526596d..226c675 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Database error base class
index 7d303b1..57538a8 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Base class for the more common types of database errors. These are known to occur
index 002d253..b4c3d52 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup Database
index f05dabc..86547b9 100644 (file)
@@ -30,7 +30,6 @@ use EmptyBagOStuff;
 use WANObjectCache;
 use Exception;
 use RuntimeException;
-use IDatabase;
 use DBTransactionError;
 use DBReplicationWaitError;
 
@@ -508,7 +507,8 @@ abstract class LBFactory implements ILBFactory {
                        'errorLogger' => $this->errorLogger,
                        'hostname' => $this->hostname,
                        'cliMode' => $this->cliMode,
-                       'agent' => $this->agent
+                       'agent' => $this->agent,
+                       'chronologyProtector' => $this->getChronologyProtector()
                ];
        }
 
index 447b96f..0384588 100644 (file)
@@ -23,7 +23,6 @@
 
 namespace Wikimedia\Rdbms;
 
-use IDatabase;
 use InvalidArgumentException;
 
 /**
@@ -252,9 +251,7 @@ class LBFactoryMulti extends LBFactory {
        public function getMainLB( $domain = false ) {
                $section = $this->getSectionForDomain( $domain );
                if ( !isset( $this->mainLBs[$section] ) ) {
-                       $lb = $this->newMainLB( $domain );
-                       $this->getChronologyProtector()->initLB( $lb );
-                       $this->mainLBs[$section] = $lb;
+                       $this->mainLBs[$section] = $this->newMainLB( $domain );
                }
 
                return $this->mainLBs[$section];
@@ -283,7 +280,6 @@ class LBFactoryMulti extends LBFactory {
        public function getExternalLB( $cluster ) {
                if ( !isset( $this->extLBs[$cluster] ) ) {
                        $this->extLBs[$cluster] = $this->newExternalLB( $cluster );
-                       $this->getChronologyProtector()->initLB( $this->extLBs[$cluster] );
                }
 
                return $this->extLBs[$cluster];
index 15cd508..df0a806 100644 (file)
@@ -89,7 +89,6 @@ class LBFactorySimple extends LBFactory {
        public function getMainLB( $domain = false ) {
                if ( !isset( $this->mainLB ) ) {
                        $this->mainLB = $this->newMainLB( $domain );
-                       $this->getChronologyProtector()->initLB( $this->mainLB );
                }
 
                return $this->mainLB;
@@ -106,7 +105,6 @@ class LBFactorySimple extends LBFactory {
        public function getExternalLB( $cluster ) {
                if ( !isset( $this->extLBs[$cluster] ) ) {
                        $this->extLBs[$cluster] = $this->newExternalLB( $cluster );
-                       $this->getChronologyProtector()->initLB( $this->extLBs[$cluster] );
                }
 
                return $this->extLBs[$cluster];
index 5931d80..cd998c3 100644 (file)
@@ -23,7 +23,6 @@
 
 namespace Wikimedia\Rdbms;
 
-use IDatabase;
 use InvalidArgumentException;
 use BadMethodCallException;
 
index 4c277ff..0b37551 100644 (file)
@@ -23,7 +23,6 @@
  */
 namespace Wikimedia\Rdbms;
 
-use IDatabase;
 use Database;
 use DBConnRef;
 use MaintainableDBConnRef;
@@ -105,6 +104,7 @@ interface ILoadBalancer {
         *  - srvCache : BagOStuff object for server cache [optional]
         *  - memCache : BagOStuff object for cluster memory cache [optional]
         *  - wanCache : WANObjectCache object [optional]
+        *  - chronologyProtector: ChronologyProtector object [optional]
         *  - hostname : The name of the current server [optional]
         *  - cliMode: Whether the execution context is a CLI script. [optional]
         *  - profiler : Class name or instance with profileIn()/profileOut() methods. [optional]
@@ -138,7 +138,7 @@ interface ILoadBalancer {
         * If a DB_REPLICA connection has been opened already, then wait immediately.
         * Otherwise sets a variable telling it to wait if such a connection is opened.
         *
-        * @param DBMasterPos $pos
+        * @param DBMasterPos|bool $pos Master position or false
         */
        public function waitFor( $pos );
 
@@ -147,7 +147,7 @@ interface ILoadBalancer {
         *
         * This can be used a faster proxy for waitForAll()
         *
-        * @param DBMasterPos $pos
+        * @param DBMasterPos|bool $pos Master position or false
         * @param int $timeout Max seconds to wait; default is mWaitTimeout
         * @return bool Success (able to connect and no timeouts reached)
         */
@@ -156,7 +156,7 @@ interface ILoadBalancer {
        /**
         * Set the master wait position and wait for ALL replica DBs to catch up to it
         *
-        * @param DBMasterPos $pos
+        * @param DBMasterPos|bool $pos Master position or false
         * @param int $timeout Max seconds to wait; default is mWaitTimeout
         * @return bool Success (able to connect and no timeouts reached)
         */
index 6878712..116a4e6 100644 (file)
@@ -25,7 +25,6 @@ namespace Wikimedia\Rdbms;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Wikimedia\ScopedCallback;
-use IDatabase;
 use Database;
 use DBConnRef;
 use MaintainableDBConnRef;
@@ -69,6 +68,8 @@ class LoadBalancer implements ILoadBalancer {
 
        /** @var ILoadMonitor */
        private $loadMonitor;
+       /** @var ChronologyProtector|null */
+       private $chronProt;
        /** @var BagOStuff */
        private $srvCache;
        /** @var BagOStuff */
@@ -124,6 +125,8 @@ class LoadBalancer implements ILoadBalancer {
 
        /** @var boolean */
        private $disabled = false;
+       /** @var boolean */
+       private $chronProtInitialized = false;
 
        /** @var integer Warn when this many connection are held */
        const CONN_HELD_WARN_THRESHOLD = 10;
@@ -222,6 +225,10 @@ class LoadBalancer implements ILoadBalancer {
                        : ( gethostname() ?: 'unknown' );
                $this->cliMode = isset( $params['cliMode'] ) ? $params['cliMode'] : PHP_SAPI === 'cli';
                $this->agent = isset( $params['agent'] ) ? $params['agent'] : '';
+
+               if ( isset( $params['chronologyProtector'] ) ) {
+                       $this->chronProt = $params['chronologyProtector'];
+               }
        }
 
        /**
@@ -424,21 +431,24 @@ class LoadBalancer implements ILoadBalancer {
                return $i;
        }
 
-       /**
-        * @param DBMasterPos|false $pos
-        */
        public function waitFor( $pos ) {
+               $oldPos = $this->mWaitForPos;
                $this->mWaitForPos = $pos;
-               $i = $this->mReadIndex;
 
+               // If a generic reader connection was already established, then wait now
+               $i = $this->mReadIndex;
                if ( $i > 0 ) {
                        if ( !$this->doWait( $i ) ) {
                                $this->laggedReplicaMode = true;
                        }
                }
+
+               // Restore the older position if it was higher
+               $this->setWaitForPositionIfHigher( $oldPos );
        }
 
        public function waitForOne( $pos, $timeout = null ) {
+               $oldPos = $this->mWaitForPos;
                $this->mWaitForPos = $pos;
 
                $i = $this->mReadIndex;
@@ -456,10 +466,14 @@ class LoadBalancer implements ILoadBalancer {
                        $ok = true; // no applicable loads
                }
 
+               // Restore the older position if it was higher
+               $this->setWaitForPositionIfHigher( $oldPos );
+
                return $ok;
        }
 
        public function waitForAll( $pos, $timeout = null ) {
+               $oldPos = $this->mWaitForPos;
                $this->mWaitForPos = $pos;
                $serverCount = count( $this->mServers );
 
@@ -470,9 +484,25 @@ class LoadBalancer implements ILoadBalancer {
                        }
                }
 
+               // Restore the older position if it was higher
+               $this->setWaitForPositionIfHigher( $oldPos );
+
                return $ok;
        }
 
+       /**
+        * @param DBMasterPos|bool $pos
+        */
+       private function setWaitForPositionIfHigher( $pos ) {
+               if ( !$pos ) {
+                       return;
+               }
+
+               if ( !$this->mWaitForPos || $pos->hasReached( $this->mWaitForPos ) ) {
+                       $this->mWaitForPos = $pos;
+               }
+       }
+
        /**
         * @param int $i
         * @return IDatabase|bool
@@ -718,6 +748,13 @@ class LoadBalancer implements ILoadBalancer {
                        $domain = false; // local connection requested
                }
 
+               if ( !$this->chronProtInitialized && $this->chronProt ) {
+                       $this->connLogger->debug( __METHOD__ . ': calling initLB() before first connection.' );
+                       // Load CP positions before connecting so that doWait() triggers later if needed
+                       $this->chronProtInitialized = true;
+                       $this->chronProt->initLB( $this );
+               }
+
                if ( $domain !== false ) {
                        $conn = $this->openForeignConnection( $i, $domain );
                } elseif ( isset( $this->mConns['local'][$i][0] ) ) {
index 5e92c33..d120b6f 100644 (file)
@@ -24,7 +24,6 @@ namespace Wikimedia\Rdbms;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Wikimedia\ScopedCallback;
-use IDatabase;
 use BagOStuff;
 
 /**
index c9f1345..1c5899b 100644 (file)
@@ -28,6 +28,8 @@
  * @since 1.19
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Interface for log entries. Every log entry has these methods.
  *
index 4382910..317652a 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 class LogEventsList extends ContextSource {
        const NO_ACTION_LINK = 1;
index 07581d7..8f94374 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Cache
  */
 
+use Wikimedia\Rdbms\IDatabase;
 use \MediaWiki\MediaWikiServices;
 use \Wikimedia\WaitConditionLoop;
 use \Wikimedia\Rdbms\TransactionProfiler;
index cb97126..6067649 100644 (file)
@@ -2043,16 +2043,20 @@ class Article implements Page {
        /**
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::doPurge
+        * @note In 1.28 (and only 1.28), this took a $flags parameter that
+        *  controlled how much purging was done.
         */
-       public function doPurge( $flags = WikiPage::PURGE_ALL ) {
-               return $this->mPage->doPurge( $flags );
+       public function doPurge() {
+               return $this->mPage->doPurge();
        }
 
        /**
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::getLastPurgeTimestamp
+        * @deprecated since 1.29
         */
        public function getLastPurgeTimestamp() {
+               wfDeprecated( __METHOD__, '1.29' );
                return $this->mPage->getLastPurgeTimestamp();
        }
 
index 388e693..c2bfb07 100644 (file)
@@ -20,6 +20,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Used to show archived pages and eventually restore them.
index e4b524b..66fadf5 100644 (file)
@@ -164,9 +164,12 @@ class WikiFilePage extends WikiPage {
                return $this->mDupes;
        }
 
-       public function doPurge( $flags = self::PURGE_ALL ) {
+       /**
+        * Override handling of action=purge
+        * @return bool
+        */
+       public function doPurge() {
                $this->loadFile();
-
                if ( $this->mFile->exists() ) {
                        wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
                        DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->mTitle, 'imagelinks' ) );
@@ -182,8 +185,7 @@ class WikiFilePage extends WikiPage {
                        // Purge redirect cache
                        $this->mRepo->invalidateImageRedirect( $this->mTitle );
                }
-
-               return parent::doPurge( $flags );
+               return parent::doPurge();
        }
 
        /**
index 1d5973b..f2f5781 100644 (file)
@@ -23,6 +23,7 @@
 use \MediaWiki\Logger\LoggerFactory;
 use \MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class representing a MediaWiki article and history.
@@ -84,9 +85,10 @@ class WikiPage implements Page, IDBAccessObject {
         */
        protected $mLinksUpdated = '19700101000000';
 
-       const PURGE_CDN_CACHE = 1; // purge CDN cache for page variant URLs
-       const PURGE_CLUSTER_PCACHE = 2; // purge parser cache in the local datacenter
-       const PURGE_GLOBAL_PCACHE = 4; // set page_touched to clear parser cache in all datacenters
+       /** @deprecated since 1.29. Added in 1.28 for partial purging, no longer used. */
+       const PURGE_CDN_CACHE = 1;
+       const PURGE_CLUSTER_PCACHE = 2;
+       const PURGE_GLOBAL_PCACHE = 4;
        const PURGE_ALL = 7;
 
        /**
@@ -1120,10 +1122,11 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Perform the actions of a page purging
-        * @param integer $flags Bitfield of WikiPage::PURGE_* constants
         * @return bool
+        * @note In 1.28 (and only 1.28), this took a $flags parameter that
+        *  controlled how much purging was done.
         */
-       public function doPurge( $flags = self::PURGE_ALL ) {
+       public function doPurge() {
                // Avoid PHP 7.1 warning of passing $this by reference
                $wikiPage = $this;
 
@@ -1131,30 +1134,15 @@ class WikiPage implements Page, IDBAccessObject {
                        return false;
                }
 
-               if ( ( $flags & self::PURGE_GLOBAL_PCACHE ) == self::PURGE_GLOBAL_PCACHE ) {
-                       // Set page_touched in the database to invalidate all DC caches
-                       $this->mTitle->invalidateCache();
-               } elseif ( ( $flags & self::PURGE_CLUSTER_PCACHE ) == self::PURGE_CLUSTER_PCACHE ) {
-                       // Delete the parser options key in the local cluster to invalidate the DC cache
-                       ParserCache::singleton()->deleteOptionsKey( $this );
-                       // Avoid sending HTTP 304s in ViewAction to the client who just issued the purge
-                       $cache = ObjectCache::getLocalClusterInstance();
-                       $cache->set(
-                               $cache->makeKey( 'page', 'last-dc-purge', $this->getId() ),
-                               wfTimestamp( TS_MW ),
-                               $cache::TTL_HOUR
-                       );
-               }
+               $this->mTitle->invalidateCache();
 
-               if ( ( $flags & self::PURGE_CDN_CACHE ) == self::PURGE_CDN_CACHE ) {
-                       // Clear any HTML file cache
-                       HTMLFileCache::clearFileCache( $this->getTitle() );
-                       // Send purge after any page_touched above update was committed
-                       DeferredUpdates::addUpdate(
-                               new CdnCacheUpdate( $this->mTitle->getCdnUrls() ),
-                               DeferredUpdates::PRESEND
-                       );
-               }
+               // Clear file cache
+               HTMLFileCache::clearFileCache( $this->getTitle() );
+               // Send purge after above page_touched update was committed
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( $this->mTitle->getCdnUrls() ),
+                       DeferredUpdates::PRESEND
+               );
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        $messageCache = MessageCache::singleton();
@@ -1169,11 +1157,11 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @return string|bool TS_MW timestamp or false
         * @since 1.28
+        * @deprecated since 1.29. It will always return false.
         */
        public function getLastPurgeTimestamp() {
-               $cache = ObjectCache::getLocalClusterInstance();
-
-               return $cache->get( $cache->makeKey( 'page', 'last-dc-purge', $this->getId() ) );
+               wfDeprecated( __METHOD__, '1.29' );
+               return false;
        }
 
        /**
index 4694890..0b867ef 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * IndexPager is an efficient pager which uses a (roughly unique) index in the
index 91e63e7..d72b3af 100644 (file)
@@ -23,8 +23,6 @@
 
 class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
 
-       /* Methods */
-
        /**
         * @param ResourceLoaderContext $context
         * @return array
@@ -77,13 +75,12 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
                return false;
        }
 
-       /**
-        * @param ResourceLoaderContext $context
-        * @return string: Hash
-        */
-       public function getModifiedHash( ResourceLoaderContext $context ) {
-               $logo = $this->getConfig()->get( 'Logo' );
-               $logoHD = $this->getConfig()->get( 'LogoHD' );
-               return md5( parent::getModifiedHash( $context ) . $logo . json_encode( $logoHD ) );
+       public function getDefinitionSummary( ResourceLoaderContext $context ) {
+               $summary = parent::getDefinitionSummary( $context );
+               $summary[] = [
+                       'logo' => $this->getConfig()->get( 'Logo' ),
+                       'logoHD' => $this->getConfig()->get( 'LogoHD' ),
+               ];
+               return $summary;
        }
 }
index f6f14b3..92095f7 100644 (file)
@@ -22,6 +22,8 @@
  * @author Roan Kattouw
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Abstraction for ResourceLoader modules which pull from wiki pages
  *
index ad9259b..9afaf40 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for archive table items, i.e. revisions deleted via action=delete
  */
index afee637..1d80d86 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for filearchive table items
  */
index 9beafc9..62bafe9 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Item class for an oldimage table row
  */
index 00cb2e1..77cf976 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for oldimage table items
  */
index ff1d2ed..1932778 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for logging table items
  */
index 453c6cc..1ea6a38 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * List for revision table items
index 7f41eb2..7812fb9 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Backend functions for suppressing and unsuppressing all references to a given user,
  * used when blocking with HideUser enabled.  This was spun out of SpecialBlockip.php
index 38c60d0..d51e525 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Search
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Base search engine base class for database-backed searches
  * @ingroup Search
index a767bc3..613d33c 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Factory class for SearchEngine.
  * Allows to create engine of the specific type.
index 8e9629d..0a8c9f4 100644 (file)
@@ -22,6 +22,7 @@
  */
 use MediaWiki\Logger\LoggerFactory;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special page which uses a ChangesList to show query results.
@@ -177,11 +178,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                        &$query_options, &$join_conds ) {
 
                                                        $user = $ctx->getUser();
-                                                       if ( $user->getId() ) {
-                                                               $conds[] = 'rc_user != ' . $dbr->addQuotes( $user->getId() );
-                                                       } else {
-                                                               $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
-                                                       }
+                                                       $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
                                                },
                                                'cssClassSuffix' => 'self',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
@@ -197,11 +194,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                        &$query_options, &$join_conds ) {
 
                                                        $user = $ctx->getUser();
-                                                       if ( $user->getId() ) {
-                                                               $conds[] = 'rc_user = ' . $dbr->addQuotes( $user->getId() );
-                                                       } else {
-                                                               $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() );
-                                                       }
+                                                       $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() );
                                                },
                                                'cssClassSuffix' => 'others',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
index bafee65..59abefd 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Variant of QueryPage which uses a gallery to output results, thus
index 45cef2b..76b1535 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Variant of QueryPage which formats the result as a simple link to the page
index 7bc2dfa..68d2d30 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * This is a class for doing query pages; since they're almost all the same,
index e7bc496..d788f2b 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class definition for a wanted query page like
index 9aba41e..cd9345d 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page listing redirects to non existent page. Those should be
index 59351dc..d7e99db 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page listing redirects to redirecting page.
index a1f5efa..dae6074 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special:LinkSearch to search the external-links table.
index 52c710d..d5fb001 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special:ListDuplicatedFiles Lists all files where the current version is
index b2d6a33..5f38629 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special:Listredirects - Lists all the redirects on the wiki.
index a88767a..7c4b490 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup SpecialPage
index 0776eec..bebed12 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that list pages that have highest category count
index 8560dca..c140ee9 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that listed pages that have highest interwiki count
index ff8550d..fbfaa73 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page to show pages ordered by the number of pages linking to them.
index 699940b..956207f 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A querypage to show categories ordered in descending order by the pages in them
index f5c2c5f..dee1c8e 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special page lists templates with a large number of
index 9e3a750..12dae8b 100644 (file)
@@ -39,6 +39,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
                $opts = new FormOptions();
 
                $opts->add( 'like', '' );
+               $opts->add( 'user', '' );
                $opts->add( 'showbots', false );
                $opts->add( 'hidepatrolled', false );
                $opts->add( 'limit', 50 );
@@ -75,6 +76,12 @@ class SpecialNewFiles extends IncludableSpecialPage {
                                'name' => 'like',
                        ],
 
+                       'user' => [
+                               'type' => 'text',
+                               'label-message' => 'newimages-user',
+                               'name' => 'user',
+                       ],
+
                        'showbots' => [
                                'type' => 'check',
                                'label-message' => 'newimages-showbots',
index a5e5113..3282a7a 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * SpecialShortpages extends QueryPage. It is used to return the shortest
index e82279e..fea7e21 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that displays a list of pages that are not on anyones watchlist.
index 4a17533..9066148 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that lists last changes made to the wiki,
index 439b6ab..6f91c46 100644 (file)
@@ -21,6 +21,8 @@
  * @todo Use some variant of Pager or something; the pagination here is lousy.
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Implements Special:Whatlinkshere
  *
index 5126bad..1133625 100644 (file)
@@ -26,6 +26,7 @@
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 class ContribsPager extends ReverseChronologicalPager {
 
index 3789dfa..47b059b 100644 (file)
@@ -193,7 +193,8 @@ class ImageListPager extends TablePager {
                }
                $sortable = [ 'img_timestamp', 'img_name', 'img_size' ];
                /* For reference, the indicies we can use for sorting are:
-                * On the image table: img_usertext_timestamp, img_size, img_timestamp
+                * On the image table: img_user_timestamp, img_usertext_timestamp,
+                * img_size, img_timestamp
                 * On oldimage: oi_usertext_timestamp, oi_name_timestamp
                 *
                 * In particular that means we cannot sort by timestamp when not filtering
index 4bf5dff..b781930 100644 (file)
@@ -55,6 +55,16 @@ class NewFilesPager extends ReverseChronologicalPager {
                $fields = [ 'img_name', 'img_user', 'img_timestamp' ];
                $options = [];
 
+               $user = $opts->getValue( 'user' );
+               if ( $user !== '' ) {
+                       $userId = User::idFromName( $user );
+                       if ( $userId ) {
+                               $conds['img_user'] = $userId;
+                       } else {
+                               $conds['img_user_text'] = $user;
+                       }
+               }
+
                if ( !$opts->getValue( 'showbots' ) ) {
                        $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
 
index 59ca31c..81a4083 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Represents a "user group membership" -- a specific instance of a user belonging
  * to a group. For example, the fact that user Mary belongs to the sysop group is a
index d801fa0..4df73f7 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Cut-down copy of User interface for local-interwiki-database
  * user rights manipulation.
index 43bccba..e107fb1 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Allows iterating a large number of rows in batches transparently.
  * By default when iterated over returns the full query result as an
index a6e47c8..70afb91 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Maintenance
  */
+use Wikimedia\Rdbms\IDatabase;
 use \MediaWiki\MediaWikiServices;
 
 class BatchRowWriter {
index 22e9288..2baf6af 100644 (file)
        "isredirect": "masinhikan ke kweskiticohemikok",
        "isimage": "e ici tapitik masinahikaniwoc",
        "whatlinkshere-links": "← ka patiki",
+       "whatlinkshere-hideredirs": "$1 itapihikina",
+       "whatlinkshere-hidetrans": "$1 pitcititawina",
        "whatlinkshere-hidelinks": "$1 ka patiki",
+       "whatlinkshere-filters": "cikopesinikan",
        "whatlinkshere-submit": "Tapowata",
        "ipblocklist-submit": "Nantokaskeritcikatek",
        "blocklink": "nokipita",
index 34f5fd5..ee3e58f 100644 (file)
@@ -35,7 +35,7 @@
                        "Elias Ahmmad"
                ]
        },
-       "tog-underline": "সà¦\82যà§\8bà¦\97à¦\97à§\81লির নিচে দাগ দেখানো হোক:",
+       "tog-underline": "সà¦\82যà§\8bà¦\97à§\87র নিচে দাগ দেখানো হোক:",
        "tog-hideminor": "অনুল্লেখ্য সম্পাদনাগুলি সাম্প্রতিক পরিবর্তন পাতায় লুকিয়ে রাখা হোক",
        "tog-hidepatrolled": "পরীক্ষিত সম্পাদনাগুলি সাম্প্রতিক পরিবর্তন পাতায় লুকিয়ে রাখা হোক",
        "tog-newpageshidepatrolled": "পরীক্ষিত পাতাগুলিকে নতুন পাতার তালিকায় লুকিয়ে রাখা হোক",
@@ -72,7 +72,7 @@
        "tog-watchlisthideanons": "বেনামী ব্যবহারকারীদের সম্পাদনাগুলি নজরতালিকায় আড়ালে রাখা হোক",
        "tog-watchlisthidepatrolled": "পরীক্ষিত সম্পাদনাগুলি নজরতালিকায় লুকিয়ে রাখা হোক",
        "tog-watchlisthidecategorization": "পাতার শ্রেণীবদ্ধকরণ লুকিয়ে রাখা হোক",
-       "tog-ccmeonemails": "à¦\85নà§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\95াà¦\9bà§\87 à¦\86মার à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦\87মà§\87à¦\87লà§\87র à¦\8fà¦\95à¦\9fি à¦\85নà§\81লিপি আমাকে পাঠানো হোক",
+       "tog-ccmeonemails": "à¦\85নà§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\95াà¦\9bà§\87 à¦\86মার à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦\87মà§\87à¦\87লà§\87র à¦\8fà¦\95à¦\9fি à¦ªà§\8dরতিলিপি আমাকে পাঠানো হোক",
        "tog-diffonly": "পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক",
        "tog-showhiddencats": "লুকায়িত বিষয়শ্রেণীসমূহ দেখানো হোক",
        "tog-norollbackdiff": "রোলব্যাকের পরে সংস্করণগুলির পার্থক্য না দেখানো হোক",
        "subcategories": "উপবিষয়শ্রেণীসমূহ",
        "category-media-header": "\"$1\" বিষয়শ্রেণীতে অন্তর্ভুক্ত মিডিয়া ফাইলগুলি",
        "category-empty": "''এই বিষয়শ্রণীতে বর্তমানে কোন পাতা বা মিডিয়া ফাইল নেই।''",
-       "hidden-categories": "{{PLURAL:$1|à¦\9fি à¦²à§\81à¦\95ায়িত à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80}}",
+       "hidden-categories": "{{PLURAL:$1|লুকায়িত বিষয়শ্রেণী}}",
        "hidden-category-category": "লুকায়িত বিষয়শ্রেণীসমূহ",
        "category-subcat-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবলমাত্র নিচের উপবিষয়শ্রেণীটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি উপবিষয়শ্রেণীর মধ্যে {{PLURAL:$1|টি উপবিষয়শ্রেণী|$1টি উপবিষয়শ্রেণী}} নিচে দেখানো হয়েছে।}}",
        "category-subcat-count-limited": "এই বিষয়শ্রেণীতে নিচের {{PLURAL:$1|টি উপবিষয়শ্রেণী|$1টি উপবিষয়শ্রেণী আছে}}।",
        "confirmable-confirm": "{{GENDER:$1|আপনি}} কি নিশ্চিত?",
        "confirmable-yes": "হ্যাঁ",
        "confirmable-no": "না",
-       "thisisdeleted": "$1 à¦¦à§\87à¦\96ানà§\8b à¦¬à¦¾ à¦ªà§\81নà¦\83সà§\83ষà§\8dà¦\9fি à¦\95রা à¦¹à§\8bà¦\95?",
-       "viewdeleted": "$1 à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95?",
+       "thisisdeleted": "$1 à¦¦à§\87à¦\96বà§\87ন à¦¬à¦¾ à¦ªà§\81নরà§\81দà§\8dধার à¦\95রবà§\87ন?",
+       "viewdeleted": "$1 à¦¦à§\87à¦\96বà§\87ন?",
        "restorelink": "{{PLURAL:$1|একটি মুছে ফেলা সম্পাদনা|$1টি মুছে ফেলা সম্পাদনা}}",
        "feedlinks": "ফিড:",
        "feed-invalid": "গ্রাহক ফিডের ধরন অবৈধ।",
        "page-atom-feed": "\"$1\" অ্যাটম ফিড",
        "feed-atom": "অ্যাটম",
        "red-link-title": "$1 (পাতার অস্তিত্ব নেই)",
-       "sort-descending": "উল্টো বর্ণক্রমে সাজানো হোক",
-       "sort-ascending": "বর্ণানুক্রমে সাজানো হোক",
+       "sort-descending": "উল্টো বর্ণক্রমে সাজান",
+       "sort-ascending": "বর্ণানুক্রমে সাজান",
        "nstab-main": "পাতা",
        "nstab-user": "ব্যবহারকারীর পাতা",
        "nstab-media": "মিডিয়া পাতা",
        "databaseerror-error": "ত্রুটি: $1",
        "transaction-duration-limit-exceeded": "দীর্ঘ পুনঃসৃষ্টি বিলম্ব এড়ানোর জন্য এই ট্রানজাকশনটি বাতিল করা হল, কারণ লিখনের স্থায়িত্ব ($1) $2 সেকেন্ড সীমাটিকে অতিক্রম করে গিয়েছিল। \nযদি আপনি অনেকগুলি আইটেম একসাথে পরিবর্তন করতে চান, তাহলে একাধিক ক্ষুদ্রতর অপারেশন সম্পন্ন করার চেষ্টা করুন।",
        "laggedslavemode": "<strong>সতর্ক বার্তা:</strong> পাতাটি সম্ভবত সম্প্রতি হালনাগাদ করা হয়নি।",
-       "readonly": "ডাà¦\9fাবà§\87à¦\9c à¦¤à¦¾à¦²à¦¾à¦¬দ্ধ",
-       "enterlockreason": "তালাবদ্ধ করার কারণ কি তা বলুন, সাথে কখন তালা খুলবেন তার আনুমানিক সময় উল্লেখ  করুন",
-       "readonlytext": "নতà§\81ন à¦­à§\81à¦\95à§\8dতি à¦\8fবà¦\82 à¦\85নà§\8dযানà§\8dয à¦¸à¦®à§\8dপাদনার à¦\9cনà§\8dয à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦¬à¦°à§\8dতমানà§\87 à¦¤à¦¾à¦²à¦¾à¦¬à¦¦à§\8dধ à¦\95রা à¦\86à¦\9bà§\87। à¦¸à¦®à§\8dভবত à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦°à¦\95à§\8dষণাবà§\87à¦\95à§\8dষণà§\87র à¦¨à¦¿à¦¯à¦¼à¦®à¦¿à¦¤ à¦\95াà¦\9c à¦\9aলà¦\9bà§\87। à¦\95াà¦\9c à¦¶à§\87ষ à¦¹à¦²à§\87 à¦\8fà¦\9fি à¦¸à§\8dবাভাবিà¦\95 à¦\85বসà§\8dথায় à¦«à¦¿à¦°à§\87 à¦\86সবà§\87।\n\nযà§\87 à¦¸à¦¿à¦¸à§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦\8fà¦\9fি à¦¤à¦¾à¦²à¦¾à¦¬দ্ধ করেছেন, তিনি এই ব্যাখ্যা দিয়েছেন: $1",
+       "readonly": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ",
+       "enterlockreason": "তালাবদ্ধ করার কারণ কি তা বলুন, সাথে কখন তালা খুলবেন তার আনুমানিক সময় উল্লেখ করুন",
+       "readonlytext": "নতà§\81ন à¦­à§\81à¦\95à§\8dতি à¦\8fবà¦\82 à¦\85নà§\8dযানà§\8dয à¦¸à¦®à§\8dপাদনার à¦\9cনà§\8dয à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦¬à¦°à§\8dতমানà§\87 à¦\85বরà§\81দà§\8dধ à¦\95রা à¦\86à¦\9bà§\87। à¦¸à¦®à§\8dভবত à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦°à¦\95à§\8dষণাবà§\87à¦\95à§\8dষণà§\87র à¦¨à¦¿à¦¯à¦¼à¦®à¦¿à¦¤ à¦\95াà¦\9c à¦\9aলà¦\9bà§\87। à¦\95াà¦\9c à¦¶à§\87ষ à¦¹à¦²à§\87 à¦\8fà¦\9fি à¦¸à§\8dবাভাবিà¦\95 à¦\85বসà§\8dথায় à¦«à¦¿à¦°à§\87 à¦\86সবà§\87।\n\nযà§\87 à¦¸à¦¿à¦¸à§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦\8fà¦\9fি à¦\85বরà§\81দ্ধ করেছেন, তিনি এই ব্যাখ্যা দিয়েছেন: $1",
        "missing-article": "\"$1\" পাতাটির $2 লেখাটি ডাটাবেজ খুঁজে পায়নি, যদিও খুঁজে পাওয়ার কথা ছিল।\n\nসাধারণত কোন মেয়াদোত্তীর্ণ সংশোধন পার্থক্য অনুসরণ করলে অথবা  \nমুছে ফেলা কোন পাতার ইতিহাসের সংযোগ অনুসরণ করলে এমনটি ঘটে।\n\nযদি এমনটি না হয়, তাহলে আপনি হয়ত সফটওয়্যারে কোন ত্রুটি খুঁজে পেয়েছেন।\n\nঅনুগ্রহ করে ইউআরএল-টি উল্লেখ করে এ ব্যাপারে কোন [[Special:ListUsers/sysop|প্রশাসককে]] অবহিত করুন।",
        "missingarticle-rev": "(সংস্করণ#: $1)",
        "missingarticle-diff": "(পার্থক্য: $1, $2)",
-       "readonly_lag": "ডাà¦\9fাবà§\87à¦\9c à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¤à¦¾à¦²à¦¾à¦¬দ্ধ করে দেয়া হয়েছে, যাতে অধীন ডাটাবেজ সার্ভারগুলি প্রধান ডাটাবেজ সার্ভারের অবস্থায় আসতে পারে।",
+       "readonly_lag": "ডাà¦\9fাবà§\87à¦\9c à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦\85বরà§\81দ্ধ করে দেয়া হয়েছে, যাতে অধীন ডাটাবেজ সার্ভারগুলি প্রধান ডাটাবেজ সার্ভারের অবস্থায় আসতে পারে।",
        "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' HTTP শিরলেখে পাঠানো হয়েছিল কিন্তু অনুরোধটি একটি API লিখন মডিউলে ছিল।",
        "internalerror": "অভ্যন্তরীণ ত্রুটি",
        "internalerror_info": "অভ্যন্তরীণ ত্রুটি: $1",
        "filecopyerror": "\"$1\" নাম থেকে \"$2\" নামে ফাইল প্রতিলিপি করা যায়নি।",
        "filerenameerror": "\"$1\" ফাইলটির নাম পরিবর্তন করে \"$2\" করা সম্ভব হয়নি।",
        "filedeleteerror": "\"$1\" ফাইলটি মুছে ফেলা সম্ভব হয়নি।",
-       "directorycreateerror": "\"$1\" à¦¨à¦¾à¦®à§\87 à¦¨à¦¿à¦°à§\8dদà§\87শিà¦\95া à¦¤à§\88রি à¦\95রা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿à¥¤",
-       "directoryreadonlyerror": "\"$1\" à¦¨à¦¾à¦®à§\87র à¦¨à¦¿à¦°à§\8dদà§\87শিà¦\95াà¦\9fি à¦¶à§\81ধà§\81মাতà§\8dর à¦ªà¦¾à¦ à¦¯à§\8bà¦\97à§\8dয।",
-       "directorynotreadableerror": "\"$1\" à¦¨à¦¾à¦®à§\87র à¦¨à¦¿à¦°à§\8dদà§\87শিà¦\95াà¦\9fি à¦ªà¦¾à¦ à¦¯à§\8bà¦\97à§\8dয à¦¨à¦¯à¦¼à¥¤",
-       "filenotfound": "\"$1\" à¦¨à¦¾à¦®à§\87র à¦«à¦¾à¦\87লà¦\9fি à¦\96à§\81à¦\81à¦\9cà§\87 à¦ªà¦¾à¦\93য়া à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿à¥¤",
+       "directorycreateerror": "\"$1\" নির্দেশিকা তৈরি করা যায়নি।",
+       "directoryreadonlyerror": "\"$1\" নির্দেশিকাটি শুধুমাত্র পাঠযোগ্য।",
+       "directorynotreadableerror": "\"$1\" নির্দেশিকাটি পাঠযোগ্য নয়।",
+       "filenotfound": "\"$1\" ফাইলটি খুঁজে পাওয়া যায়নি।",
        "unexpected": "অপ্রত্যাশিত মান: \"$1\"=\"$2\"।",
        "formerror": "ত্রুটি: ফরমটি জমা দেওয়া সম্ভব হয়নি।",
        "badarticleerror": "এই পাতায় এই কাজটি করা সম্ভব নয়।",
        "cannotdelete": "\"$1\" পাতা বা ফাইলটি মোছা সম্ভব হয়নি।\nসম্ভবত অন্য কেউ আগেই এটিকে মুছে ফেলেছেন।",
-       "cannotdelete-title": "\"$1\" à¦¶à¦¿à¦°à§\8bনামà§\87র à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤",
+       "cannotdelete-title": "\"$1\" à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾",
        "delete-hook-aborted": "হুকের কারণে পাতা মোছার কাজটি পরিত্যক্ত হয়েছে।\nকোন ব্যাখ্যা দেয়া হয়নি।",
-       "no-null-revision": "\"$1\" à¦¨à¦¾à¦®à§\87র à¦ªà¦¾à¦¤à¦¾à¦° à¦\9cনà§\8dয à¦«à¦¾à¦\81à¦\95া à¦¸à¦\82সà§\8dà¦\95রণ à¦¤à§\88রà§\80 à¦\95রা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿",
+       "no-null-revision": "\"$1\" পাতার জন্য ফাঁকা সংস্করণ তৈরী করা যায়নি",
        "badtitle": "ভুল শিরোনাম",
        "badtitletext": "অনুরোধকৃত পাতার শিরোনামটি অবৈধ, খালি কিংবা কোন ভুল আন্তঃভাষা বা আন্তঃউইকি শিরোনাম সংযোগ ছিল। এটিতে সম্ভবত এমন এক (একাধিক) ক্যারেক্টার আছে, যা (যেগুলি) শিরোনামে ব্যবহারযোগ্য নয়।",
        "title-invalid-empty": "অনুরোধকৃত পাতার শিরোনামটি খালি বা শুধুমাত্র একটি নামস্থানের নাম ধারণ করে।",
        "title-invalid-too-long": "অনুরোধকৃত পাতার শিরোনামটি অত্যধিক দীর্ঘ। ইউটিএফ-৮ সাংকেতিকীকরণ অনুযায়ী এটি $1 {{PLURAL:$1|বাইটের}} থেকে দীর্ঘতর হতে পারবে না।",
        "title-invalid-leading-colon": "অনুরোধকৃত পাতার শিরোনামটির শুরুতে একটি অবৈধ কোলন চিহ্ন (:) রয়েছে।",
        "perfcached": "নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং সম্পূর্ণ হালনাগাদকৃত না-ও হতে পারে। সর্বোচ্চ {{PLURAL:$1|একটি ফলাফল|$1 টি ফলাফল}} ক্যাশে থাকতে পারে।",
-       "perfcachedts": "নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং সর্বশেষ $1 তারিখে হালনাগাদ করা হয়েছে। সর্বোচ্চ {{PLURAL:$4|একটি ফলাফল|$4 টি ফলাফল}} ক্যাশে থাকতে পারে।",
+       "perfcachedts": "নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং সর্বশেষ $1 তারিখে হালনাগাদ করা হয়েছে। সর্বোচ্চ {{PLURAL:$4|একটি ফলাফল|$4টি ফলাফল}} ক্যাশে থাকতে পারে।",
        "querypage-no-updates": "এই পাতার জন্য হালনাগাদ নিষ্ক্রিয় করা হয়েছে। এখানে রাখা উপাত্তগুলি এ মুহূর্তে হালনাগাদ করা হবে না।",
        "viewsource": "উৎস দেখুন",
-       "viewsource-title": "$1 নামের পাতাটির উৎস দেখুন",
+       "viewsource-title": "$1-এর উৎস দেখুন",
        "actionthrottled": "কাজের গতি ধীরকরণ",
        "actionthrottledtext": "অপব্যবহার প্রতিরোধক সমাধান হিসেবে এই কাজটি খুব কম সময়ে অনেক বেশিবার সম্পাদন করার উপর সীমা বেঁধে দেওয়া হয়েছে, এবং আপনি সেই সীমা অতিক্রম করেছেন।\nঅনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
        "protectedpagetext": "সম্পাদনা অথবা অন্যান্য কাজে বাধা দিতে পাতাটিকে সুরক্ষিত হয়েছে।",
        "viewsourcetext": "এ পাতাটি আপনি দেখতে এবং উৎসের প্রতিলিপি করতে পারবেন।",
-       "viewyourtext": "আপনি এই পাতায় করা <strong>আপনার সম্পাদনাগুলি</strong>দেখতে এবং প্রতিলিপি করতে পারেন।",
+       "viewyourtext": "আপনি এই পাতায় করা <strong>আপনার সম্পাদনাগুলি</strong> দেখতে এবং প্রতিলিপি করতে পারেন।",
        "protectedinterface": "এই পাতার বিষয়বস্তু এই উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটি যাতে অপব্যবহারে না করা হয়, সেজন্য এটিকে সুরক্ষিত করে রাখা হয়েছে।\nসকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করণ প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
-       "editinginterface": "<strong>সতরà§\8dà¦\95 à¦¬à¦¾à¦°à§\8dতা:</strong> à¦\86পনি à¦\8fমন à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রà¦\9bà§\87ন à¦¯à¦¾ à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦\9cনà§\8dয à¦\87নà§\8dà¦\9fারফà§\87স à¦\9fà§\87à¦\95à§\8dসà¦\9f সরবরাহ করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির অন্যান্য ব্যবহারকারীদের জন্য দৃশ্যমান ইন্টারফেসে প্রভাব ফেলবে।",
+       "editinginterface": "<strong>সতরà§\8dà¦\95 à¦¬à¦¾à¦°à§\8dতা:</strong> à¦\86পনি à¦\8fমন à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রà¦\9bà§\87ন à¦¯à¦¾ à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦\9cনà§\8dয à¦\87নà§\8dà¦\9fারফà§\87স à¦²à§\87à¦\96া সরবরাহ করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির অন্যান্য ব্যবহারকারীদের জন্য দৃশ্যমান ইন্টারফেসে প্রভাব ফেলবে।",
        "translateinterface": "সকল উইকির জন্য অনুবাদ যোগ বা পরিবর্তন করতে দয়া করে [https://translatewiki.net/ translatewiki.net], মিডিয়াউইকি স্থানীয়করণ প্রকল্প ব্যবহার করুন।",
-       "cascadeprotected": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fিà¦\95à§\87 à¦¸à¦®à§\8dপাদনা à¦¥à§\87à¦\95à§\87 à¦¸à§\81রà¦\95à§\8dষিত à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦\95ারণ à¦\8fà¦\9fি à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত {{PLURAL:$1|à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼}} অন্তর্ভুক্ত, যেগুলি \"প্রপাতাকার\" বৈশিষ্ট্য সহযোগে সুরক্ষিত করা আছে:\n$2",
+       "cascadeprotected": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fিà¦\95à§\87 à¦¸à¦®à§\8dপাদনা à¦¥à§\87à¦\95à§\87 à¦¸à§\81রà¦\95à§\8dষিত à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦\95ারণ à¦\8fà¦\9fি à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত {{PLURAL:$1|পাতায়|পাতাà¦\97à§\81লিতà§\87}} অন্তর্ভুক্ত, যেগুলি \"প্রপাতাকার\" বৈশিষ্ট্য সহযোগে সুরক্ষিত করা আছে:\n$2",
        "namespaceprotected": "<strong>$1</strong> নামস্থানের কোন পাতা আপনার সম্পাদনা করার অনুমতি নেই।",
        "customcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "customjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "mypreferencesprotected": "আপনার পছন্দসমূহ সম্পাদনা করতে আপনার অনুমতি নেই",
        "ns-specialprotected": "বিশেষ পাতাসমূহ সম্পাদনা করা যাবে না।",
        "titleprotected": "[[User:$1|$1]] কর্তৃক এই শিরোনামটি সৃষ্টি করা থেকে সুরক্ষিত করা হয়েছে। কারণ: <em>$2</em>।",
-       "filereadonlyerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fিà¦\95à§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾ à¦\95ারণ \"$2\" à¦«à¦¾à¦\87ল à¦¸à¦\82à¦\97à§\8dরহসà§\8dথল à¦¶à§\81ধà§\81মাতà§\8dর-পঠন à¦®à§\8bডà§\87 à¦\86à¦\9bà§\87।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fি à¦¬à¦¨্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: \"$3\"।",
+       "filereadonlyerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fিà¦\95à§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾ à¦\95ারণ \"$2\" à¦«à¦¾à¦\87ল à¦¸à¦\82à¦\97à§\8dরহশালাà¦\9fি à¦¶à§\81ধà§\81মাতà§\8dর-পঠন à¦®à§\8bডà§\87 à¦\86à¦\9bà§\87।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦«à¦¾à¦\87লà¦\9fি à¦\85বরà§\81দ্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: \"$3\"।",
        "invalidtitle-knownnamespace": "অবৈধ শিরোনাম, যেখানে নামস্থান \"$2\" এবং লেখা হয়েছে \"$3\"",
        "invalidtitle-unknownnamespace": "অবৈধ শিরোনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে \"$2\"",
        "exception-nologin": "প্রবেশ করেন নি",
        "copyrightwarning2": "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
        "editpage-cannot-use-custom-model": "এই পাতার বিষয়বস্তুর রূপ পরিবর্তন করা যাবে না।",
        "longpageerror": "'''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''\nএটি সংরক্ষণ করা সম্ভব নয়।",
-       "readonlywarning": "<strong>সতরà§\8dà¦\95à§\80à¦\95রণ: à¦°à¦\95à§\8dষণাবà§\87à¦\95à§\8dষণà§\87র à¦\9cনà§\8dয à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦°à¦¾à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦¤à¦¾à¦\87 à¦\8fà¦\87 à¦®à§\81হà§\82রà§\8dতà§\87 à¦\86পনি à¦\86পনার à¦¸à¦®à§\8dপাদনা à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾à¥¤</strong>\nà¦\86পনি à¦\9aাà¦\87লà§\87 à¦²à§\87à¦\96াà¦\9fি à¦\85নà§\81লিপি à¦\95রà§\87 à¦\93 à¦\95à§\8bন à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦«à¦¾à¦\87লà§\87 à¦ªà§\8dরতিলà§\87পন à¦\95রার à¦¦à§\8dবারা à¦­à¦¬à¦¿à¦·à§\8dযতà§\87র à¦\9cনà§\8dয à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fি à¦¬à¦¨্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
+       "readonlywarning": "<strong>সতরà§\8dà¦\95বারà§\8dতা: à¦°à¦\95à§\8dষণাবà§\87à¦\95à§\8dষণà§\87র à¦\9cনà§\8dয à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦°à¦¾à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦¤à¦¾à¦\87 à¦\8fà¦\87 à¦®à§\81হà§\82রà§\8dতà§\87 à¦\86পনি à¦\86পনার à¦¸à¦®à§\8dপাদনা à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾à¥¤</strong>\nà¦\86পনি à¦\9aাà¦\87লà§\87 à¦²à§\87à¦\96াà¦\9fি à¦ªà§\8dরতিলিপি à¦\95রà§\87 à¦\95à§\8bন à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦«à¦¾à¦\87লà§\87 à¦¸à§\87à¦\81à¦\9fà§\87 à¦­à¦¬à¦¿à¦·à§\8dযতà§\87র à¦\9cনà§\8dয à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nযà§\87 à¦¸à¦¿à¦¸à§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¡à¦¾à¦\9fাবà§\87à¦\9cà¦\9fি  à¦\85বরà§\81দ্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
        "protectedpagewarning": "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "semiprotectedpagewarning": "'''নোট:''' এই পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে তাই নিবন্ধনকৃত ব্যবহারকারী এটি সম্পাদনা করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "cascadeprotectedwarning": "<strong>সতর্কীকরণ:</strong> এই পাতাটি সুরক্ষিত, ফলে এটি শুধুমাত্র প্রশাসক অধিকারপ্রাপ্ত ব্যবহারকারীগণ সম্পাদনা করতে পারেন, কারণ এটি নিচের প্রপাতাকার-সুরক্ষিত {{PLURAL:$1|পাতায়|পাতাসমূহে}} অন্তর্ভুক্ত আছে:",
        "sectioneditnotsupported-title": "অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
        "sectioneditnotsupported-text": "এই সম্পাদনা পাতায় অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
        "permissionserrors": "অনুমতি ত্রুটিসমূহ",
-       "permissionserrorstext": "à¦\86পনার à¦\8fà¦\9fা à¦\95রার à¦\85নà§\81মতি à¦¨à§\87à¦\87, à¦¨à¦¿à¦\9aà§\87র {{PLURAL:$1|à¦\9fি à¦\95ারণà§\87র|à¦\9fি à¦\95ারণà§\87র}} à¦\9cনà§\8dয:",
-       "permissionserrorstext-withaction": "নিমà§\8dনà§\8bà¦\95à§\8dত {{PLURAL:$1|à¦\9fি à¦\95ারণà§\87র}} à¦\9cনà§\8dয à¦\86পনার $2-র à¦\85নà§\81মà§\8bদন à¦¨à§\87à¦\87:",
+       "permissionserrorstext": "নিনà§\8dমলিà¦\96িত {{PLURAL:$1|à¦\95ারণà¦\9fির|à¦\95ারণà¦\97à§\81লির}} à¦\9cনà§\8dয à¦\86পনার à¦\8fà¦\9fা à¦\95রার à¦\85নà§\81মতি à¦¨à§\87à¦\87:",
+       "permissionserrorstext-withaction": "à¦\86পনার $2 à¦\85নà§\81মতি à¦¨à§\87à¦\87, à¦¯à¦¾à¦° {{PLURAL:$1|à¦\95ারণ|à¦\95ারণসমà§\82হ}} à¦¹à¦²:",
        "contentmodelediterror": "আপনি এই পুনর্বিবেচনা সম্পাদনা করতে পারবেন না কারণ এর বিষয়বস্তু মডেল <code>$1</code>, যা বর্তমান বিষয়বস্তু মডেল <code>$2</code>-এর থেকে ভিন্ন।",
        "recreate-moveddeleted-warn": "'''সতর্কীকরণ: আপনি এমন একটি পাতা পুনরায় তৈরি করছেন যা পূর্বে অপসারণ করা হয়েছিল।'''\n\nআপনি পাতাটি সম্পাদনা চালিয়ে যাওয়া ঠিক হবে কিনা, তা বিবেচনা করুন।\nআপনার সুবিধার্থে পাতাটির অপলুপ্তি লগ এখানে দেয়া হলো:",
        "moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এ পাতার অবলুপ্তি লগ দেওয়া হলো।",
        "post-expand-template-argument-warning": "' ' ' সাবধান: ' ' ' এই পাতাটিতে অন্তত একটি ফর্মা যুক্তি আছে যা একটি খুব বড় বিস্তার আকার ধারণ করেছে।\nতাই এই আর্গুমেন্টটি বাদ দেওয়া হয়েছে।",
        "post-expand-template-argument-category": "বাদ ফর্মা আর্গুমেন্ট ধারণকারী পাতা",
        "parser-template-loop-warning": "টেমপ্লেট লুপ সনাক্ত হয়েছে: [[$1]]",
+       "template-loop-category": "টেমপ্লেট লুপসহ পাতা",
+       "template-loop-category-desc": "এই পাতায় একটি টেমপ্লেট লুপ আছে, অর্থাৎ এটি এমন একটি টেমপ্লেট যা নিজেকেই পুনরাবৃত্তভাবে আহ্বান করে।",
        "parser-template-recursion-depth-warning": "টেমপ্লেট পুনরাবৃত্তি (রিকার্শন) ডেপথ্‌ সীমা অতক্রম করেছে ($1)",
        "language-converter-depth-warning": "ভাষা পরিবর্তন ডেপথ্‌ সীমা অতক্রম করেছে ($1)",
        "node-count-exceeded-category": "যে সকল পাতার নোড কাউন্ট সীমানা পার হয়েছে",
        "cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানার ব্যাপ্তি <strong>$1</strong>-এর মধ্যে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানাও (<strong>$4</strong>) রয়েছে। \n\n$3 কর্তৃক <em>$2</em> কারণ দেখানো হয়েছে।",
        "viewpagelogs": "এই পাতার জন্য লগগুলো দেখুন",
        "nohistory": "এই পাতার কোন সম্পাদনার ইতিহাস নেই।",
-       "currentrev": "সরà§\8dবশà§\87ষ à¦¸à¦\82শà§\8bধিত à¦¸à¦\82সà§\8dà¦\95রণ",
-       "currentrev-asof": "$1 à¦¸à¦®à¦¯à¦¼ à¦\93 à¦¤à¦¾à¦°à¦¿à¦\96à§\87 à¦¸à¦®à§\8dপাদিত à¦¸à¦°à§\8dবশà§\87ষ à¦¸à¦\82শà§\8bধিত সংস্করণ",
+       "currentrev": "সর্বশেষ সংস্করণ",
+       "currentrev-asof": "$1 à¦¤à¦¾à¦°à¦¿à¦\96à§\87 à¦¸à¦®à§\8dপাদিত à¦¸à¦°à§\8dবশà§\87ষ সংস্করণ",
        "revisionasof": "$1 তারিখে সংশোধিত সংস্করণ",
-       "revision-info": "{{GENDER:$6|$2}} à¦\95রà§\8dতà§\83à¦\95 $1 à¦¸à¦®à¦¯à¦¼ à¦\93 à¦¤à¦¾à¦°à¦¿à¦\96à§\87 à¦¸à¦\82শà§\8bধিত à¦¸à¦\82সà§\8dà¦\95রণ $7",
+       "revision-info": "{{GENDER:$6|$2}} à¦\95রà§\8dতà§\83à¦\95 $1 à¦¤à¦¾à¦°à¦¿à¦\96à§\87 à¦¸à¦\82শà§\8bধিত à¦¸à¦\82সà§\8dà¦\95রণ$7",
        "previousrevision": "←পুর্বের সংস্করণ",
        "nextrevision": "পরবর্তী সংস্করণ→",
        "currentrevisionlink": "সর্বশেষ সংস্করণ",
        "last": "পূর্ববর্তী",
        "page_first": "প্রথম",
        "page_last": "শেষ",
-       "histlegend": "পার্থক্য নির্বাচন: যে সংস্করণগুলি তুলনা করতে চান, সেগুলি চিহ্নিত করে এন্টার বা নিচের বোতামটি টিপুন।<br />\nনির্দেশিকা: <strong>(বর্তমান)</strong>  = বর্তমান সংস্করণের সাথে পার্থক্য, <strong>(পূর্ববর্তী)<strong> =  পূর্বের সংস্করণের সাথে পার্থক্য, <strong>অ<strong> = অনুল্লেখ্য সম্পাদনা।",
+       "histlegend": "পার্থক্য নির্বাচন: যে সংস্করণগুলি তুলনা করতে চান, সেগুলি চিহ্নিত করে এন্টার বা নিচের বোতামটি টিপুন।<br />\nনির্দেশিকা: <strong>({{int:cur}})</strong> = বর্তমান সংস্করণের সাথে পার্থক্য, <strong>({{int:last}})</strong> = পূর্বের সংস্করণের সাথে পার্থক্য,  <strong>{{int:minoreditletter}}</strong> = অনুল্লেখ্য সম্পাদনা।",
        "history-fieldset-title": "সংশোধিত সংস্করণের জন্য অনুসন্ধান করুন",
        "history-show-deleted": "শুধুমাত্র অপসারিত সংশোধন",
        "histfirst": "সবচেয়ে পুরনো",
        "rev-deleted-comment": "(সম্পাদনা সারাংশ অপসারিত)",
        "rev-deleted-user": "(ব্যবহারকারীর নাম সরিয়ে নেওয়া হয়েছে)",
        "rev-deleted-event": "(লগ তথ্য সরানো হয়েছে)",
-       "rev-deleted-user-contribs": "ব্যবহারকারীর নাম অথবা আইপি ঠিকানা অপসারিত হয়েছে - অবদান থেকে সম্পাদনা লুকিয়ে রাখা হয়েছে",
+       "rev-deleted-user-contribs": "[ব্যবহারকারীর নাম অথবা আইপি ঠিকানা সরানো হয়েছে - অবদান থেকে সম্পাদনা লুকিয়ে রাখা হয়েছে]",
        "rev-deleted-text-permission": "পাতার এই সংস্করণটি '''অপসারিত''' হয়েছে।\nবিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।",
        "rev-suppressed-text-permission": "পাতার সংশোধনটি <strong>গোপন</strong> করা হয়েছে।\nবিস্তারিত বিবরণ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} গোপনকার্যের লগে] থাকতে পারে।",
        "rev-deleted-text-unhide": "পাতার এই সংস্করণটি '''অপসারিত''' হয়েছে।\nবিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।\nআপনি ইচ্ছা পোষণ করলে [$1 এই সংস্করণটি দেখতে পারেন]।",
        "revdelete-hide-comment": "সম্পাদনা সারাংশ",
        "revdelete-hide-user": "সম্পাদকের ব্যবহারকারী নাম/আইপি ঠিকানা",
        "revdelete-hide-restricted": "প্রশাসকবৃন্দ এবং অন্যদের ক্ষেত্রে এই ডাটা রোধ করো",
-       "revdelete-radio-same": "অপরিবর্তিত থাক",
+       "revdelete-radio-same": "(পরিবর্তন করবেন না)",
        "revdelete-radio-set": "লুকায়িত",
        "revdelete-radio-unset": "দৃশ্যমান",
        "revdelete-suppress": "সব প্রশাসক ও অন্যান্যদের কাছ থেকে উপাত্ত লুকিয়ে রাখা হোক।",
        "mergelogpagetext": "নিচে সবচেয়ে সাম্প্রতিক ঘটা এক পাতার ইতিহাসের সাথে অন্য পাতার ইতিহাসের একত্রীকরণের একটি তালিকা দেওয়া হল।",
        "history-title": "\"$1\" পাতাটির সংশোধনের ইতিহাস",
        "difference-title": "\"$1\" পাতাটির দুইটি সংশোধিত সংস্করণের মধ্যে পার্থক্য",
-       "difference-title-multipage": "\"$1\" à¦\93 \"$2\" à¦¶à¦¿à¦°à§\8bনামà§\87র à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লির à¦®à¦§à§\8dযà§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয",
-       "difference-multipage": "পাতাগুলির মধ্যে পার্থক্য",
+       "difference-title-multipage": "\"$1\" ও \"$2\" পাতাগুলির মধ্যে পার্থক্য",
+       "difference-multipage": "(পাতাগুলির মধ্যে পার্থক্য)",
        "lineno": "$1 নং লাইন:",
        "compareselectedversions": "নির্বাচিত সংশোধিত সংস্করণগুলির তুলনা",
        "showhideselectedversions": "নির্বাচিত সংশোধনগুলি দেখাও/লুকাও",
        "prevn-title": "পূর্ববর্তী $1{{PLURAL:$1|টি ফলাফল}}",
        "nextn-title": "পরবর্তী $1টি {{PLURAL:$1|ফলাফল}}",
        "shown-title": "প্রতি পাতায় $1টি {{PLURAL:$1|ফলাফল}} দেখাও",
-       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95।",
+       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) à¦¦à§\87à¦\96à§\81ন",
        "searchmenu-exists": "'''এই উইকিতে \"[[:$1]]\" নামে একটি পাতা রয়েছে'''",
        "searchmenu-new": "<strong>\"[[:$1]]\" পাতাটি এই উইকিতে তৈরি করুন!</strong> {{PLURAL:$2|0=|এছাড়া আপনার অনুসন্ধানের সাথে পাওয়া পাতাটি দেখুন।|এছাড়া অনুসন্ধানে পাওয়া ফলাফলগুলিও দেখুন।}}",
        "searchprofile-articles": "বিষয়বস্তুসমৃদ্ধ পাতা",
        "searchprofile-images": "মাল্টিমিডিয়া",
        "searchprofile-everything": "সমস্তকিছু",
-       "searchprofile-advanced": "উন্নততর অনুসন্ধান",
+       "searchprofile-advanced": "উন্নত",
        "searchprofile-articles-tooltip": "$1 এ অনুসন্ধান",
        "searchprofile-images-tooltip": "ফাইলের জন্য অনুসন্ধান",
-       "searchprofile-everything-tooltip": "সà¦\95ল à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\85নà§\81সনà§\8dধান à¦\95রা à¦¹à§\8bà¦\95 (আলাপের পাতাসহ)",
-       "searchprofile-advanced-tooltip": "সà§\8dবনিরà§\8dধারিত à¦¨à¦¾à¦®à¦¸à§\8dথানà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রা à¦¹à§\8bà¦\95",
+       "searchprofile-everything-tooltip": "সà¦\95ল à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন (আলাপের পাতাসহ)",
+       "searchprofile-advanced-tooltip": "সà§\8dবনিরà§\8dধারিত à¦¨à¦¾à¦®à¦¸à§\8dথানà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন",
        "search-result-size": "$1 ({{PLURAL:$2|১টি শব্দ|$2টি শব্দ}})",
        "search-result-category-size": "{{PLURAL:$1|১টি সদস্য|$1টি সদস্য}} ({{PLURAL:$2|১টি উপবিষয়শ্রেণী|$2টি উপবিষয়শ্রেণী}}, {{PLURAL:$3|১টি ফাইল |$3টি ফাইল}})",
        "search-redirect": "($1 থেকে পুনর্নির্দেশিত)",
        "search-showingresults": "মোট {{PLURAL:$4|<strong>$3</strong>টি ফলাফলের মধ্যে <strong>$1</strong>টি ফলাফল|মোট <strong>$3</strong>টি ফলাফলের মধ্যে <strong>$1 - $2</strong> নং ফলাফল}}",
        "search-nonefound": "অনুসন্ধানকৃত জিজ্ঞাসার সাথে মিলে যায় এমন কোনো ফলাফল নেই।",
        "search-nonefound-thiswiki": "অনুসন্ধানকৃত জিজ্ঞাসার সাথে মিলে যায় এমন কোনো ফলাফল এই সাইটে নেই।",
-       "powersearch-legend": "উন্নততর অনুসন্ধান",
-       "powersearch-ns": "নিà¦\9aà§\87র à¦¨à¦¿à¦°à§\8dবাà¦\9aিত à¦¨à¦¾à¦®à¦¸à§\8dথানà¦\97à§\81লিতà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রা à¦¹à§\8bà¦\95:",
-       "powersearch-togglelabel": "নিরà§\8dবাà¦\9aন à¦\95রা à¦¹à§\8bà¦\95:",
+       "powersearch-legend": "উন্নত অনুসন্ধান",
+       "powersearch-ns": "নামসà§\8dথানà¦\97à§\81লিতà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন:",
+       "powersearch-togglelabel": "নিরà§\8dবাà¦\9aন à¦\95রà§\81ন:",
        "powersearch-toggleall": "সবগুলি",
        "powersearch-togglenone": "কোনটিই নয়",
        "powersearch-remember": "ভবিষ্যত অনুসন্ধানগুলির জন্য নির্বাচন মনে রাখা হোক",
        "prefs-resetpass": "পাসওয়ার্ড পরিবর্তন",
        "prefs-changeemail": "ইমেইল ঠিকানা পরিবর্তন বা বাতিল করুন",
        "prefs-setemail": "একটি ইমেইল ঠিকানা নির্ধারণ করুন",
-       "prefs-email": "ইমেইল-সংক্রান্ত পছন্দগুলি",
+       "prefs-email": "ইমেইলের পছন্দগুলি",
        "prefs-rendering": "অবয়ব",
        "saveprefs": "সংরক্ষণ",
        "restoreprefs": "সকল পূর্বনির্ধারিত সেটিং ফিরিয়ে আনো (সকল অংশে)",
        "stub-threshold-sample-link": "নমুনা",
        "stub-threshold-disabled": "নিস্ক্রিয়",
        "recentchangesdays": "সাম্প্রতিক পরিবর্তন পাতায় প্রদর্শিত দিনের সংখ্যা:",
-       "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিনের}} সাম্প্রতিক পরিবর্তন প্রদর্শনযোগ্য",
+       "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিনের}}",
        "recentchangescount": "সাম্প্রতিক পরিবর্তনে প্রদর্শিত সম্পাদনার পূর্বনির্ধারিত সংখ্যা:",
        "prefs-help-recentchangescount": "এতে সাম্প্রতিক পরিবর্তনগুলি, পাতার ইতিহাসগুলি এবং লগগুলি অন্তর্ভুক্ত।",
        "prefs-help-watchlist-token2": "এটি আপনার নজরতালিকার ওয়েব ফিডের গোপন চাবি। কেউ যদি এটি জানতে পারেন, তাহলে তিনি আপনার নজরতালিকা পড়তে সক্ষম হবেন, তাই এটি প্রকাশ করবেন না। [[Special:ResetTokens|আপনার এটি পুনঃনির্ধারণ করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
        "right-mergehistory": "পাতার ইতিহাস একীকরণ করুন।",
        "right-userrights": "সকল ব্যবহারকারী অধিকার সম্পাদনা করুন",
        "right-userrights-interwiki": "অন্যান্য উইকির ব্যবহারকারীদের অধিকারসমূহ সম্পাদনা করুন।",
-       "right-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\8fবà¦\82 à¦\96à§\81লà§\81ন",
+       "right-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রা à¦\8fবà¦\82 à¦\96à§\8bলা",
        "right-override-export-depth": "৫ম স্তর পর্যন্ত সংযুক্তিসহ একটি পাতা রপ্তানী করুন",
        "right-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠানো",
        "right-managechangetags": "[[Special:Tags|ট্যাগ]] তৈরি ও সক্রিয়/নিষ্ক্রিয় করুন",
        "action-block": "এই ব্যবহারকারীকে সম্পাদনা করতে বাঁধা দেয়ার",
        "action-protect": "এই পাতার সুরক্ষার মাত্রা পরিবর্তন করার",
        "action-rollback": "একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন",
-       "action-import": "অন্য উইকি থেকে পাতা আমদানি করা",
+       "action-import": "অন্য উইকি থেকে পাতা আমদানি করা",
        "action-importupload": "ফাইল আপলোড থেকে পাতা আমদানী করো",
        "action-patrol": "অন্যদের সম্পাদনা পরীক্ষিত বলে চিহ্নিত করো",
        "action-autopatrol": "পরীক্ষিত বলে চিহ্নিত কি আপনি সম্পাদনা করেছেন",
        "action-mergehistory": "এই পাতার ইতিহাস একত্রিত করার",
        "action-userrights": "সকল ব্যবহারকারীর অধিকার সম্পাদনা করুন",
        "action-userrights-interwiki": "অন্যান্য উইকির ব্যবহারকারীদের অধিকারসমূহ সম্পাদনা করুন",
-       "action-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\85থবা à¦\96à§\81লà§\81ন",
+       "action-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রা à¦\85থবা à¦\96à§\8bলা",
        "action-sendemail": "ই-মেইল পাঠাও",
        "action-editmyoptions": "নিজের পছন্দসমূহ সম্পাদনা করার",
        "action-editmywatchlist": "আপনার নজরতালিকা পরিবর্তন করুন",
        "rcfilters-highlightmenu-help": "এই বৈশিষ্ট্য আলোকপাত করতে একটি রঙ নির্বাচন করুন",
        "rcfilters-filterlist-noresults": "কোনও ফিল্টার পাওয়া যায়নি",
        "rcfilters-noresults-conflict": "কোনও ফলাফল পাওয়া যায়নি কারণ অনুসন্ধানের মাপকাঠিগুলির মধ্যে সংঘর্ষ আছে",
-       "rcfilters-state-message-subset": "à¦\8fà¦\87 à¦\9bাà¦\81à¦\95নিà¦\9fির à¦\95à§\8bন à¦ªà§\8dরভাব à¦¨à§\87à¦\87 à¦\95ারণ à¦\8fর à¦«à¦²à¦¾à¦«à¦²à¦\97à§\81লি à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত à¦¬à§\83হতà§\8dতর à¦ªà¦°à¦¿à¦§à¦¿à¦° {{PLURAL:$2|à¦\9fি à¦\9bাà¦\81à¦\95নির}} মধ্যে অন্তর্ভুক্ত আছে (আলোকপাত করে এটিকে আলাদা করে দেখার চেষ্টা করুন): $1",
+       "rcfilters-state-message-subset": "à¦\8fà¦\87 à¦\9bাà¦\81à¦\95নিà¦\9fির à¦\95à§\8bন à¦ªà§\8dরভাব à¦¨à§\87à¦\87 à¦\95ারণ à¦\8fর à¦«à¦²à¦¾à¦«à¦²à¦\97à§\81লি à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত à¦¬à§\83হতà§\8dতর à¦ªà¦°à¦¿à¦§à¦¿à¦° {{PLURAL:$2|à¦\9bাà¦\81à¦\95নির|à¦\9bাà¦\81à¦\95নিà¦\97à§\81লির}} মধ্যে অন্তর্ভুক্ত আছে (আলোকপাত করে এটিকে আলাদা করে দেখার চেষ্টা করুন): $1",
        "rcfilters-state-message-fullcoverage": "কোন দলের সমস্ত ছাঁকনি নির্বাচন করা এবং কোন ছাঁকনিই নির্বাচন না করা একই কথা, তাই এই ছাঁকনিটির কোন প্রভাব নেই। এই দলে অন্তর্ভুক্ত ছাঁকনিগুলি হল: $1",
        "rcfilters-filtergroup-registration": "ব্যবহারকারী নিবন্ধন",
        "rcfilters-filter-registered-label": "নিবন্ধিত",
        "rcfilters-filter-registered-description": "প্রবেশকৃত সম্পাদকবৃন্দ।",
        "rcfilters-filter-unregistered-label": "অনিবন্ধিত",
        "rcfilters-filter-unregistered-description": "সম্পাদক যারা প্রবেশ করেন নি।",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "এই ছাঁকনিটির সাথে নিম্নোক্ত ব্যবহারকারী অভিজ্ঞতা-সংক্রান্ত {{PLURAL:$2|টি ছাঁকনির}} সংঘর্ষ আছে; এই {{PLURAL:$2|টি ছাঁকনি}} কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "এই ছাঁকনিটির সাথে নিম্নোক্ত ব্যবহারকারী অভিজ্ঞতা{{PLURAL:$2|ছাঁকনির|ছাঁকনিগুলির}} সংঘর্ষ আছে; যা কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে: $1",
        "rcfilters-filtergroup-authorship": "কৃতি সম্পাদনা",
        "rcfilters-filter-editsbyself-label": "আপনার নিজস্ব সম্পাদনা",
        "rcfilters-filter-editsbyself-description": "আপনার দ্বারা সম্পাদনা।",
        "rcfilters-filter-editsbyother-label": "অন্যদের দ্বারা সম্পাদনা",
        "rcfilters-filter-editsbyother-description": "অন্য ব্যবহারকারীদের দ্বারা করা সম্পাদনা (আপনার না)।",
        "rcfilters-filtergroup-userExpLevel": "অভিজ্ঞতার স্তর (শুধু মাত্র নিবন্ধিত ব্যবহারকারীর জন্য)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "অভিজ্ঞতা-সংক্রান্ত ছাঁকনিগুলি কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে, তাই এই ছাঁকটি \"অনিবন্ধিত\" ছাঁকনিটির সাথে সংঘর্ষে আছে।",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"অনিবন্ধিত\" ছাঁকনিটি এক বা তার অধিক অভিজ্ঞতা-সংক্রান্ত ছাঁকনির সাথে সংঘর্ষে আছে, যে ছাঁকনিগুলি কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে। সংঘর্ষরত ছাঁকনিগুলিকে উপরের \"সক্রিয় ছাঁকনিসমূহ\" এলাকাতে চিহ্নিত করা হয়েছে।",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "অভিজ্ঞতা ছাঁকনিগুলি কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে, তাই এই ছাঁকনিটি \"অনিবন্ধিত\" ছাঁকনিটির সাথে সংঘর্ষে আছে।",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"অনিবন্ধিত\" ছাঁকনিটি এক বা তার অধিক অভিজ্ঞতা ছাঁকনির সাথে সংঘর্ষে আছে, যে ছাঁকনিগুলি কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে। সংঘর্ষরত ছাঁকনিগুলিকে উপরের \"সক্রিয় ছাঁকনিসমূহ\" এলাকাতে চিহ্নিত করা হয়েছে।",
        "rcfilters-filter-user-experience-level-newcomer-label": "নতুন আগত",
        "rcfilters-filter-user-experience-level-newcomer-description": "১০টি সম্পাদনার কম ও ৪ দিনের কার্যকলাপ।",
        "rcfilters-filter-user-experience-level-learner-label": "শিক্ষার্থী",
-       "rcfilters-filter-user-experience-level-learner-description": "যারা \"নবাগত\" ব্যবহারকারীদের চেয়ে বেশিসংখ্যক দিন ও বেশিবার সম্পাদনা করেছেন, কিন্তু \"অভিজ্ঞ\" ব্যবহারকারীদের চেয়ে কমসংখ্যক দিন ও কমবার সম্পাদনা করেছেন।",
+       "rcfilters-filter-user-experience-level-learner-description": "যারা \"নবাগত\" ব্যবহারকারীদের চেয়ে বেশিসংখ্যক দিন ও বেশিবার সম্পাদনা করেছেন, কিন্তু \"অভিজ্ঞ ব্যবহারকারীদের\" চেয়ে কম করেছেন।",
        "rcfilters-filter-user-experience-level-experienced-label": "অভিজ্ঞ ব্যবহারকারী",
        "rcfilters-filter-user-experience-level-experienced-description": "৩০ দিনের বেশী কার্যকলাপ ও ৫০০টি সম্পাদনা।",
        "rcfilters-filtergroup-automated": "স্বয়ংক্রিয় অবদান",
        "rcfilters-filter-logactions-label": "প্রবেশকৃত কার্য",
        "rcfilters-filter-logactions-description": "প্রশাসনিক কর্ম, অ্যাকাউন্ট সৃষ্টিকরণ, পাতা অপসারণ, আপলোড....",
        "rcfilters-hideminor-conflicts-typeofchange-global": "\"অনুল্লেখ্য সম্পাদনা\" ছাঁকনিটির সাথে এক বা ততোধিক \"পরিবর্তনের ধরন\"-সংক্রান্ত ছাঁকনির সংঘর্ষ আছে, কারণ কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়। সংঘর্ষে থাকা ছাঁকনিগুলিকে উপরের \"সক্রিয় ছাঁকনিসমূহ\" এলাকাতে চিহ্নিত করা হয়েছে।",
-       "rcfilters-hideminor-conflicts-typeofchange": "কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়, তাই এই ছাঁকনিটির সাথে নিম্নোক্ত \"পরিবর্তনের ধরন\"-সংক্রান্ত ছাঁকনিগুলির সংঘর্ষ আছে: $1",
+       "rcfilters-hideminor-conflicts-typeofchange": "কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়, তাই এই ছাঁকনিটির সাথে নিম্নোক্ত পরিবর্তনের ধরন ছাঁকনিগুলির সংঘর্ষ আছে: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "এই \"পরিবর্তনের ধরন\"-সংক্রান্ত ছাঁকনিটির সাথে \"অনুল্লেখ্য সম্পাদনা\" ছাঁকনিটির সংঘর্ষ আছে। কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়।",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "fileexists-shared-forbidden": "অংশীদারী ফাইল ভাণ্ডারে এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান।\nআপনি যদি এখনো ফাইলটি আপলোড করতে চান, তবে অনুগ্রহপূর্বক পেছনে গিয়ে একটি নতুন নামে ফাইলটি আপলোড করুন।[[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "আপলোডটি <strong>[[:$1]]</strong>-এর বর্তমান সংস্করণের হুবহু প্রতিলিপি।",
        "fileexists-duplicate-version": "এই আপলোডটি <strong>[[:$1]]</strong>-এর একটি {{PLURAL:$2|পুরনো সংস্করণের}} হুবহু প্রতিলিপি।",
-       "file-exists-duplicate": "এই ফাইলটি নিচের {{PLURAL:$1|ফাইল|ফাইলগুলির}} অনুলিপি:",
+       "file-exists-duplicate": "এই ফাইলটি নিচের {{PLURAL:$1|ফাইলটির|ফাইলগুলির}} অবিকল প্রতিলিপি:",
        "file-deleted-duplicate": "এই ফাইলটির মত একটি ফাইল ([[:$1]]) পূর্বে অপসারণ করা হয়েছে।\nপুনরায় আপলোড করার পূর্বে আপনার উচিত আগের ফাইলটির অপসারণের কারণ জানা।",
        "file-deleted-duplicate-notitle": "এই ফাইলটির মত হুবহু একটি ফাইল আগেই মুছে ফেলা হয়েছে, এবং শিরোনামটিও অবলোপন করা হয়েছে। \nএই ফাইলটিকে পুনরায় আপলোড করার আগে এমন কাউকে জিজ্ঞাসা করে নিন যিনি অবলুপ্ত ফাইল উপাত্তগুলি দেখার ক্ষমতা রাখেন বলে এই পরিস্থিতিটি পর্যালোচনা করতে পারেন।",
        "uploadwarning": "আপলোড সতর্কবাণী",
        "uploaded-href-attribute-svg": "এসভিজি ফাইলের href বৈশিষ্ট্যগুলির জন্য কেবলমাত্র http:// বা https:// লক্ষ্যগুলি অনুমোদিত; কিন্তু <code>&lt;$1 $2=\"$3\"&gt;</code> পাওয়া গেছে।",
        "uploaded-href-unsafe-target-svg": "অনিরাপদ উপাত্তে href পাওয়া গেছে: আপলোডকৃত SVG ফাইলে URI লক্ষ্য ছিল <code>&lt;$1 $2=\"$3\"&gt;</code>।",
        "uploaded-animate-svg": "\"animate\" ট্যাগটি পাওয়া গেছে যা আপলোডকৃত এসভিজি ফাইলের <code>&lt;$1 $2=\"$3\"&gt;</code> - এই \"from\" অ্যাট্রিবিউটটি ব্যবহার করে href পরিবর্তন করতে পারে।",
-       "uploaded-setting-event-handler-svg": "à¦\87ভà§\87নà§\8dà¦\9f-হà§\8dযানà§\8dডলার à¦\85à§\8dযাà¦\9fà§\8dরিবিà¦\89à¦\9f à¦¸à§\87à¦\9f করতে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>&lt;$1 $2=\"$3\"&gt;</code> খুঁজে পাওয়া গেছে।",
+       "uploaded-setting-event-handler-svg": "à¦\87ভà§\87নà§\8dà¦\9f-হà§\8dযানà§\8dডলার à¦\85à§\8dযাà¦\9fà§\8dরিবিà¦\89à¦\9f à¦¨à¦¿à¦°à§\8dধারণ করতে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>&lt;$1 $2=\"$3\"&gt;</code> খুঁজে পাওয়া গেছে।",
        "uploaded-setting-href-svg": "\"set\" ট্যাগটি ব্যবহার করে \"href\" অ্যাট্রিবিউট পিতৃ-উপাদানে যোগ করতে বাধাদান করা হয়েছে।",
        "uploaded-wrong-setting-svg": "\"set\" ট্যাগটি ব্যবহার করে যেকোন অ্যাট্রিবিউটে কোন রিমোট/ডাটা/স্ক্রিপ্ট লক্ষ্য যোগ করতে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>&lt;set to=\"$1\"&gt;</code> খুঁজে পাওয়া গেছে।",
-       "uploaded-setting-handler-svg": "যà§\87 à¦\8fসভিà¦\9cি à¦«à¦¾à¦\87ল à¦°à¦¿à¦®à§\8bà¦\9f/ডাà¦\9fা/সà§\8dà¦\95à§\8dরিপà§\8dà¦\9f à¦¦à¦¿à¦¯à¦¼à§\87 \"handler\" à¦\85à§\8dযাà¦\9fà§\8dরিবিà¦\89à¦\9fà¦\9fি à¦¸à§\87à¦\9f করে, সেটিকে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>$1=\"$2\"</code> খুঁজে পাওয়া গেছে।",
-       "uploaded-remote-url-svg": "যà§\87 à¦\8fসভিà¦\9cি à¦«à¦¾à¦\87ল à¦°à¦¿à¦®à§\8bà¦\9f à¦\87à¦\89à¦\86রà¦\8fল à¦¦à¦¿à¦¯à¦¼à§\87 à¦¯à§\87à¦\95à§\8bন à¦¶à§\88লà§\80 à¦\85à§\8dযাà¦\9fà§\8dরিবিà¦\89à¦\9fà¦\9f à¦¸à§\87à¦\9f করে, সেটিকে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>$1=\"$2\"</code> খুঁজে পাওয়া গেছে।",
+       "uploaded-setting-handler-svg": "যà§\87 à¦\8fসভিà¦\9cি à¦«à¦¾à¦\87ল à¦°à¦¿à¦®à§\8bà¦\9f/ডাà¦\9fা/সà§\8dà¦\95à§\8dরিপà§\8dà¦\9f à¦¦à¦¿à¦¯à¦¼à§\87 \"handler\" à¦\85à§\8dযাà¦\9fà§\8dরিবিà¦\89à¦\9fà¦\9fি à¦¨à¦¿à¦°à§\8dধারণ করে, সেটিকে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>$1=\"$2\"</code> খুঁজে পাওয়া গেছে।",
+       "uploaded-remote-url-svg": "যà§\87 à¦\8fসভিà¦\9cি à¦«à¦¾à¦\87ল à¦°à¦¿à¦®à§\8bà¦\9f à¦\87à¦\89à¦\86রà¦\8fল à¦¦à¦¿à¦¯à¦¼à§\87 à¦¯à§\87à¦\95à§\8bন à¦¶à§\88লà§\80 à¦\85à§\8dযাà¦\9fà§\8dরিবিà¦\89à¦\9fà¦\9f à¦¨à¦¿à¦°à§\8dধারণ করে, সেটিকে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>$1=\"$2\"</code> খুঁজে পাওয়া গেছে।",
        "uploaded-image-filter-svg": "আপলোডকৃত SVG ফাইলে URL: <code>&lt;$1 $2=\"$3\"&gt;</code> সহ ছবি পরিশোধক পাওয়া গেছে।",
        "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"<nowiki>$1</nowiki>\" রয়েছে",
        "uploadinvalidxml": "আপলোডকৃত ফাইলে XML পার্স করা যাবে না।",
        "backend-fail-describe": "\"$1\" ফাইলের মেটাডাটা পরিবর্তন সম্ভব নয়।",
        "backend-fail-alreadyexists": "\"$1\" নামের একটি ফাইল আগে থেকেই রয়েছে।",
        "backend-fail-store": "\"$2\"-এ \"$1\" ফাইলটি সংরক্ষন করা সম্ভব নয়।",
-       "backend-fail-copy": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি \"$2\"-তà§\87 à¦\85নà§\81লিপি করা সম্ভব নয়।",
+       "backend-fail-copy": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি \"$2\"-à¦\8f à¦ªà§\8dরতিলিপি করা সম্ভব নয়।",
        "backend-fail-move": "\"$2\"-এ \"$1\" ফাইলটি স্থানান্তর করা সম্ভব নয়।",
        "backend-fail-opentemp": "অস্থায়ী ফাইলটি খোলা যাবে না।",
        "backend-fail-writetemp": "অস্থায়ী ফাইলটিতে লেখা যাচ্ছে না।",
        "backend-fail-usable": "\"$1\" ফাইলটিতে লেখা অথবা ফাইলটি পড়া যাচ্ছে না, কারণ সঠিক অনুমতি নেই অথবা ডিরেক্টরীটি নেই।",
        "filejournal-fail-dbconnect": "\"$1\" স্টোরেজ ব্যাকেন্ডের জার্নাল ডাটাবেজের সাথে যুক্ত হওয়া যাচ্ছে না।",
        "filejournal-fail-dbquery": "\"$1\" স্টোরেজ ব্যাকেন্ডের জার্নাল ডাটাবেজ হালনাগাদ করা যাচ্ছে না।",
-       "lockmanager-notlocked": "\"$1\" à¦\86নলà¦\95 à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾; à¦\8fà¦\9fি à¦²à¦\95 à¦\95রা à¦°à¦¯à¦¼à§\87à¦\9bà§\87।",
+       "lockmanager-notlocked": "\"$1\" à¦\96à§\8bলা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿; à¦\8fà¦\9fিà¦\95à§\87 à¦\85বরà§\81দà§\8dধ à¦\95রা à¦¹à¦¯à¦¼à¦¨à¦¿।",
        "lockmanager-fail-closelock": "\"$1\" ফাইলটি লক করা তাই বন্ধ করা যাচ্ছে না।",
-       "lockmanager-fail-deletelock": "\"$1\" à¦²à¦\95 à¦\95রা ফাইলটি অপসারণ সম্ভব নয়।",
+       "lockmanager-fail-deletelock": "\"$1\" à¦\85বরà§\8bধনিরà§\8dদà§\87শà¦\95 ফাইলটি অপসারণ সম্ভব নয়।",
        "lockmanager-fail-acquirelock": "\"$1\" লক করা ফাইল খুজে পাওয়া যাচ্ছে না।",
-       "lockmanager-fail-openlock": "\"$1\" à¦²à¦\95 à¦\95রা ফাইলটি খোলা সম্ভব নয়।",
+       "lockmanager-fail-openlock": "\"$1\" à¦\8fà¦\87 à¦\85বরà§\8bধনিরà§\8dদà§\87শà¦\95 ফাইলটি খোলা সম্ভব নয়।",
        "lockmanager-fail-releaselock": "\"$1\" লক করা ফাইলটি ছাড়া যাচ্ছে না।",
-       "lockmanager-fail-db-bucket": "$1 à¦\8fর à¦²à¦\95 à¦\95রা ডাটাবেজের সাথে যোগাযোগ করা যাচ্ছে না।",
+       "lockmanager-fail-db-bucket": "$1 à¦¬à¦¾à¦\95à§\87à¦\9fà¦\9fিতà§\87 à¦¯à¦¥à§\87ষà§\8dà¦\9f à¦¸à¦\82à¦\96à§\8dযà¦\95 à¦\85বরà§\8bধ ডাটাবেজের সাথে যোগাযোগ করা যাচ্ছে না।",
        "lockmanager-fail-db-release": "$1 ডাটাবেজের লক খোলা যাচ্ছে না।",
-       "lockmanager-fail-svr-acquire": "$1 সার্ভারের লক পাওয়া যাচ্ছে না।",
+       "lockmanager-fail-svr-acquire": "$1 সার্ভারে তালা পাওয়া যায়নি।",
        "lockmanager-fail-svr-release": "$1 ডাটাবেজের লক খোলা যাচ্ছে না।",
        "zip-file-open-error": "ফাইলটির জিপ পরীক্ষা করার সময় একটি ত্রুটি দেখা দিয়েছে।",
        "zip-wrong-format": "চিহ্নিত ফাইলটি কোনো জিপ ফাইল নয়।",
        "duplicatesoffile": "নিচের {{PLURAL:$1|ফাইলটি|$1 ফাইলগুলো}} এই ফাইলের প্রতিলিপি ([[Special:FileDuplicateSearch/$2|বিস্তারিত দেখুন]]):",
        "sharedupload": "এই ফাইলটি $1 থেকে নেওয়া হয়েছে এবং এবং অন্যান্য প্রকল্পেও ব্যবহৃত হতে পারে।",
        "sharedupload-desc-there": "এই ফাইলটি $1 থেকে দেখানো হচ্ছে এবং হয়তো এটি অন্যান্য প্রকল্পতেও ব্যবহৃত হয়েছে।\nঅনুগ্রহ করে বিস্তারিত জানার জন্য [$2 ফাইলটির বর্ণনা পাতা] দেখুন।",
-       "sharedupload-desc-here": "à¦\8fà¦\87 à¦«à¦¾à¦\87লà¦\9fি $1 à¦¥à§\87à¦\95à§\87 à¦\86à¦\97ত à¦\8fবà¦\82 à¦\85নà§\8dযানà§\8dয à¦ªà§\8dরà¦\95লà§\8dপà§\87 à¦¬à§\8dযবহà§\83ত à¦¹à¦¤à§\87 à¦ªà¦¾à¦°à§\87।\nসà§\87à¦\96ানà§\87 à¦\85বসà§\8dথিত [$2 à¦«à¦¾à¦\87লà¦\9fির à¦¬à¦¿à¦¬à¦°à¦£ à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼] à¦°à¦¾à¦\96া বিবরণ নিচে দেখানো হলো।",
+       "sharedupload-desc-here": "à¦\8fà¦\87 à¦«à¦¾à¦\87লà¦\9fি $1 à¦¥à§\87à¦\95à§\87 à¦\86à¦\97ত à¦\8fবà¦\82 à¦\85নà§\8dযানà§\8dয à¦ªà§\8dরà¦\95লà§\8dপà§\87 à¦¬à§\8dযবহà§\83ত à¦¹à¦¤à§\87 à¦ªà¦¾à¦°à§\87।\nসà§\87à¦\96ানà§\87 à¦¥à¦¾à¦\95া [$2 à¦«à¦¾à¦\87লà¦\9fির à¦¬à¦¿à¦¬à¦°à¦£ à¦ªà¦¾à¦¤à¦¾à¦°] বিবরণ নিচে দেখানো হলো।",
        "sharedupload-desc-edit": "এই ফাইলটি $1 থেকে এবং অন্যান্য প্রকল্পে ব্যবহৃত হতে পারে।\n[$2 ফাইলটির বর্ণনা পাতা] থেকে আপনি ফাইলটি বর্ণনা সম্পাদনা করতে পারেন।",
        "sharedupload-desc-create": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
        "filepage-nofile": "এই নামের কোন ফাইল নেই।",
        "filedelete-nofile-old": "নির্দেশিত বৈশিষ্ট্যগুলির জন্য '''$1'''-এর কোন আর্কাইভ সংস্করণ নেই।",
        "filedelete-otherreason": "অন্য/বাড়তি কারণ:",
        "filedelete-reason-otherlist": "অন্য কারণ",
-       "filedelete-reason-dropdown": "*সাধারণ à¦\85পসারণà§\87র à¦\95ারণসমà§\82হ\n** à¦\95পিরাà¦\87à¦\9f à¦²à¦\99à§\8dà¦\98ন\n** à¦«à¦¾à¦\87লà§\87র à¦\85নà§\81লিপি",
+       "filedelete-reason-dropdown": "*à¦\85পসারণà§\87র à¦¸à¦¾à¦§à¦¾à¦°à¦£ à¦\95ারণসমà§\82হ\n** à¦\95পিরাà¦\87à¦\9f à¦²à¦\99à§\8dà¦\98ন\n** à¦\85বিà¦\95ল à¦ªà§\8dরতিলিপিà¦\95à§\83ত à¦«à¦¾à¦\87ল",
        "filedelete-edit-reasonlist": "অপসারণের কারণ সম্পাদনা",
        "filedelete-maintenance": "রক্ষণাবেক্ষণের সময় ফাইল অপরাসণ এবং পুনরুদ্ধার সাময়িকভাবে নিস্ক্রিয় রয়েছে।",
        "filedelete-maintenance-title": "ফাইলটি অপসারণ করা সম্ভব নয়",
        "protectedpages-indef": "শুধুমাত্র অসীম সুরক্ষা",
        "protectedpages-summary": "এই পাতাটি বর্তমানে সুরক্ষিত থাকা বিদ্যমান পাতগুলির তালিকা। সৃষ্টি করা থেকে সুরক্ষিত রয়েছে এমন পাতার তালিকার জন্য, [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] দেখুন।",
        "protectedpages-cascade": "শুধুমাত্র প্রপাতাকার সুরক্ষা",
-       "protectedpages-noredirect": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
+       "protectedpages-noredirect": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95ান",
        "protectedpagesempty": "কোন পাতা বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।",
        "protectedpages-timestamp": "সময়বার্তা",
        "protectedpages-page": "পাতা",
        "apisandbox": "এপিআই খেলাঘর",
        "apisandbox-jsonly": "API খেলাঘর ব্যবহার করতে জাভাস্ক্রিপ্ট প্রয়োজন।",
        "apisandbox-api-disabled": "এপিআই এই সাইটে নিষ্ক্রিয় করা আছে।",
-       "apisandbox-intro": "<strong>মিডিয়াà¦\89à¦\87à¦\95ি à¦\93য়à§\87ব à¦¸à§\87বা à¦\8fপিà¦\86à¦\87</strong> à¦¨à¦¿à¦¯à¦¼à§\87 à¦ªà¦°à§\80à¦\95à§\8dষানিরà§\80à¦\95à§\8dষা à¦\9aালাতà§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¬à§\8dযবহার à¦\95রà§\81ন। \nà¦\8fপিà¦\86à¦\87 à¦¬à§\8dযবহারà§\87র à¦\89পর à¦¬à¦¿à¦¸à§\8dতারিত à¦\9cানতà§\87 [[mw:API:Main page|à¦\8fপিà¦\86à¦\87 à¦¡à¦\95à§\81মà§\87নà§\8dà¦\9fà§\87শন]] à¦¦à§\87à¦\96à§\81ন।\nà¦\89দাহরণ: [https://www.mediawiki.org/wiki/API#A_simple_example get the content of a Main Page]। আরও উদাহরণ দেখার জন্য একটি কর্ম নির্বাচন করুন।\n\nলক্ষ করুন যে যদিও এটি একটি খেলাঘর, তা সত্ত্বেও এই পাতায় করা আপনার সম্পাদনাগুলি উইকিতে পরিবর্তন সাধন করতে পারে।",
+       "apisandbox-intro": "<strong>মিডিয়াà¦\89à¦\87à¦\95ি à¦\93য়à§\87ব à¦¸à§\87বা à¦\8fপিà¦\86à¦\87</strong> à¦¨à¦¿à¦¯à¦¼à§\87 à¦ªà¦°à§\80à¦\95à§\8dষানিরà§\80à¦\95à§\8dষা à¦\9aালাতà§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¬à§\8dযবহার à¦\95রà§\81ন। \nà¦\8fপিà¦\86à¦\87 à¦¬à§\8dযবহারà§\87র à¦\89পর à¦¬à¦¿à¦¸à§\8dতারিত à¦\9cানতà§\87 [[mw:API:Main page|à¦\8fপিà¦\86à¦\87 à¦¨à¦¥à¦¿à¦ªà¦¤à§\8dর]] à¦¦à§\87à¦\96à§\81ন।\nà¦\89দাহরণ: [https://www.mediawiki.org/wiki/API#A_simple_example à¦ªà§\8dরধান à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦ªà¦¾à¦¨]। আরও উদাহরণ দেখার জন্য একটি কর্ম নির্বাচন করুন।\n\nলক্ষ করুন যে যদিও এটি একটি খেলাঘর, তা সত্ত্বেও এই পাতায় করা আপনার সম্পাদনাগুলি উইকিতে পরিবর্তন সাধন করতে পারে।",
        "apisandbox-fullscreen": "প্যানেল সম্প্রসারণ করুন",
        "apisandbox-fullscreen-tooltip": "ব্রাউজারের উইন্ডো পূরণ করতে খেলাঘরের প্যানেল প্রসারিত করুন।",
        "apisandbox-unfullscreen": "পাতা দেখাও",
        "magiclink-tracking-isbn": "আইএসবিএন জাদু সংযোগ ব্যবহার করা পাতা",
        "magiclink-tracking-isbn-desc": "এই পাতাটি আইএসবিএন যাদু সংযোগ ব্যবহার করে। কিভাবে মাইগ্রেট করবেন জানতে [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] দেখুন।",
        "specialloguserlabel": "সম্পাদক:",
-       "speciallogtitlelabel": "লà¦\95à§\8dষà§\8dয (শিরà§\8bনাম à¦¬à¦¾ {{ns:user}}:বà§\8dযবহারà¦\95ারà§\80র à¦\9cনà§\8dয ব্যবহারকারী নাম):",
+       "speciallogtitlelabel": "লà¦\95à§\8dষà§\8dয (বà§\8dযবহারà¦\95ারà§\80র à¦\9cনà§\8dয à¦¶à¦¿à¦°à§\8bনাম à¦¬à¦¾ {{ns:user}}:ব্যবহারকারী নাম):",
        "log": "লগগুলি",
        "logeventslist-submit": "দেখাও",
        "all-logs-page": "সব প্রকাশ্য লগ",
        "allpagesprefix": "এই উপসর্গবিশিষ্ট পাতাগুলো দেখাও:",
        "allpagesbadtitle": "প্রদত্ত পাতার শিরোনামটি অবৈধ ছিল অথবা এটিতে কোন আন্তঃভাষা বা আন্তঃউইকি উপসর্গ ছিল। এটিতে এক বা একাধিক ক্যারেক্টার থাকতে পারে যা শিরোনামে ব্যবহার করা সম্ভব নয়।",
        "allpages-bad-ns": "{{SITENAME}}-এ \"$1\" নামের কোন নামস্থান নেই।",
-       "allpages-hide-redirects": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
+       "allpages-hide-redirects": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95ান",
        "cachedspecial-viewing-cached-ttl": "আপনি এই পৃষ্ঠায় একটি ক্যাশে সংস্করণ দেখছেন, যা $1 দিনের পুরানো হতে পারে।",
        "cachedspecial-viewing-cached-ts": "আপনি এই পৃষ্ঠায় একটি ক্যাশে সংস্করণ দেখছেন, যা সম্পূর্ণরূপে হালনাগাদকৃত নাও হতে পারে।",
        "cachedspecial-refresh-now": "সাম্প্রতিকগুলো প্রদর্শন করো।",
        "activeusers-excludegroups": "এই দলভুক্ত ব্যবহারকারী বাদ দিন:",
        "activeusers-noresult": "কোনো ব্যবহারকারী পাওয়া যায়নি।",
        "activeusers-submit": "সক্রিয় ব্যবহারকারী প্রদর্শন করুন",
-       "listgrouprights": "ব্যবহারকারী দল অনুযায়ী অধিকার",
+       "listgrouprights": "ব্যবহারকারীর দলগত অধিকার",
        "listgrouprights-summary": "এই উইকিতে সংজ্ঞায়িত ব্যবহারকারী দলগুলির একটি তালিকা নিচে দেখানো হচ্ছে, সাথে দলের সাথে সংশ্লিষ্ট অধিকারসমূহও উল্লেখ করা হয়েছে।\nনির্দিষ্ট ব্যক্তির অধিকারগুলি সম্পর্কে [[{{MediaWiki:Listgrouprights-helppage}}|অতিরিক্ত তথ্য]] থাকতে পারে।",
        "listgrouprights-key": "ব্যাখ্যা:\n* <span class=\"listgrouprights-granted\">অনুমোদিত অধিকার</span>\n* <span class=\"listgrouprights-revoked\">প্রত্যাহারকৃত অধিকার</span>",
        "listgrouprights-group": "দল",
        "emailsubject": "বিষয়:",
        "emailmessage": "বার্তা:",
        "emailsend": "প্রেরণ করো",
-       "emailccme": "à¦\86মার à¦¬à¦¾à¦°à§\8dতার à¦\8fà¦\95à¦\9fি à¦\85নà§\81লিপি à¦\86মাà¦\95à§\87 à¦\87-মেইল করা হোক।",
-       "emailccsubject": "আপনার বার্তার অনুলিপি $1-কে: $2",
+       "emailccme": "à¦\86মার à¦¬à¦¾à¦°à§\8dতার à¦\8fà¦\95à¦\9fি à¦ªà§\8dরতিলিপি à¦\86মাà¦\95à§\87 à¦\87মেইল করা হোক।",
+       "emailccsubject": "$1-কে আপনার বার্তার প্রতিলিপি: $2",
        "emailsent": "ই-মেইল প্রেরণ করা হয়েছে",
        "emailsenttext": "আপনার ই-মেইল বার্তা প্রেরণ করা হয়েছে।",
        "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে {{GENDER:$2|$2}}-এর নিকট {{GENDER:$1|পাঠানো হয়েছে}}। যদি {{GENDER:$2|আপনি}} এই ইমেইলটির উত্তর দেন, তাহলে {{GENDER:$2|আপনার}} উত্তরের ইমেইলটি সরাসরি {{GENDER:$1|মূল প্রেরকের}} কাছে পাঠানো হবে, সেই সাথে {{GENDER:$2|আপনার}} ইমেল ঠিকানা {{GENDER:$1|তাঁর}} কাছে প্রকাশ করা হবে।",
        "deletecomment": "কারণ:",
        "deleteotherreason": "অন্য/অতিরিক্ত কারণ:",
        "deletereasonotherlist": "অন্য কারণ",
-       "deletereason-dropdown": "*মà§\81à¦\9bà§\87 à¦«à§\87লার à¦¸à¦¾à¦§à¦¾à¦°à¦£ à¦\95ারণà¦\97à§\81লি\n** à¦\85বাà¦\9eà§\8dà¦\9bিত à¦ªà§\81নরাবà§\83তà§\8dত à¦¸à¦®à§\8dপাদনা (spam)\n** ধ্বংসপ্রবণতা\n** কপিরাইট ভঙ্গ\n** লেখকের অনুরোধ\n** অকার্যকর পুনঃনির্দেশ",
+       "deletereason-dropdown": "*মà§\81à¦\9bà§\87 à¦«à§\87লার à¦¸à¦¾à¦§à¦¾à¦°à¦£ à¦\95ারণà¦\97à§\81লি\n** à¦¸à§\8dপà§\8dযাম\n** ধ্বংসপ্রবণতা\n** কপিরাইট ভঙ্গ\n** লেখকের অনুরোধ\n** অকার্যকর পুনঃনির্দেশ",
        "delete-edit-reasonlist": "অপসারণের কারণ সম্পাদনা",
        "delete-toobig": "এই পাতার সম্পাদনার ইতিহাস অনেক বড়, যা $1টি {{PLURAL:$1|সংস্করণের|সংস্করণের}} বেশি।\n{{SITENAME}}-এর দূর্ঘটনাজনিত সমস্যা এড়াতে এই ধরনের পাতা মুছার ব্যপারে সীমাবদ্ধতা আরোপিত হয়েছে।",
        "delete-warning-toobig": "এই পাতাটির একটি বৃহৎ সম্পাদনা ইতিহাস রয়েছে, যা $1 {{PLURAL:$1|সংস্করণেরও|সংস্করণেরও}} বেশি।\nএই পাতাটি মুছে ফেললে তা {{SITENAME}} সাইটের ডেটাবেজ সমস্যার কারণ হতে পারে;\nসাবধানতার সাথে এগিয়ে যান।",
        "changecontentmodel-submit": "পরিবর্তন করুন",
        "changecontentmodel-success-title": "বিষয়বস্তুর প্রতিরূপ পরিবর্তিত হয়েছিলো",
        "changecontentmodel-success-text": "[[:$1]]-এর বিষয়বস্তুর ধরণ পরিবর্তন হয়েছে।",
-       "changecontentmodel-cannot-convert": "[[:$1]] à¦¨à¦¾à¦®à§\87র à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 $2 à¦¨à¦¾à¦®à¦\95 à¦¸à§\8dথানà§\80য়à¦\95à§\83ত ধরনে রূপান্তরিত করা সম্ভব নয়।",
+       "changecontentmodel-cannot-convert": "[[:$1]] à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 $2-à¦\8fর ধরনে রূপান্তরিত করা সম্ভব নয়।",
        "changecontentmodel-nodirectediting": "$1 বিষয়বস্তুর রূপ সরাসরি সম্পাদনা করা সমর্থন করে না",
        "changecontentmodel-emptymodels-title": "কোন বিষয়বস্তুর রূপ উপলব্ধ নয়",
-       "changecontentmodel-emptymodels-text": "[[:$1]] à¦¨à¦¾à¦®à§\87র à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\95à§\8bন à¦°à¦\95মà§\87র à¦¬à¦¿à¦·à¦\87য়বসà§\8dতà§\81 ধরনেই রূপান্তরিত করা সম্ভব নয়।",
+       "changecontentmodel-emptymodels-text": "[[:$1]] à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\95à§\8bন ধরনেই রূপান্তরিত করা সম্ভব নয়।",
        "log-name-contentmodel": "বিষয়বস্তুর রূপ পরিবর্তন লগ",
        "log-description-contentmodel": "এই পাতাতে পাতাগুলির বিষয়বস্তুর মডেলের পরিবর্তনের একটি তালিকা আছে। এছাড়াও পূর্বনির্ধারিত মডেল ব্যতীত অন্য মডেলে তৈরি করা পাতাগুলিও তালিকাতে দেওয়া আছে।",
-       "logentry-contentmodel-new": "$1 পূর্বনির্ধারিত নয় এমন একটি বিষয়বস্তু মডেল \"$5\" ব্যবহার $3 নামের পাতাটি {{GENDER:$2|তৈরি করেছেন}}",
+       "logentry-contentmodel-new": "$1 পূর্বনির্ধারিত নয় এমন একটি বিষয়বস্তুর রূপ \"$5\" ব্যবহার $3 পাতাটি {{GENDER:$2|তৈরি করেছেন}}",
        "logentry-contentmodel-change": "$1 $3 পাতার বিষয়বস্তুর রূপ \"$4\" থেকে \"$5\"-এ {{GENDER:$2|পরিবর্তন করেছেন}}",
        "logentry-contentmodel-change-revertlink": "প্রত্যাবর্তন",
        "logentry-contentmodel-change-revert": "প্রত্যাবর্তন",
        "protectexpiry": "মেয়াদোত্তীর্ণ হবে:",
        "protect_expiry_invalid": "মেয়াদোত্তীর্ণ সময় অবৈধ।",
        "protect_expiry_old": "মেয়াদোত্তীর্ণ সময় অতীতে অবস্থিত।",
-       "protect-unchain-permissions": "সুরক্ষা-সংক্রান্ত অন্যান্য পছন্দগুলি দেখার জন্য তালা খুলুন",
+       "protect-unchain-permissions": "সুরক্ষা অন্যান্য পছন্দগুলি দেখার জন্য তালা খুলুন",
        "protect-text": "'''$1''' পাতাটির জন্য সুরক্ষার স্তর আপনি এখানে দেখতে ও পরিবর্তন করতে পারেন।",
        "protect-locked-blocked": "বাধাপ্রাপ্ত অবস্থায় আপনি পাতাটির সুরক্ষা স্তর পরিবর্তন করতে পারবেন না। এখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
-       "protect-locked-dblock": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ থাকায় সুরক্ষা স্তর পরিবর্তন করা যাবে না।\nএখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
+       "protect-locked-dblock": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ থাকায় সুরক্ষা স্তর পরিবর্তন করা যাবে না।\nএখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
        "protect-locked-access": "আপনার অ্যাকাউন্ট থেকে পাতার সুরক্ষা স্তর পরিবর্তন করার অনুমতি নেই।\nএখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
        "protect-cascadeon": "এই পাতাটি বর্তমানে সুরক্ষিত আছে, কারণ পাতাটি নিচের {{PLURAL:$1|পাতায়|পাতাগুলিতে}} অন্তর্ভুক্ত, {{PLURAL:$1|যাতে|যেগুলিতে}} প্রপাতাকার সুরক্ষা চালু আছে। আপনি এই পাতাটির সুরক্ষা স্তর পরিবর্তন করতে পারেন, তবে এটি প্রপাতাকার সুরক্ষাটিতে কোন পরিবর্তন সাধন করবে না।",
        "protect-default": "সমস্ত ব্যবহারকারীর জন্য",
        "pagesize": "(বাইট)",
        "restriction-edit": "সম্পাদনা",
        "restriction-move": "সরিয়ে নেওয়া",
-       "restriction-create": "সà§\83ষà§\8dà¦\9fি à¦\95রা à¦¹à§\8bà¦\95",
+       "restriction-create": "তà§\88রি à¦\95রà§\81ন",
        "restriction-upload": "আপলোড",
        "restriction-level-sysop": "সম্পূর্ণ সুরক্ষিত",
        "restriction-level-autoconfirmed": "অর্ধ-সুরক্ষিত",
        "ipaddressorusername": "আইপি ঠিকানা বা ব্যবহারকারীর নাম:",
        "ipbexpiry": "যখন মেয়াদোত্তীর্ণ হবে:",
        "ipbreason": "কারণ:",
-       "ipbreason-dropdown": "*বাধা à¦¦à¦¾à¦¨à§\87র à¦¸à¦¾à¦§à¦¾à¦°à¦£ à¦\95ারণà¦\97à§\81লি\n** à¦®à¦¿à¦¥à§\8dযা à¦¤à¦¥à§\8dয à¦ªà§\8dরবিষà§\8dà¦\9f à¦\95রা\n** à¦ªà¦¾à¦¤à¦¾ à¦¥à§\87à¦\95à§\87 à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦®à§\81à¦\9bà§\87 à¦«à§\87লা\n** à¦\85বাà¦\9eà§\8dà¦\9bিত à¦¬à¦¹à¦¿à¦\83সà§\8dথ à¦\95à§\8bন à¦¸à¦¾à¦\87à¦\9fà§\87র à¦ªà§\8dরতি à¦¸à¦\82যà§\8bà¦\97 à¦¬à¦¾à¦°à¦\82বার à¦¯à§\8bà¦\97 à¦\95রা\n** à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লিতà§\87 à¦\85রà§\8dথহà§\80ন à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦ªà§\8dরবিষà§\8dà¦\9f করা\n** ভীতি উদ্রেককারী আচরণ/হয়রানি\n** একাধিক অ্যাকাউন্টের অপব্যবহার\n** ব্যবহারকারী নাম অগ্রহণযোগ্য",
+       "ipbreason-dropdown": "*বাধা à¦¦à¦¾à¦¨à§\87র à¦¸à¦¾à¦§à¦¾à¦°à¦£ à¦\95ারণà¦\97à§\81লি\n** à¦®à¦¿à¦¥à§\8dযা à¦¤à¦¥à§\8dয à¦¯à§\8bà¦\97 à¦\95রা\n** à¦ªà¦¾à¦¤à¦¾ à¦¥à§\87à¦\95à§\87 à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦®à§\81à¦\9bà§\87 à¦«à§\87লা\n** à¦\85বাà¦\9eà§\8dà¦\9bিত à¦¬à¦¹à¦¿à¦\83সà§\8dথ à¦\95à§\8bন à¦¸à¦¾à¦\87à¦\9fà§\87র à¦ªà§\8dরতি à¦¸à¦\82যà§\8bà¦\97 à¦¬à¦¾à¦°à¦\82বার à¦¯à§\8bà¦\97 à¦\95রা\n** à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লিতà§\87 à¦\85রà§\8dথহà§\80ন à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦¯à§\8bà¦\97 করা\n** ভীতি উদ্রেককারী আচরণ/হয়রানি\n** একাধিক অ্যাকাউন্টের অপব্যবহার\n** ব্যবহারকারী নাম অগ্রহণযোগ্য",
        "ipb-hardblock": "এই আইপি ঠিকানা থেকে লগ-ইনকৃত ব্যবহারকারীদেরকে সম্পাদনায় বাধা দাও",
        "ipbcreateaccount": "অ্যাকাউন্ট সৃষ্টিতে বাধা দেওয়া হোক",
        "ipbemailban": "ব্যবহারকারীকে ই-মেইল পাঠাতে বাধা দেওয়া হোক",
        "cant-see-hidden-user": "আপনি যে ব্যবহারকারীকে ব্লক বা লুকিয়ে রাখতে চাচ্ছেন তাকে আগে থেকেই ব্লক বা লুকিয়ে রাখা হয়েছে। এছাড়া আপনার Hideuser অধিকার নেই, তাই আপনি ব্যবহারকারীর অবস্থা পরিবর্তন করতে পারবেন না।",
        "ipbblocked": "আপনি অন্য কোন ব্যবহারকরীকে ব্লক বা আনব্লক করতে পারবেন না, কারণ আপনি নিজেই ব্লক রয়েছেন",
        "ipbnounblockself": "আপনি নিজেকে আনব্লক করতে পারবেন না",
-       "lockdb": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ করে দেওয়া হোক",
+       "lockdb": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ করে দেওয়া হোক",
        "unlockdb": "ডাটাবেজ খুলে দেওয়া হোক",
-       "lockdbtext": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রà§\87 à¦¦à¦¿à¦²à§\87 à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦ªà¦\9bনà§\8dদ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦¨à¦\9cরতালিà¦\95া à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87, এবং ডাটাবেজে পরিবর্তন আনে এমন কোন কিছু করতে পারবেন না।\nঅনুগ্রহ করে নিশ্চিত করুন যে আপনি এটাই করতে চান, এবং আপনার রক্ষণাবেক্ষণ শেষ হবার পর ডাটাবেজ আবার খুলে দেবেন।",
+       "lockdbtext": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রà§\87 à¦¦à¦¿à¦²à§\87 à¦\95à§\8bনà§\8b à¦¬à§\8dযবহারà¦\95ারà§\80à¦\87 à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦ªà¦\9bনà§\8dদ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦¨à¦\9cরতালিà¦\95া à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 এবং ডাটাবেজে পরিবর্তন আনে এমন কোন কিছু করতে পারবেন না।\nঅনুগ্রহ করে নিশ্চিত করুন যে আপনি এটাই করতে চান, এবং আপনার রক্ষণাবেক্ষণ শেষ হবার পর ডাটাবেজ আবার খুলে দেবেন।",
        "unlockdbtext": "ডাটাবেজ খুলে দিলে সব ব্যবহারকারী পাতা সম্পাদনা করতে, তাদের পছন্দ পরিবর্তন করতে, তাদের নজরতালিকা সম্পাদনা করতে, এবং ডাটাবেজে পরিবর্তন সাধন করে, এমন অন্যান্য কাজ করতে পারবেন।\nঅনুগ্রহ করে নিশ্চিত করুন যে আপনি এটাই করতে চান।",
-       "lockconfirm": "হà§\8dযাà¦\81, à¦\86মি à¦\86সলà§\87à¦\87 à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রতে চাই।",
+       "lockconfirm": "হà§\8dযাà¦\81, à¦\86মি à¦\86সলà§\87à¦\87 à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রà§\87 à¦¦à¦¿তে চাই।",
        "unlockconfirm": "হ্যাঁ, আমি আসলেই ডাটাবেজ খুলে দিতে চাই।",
-       "lockbtn": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ করা হোক",
+       "lockbtn": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ করা হোক",
        "unlockbtn": "ডাটাবেজ খুলে দেওয়া হোক",
        "locknoconfirm": "আপনি নিশ্চিতকরণ বাক্সে টিক দেননি।",
-       "lockdbsuccesssub": "ডাà¦\9fাবà§\87à¦\9c à¦¸à¦«à¦²à¦­à¦¾à¦¬à§\87 à¦¬à¦¨্ধ করে দেওয়া হয়েছে",
+       "lockdbsuccesssub": "ডাà¦\9fাবà§\87à¦\9c à¦¸à¦«à¦²à¦­à¦¾à¦¬à§\87 à¦\85বরà§\81দ্ধ করে দেওয়া হয়েছে",
        "unlockdbsuccesssub": "ডাটাবেজ খুলে দেওয়া হয়েছে",
-       "lockdbsuccesstext": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ করা হয়েছে\n<br />আপনার রক্ষণাবেক্ষণ সম্পন্ন হবার পর [[Special:UnlockDB|ডাটাবেজ খুলে দিতে]] ভুলবেন না।",
+       "lockdbsuccesstext": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ করা হয়েছে\n<br />আপনার রক্ষণাবেক্ষণ সম্পন্ন হবার পর [[Special:UnlockDB|ডাটাবেজ খুলে দিতে]] ভুলবেন না।",
        "unlockdbsuccesstext": "ডাটাবেজ খুলে দেওয়া হয়েছে।",
-       "lockfilenotwritable": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রার à¦«à¦¾à¦\87লà¦\9fি à¦²à¦¿à¦\96নযà§\8bà¦\97à§\8dয à¦¨à¦¯à¦¼à¥¤ à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ করতে বা খুলতে চাইলে ফাইলটিকে ওয়েব সার্ভার কর্তৃক লিখনযোগ্য হতে হবে।",
-       "databaselocked": "ডাà¦\9fাবà§\87সà¦\9fি à¦\87তিমধà§\8dযà§\87à¦\87 à¦¤à¦¾à¦²à¦¾à¦¬দ্ধ।",
+       "lockfilenotwritable": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\8bধনিরà§\8dদà§\87শà¦\95 à¦«à¦¾à¦\87লà¦\9fি à¦²à¦¿à¦\96নযà§\8bà¦\97à§\8dয à¦¨à¦¯à¦¼à¥¤ à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ করতে বা খুলতে চাইলে ফাইলটিকে ওয়েব সার্ভার কর্তৃক লিখনযোগ্য হতে হবে।",
+       "databaselocked": "ডাà¦\9fাবà§\87à¦\9cà¦\9fি à¦\87তিমধà§\8dযà§\87à¦\87 à¦\85বরà§\81দ্ধ।",
        "databasenotlocked": "ডাটাবেজ বন্ধ নয়।",
        "lockedbyandtime": "({{GENDER:$1|$1}} $2 এর $3 সময়ে)",
        "move-page": "$1 স্থানান্তর",
        "import-interwiki-text": "আমদানির জন্য একটি উইকি ও পাতার শিরোনাম নির্বাচন করুন।\nসংশোধনের তারিখগুলি এবং সম্পাদকদের নামগুলি সংরক্ষণ করা হবে।\nঅন্যান্য উইকি থেকে সমস্ত আমদানি [[Special:Log/import|আমদানি লগে]] লিপিবদ্ধ আছে।",
        "import-interwiki-sourcewiki": "উত্স উইকি:",
        "import-interwiki-sourcepage": "উৎস পাতা:",
-       "import-interwiki-history": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¸à¦®à¦¸à§\8dত à¦\87তিহাসà§\87র à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦\85নà§\81লিপি করা হোক",
+       "import-interwiki-history": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦\87তিহাসà§\87র à¦¸à¦®à¦¸à§\8dত à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦ªà§\8dরতিলিপি করা হোক",
        "import-interwiki-templates": "সকল টেম্পলেট অন্তর্ভুক্ত",
        "import-interwiki-submit": "আমদানি",
        "import-mapping-default": "পূর্বনির্ধারিত অবস্থানে আমদানি করুন",
        "import-error-special": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ এটি একটি বিশেষ নামস্থানকে নির্দেশ করে যেটি সম্পাদনার জন্য অনুমোদিত নয়।",
        "import-error-invalid": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ নামটি সঠিক নয়।",
        "import-error-unserialize": "$1 পাতার $2 সংস্করণটি সিরিয়ালাইজ করা যাচ্ছে না। এই রিভিশনে $4 হিসাবে $3 কন্টেন্ট মডেলে সিরিয়ালাইজ করা আছে।",
-       "import-error-bad-location": "বিষয়বসà§\8dতà§\81 à¦®à¦¡à§\87ল $3 à¦¬à§\8dযবহার à¦\95রà§\87 à¦¸à¦®à§\8dপাদিত $2 à¦¨à¦\82 à¦¸à¦\82শà§\8bধনà¦\9fি \"$1\" à¦¨à¦¾à¦®à§\87র à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রা à¦¯à¦¾à¦¬à§\87 à¦¨à¦¾, à¦\95ারণ à¦\90 à¦®à¦¡à§\87লà¦\9fি à¦\90 à¦ªà¦¾à¦¤à¦¾à¦¤à§\87 à¦ªà§\8dরযà§\8bà¦\9cà§\8dয à¦¨à¦¯à¦¼à¥¤",
+       "import-error-bad-location": "বিষয়বস্তু মডেল $3 ব্যবহার করে সম্পাদিত $2 নং সংশোধনটি \"$1\" পাতায় সংরক্ষণ করা যাবে না, কারণ ঐ মডেলটি ঐ পাতাতে প্রযোজ্য নয়।",
        "import-options-wrong": "{{PLURAL:$2|পছন্দ}} নির্বাচনে ভুল: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "মূল পাতার ভুল শিরনাম দেয়া হয়েছে।",
        "import-rootpage-nosubpage": "মূল পাতার \"$1\" নামস্থানে উপপাতা তৈরী অনুমোদিত নয়।",
        "tooltip-ca-nstab-help": "সাহায্য পাতাটি দেখুন",
        "tooltip-ca-nstab-category": "বিষয়শ্রেণী পাতাটি দেখুন",
        "tooltip-minoredit": "এটিকে অনুল্লেখ্য সম্পাদনা হিসেবে চিহ্নিত করা হোক",
-       "tooltip-save": "à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¸à¦\82রà¦\95à§\8dষিত à¦¹à§\8bà¦\95",
+       "tooltip-save": "à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¸à¦\82রà¦\95à§\8dষিত à¦\95রà§\81ন",
        "tooltip-publish": "আপনার পরিবর্তন প্রকাশ করুন",
        "tooltip-preview": "অনুগ্রহ করে সংরক্ষণের আগে আপনার পরিবর্তনগুলি প্রাকদর্শন করুন!",
-       "tooltip-diff": "à¦\86পনি à¦\9fà§\87à¦\95à§\8dসà¦\9fà§\87 à¦\95à§\80 à¦\95à§\80 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রà§\87à¦\9bà§\87ন, à¦¤à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95।",
+       "tooltip-diff": "লà§\87à¦\96ায় à¦\95à§\80 à¦\95à§\80 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রà§\87à¦\9bà§\87ন à¦¤à¦¾ à¦¦à§\87à¦\96à§\81ন",
        "tooltip-compareselectedversions": "এই পাতার দুইটি নির্বাচিত সংস্করণের মধ্যে তুলনা দেখুন।",
        "tooltip-watch": "এই পাতাটি আমার নজরতালিকায় যোগ করো",
        "tooltip-watchlistedit-normal-submit": "শিরোনাম অপসারণ",
        "anonusers": "{{SITENAME}} বেনামী {{PLURAL:$2|ব্যবহারকারী|ব্যবহারকারীগণ}} $1",
        "creditspage": "পাতার স্বীকৃতি",
        "nocredits": "এই পাতাটির জন্য কোন কৃতিত্ব-সম্পর্কিত তথ্য নেই।",
-       "spamprotectiontitle": "à¦\85বাà¦\9eà§\8dà¦\9bিত à¦ªà§\81নরাবà§\83তà§\8dত à¦¸à¦®à§\8dপাদনা (spam) প্রতিরক্ষা ছাঁকনি",
-       "spamprotectiontext": "à¦\86পনি à¦¯à§\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦\9aà§\87য়à§\87à¦\9bà§\87ন, à¦¤à¦¾ à¦\85বাà¦\9eà§\8dà¦\9bিত à¦ªà§\81নরাবà§\83তà§\8dত à¦¸à¦®à§\8dপাদনার ছাঁকনি বাধা দিয়েছে। সম্ভবত কালোতালিকাভুক্ত বহিঃস্থ কোন সাইটের সংযোগের কারণে এমনটি ঘটেছে।",
-       "spamprotectionmatch": "নিà¦\9aà§\87র à¦\9fà§\87à¦\95à§\8dসà¦\9fà¦\9fি à¦\86মাদà§\87র à¦\85বাà¦\9eà§\8dà¦\9bিত à¦ªà§\81নরাবà§\83তà§\8dত à¦¸à¦®à§\8dপাদনার ছাঁকনিকে সক্রিয় করেছে: $1",
-       "spambot_username": "মিডিয়াà¦\89à¦\87à¦\95ি à¦\85বাà¦\9eà§\8dà¦\9bিত à¦ªà§\81নরাবà§\83তà§\8dত à¦¸à¦®à§\8dপাদনা পরিস্কার",
+       "spamprotectiontitle": "সà§\8dপà§\8dযাম প্রতিরক্ষা ছাঁকনি",
+       "spamprotectiontext": "à¦\86পনি à¦¯à§\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦\9aà§\87য়à§\87à¦\9bà§\87ন, à¦¤à¦¾ à¦¸à§\8dপà§\8dযাম ছাঁকনি বাধা দিয়েছে। সম্ভবত কালোতালিকাভুক্ত বহিঃস্থ কোন সাইটের সংযোগের কারণে এমনটি ঘটেছে।",
+       "spamprotectionmatch": "নিà¦\9aà§\87র à¦²à§\87à¦\96াà¦\9fি à¦\86মাদà§\87র à¦¸à§\8dপà§\8dযাম ছাঁকনিকে সক্রিয় করেছে: $1",
+       "spambot_username": "মিডিয়াà¦\89à¦\87à¦\95ি à¦¸à§\8dপà§\8dযাম পরিস্কার",
        "spam_reverting": "$1-এর প্রতি কোন সংযোগ নেই, এমন সর্বশেষ সংস্করণে ফেরত নেওয়া হচ্ছে।",
        "spam_blanking": "$1-এর প্রতি সংযোগ অন্তর্ভুক্ত আছে এমন সমস্ত সংশোধন খালি করা হচ্ছে",
        "spam_deleting": "$1-এর প্রতি সংযোগ অন্তর্ভুক্ত আছে এমন সমস্ত সংশোধন অপসারণ করা হচ্ছে",
        "metadata": "অধি-উপাত্ত",
        "metadata-help": "এই ফাইলে অতিরিক্ত কিছু তথ্য আছে। সম্ভবত যে ডিজিটাল ক্যামেরা বা স্ক্যানারের মাধ্যমে এটি তৈরি বা ডিজিটায়িত করা হয়েছিল, সেটি কর্তৃক তথ্যগুলি যুক্ত হয়েছে। যদি ফাইলটি তার আদি অবস্থা থেকে পরিবর্তিত হয়ে থাকে, কিছু কিছু বিবরণ পরিবর্তিত ফাইলটির জন্য প্রযোজ্য না-ও হতে পারে।",
        "metadata-expand": "সম্প্রসারিত সবিস্তারে দেখাও",
-       "metadata-collapse": "সমà§\8dপà§\8dরসারিত à¦¬à¦¿à¦¸à§\8dতারিত à¦¬à¦¿à¦¬à¦°à¦£ à¦²à§\81à¦\95ানà§\8b à¦¹à§\8bà¦\95",
-       "metadata-fields": "à¦\8fà¦\87 à¦¬à¦¾à¦°à§\8dতায় à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦\9aিতà§\8dর à¦®à§\87à¦\9fাডাà¦\9fা à¦\95à§\8dষà§\87তà§\8dরà¦\97à§\81লি à¦\9bবির à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà§\8dরদরà§\8dশন à¦\95রা à¦¹à¦¬à§\87, à¦¯à¦\96ন à¦\85ধি-à¦\89পাতà§\8dত সারণিটি সংকুচিত করা হবে। অন্য ক্ষেত্রগুলি স্বাভাবিক অবস্থায় লুকায়িত থাকবে।\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-collapse": "সমà§\8dপà§\8dরসারিত à¦¬à¦¿à¦¬à¦°à¦£ à¦¦à§\87à¦\96ান",
+       "metadata-fields": "à¦\8fà¦\87 à¦¬à¦¾à¦°à§\8dতায় à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦\9aিতà§\8dর à¦®à§\87à¦\9fাডাà¦\9fা à¦\95à§\8dষà§\87তà§\8dরà¦\97à§\81লি à¦\9bবির à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà§\8dরদরà§\8dশন à¦\95রা à¦¹à¦¬à§\87, à¦¯à¦\96ন à¦®à§\87à¦\9fাডাà¦\9fা সারণিটি সংকুচিত করা হবে। অন্য ক্ষেত্রগুলি স্বাভাবিক অবস্থায় লুকায়িত থাকবে।\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "চওড়া",
        "exif-imagelength": "লম্বা",
        "exif-bitspersample": "উপাদানপ্রতি বিট",
        "version-specialpages": "বিশেষ পাতাসমূহ",
        "version-parserhooks": "পার্সার হুক",
        "version-variables": "চলক",
-       "version-antispam": "à¦\85বাà¦\9eà§\8dà¦\9bিত à¦ªà§\81নরাবà§\83তà§\8dত à¦¸à¦®à§\8dপাদনা প্রতিরোধ",
+       "version-antispam": "সà§\8dপà§\8dযাম প্রতিরোধ",
        "version-other": "অন্য",
        "version-mediahandlers": "মিডিয়া ব্যবস্থাপক",
        "version-hooks": "হুক",
        "version-license-not-found": "এই এক্সটেনশনের জন্য কোনো বিস্তারিত লাইসেন্স তথ্য পাওয়া যায়নি।",
        "version-credits-title": "$1-এর জন্য কৃতিত্ব",
        "version-credits-not-found": "এই এক্সটেনশনটির জন্য কোনো বিস্তারিত কৃতিত্ব তথ্য পাওয়া যায়নি।",
-       "version-poweredby-credits": "এই উইকিটি পরিচালিত হচ্ছে <strong>[https://www.mediawiki.org/ মিডিয়াউইকি]</strong> -এর মাধ্যমে, কপিরাইট © ২০০১-$1 $2।",
+       "version-poweredby-credits": "এই উইকিটি <strong>[https://www.mediawiki.org/ মিডিয়াউইকির]</strong> মাধ্যমে পরিচালিত হচ্ছে, কপিরাইট © ২০০১-$1 $2।",
        "version-poweredby-others": "অন্যান্য",
        "version-poweredby-translators": "translatewiki.net অনুবাদকগণ",
        "version-credits-summary": "[[Special:Version|মিডিয়াউইকি]] সফটওয়্যারে অবদানের জন্য আমরা এই ব্যক্তিকে স্বীকৃতি দিতে চাই।",
-       "version-license-info": "মিডিয়াà¦\89à¦\87à¦\95ি à¦\8fà¦\95à¦\9fি à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার; à¦\86পনি à¦\8fà¦\9fি à¦¬à¦¿à¦¤à¦°à¦£ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦\8fবà¦\82/à¦\85থবা à¦¸à¦®à§\8dপদানা à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন, à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà§\87র à¦ªà§\8dরà¦\95াশিত à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à§¨à¦¯à¦¼ à¦\85থবা à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95তম à¦\95à§\8bনà§\8b à¦¸à¦\82সà§\8dà¦\95রণ à¦®à§\87নà§\87 à¦\9aলতà§\87 à¦¹à¦¬à§\87। \n\nসà¦\95লà§\87র à¦\89পà¦\95ারà§\87র à¦²à¦\95à§\8dষà§\8dযà§\87 à¦\8fà¦\9fি à¦¬à¦¿à¦¤à¦°à¦£ à¦\95রা à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87, à¦\95িনà§\8dতà§\81 à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦\95à§\8bনà§\8b à¦\93য়ারà§\87নà§\8dà¦\9fি à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾, à¦\8fমনà¦\95ি à¦¬à¦¿à¦¶à§\87ষ à¦\95à§\8bনà§\8b à¦\95ারà§\8dযà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦¬à§\8dযবহারà§\87র à¦\9cনà§\8dযà¦\93 à¦¤à¦¥à¦¾à¦\95থিত à¦\93য়ারà§\87নà§\8dà¦\9fি à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾à¥¤ à¦¬à¦¿à¦¸à§\8dতারিত à¦\9cানতà§\87 à¦¦à§\87à¦\96à§\81ন à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dস। \n\nà¦\8fà¦\87 à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦¸à¦¾à¦¥à§\87 [{{SERVER}}{{SCRIPTPATH}}/COPYING à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à¦\8fà¦\95à¦\9fি à¦\85নà§\81লিপি] à¦¥à¦¾à¦\95ার à¦\95থা; à¦¯à¦¦à¦¿ à¦\86পনি à¦¨à¦¾ à¦ªà§\87য়à§\87 à¦¥à¦¾à¦\95à§\87ন à¦¤à¦¾à¦¹à¦²à§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà¦\95à§\87 à¦\9cানান à¦\8fà¦\87 à¦ à¦¿à¦\95ানায়, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA à¦\85থবা [//www.gnu.org/licenses/old-licenses/gpl-2.0.html à¦\85নলাà¦\87নà§\87 à¦¦à§\87à¦\96ুন]।",
+       "version-license-info": "মিডিয়াà¦\89à¦\87à¦\95ি à¦\8fà¦\95à¦\9fি à¦\89নà§\8dমà§\81à¦\95à§\8dত à¦¸à¦«à¦\9fà¦\93য়à§\8dযার; à¦\86পনি à¦\8fà¦\9fি à¦ªà§\81নà¦\83বিতরণ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦\8fবà¦\82/à¦\85থবা à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন, à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà§\87র à¦ªà§\8dরà¦\95াশিত à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à§¨à¦¯à¦¼ à¦\85থবা à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95তম à¦\95à§\8bনà§\8b à¦¸à¦\82সà§\8dà¦\95রণ à¦®à§\87নà§\87 à¦\9aলতà§\87 à¦¹à¦¬à§\87। \n\nমিডিয়াà¦\89à¦\87à¦\95ি à¦\8fà¦\87 à¦\86শায় à¦¬à¦¿à¦¤à¦°à¦£ à¦\95রা à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87 à¦¯à§\87 à¦\8fà¦\9fি à¦¸à¦\95লà§\87র à¦\89পà¦\95ারà§\87 à¦\86সবà§\87, à¦\95িনà§\8dতà§\81 à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦\95à§\8bনà§\8b à¦²à¦¿à¦\96িত à¦\85à¦\99à§\8dà¦\97à§\80à¦\95ার à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾, à¦\8fমনà¦\95ি à¦¬à§\8dযবসাযà§\8bà¦\97à§\8dযতা à¦¬à¦¾ à¦¬à¦¿à¦¶à§\87ষ à¦\95à§\8bনà§\8b à¦\95ারà§\8dযà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦¬à§\8dযবহারà§\87র à¦\9cনà§\8dয à¦\8fà¦\9fি à¦\89পযà§\81à¦\95à§\8dত à¦\95ি à¦¨à¦¾, à¦\8f à¦¨à¦¿à¦¯à¦¼à§\87 à¦ªà¦°à§\8bà¦\95à§\8dষ à¦\85à¦\99à§\8dà¦\97à§\80à¦\95ারà¦\93 à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾à¥¤ à¦¬à¦¿à¦¸à§\8dতারিত à¦\9cানতà§\87 à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dস à¦¦à§\87à¦\96à§\81ন। \n\nà¦\8fà¦\87 à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦¸à¦¾à¦¥à§\87 [{{SERVER}}{{SCRIPTPATH}}/COPYING à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à¦\8fà¦\95à¦\9fি à¦ªà§\8dরতিলিপি] à¦¥à¦¾à¦\95ার à¦\95থা; à¦¯à¦¦à¦¿ à¦\86পনি à¦¨à¦¾ à¦ªà§\87য়à§\87 à¦¥à¦¾à¦\95à§\87ন à¦¤à¦¾à¦¹à¦²à§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà¦\95à§\87 à¦\9cানান à¦\8fà¦\87 à¦ à¦¿à¦\95ানায়, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA à¦\85থবা [//www.gnu.org/licenses/old-licenses/gpl-2.0.html à¦²à¦¾à¦\87সà§\87নà§\8dসà¦\9fি à¦\87নà§\8dà¦\9fারনà§\87à¦\9fà§\87 à¦ªà¦¡à¦¼ুন]।",
        "version-software": "ইনস্টলকৃত সফটওয়্যার",
        "version-software-product": "পণ্য",
        "version-software-version": "সংস্করণ",
        "fileduplicatesearch-submit": "অনুসন্ধান",
        "fileduplicatesearch-info": "$1 × $2 পিক্সেল<br />ফাইলের আকার: $3<br />এমআইএমই প্রকার: $4",
        "fileduplicatesearch-result-1": " \"$1\" ফাইলের কোন ডুপ্লেকেট ফাইল নাই।",
-       "fileduplicatesearch-result-n": "\"$1\" à¦\8fà¦\87 à¦«à¦¾à¦\87লà§\87র {{PLURAL:$2|1 à¦\8fà¦\95à¦\87রà¦\95ম à¦\85নà§\81লিপি|$2 à¦\8fà¦\95à¦\87রà¦\95ম à¦\85নà§\81লিপি}} রয়েছে।",
+       "fileduplicatesearch-result-n": "\"$1\" à¦«à¦¾à¦\87লà¦\9fির {{PLURAL:$2|১à¦\9fি à¦\85বিà¦\95ল à¦ªà§\8dরতিলিপি|$2à¦\9fি à¦\85বিà¦\95ল à¦ªà§\8dরতিলিপি}} রয়েছে।",
        "fileduplicatesearch-noresults": "\"$1\" নামের কোনো ফাইল খুঁজে পাওয়া যায়নি।",
        "specialpages": "বিশেষ পাতাসমূহ",
        "specialpages-note-top": "ব্যাখ্যা",
        "specialpages-group-pagetools": "পাতা সংক্রান্ত সরঞ্জাম",
        "specialpages-group-wiki": "উপাত্ত এবং সরঞ্জামসমূহ",
        "specialpages-group-redirects": "বিশেষ পাতাগুলি পুনর্নির্দেশ করা হচ্ছে",
-       "specialpages-group-spam": "à¦\85বাà¦\9eà§\8dà¦\9bিত à¦ªà§\81নরাবà§\83তà§\8dত à¦¸à¦®à§\8dপাদনারà§\8bধà§\80 সরঞ্জামসমূহ",
+       "specialpages-group-spam": "সà§\8dপà§\8dযাম সরঞ্জামসমূহ",
        "specialpages-group-developer": "ডেভলপারের সরঞ্জাম",
        "blankpage": "খালি পাতা",
        "intentionallyblankpage": "এই পাতাটি ইচ্ছা করে খালি রাখা হয়েছে",
        "tags-create-invalid-chars": "ট্যাগের নামে কমা (<code>,</code>) বা ফরোয়ার্ড স্ল্যাশ (<code>/</code>) থাকতে পারবে না।",
        "tags-create-invalid-title-chars": "ট্যাগের নাম এমন অক্ষর থাকতে পারবে না যা পাতার শিরোনামে ব্যবহার করা যায় না।",
        "tags-create-already-exists": "\"$1\" ট্যাগ ইতিমধ্যেই বিদ্যমান।",
-       "tags-create-warnings-above": "\"$1\" à¦\9fà§\8dযাà¦\97à¦\9fি à¦¤à§\88রির à¦ªà§\8dরà¦\9aà§\87ষà§\8dà¦\9fার à¦¸à¦®à¦¯à¦¼ à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত {{PLURAL:$2|à¦\9fি à¦¸à¦¤à¦°à§\8dà¦\95 à¦¬à¦¾à¦°à§\8dতা}} উৎপন্ন হয়েছে:",
+       "tags-create-warnings-above": "\"$1\" à¦\9fà§\8dযাà¦\97à¦\9fি à¦¤à§\88রির à¦ªà§\8dরà¦\9aà§\87ষà§\8dà¦\9fার à¦¸à¦®à¦¯à¦¼ à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত {{PLURAL:$2|সতরà§\8dà¦\95 à¦¬à¦¾à¦°à§\8dতা|সতরà§\8dà¦\95 à¦¬à¦¾à¦°à§\8dতাà¦\97à§\81লি}} উৎপন্ন হয়েছে:",
        "tags-create-warnings-below": "আপনি কি ট্যাগটি তৈরি করা চালিয়ে যেতে চান?",
        "tags-delete-title": "ট্যাগ অপসারণ",
        "tags-delete-explanation-initial": "আপনি ডাটাবেজ থেকে \"$1\" ট্যাগটি অপসারণ করতে চলেছেন।",
-       "tags-delete-explanation-in-use": "ট্যাগটি বর্তমানে যে {{PLURAL:$2|$2 টি সংশোধন এবং/বা লগ ভুক্তি}}তে প্রযুক্ত হয়েছে, সেগুলি থেকে এটিকে অপসারণ করা হবে।",
+       "tags-delete-explanation-in-use": "ট্যাগটি বর্তমানে যে {{PLURAL:$2|$2 টি সংশোধন এবং/বা লগ ভুক্তিতে}} প্রয়োগ হয়েছে, সেগুলি থেকে এটিকে অপসারণ করা হবে।",
        "tags-delete-explanation-warning": "এই কাজটি <strong>অপরিবর্তনযোগ্য</strong> এবং এটিকে ভবিষ্যতে <strong>বাতিল করা সম্ভব নয়</strong>, এমনকি ডাটাবেজ প্রশাসকরাও এটি বাতিল করতে পারবেন না। এই ট্যাগটিই মুছে ফেলতে চাচ্ছেন কি না, সে ব্যাপারে সুনিশ্চিত হোন।",
-       "tags-delete-explanation-active": "<strong>\"$1\" à¦\9fà§\8dযাà¦\97à¦\9fি à¦\8fà¦\96নà¦\93 à¦¸à¦\95à§\8dরিয় à¦\8fবà¦\82 à¦­à¦¬à¦¿à¦·à§\8dযতà§\87 à¦\8fà¦\9fিà¦\95à§\87 à¦ªà§\8dরয়à§\8bà¦\97 à¦\95রা à¦¯à¦¾à¦¬à§\87।</strong> à¦\8fà¦\87 à¦¬à§\8dযাপারà¦\9fি à¦\98à¦\9fা à¦¬à¦¨à§\8dধ à¦\95রার à¦\9cনà§\8dয à¦¯à§\87সব à¦¸à§\8dথানà§\87 à¦\9fà§\8dযাà¦\97à¦\9fিà¦\95à§\87 à¦ªà§\8dরয়à§\8bà¦\97 à¦\95রার à¦\9cনà§\8dয à¦¸à§\87à¦\9f করা হয়েছে, সেসব স্থানে গিয়ে সেটিকে নিষ্ক্রিয় করুন।",
+       "tags-delete-explanation-active": "<strong>\"$1\" à¦\9fà§\8dযাà¦\97à¦\9fি à¦\8fà¦\96নà¦\93 à¦¸à¦\95à§\8dরিয় à¦\8fবà¦\82 à¦­à¦¬à¦¿à¦·à§\8dযতà§\87 à¦\8fà¦\9fিà¦\95à§\87 à¦ªà§\8dরয়à§\8bà¦\97 à¦\95রা à¦¯à¦¾à¦¬à§\87।</strong> à¦\8fà¦\87 à¦¬à§\8dযাপারà¦\9fি à¦\98à¦\9fা à¦¬à¦¨à§\8dধ à¦\95রার à¦\9cনà§\8dয à¦¯à§\87সব à¦¸à§\8dথানà§\87 à¦\9fà§\8dযাà¦\97à¦\9fিà¦\95à§\87 à¦ªà§\8dরয়à§\8bà¦\97 à¦\95রার à¦\9cনà§\8dয à¦¨à¦¿à¦°à§\8dধারণ করা হয়েছে, সেসব স্থানে গিয়ে সেটিকে নিষ্ক্রিয় করুন।",
        "tags-delete-reason": "কারণ:",
        "tags-delete-submit": "অপরিবর্তনীয় এই ট্যাগ অপসারন করো",
        "tags-delete-not-allowed": "এক্সটেনশন দ্বারা সংজ্ঞায়িত ট্যাগ অপসারণ করা সম্ভব নয়, যদি না এক্সটেনশনটি বিশেষভাবে এটি করার অনুমতি দিয়ে থাকে।",
        "tags-delete-not-found": "\"$1\" ট্যাগ বিদ্যমান নয়।",
        "tags-delete-too-many-uses": "\"$1\" ট্যাগটি $2টিরও অধিক {{PLURAL:$2|সংশোধনে}} প্রয়োগ করা হয়েছে, যার অর্থ এটি অপসারণ করা যাবে না।",
-       "tags-delete-warnings-after-delete": "\"$1\" à¦\9fà§\8dযাà¦\97à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦\95িনà§\8dতà§\81 à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত {{PLURAL:$2|à¦\9fি à¦¸à¦¤à¦°à§\8dà¦\95 à¦¬à¦¾à¦°à§\8dতা}} উৎপন্ন হয়েছে:",
+       "tags-delete-warnings-after-delete": "\"$1\" à¦\9fà§\8dযাà¦\97à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦\95িনà§\8dতà§\81 à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত {{PLURAL:$2|সতরà§\8dà¦\95 à¦¬à¦¾à¦°à§\8dতাà¦\9fি|সতরà§\8dà¦\95 à¦¬à¦¾à¦°à§\8dতাà¦\97à§\81লি}} উৎপন্ন হয়েছে:",
        "tags-delete-no-permission": "আপনার পরিবর্তন ট্যাগ মুছে ফেলার অনুমতি নেই।",
        "tags-activate-title": "সক্রিয় ট্যাগ",
        "tags-activate-question": "আপনি ট্যাগ \"$1\" সক্রিয় করতে চলেছেন।",
        "tags-edit-manage-link": "ট্যাগ পরিচালনা করুন",
        "tags-edit-revision-selected": "[[:$2]] পাতার {{PLURAL:$1|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|নির্বাচিত লগ ইভেন্ট}}:",
-       "tags-edit-revision-legend": "{{PLURAL:$1|এই সংশোধনে|$1টি সংশোধনের সবগুলিতে}} ট্যাগ যোগ বা অপসারণ করুন।",
+       "tags-edit-revision-legend": "{{PLURAL:$1|এই সংশোধন|$1টি সংশোধনের সবগুলি}} থেকে ট্যাগ যোগ বা অপসারণ করুন",
        "tags-edit-logentry-legend": "{{PLURAL:$1|এই লগের ভুক্তি|$1টি লগের ভুক্তি}} থেকে ট্যাগ যোগ বা বাতিল করুন",
        "tags-edit-existing-tags": "বিদ্যমান ট্যাগ:",
        "tags-edit-existing-tags-none": "<em>কোনটি নয়</em>",
        "dberr-info-hidden": "(ডেটাবেজ প্রবেশ করা সম্ভব হয়নি)",
        "dberr-usegoogle": "এই পরিস্থিতিতে আপনি গুগলের মাধ্যমে অনুসন্ধান করার চেষ্টা করতে পারেন।",
        "dberr-outofdate": "খেয়াল করুন যে, আমাদের বিষয়বস্তু সম্পর্কিত তাদের সূচি মেয়াদ উত্তীর্ণ হতে পারে।",
-       "dberr-cachederror": "à¦\8fà¦\9fি à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦\95à§\8dযাশà§\87 à¦²à¦¿à¦ªà¦¿, à¦¯à¦¾ à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াতà¦\95à§\83ত à¦¨à¦¾ও হতে পারে।",
+       "dberr-cachederror": "à¦\8fà¦\9fি à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦\9fির à¦\95à§\8dযাশ à¦ªà§\8dরতিলিপি, à¦¯à¦¾ à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াতà¦\95à§\83ত à¦¨à¦¾-ও হতে পারে।",
        "htmlform-invalid-input": "আপনার প্রদানকৃত ইনপুটে সমস্যা রয়েছে",
        "htmlform-select-badoption": "যে মান আপনি উল্লেখ করেছেন তা গ্রহণযোগ্য অপশন নয়।",
        "htmlform-int-invalid": "আপনার পরিবর্তীত সংখ্যাটি ইন্টিজার(পূর্ণসংখ্যা) নয়।",
        "logentry-protect-protect-cascade": "$1 $3 {{GENDER:$2|সুরক্ষিত করেছেন}} $4 [প্রপাতাকার]",
        "logentry-protect-modify": "$1 $3-এর জন্য সুরক্ষা স্তর {{GENDER:$2|পরিবর্তন করেছেন}} $4",
        "logentry-protect-modify-cascade": "$1 $3-এর জন্য সুরক্ষা স্তর {{GENDER:$2|পরিবর্তন করেছেন}} $4 [প্রপাতাকার]",
-       "logentry-rights-rights": "$1 নামক ব্যবহারকারী {{GENDER:$6|$3}}-এর দলীয় সদস্যপদ $4  থেকে $5 -এ {{GENDER:$2|পরিবর্তন}} করেছেন",
+       "logentry-rights-rights": "$1 {{GENDER:$6|$3}}-এর দলীয় সদস্যপদ $4 থেকে $5-এ {{GENDER:$2|পরিবর্তন}} করেছেন",
        "logentry-rights-rights-legacy": "$1 দলের সদস্যপদ পরিবর্তন করেছেন {{GENDER:$2|changed}} এর জন্য $3",
        "logentry-rights-autopromote": "$1 স্বয়ংক্রিয়ভাবে $4 থেকে $5-এ {{GENDER:$2|উন্নীত}} হয়েছেন",
        "logentry-upload-upload": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
        "logentry-managetags-deactivate": "$1 \"$4\" ট্যাগটি ব্যবহারকারী ও বট দ্বারা ব্যবহারের জন্য {{GENDER:$2|নিষ্ক্রিয়}} করেছেন",
        "log-name-tag": "ট্যাগ লগ",
        "log-description-tag": "এই পাতাতে দেখানো হয়েছে কখন কখন ব্যবহারকারীরা নির্দিষ্ট সংশোধন বা লগ ভুক্তিতে [[Special:Tags|ট্যাগ]] যোগ বা সেখান থেকে ট্যাগ অপসারণ করেছেন। যখন কোন সম্পাদনা, অপসারণ বা এই জাতীয় কর্মের অংশ হিসেবে ট্যাগ করা হয়, সেই ট্যাগগুলি এই লগে তালিকাভুক্ত করা হয় না।",
-       "logentry-tag-update-add-revision": "$1 নামক ব্যবহারকারী $6 এই {{PLURAL:$7|টি ট্যাগ}} $3 নামক পাতার $4 নং সংস্করণে {{GENDER:$2|যোগ করেছেন}}",
-       "logentry-tag-update-add-logentry": "$1 নামক ব্যবহারকারী $6 এই {{PLURAL:$7|টি ট্যাগ}} $3 নামক পাতার $5 নং লগ ভুক্তিতে {{GENDER:$2|যোগ করেছেন}}",
-       "logentry-tag-update-remove-revision": "$1 নামক ব্যবহারকারী $8 এই {{PLURAL:$9|টি ট্যাগ}} $3 নামক পাতার $4 নং সংস্করণ থেকে {{GENDER:$2|অপসারণ করেছেন}}",
-       "logentry-tag-update-remove-logentry": "$1 নামক ব্যবহারকারী $8 এই {{PLURAL:$9|টি ট্যাগ}} $3 নামক পাতার $5 নং লগ ভুক্তি থেকে {{GENDER:$2|অপসারণ করেছেন}}",
-       "logentry-tag-update-revision": "$1 নামক ব্যবহারকারী $3 নামক পাতার $4 নং সংস্করণের ট্যাগগুলি  {{GENDER:$2|হালনাগাদ করেছেন}} ($6 এই {{PLURAL:$7|টি যোগ করা হয়েছে}};$8 এই {{PLURAL:$9|টি অপসারণ করা হয়েছে}})",
-       "logentry-tag-update-logentry": "$1 নামক ব্যবহারকারী $3 নামক পাতার $5 নং লগ ভুক্তির ট্যাগগুলি  {{GENDER:$2|হালনাগাদ করেছেন}} ($6 এই {{PLURAL:$7|টি যোগ করা হয়েছে}};$8 এই {{PLURAL:$9|টি অপসারণ করা হয়েছে}})",
+       "logentry-tag-update-add-revision": "$1 $3 পাতার $4 নং সংস্করণে $6 {{PLURAL:$7|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|যোগ করেছেন}}",
+       "logentry-tag-update-add-logentry": "$1 $3 পাতার $5 নং লগ ভুক্তিতে $6 {{PLURAL:$7|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|যোগ করেছেন}}",
+       "logentry-tag-update-remove-revision": "$1 $3 পাতার $4 নং লগ সংস্করণ থেকে $8 {{PLURAL:$9|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|সরিয়েছেন}}",
+       "logentry-tag-update-remove-logentry": "$1 $3 পাতার $5 নং লগ ভুক্তি থেকে $8 {{PLURAL:$9|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|সরিয়েছেন}}",
+       "logentry-tag-update-revision": "$1 $3 পাতার $4 নং সংস্করণের ট্যাগগুলি {{GENDER:$2|হালনাগাদ করেছেন}} ($6 {{PLURAL:$7|যোগ করা হয়েছে}}; $8 {{PLURAL:$9|সরানো হয়েছে}})",
+       "logentry-tag-update-logentry": "$1 $3 পাতার $5 নং লগ ভুক্তির ট্যাগগুলি {{GENDER:$2|হালনাগাদ করেছেন}} ($6 {{PLURAL:$7|যোগ করা হয়েছে}}; $8{{PLURAL:$9|সরানো হয়েছে}})",
        "rightsnone": "(কিছু নাই)",
        "rightslogentry-temporary-group": "$1 (সাময়িক, $2 পর্যন্ত)",
        "feedback-adding": "পাতায় প্রতিক্রিয়া যোগ হচ্ছে...",
        "log-name-pagelang": "ভাষা পরিবর্তন লগ",
        "log-description-pagelang": "এটি পাতার ভাষা পরিবর্তনের লগ।",
        "logentry-pagelang-pagelang": "$1 $3-এর ভাষা $4 থেকে $5-এ {{GENDER:$2|পরিবর্তন}} করেছেন",
-       "default-skin-not-found": "à¦\93হà§\8b! à¦\86পনার à¦\89à¦\87à¦\95ির à¦¯à§\87 à¦ªà§\81নরà§\8dনিরà§\8dধারিত à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£, à¦¯à§\87à¦\9fি <code dir=\"ltr\">$wgDefaultSkin</code>-à¦\8f <code>$1</code> à¦¹à¦¿à¦¸à§\87বà§\87 à¦¸à¦\82à¦\9cà§\8dà¦\9eায়িত, à¦¸à§\87à¦\9fি à¦ªà¦¾à¦\93য়া à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤\n\nà¦\86পনার à¦\87নসà§\8dà¦\9fলà§\87শনà§\87 à¦®à¦¨à§\87 à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত {{PLURAL:$4|à¦\9fি à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£}} à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত à¦\86à¦\9bà§\87। à¦\95à§\80 à¦\95রà§\87 {{PLURAL:$4।|à¦\8fà¦\9fি|à¦\8fà¦\97à§\81লি}} à¦¸à¦\95à§\8dরিয় à¦\95রতà§\87 à¦¹à¦¬à§\87 à¦\8fবà¦\82 à¦ªà§\82রà§\8dবনিরà§\8dধারিতà¦\9fি à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦\95রতà§\87 à¦¹à¦¬à§\87, à¦¤à¦¾à¦° à¦\9cনà§\8dয [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] à¦¦à§\87à¦\96à§\81ন। \n\n$2\n\n; à¦¯à¦¦à¦¿ à¦\86পনি à¦\96à§\81ব à¦¸à¦®à§\8dপà§\8dরতি à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ি à¦\87নà§\8dসà¦\9fল à¦\95রà§\87 à¦¥à¦¾à¦\95à§\87ন:\n: à¦\86পনি à¦¸à¦®à§\8dভবত à¦\97িà¦\9f à¦¥à§\87à¦\95à§\87 à¦\85থবা à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦\89à§\8eস à¦\95à§\8bড à¦¥à§\87à¦\95à§\87 à¦\85নà§\8dয à¦\95à§\8bন à¦ªà¦¦à§\8dধতি à¦\85নà§\81সরণ à¦\95রà§\87 à¦\87নà§\8dসà¦\9fল à¦\95রà§\87à¦\9bà§\87ন। à¦\8fমনà¦\9fাà¦\87 à¦ªà§\8dরতà§\8dযাশিত।  [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-à¦\8fর à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦¨à¦¿à¦°à§\8dদà§\87শিà¦\95া] à¦¥à§\87à¦\95à§\87 à¦¨à¦¿à¦\9aà§\87র à¦ªà¦¦à§\8dধতিà¦\97à§\81লির à¦¸à¦¾à¦¹à¦¾à¦¯à§\8dযà§\87 à¦\95িà¦\9bà§\81 à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦\87নà§\8dসà¦\9fল à¦\95রার à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\81ন:\n:* [https://www.mediawiki.org/wiki/Download à¦\9fারবল à¦\87নà§\8dসà¦\9fলারà¦\9fি] à¦¡à¦¾à¦\89নলà§\8bড à¦\95রà§\87; à¦\8fà¦\9fিতà§\87 à¦\85নà§\87à¦\95à¦\97à§\81লি à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦\93 à¦\8fà¦\95à§\8dসà¦\9fà§\87নশন à¦°à¦¯à¦¼à§\87à¦\9bà§\87। à¦\86পনি à¦\8fà¦\9fির  <code>skins/</code> à¦¡à¦¾à¦\87রà§\87à¦\95à¦\9fরিà¦\9fি à¦ªà§\8dরতিলিপি à¦\95রà§\87 à¦¸à¦¾à¦\81à¦\9fতà§\87 à¦ªà¦¾à¦°à§\87ন।\n:* à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦\9fারবলà¦\97à§\81লি [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] à¦¥à§\87à¦\95à§\87 à¦¡à¦¾à¦\89নলà§\8bড à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins à¦\97িà¦\9f à¦¬à§\8dযবহার à¦\95রà§\87 à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦¡à¦¾à¦\89নলà§\8bড à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন]\n: à¦\86পনি à¦¯à¦¦à¦¿ à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ি à¦¡à§\87ভà§\87লপার à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 à¦\8f à¦\95াà¦\9cà¦\9fি à¦\95রলà§\87 à¦\86পনার à¦\97িà¦\9f à¦¸à¦\82à¦\97à§\8dরহশালার à¦¸à¦¾à¦¥à§\87 à¦\8fà¦\9fির à¦¸à¦\82à¦\98াত à¦¹à¦¬à§\87 à¦¨à¦¾à¥¤\n; à¦\86পনি à¦¯à¦¦à¦¿ à¦\96à§\81ব à¦¸à¦®à§\8dপà§\8dরতি à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ির à¦¸à¦°à§\8dবশà§\87ষ à¦¸à¦\82সà§\8dà¦\95রণà§\87 à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ à¦\95রà§\87 à¦¥à¦¾à¦\95à§\87ন:\n: à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ির à§§.২৪ à¦\8fবà¦\82 à¦¨à¦¤à§\81নতর à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লি à¦\87নà§\8dসà¦\9fলà¦\95à§\83ত à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£à¦\97à§\81লি à¦\86র à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¸à¦\95à§\8dরিয় à¦\95রà§\87 à¦¨à¦¾à¥¤ ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery] à¦¦à§\87à¦\96à§\81ন)। à¦\86পনি <code>LocalSettings.php</code> à¦«à¦¾à¦\87লà¦\9fির à¦­à§\87তরà§\87 à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত  {{PLURAL:$5|à¦\9fি à¦²à¦¾à¦\87ন}} à¦¸à§\87à¦\81à¦\9fà§\87 à¦\87নà§\8dসà¦\9fলà¦\95à§\83ত {{PLURAL:$5|à¦\9fি à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£}} {{PLURAL:$5|সবà¦\97à§\81লি}} à¦¸à¦\95à§\8dরিয় à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন:\n\n<pre dir=\"ltr\">$3</pre>\n\n; à¦\86পনি à¦¯à¦¦à¦¿ à¦\96à§\81ব à¦¸à¦®à§\8dপà§\8dরতি <code>LocalSettings.php</code> à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রà§\87 à¦¥à¦¾à¦\95à§\87ন:\n: à¦\9fাà¦\87পিà¦\82 ত্রুটির জন্য বহিরাবরণের নামগুলি পুনরায় পরীক্ষা করুন।",
-       "default-skin-not-found-no-skins": "à¦\93হà§\8b! à¦\86পনার à¦\89à¦\87à¦\95ির à¦¯à§\87 à¦ªà§\81নরà§\8dনিরà§\8dধারিত à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£, à¦¯à§\87à¦\9fি <code dir=\"ltr\">$wgDefaultSkin</code>-à¦\8f <code>$1</code> à¦¹à¦¿à¦¸à§\87বà§\87 à¦¸à¦\82à¦\9cà§\8dà¦\9eায়িত, à¦¸à§\87à¦\9fি à¦ªà¦¾à¦\93য়া à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤\n\nà¦\86পনার à¦\95à§\8bন à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦\87নà§\8dসà¦\9fল à¦\95রা à¦¹à¦¯à¦¼à¦¨à¦¿à¥¤\n\n; à¦¯à¦¦à¦¿ à¦\86পনি à¦\96à§\81ব à¦¸à¦®à§\8dপà§\8dরতি à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ি à¦\87নà§\8dসà¦\9fল à¦\95রà§\87 à¦¥à¦¾à¦\95à§\87ন à¦¬à¦¾ à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ির à¦¸à¦°à§\8dবশà§\87ষ à¦¸à¦\82সà§\8dà¦\95রণà§\87 à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ à¦\95রà§\87 à¦¥à¦¾à¦\95à§\87ন:\n: à¦\86পনি à¦¸à¦®à§\8dভবত à¦\97িà¦\9f à¦¥à§\87à¦\95à§\87 à¦\85থবা à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦\89à§\8eস à¦\95à§\8bড à¦¥à§\87à¦\95à§\87 à¦\85নà§\8dয à¦\95à§\8bন à¦ªà¦¦à§\8dধতি à¦\85নà§\81সরণ à¦\95রà§\87 à¦\87নà§\8dসà¦\9fল à¦\95রà§\87à¦\9bà§\87ন। à¦\8fমনà¦\9fাà¦\87 à¦ªà§\8dরতà§\8dযাশিত। à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ির à§§.২৪ à¦\8fবà¦\82 à¦¨à¦¤à§\81নতর à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লি à¦®à§\82ল à¦¸à¦\82à¦\97à§\8dরহশালাতà§\87 à¦\8fà¦\96ন à¦\86র à¦\95à§\8bন à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত à¦¥à¦¾à¦\95à§\87 à¦¨à¦¾à¥¤  à¦\86র à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¸à¦\95à§\8dরিয় à¦\95রà§\87 à¦¨à¦¾à¥¤  [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-à¦\8fর à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦¨à¦¿à¦°à§\8dদà§\87শিà¦\95া] à¦¥à§\87à¦\95à§\87 à¦¨à¦¿à¦\9aà§\87র à¦ªà¦¦à§\8dধতিà¦\97à§\81লির à¦¸à¦¾à¦¹à¦¾à¦¯à§\8dযà§\87 à¦\95িà¦\9bà§\81 à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦\87নà§\8dসà¦\9fল à¦\95রার à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\81ন:\n:* [https://www.mediawiki.org/wiki/Download à¦\9fারবল à¦\87নà§\8dসà¦\9fলারà¦\9fি] à¦¡à¦¾à¦\89নলà§\8bড à¦\95রà§\87; à¦\8fà¦\9fিতà§\87 à¦\85নà§\87à¦\95à¦\97à§\81লি à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦\93 à¦\8fà¦\95à§\8dসà¦\9fà§\87নশন à¦°à¦¯à¦¼à§\87à¦\9bà§\87। à¦\86পনি à¦\8fà¦\9fির  <code>skins/</code> à¦¡à¦¾à¦\87রà§\87à¦\95à¦\9fরিà¦\9fি à¦ªà§\8dরতিলিপি à¦\95রà§\87 à¦¸à¦¾à¦\81à¦\9fতà§\87 à¦ªà¦¾à¦°à§\87ন।\n:* à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦\9fারবলà¦\97à§\81লি [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] à¦¥à§\87à¦\95à§\87 à¦¡à¦¾à¦\89নলà§\8bড à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins à¦\97িà¦\9f à¦¬à§\8dযবহার à¦\95রà§\87 à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦¡à¦¾à¦\89নলà§\8bড à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন]\n: à¦\86পনি à¦¯à¦¦à¦¿ à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ি à¦¡à§\87ভà§\87লপার à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 à¦\8f à¦\95াà¦\9cà¦\9fি à¦\95রলà§\87 à¦\86পনার à¦\97িà¦\9f à¦¸à¦\82à¦\97à§\8dরহশালার à¦¸à¦¾à¦¥à§\87 à¦\8fà¦\9fির à¦¸à¦\82à¦\98াত à¦¹à¦¬à§\87 à¦¨à¦¾à¥¤([https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration]-à¦\8f à¦¦à§\87à¦\96à§\81ন) à¦\95à§\80ভাবà§\87 à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£à¦\97à§\81লি à¦¸à¦\95à§\8dরিয় à¦\95রতà§\87 à¦¹à¦¯à¦¼ à¦\8fবà¦\82 à¦\95à§\8bন à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£à¦\9fি à¦ªà§\81নরà§\8dনিরà§\8dধারিত  হবে, তা কীভাবে নির্বাচন করতে হয়।",
+       "default-skin-not-found": "à¦\93হà§\8b! à¦\86পনার à¦\89à¦\87à¦\95ির à¦ªà§\82রà§\8dবনিরà§\8dধারিত à¦\86বরণ, à¦¯à§\87à¦\9fি <code dir=\"ltr\">$wgDefaultSkin</code>-à¦\8f <code>$1</code> à¦¹à¦¿à¦¸à§\87বà§\87 à¦¸à¦\82à¦\9cà§\8dà¦\9eায়িত, à¦¸à§\87à¦\9fি à¦ªà¦¾à¦\93য়া à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤\n\nà¦\86পনার à¦\87নসà§\8dà¦\9fলà§\87শনà§\87 à¦®à¦¨à§\87 à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত {{PLURAL:$4|à¦\86বরণ|à¦\86বরণà¦\97à§\81লি}} à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত à¦\86à¦\9bà§\87। à¦\95à§\80 à¦\95রà§\87 {{PLURAL:$4।|à¦\8fà¦\9fি|à¦\8fà¦\97à§\81লি}} à¦¸à¦\95à§\8dরিয় à¦\95রতà§\87 à¦¹à¦¬à§\87 à¦\8fবà¦\82 à¦ªà§\82রà§\8dবনিরà§\8dধারিতà¦\9fি à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦\95রতà§\87 à¦¹à¦¬à§\87, à¦¤à¦¾à¦° à¦\9cনà§\8dয [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] à¦¦à§\87à¦\96à§\81ন। \n\n$2\n\n; à¦¯à¦¦à¦¿ à¦\86পনি à¦\96à§\81ব à¦¸à¦®à§\8dপà§\8dরতি à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ি à¦\87নà§\8dসà¦\9fল à¦\95রà§\87 à¦¥à¦¾à¦\95à§\87ন:\n: à¦\86পনি à¦¸à¦®à§\8dভবত à¦\97িà¦\9f à¦¥à§\87à¦\95à§\87 à¦\85থবা à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦\89à§\8eস à¦\95à§\8bড à¦¥à§\87à¦\95à§\87 à¦\85নà§\8dয à¦\95à§\8bন à¦ªà¦¦à§\8dধতি à¦\85নà§\81সরণ à¦\95রà§\87 à¦\87নà§\8dসà¦\9fল à¦\95রà§\87à¦\9bà§\87ন। à¦\8fমনà¦\9fাà¦\87 à¦ªà§\8dরতà§\8dযাশিত।  [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-à¦\8fর à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦¨à¦¿à¦°à§\8dদà§\87শিà¦\95া] à¦¥à§\87à¦\95à§\87 à¦¨à¦¿à¦\9aà§\87র à¦ªà¦¦à§\8dধতিà¦\97à§\81লির à¦¸à¦¾à¦¹à¦¾à¦¯à§\8dযà§\87 à¦\95িà¦\9bà§\81 à¦\86বরণ à¦\87নà§\8dসà¦\9fল à¦\95রার à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\81ন:\n:* [https://www.mediawiki.org/wiki/Download à¦\9fারবল à¦\87নà§\8dসà¦\9fলারà¦\9fি] à¦¡à¦¾à¦\89নলà§\8bড à¦\95রà§\87; à¦\8fà¦\9fিতà§\87 à¦\85নà§\87à¦\95à¦\97à§\81লি à¦\86বরণ à¦\93 à¦\8fà¦\95à§\8dসà¦\9fà§\87নশন à¦°à¦¯à¦¼à§\87à¦\9bà§\87। à¦\86পনি <code>skins/</code> à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦ªà§\8dরতিলিপি à¦\95রà§\87 à¦¸à¦¾à¦\81à¦\9fতà§\87 à¦ªà¦¾à¦°à§\87ন।\n:* à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦\86বরণ à¦\9fারবলà¦\97à§\81লি [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] à¦¥à§\87à¦\95à§\87 à¦¡à¦¾à¦\89নলà§\8bড à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins à¦\97িà¦\9f à¦¬à§\8dযবহার à¦\95রà§\87 à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦¡à¦¾à¦\89নলà§\8bড à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন]\n: à¦\86পনি à¦¯à¦¦à¦¿ à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ি à¦¡à§\87ভà§\87লপার à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 à¦\8f à¦\95াà¦\9cà¦\9fি à¦\95রলà§\87 à¦\86পনার à¦\97িà¦\9f à¦¸à¦\82à¦\97à§\8dরহশালার à¦¸à¦¾à¦¥à§\87 à¦\8fà¦\9fির à¦¸à¦\82à¦\98াত à¦¹à¦¬à§\87 à¦¨à¦¾à¥¤\n; à¦\86পনি à¦¯à¦¦à¦¿ à¦\96à§\81ব à¦¸à¦®à§\8dপà§\8dরতি à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ির à¦¸à¦°à§\8dবশà§\87ষ à¦¸à¦\82সà§\8dà¦\95রণà§\87 à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ à¦\95রà§\87 à¦¥à¦¾à¦\95à§\87ন:\n: à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ির à§§.২৪ à¦\8fবà¦\82 à¦¨à¦¤à§\81নতর à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লি à¦\87নà§\8dসà¦\9fলà¦\95à§\83ত à¦\86বরণà¦\97à§\81লি à¦\86র à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¸à¦\95à§\8dরিয় à¦\95রà§\87 à¦¨à¦¾à¥¤ ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery] à¦¦à§\87à¦\96à§\81ন)। à¦\86পনি <code>LocalSettings.php</code> à¦«à¦¾à¦\87লà¦\9fির à¦­à§\87তরà§\87 à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত  {{PLURAL:$5|লাà¦\87ন|লাà¦\87নà¦\97à§\81লি}} à¦¸à§\87à¦\81à¦\9fà§\87 à¦\87নà§\8dসà¦\9fলà¦\95à§\83ত {{PLURAL:$5|à¦\86বরণ|à¦\86বরণà¦\97à§\81লি}} à¦¸à¦\95à§\8dরিয় à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন:\n\n<pre dir=\"ltr\">$3</pre>\n\n; à¦\86পনি à¦¯à¦¦à¦¿ à¦\96à§\81ব à¦¸à¦®à§\8dপà§\8dরতি <code>LocalSettings.php</code> à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রà§\87 à¦¥à¦¾à¦\95à§\87ন:\n: à¦¬à¦¾à¦¨à¦¾à¦¨ ত্রুটির জন্য বহিরাবরণের নামগুলি পুনরায় পরীক্ষা করুন।",
+       "default-skin-not-found-no-skins": "à¦\93হà§\8b! à¦\86পনার à¦\89à¦\87à¦\95ির à¦ªà§\82রà§\8dবনিরà§\8dধারিত, à¦¯à§\87à¦\9fি <code dir=\"ltr\">$wgDefaultSkin</code>-à¦\8f <code>$1</code> à¦¹à¦¿à¦¸à§\87বà§\87 à¦¸à¦\82à¦\9cà§\8dà¦\9eায়িত, à¦¸à§\87à¦\9fি à¦ªà¦¾à¦\93য়া à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤\n\nà¦\86পনার à¦\95à§\8bন à¦\86বরণ à¦\87নà§\8dসà¦\9fল à¦\95রা à¦¹à¦¯à¦¼à¦¨à¦¿à¥¤\n\n; à¦¯à¦¦à¦¿ à¦\86পনি à¦\96à§\81ব à¦¸à¦®à§\8dপà§\8dরতি à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ি à¦\87নà§\8dসà¦\9fল à¦\95রà§\87 à¦¥à¦¾à¦\95à§\87ন à¦¬à¦¾ à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ির à¦¸à¦°à§\8dবশà§\87ষ à¦¸à¦\82সà§\8dà¦\95রণà§\87 à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ à¦\95রà§\87 à¦¥à¦¾à¦\95à§\87ন:\n: à¦\86পনি à¦¸à¦®à§\8dভবত à¦\97িà¦\9f à¦¥à§\87à¦\95à§\87 à¦\85থবা à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦\89à§\8eস à¦\95à§\8bড à¦¥à§\87à¦\95à§\87 à¦\85নà§\8dয à¦\95à§\8bন à¦ªà¦¦à§\8dধতি à¦\85নà§\81সরণ à¦\95রà§\87 à¦\87নà§\8dসà¦\9fল à¦\95রà§\87à¦\9bà§\87ন। à¦\8fমনà¦\9fাà¦\87 à¦ªà§\8dরতà§\8dযাশিত। à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ির à§§.২৪ à¦\8fবà¦\82 à¦¨à¦¤à§\81নতর à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লি à¦®à§\82ল à¦¸à¦\82à¦\97à§\8dরহশালাতà§\87 à¦\8fà¦\96ন à¦\86র à¦\95à§\8bন à¦\86বরণ à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত à¦¥à¦¾à¦\95à§\87 à¦¨à¦¾à¥¤ à¦\86র à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¸à¦\95à§\8dরিয় à¦\95রà§\87 à¦¨à¦¾à¥¤  [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-à¦\8fর à¦\86বরণ à¦¨à¦¿à¦°à§\8dদà§\87শিà¦\95া] à¦¥à§\87à¦\95à§\87 à¦¨à¦¿à¦\9aà§\87র à¦ªà¦¦à§\8dধতিà¦\97à§\81লির à¦¸à¦¾à¦¹à¦¾à¦¯à§\8dযà§\87 à¦\95িà¦\9bà§\81 à¦\86বরণ à¦\87নà§\8dসà¦\9fল à¦\95রার à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\81ন:\n:* [https://www.mediawiki.org/wiki/Download à¦\9fারবল à¦\87নà§\8dসà¦\9fলারà¦\9fি] à¦¡à¦¾à¦\89নলà§\8bড à¦\95রà§\87; à¦\8fà¦\9fিতà§\87 à¦\85নà§\87à¦\95à¦\97à§\81লি à¦\86বরণ à¦\93 à¦\8fà¦\95à§\8dসà¦\9fà§\87নশন à¦°à¦¯à¦¼à§\87à¦\9bà§\87। à¦\86পনি <code>skins/</code> à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦ªà§\8dরতিলিপি à¦\95রà§\87 à¦¸à¦¾à¦\81à¦\9fতà§\87 à¦ªà¦¾à¦°à§\87ন।\n:* à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦\86বরণ à¦\9fারবলà¦\97à§\81লি [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] à¦¥à§\87à¦\95à§\87 à¦¡à¦¾à¦\89নলà§\8bড à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins à¦\97িà¦\9f à¦¬à§\8dযবহার à¦\95রà§\87 à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£ à¦¡à¦¾à¦\89নলà§\8bড à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন]\n: à¦\86পনি à¦¯à¦¦à¦¿ à¦®à¦¿à¦¡à¦¿à¦¯à¦¼à¦¾à¦\89à¦\87à¦\95ি à¦¡à§\87ভà§\87লপার à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 à¦\8f à¦\95াà¦\9cà¦\9fি à¦\95রলà§\87 à¦\86পনার à¦\97িà¦\9f à¦¸à¦\82à¦\97à§\8dরহশালার à¦¸à¦¾à¦¥à§\87 à¦\8fà¦\9fির à¦¸à¦\82à¦\98াত à¦¹à¦¬à§\87 à¦¨à¦¾à¥¤([https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration]-à¦\8f à¦¦à§\87à¦\96à§\81ন) à¦\95à§\80ভাবà§\87 à¦¬à¦¹à¦¿à¦°à¦¾à¦¬à¦°à¦£à¦\97à§\81লি à¦¸à¦\95à§\8dরিয় à¦\95রতà§\87 à¦¹à¦¯à¦¼ à¦\8fবà¦\82 à¦\95à§\8bন à¦\86বরণà¦\9fি à¦ªà§\81নরà§\8dনিরà§\8dধারিত হবে, তা কীভাবে নির্বাচন করতে হয়।",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (সক্রিয় করা)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>নিষ্ক্রিয় করা</strong>)",
        "mediastatistics": "মিডিয়া পরিসংখ্যান",
        "json-error-ctrl-char": "অক্ষর নিয়ন্ত্রণ ত্রুটি, সম্ভবত ভুল এনকোডকৃত",
        "json-error-syntax": "সিনট্যাক্স ত্রুটি",
        "json-error-utf8": "ত্রুটিপূর্ণ ইউটিএফ-৮ অক্ষর, সম্ভবত ভুল এনকোডকৃত",
-       "json-error-recursion": "যà§\87 à¦­à§\8dযালà§\81à¦\9fি à¦\8fনà¦\95à§\8bড à¦\95রা à¦¹à¦¬à§\87 à¦¸à§\87à¦\9fিতà§\87 à¦\8fà¦\95 à¦¬à¦¾ à¦¤à¦¾à¦° à¦\85ধিà¦\95 à¦°à¦¿à¦\95ারà§\8dসিভ à¦°à§\87ফারà§\87নà§\8dস à¦\86à¦\9bà§\87।",
-       "json-error-inf-or-nan": "à¦\8fà¦\95 à¦¬à¦¾ à¦¤à¦¾à¦° à¦\85ধিà¦\95 NAN à¦\85থবা INF à¦­à§\8dযালà§\81 à¦\8fনà¦\95à§\8bড à¦\95রার à¦\9cনà§\8dয à¦ªà§\8dরবিষà§\8dà¦\9f à¦­à§\8dযালà§\81তà§\87 à¦¬à¦¿à¦¦à§\8dযমান।",
+       "json-error-recursion": "যà§\87 à¦®à¦¾à¦¨à¦\9fি à¦\8fনà¦\95à§\8bড à¦\95রা à¦¹à¦¬à§\87 à¦¸à§\87à¦\9fিতà§\87 à¦\8fà¦\95 à¦¬à¦¾ à¦¤à¦¾à¦° à¦\85ধিà¦\95 à¦°à¦¿à¦\95ারà§\8dসিভ à¦¸à§\82তà§\8dর à¦\86à¦\9bà§\87",
+       "json-error-inf-or-nan": "à¦\8fনà¦\95à§\8bড à¦\95রার à¦\9cনà§\8dয à¦®à¦¾à¦¨à§\87 à¦\8fà¦\95 à¦¬à¦¾ à¦\8fà¦\95াধিà¦\95 NAN à¦\85থবা INF à¦®à¦¾à¦¨ à¦¬à¦¿à¦¦à§\8dযমান",
        "json-error-unsupported-type": "এনকোড করা যাবে না এমন একটি মানের ধরন দেয়া হয়েছে",
        "headline-anchor-title": "এই অনুচ্ছেদে সংযোগ",
        "special-characters-group-latin": "লাতিন",
        "log-action-filter-contentmodel-change": "বিষয়বস্তুর রূপ পরিবর্তন",
        "log-action-filter-contentmodel-new": "অ-মানক বিষয়বস্তুর রূপসহ পাতা তৈরি",
        "log-action-filter-delete-delete": "পাতা অপসারণ",
-       "log-action-filter-delete-delete_redir": "পà§\81নরà§\8dনিরà§\8dদà§\87শ à¦®à§\81à¦\9bà§\87 à¦¨à¦¤à§\81ন à¦\95রà§\87 à¦²à§\87à¦\96া",
+       "log-action-filter-delete-delete_redir": "পà§\81নরà§\8dনিরà§\8dদà§\87শ à¦ªà§\81নরà§\8dলিà¦\96ন",
        "log-action-filter-delete-restore": "পাতা পুনঃরুদ্ধার",
        "log-action-filter-delete-event": "লগ অপসারণ",
        "log-action-filter-delete-revision": "সংশোধন অপসারণ",
index b32913e..4e28666 100644 (file)
        "post-expand-template-argument-warning": "Diwallit : war ar bajenn-mañ ez eus eus da nebeutañ un arventenn eus ur patrom zo re vras.\nA-gostez eo bet lezet an arventenn-se.",
        "post-expand-template-argument-category": "Pajennoù enno arventennoù patrom bet lezet a-gostez",
        "parser-template-loop-warning": "Patrom e kelc'h detektet : [[$1]]",
+       "template-loop-category": "Pajennoù enno lagadennoù patrom",
+       "template-loop-category-desc": "Ul lagadenn batrom zo er bajenn, d.l.e. ur patrom en em c'halv e-unan en ur mod rekursivel.",
        "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù rekursivek ar patromoù ($1)",
        "language-converter-depth-warning": "Aet eur en tu all d'ar vevenn amdreiñ yezhoù ($1)",
        "node-count-exceeded-category": "Pajennoù m'eur aet en tu all d'an niver a skoulmoù",
index 2cb90bb..c348aab 100644 (file)
        "post-expand-template-argument-warning": "'''Warnung:''' Diese Seite enthält mindestens einen Parameter in einer Vorlage, der expandiert zu groß ist. Diese Parameter werden ignoriert.",
        "post-expand-template-argument-category": "Seiten mit ignorierten Vorlagenparametern",
        "parser-template-loop-warning": "Vorlagenschleife entdeckt: [[$1]]",
+       "template-loop-category": "Seiten mit Vorlagenschleifen",
+       "template-loop-category-desc": "Die Seite enthält eine Vorlagenschleife, z.&nbsp;B. eine Vorlage, die sich selbst rekursiv aufruft.",
        "parser-template-recursion-depth-warning": "Vorlagenrekursionstiefengrenze überschritten ($1)",
        "language-converter-depth-warning": "Sprachkonvertertiefenlimit überschritten ($1)",
        "node-count-exceeded-category": "Seiten, die die Knotenanzahl überschritten haben",
index 0c8bf21..1cd4391 100644 (file)
        "newimages-summary": "This special page shows the last uploaded files.",
        "newimages-legend": "Filter",
        "newimages-label": "Filename (or a part of it):",
+       "newimages-user": "IP address or username",
        "newimages-showbots": "Show uploads by bots",
        "newimages-hidepatrolled": "Hide patrolled uploads",
        "noimages": "Nothing to see.",
index 4bcece9..6f50a37 100644 (file)
        "post-expand-template-argument-warning": "'''هشدار:''' این صفحه شامل دست کم یک پارامتر الگو است که بیش از اندازه بزرگ است.\nاین پارامترها نادیده گرفته شدند.",
        "post-expand-template-argument-category": "صفحه‌های حاوی الگوهایی با پارامترهای نادیده‌گرفته‌شده",
        "parser-template-loop-warning": "حلقه در الگو پیدا شد: [[$1]]",
+       "template-loop-category": "صفحه‌های دارای حلقه در الگو",
+       "template-loop-category-desc": "صفحه دارای حلقه در الگو، مثلا الگویی که از خودش درون خودش استفاده‌کرده‌است.",
        "parser-template-recursion-depth-warning": "محدودیت عمق بازگشت الگو رد شد ($1)",
        "language-converter-depth-warning": "محدودیت عمق مبدل زبانی رد شد ($1)",
        "node-count-exceeded-category": "صفحه‌هایی که از حداکثر تعداد گره تجاوز کرده‌اند",
        "page_first": "نخست",
        "page_last": "واپسین",
        "histlegend": "انتخاب تفاوت: دکمه‌های گرد کنار ویرایش‌هایی که می‌خواهید با هم مقایسه کنید را علامت بزنید و دکمهٔ Enter را بزنید یا دکمهٔ پایین را فشار دهید.<br />\nاختصارات: '''({{int:cur}})''' = تفاوت با نسخهٔ فعلی، '''({{int:last}})''' = تفاوت با نسخهٔ قبلی، '''({{int:minoreditletter}})''' = ویرایش جزئی.",
-       "history-fieldset-title": "مرور تاریخچه",
-       "history-show-deleted": "فقط حذف‌شده",
+       "history-fieldset-title": "جستجو برای نسخه‌ها",
+       "history-show-deleted": "فقط حذف‌شدهفقط نسخه‌های حذف شده",
        "histfirst": "قدیمی‌ترین",
        "histlast": "جدیدترین",
        "historysize": "({{PLURAL:$1|۱ بایت|$1 بایت}})",
        "rcfilters-invalid-filter": "پالایهٔ نامعتبر",
        "rcfilters-empty-filter": "پالایه‌ای فعال نیست. همهٔ مشارکت‌های دیده می‌شوند.",
        "rcfilters-filterlist-title": "پالایه‌ها",
+       "rcfilters-filterlist-whatsthis": "این چیست؟",
        "rcfilters-filterlist-feedbacklink": "ارسال بازخورد برای پالایه‌های جدید (آزمایشی)",
        "rcfilters-highlightbutton-title": "پررنگ کردن نتایج",
        "rcfilters-highlightmenu-title": "انتخاب رنگ",
        "rcfilters-highlightmenu-help": "یک رنگ انتخاب کنید تا این خصوصیت پر رنگ شود",
        "rcfilters-filterlist-noresults": "پالایه‌ای یافت نشد",
+       "rcfilters-noresults-conflict": "نتیجه‌ای یافت نشد چون محدوده جستجو دارای تداخل است",
+       "rcfilters-state-message-subset": "این پالایه تاثیری ندارد چون نتایج آن شامل موارد مرزی {{PLURAL:$2|پالایه|پالایه}} است (از پررنگ‌کننده برای تمایز استفاده کنید): $1",
        "rcfilters-filtergroup-registration": "ثبت‌نام کاربر",
        "rcfilters-filter-registered-label": "ثبت شده",
        "rcfilters-filter-registered-description": "ورود ویرایشگران.",
index 7342f35..fd8f66a 100644 (file)
        "post-expand-template-argument-warning": "<strong>Attention :</strong> cette page contient au moins un paramètre de modèle dont la taille après expansion est trop importante. \nCes arguments n’ont donc pas été inclus.",
        "post-expand-template-argument-category": "Pages contenant des paramètres de modèle non évalués",
        "parser-template-loop-warning": "Modèle en boucle détecté : [[$1]]",
+       "template-loop-category": "Pages avec des boucles de modèle",
+       "template-loop-category-desc": "La page contient une boucle de modèle, c.à.d. un modèle qui s’appelle lui-même récursivement.",
        "parser-template-recursion-depth-warning": "Limite de profondeur des appels récursifs de modèles dépassée ($1)",
        "language-converter-depth-warning": "Limite de profondeur du convertisseur de langue dépassée ($1)",
        "node-count-exceeded-category": "Pages dépassant le nombre de nœuds maximal",
index 8f7dd00..864b0d7 100644 (file)
        "post-expand-template-argument-warning": "'''אזהרה:''' דף זה כולל לפחות תבנית אחת שבה פרמטרים גדולים מדי.\nפרמטרים אלה הושמטו.",
        "post-expand-template-argument-category": "דפים שבהם הושמטו פרמטרים של תבניות",
        "parser-template-loop-warning": "נמצאה תבנית הקוראת לעצמה: [[$1]]",
+       "template-loop-category": "דפים עם לולאות בתבנית",
+       "template-loop-category-desc": "הדף הזה מכיל לולאה בתבנית, כלומר תבנית שקוראת לעצמה באופן רקורסיבי.",
        "parser-template-recursion-depth-warning": "עומק התבניות המוכללות זו בזו עבר את המגבלה ($1)",
        "language-converter-depth-warning": "עומק ממיר השפה עבר את המגבלה ($1)",
        "node-count-exceeded-category": "דפים שבהם מספר הצמתים גדול מדי",
index 153a890..43f1213 100644 (file)
        "content-not-allowed-here": "ページ [[$2]] では、「$1」コンテンツは許可されていません",
        "editwarning-warning": "このページを離れると、あなたが行なった変更がすべて失われてしまうかもしれません。\nログインしている場合、個人設定の「{{int:prefs-editing}}」タブでこの警告を表示しないようにすることができます。",
        "editpage-invalidcontentmodel-title": "対応していないコンテンツ形式",
+       "editpage-invalidcontentmodel-text": "コンテンツ・モデル「$1」は対応していません。",
        "editpage-notsupportedcontentformat-title": "対応していないコンテンツ形式",
        "editpage-notsupportedcontentformat-text": "コンテンツ モデル $2 は、コンテンツ形式 $1 に対応していません。",
        "content-model-wikitext": "ウィキテキスト",
        "content-model-css": "CSS",
        "content-json-empty-object": "空のオブジェクト",
        "content-json-empty-array": "空の配列",
+       "deprecated-self-close-category": "無効な自己終了HTMLタグを使用しているページ",
+       "deprecated-self-close-category-desc": "<code>&lt;b/></code> や <code>&lt;span/></code> 等の無効な自己終了HTMLタグを含むページ。これらのタグはまもなく HTML5 の仕様に準拠する動作へと変更されるため、ウィキテキスト内での使用は非推奨となりました。",
        "duplicate-args-warning": "<strong>警告:</strong> [[:$1]]は複数の「$3」パラメータを伴って[[:$2]]を呼び出しています。提供されている最後の値のみが使用されます。",
        "duplicate-args-category": "テンプレート呼び出しで引数が重複しているページ",
        "duplicate-args-category-desc": "引数が重複したテンプレート呼び出しを含むページ。例: <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>、<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>",
        "post-expand-template-argument-warning": "<strong>警告:</strong> このページは、展開後のサイズが大きすぎるテンプレート引数を少なくとも 1 つ含んでいます。\nこれらの引数を省略しました。",
        "post-expand-template-argument-category": "省略されたテンプレート引数を含むページ",
        "parser-template-loop-warning": "テンプレートのループを検出しました: [[$1]]",
+       "template-loop-category": "テンプレートがループしているページ",
+       "template-loop-category-desc": "テンプレート自身が再帰的自己参照を行うなど、ループするテンプレートが含まれているページ。",
        "parser-template-recursion-depth-warning": "テンプレートの再帰の深さ ($1) が上限を超えました",
        "language-converter-depth-warning": "言語変換機能の深さ ($1) が制限を超えました",
        "node-count-exceeded-category": "ノード数が制限を超えたページ",
        "page_first": "先頭",
        "page_last": "末尾",
        "histlegend": "差分の選択: 比較したい版のラジオボタンを選択し、Enterキーを押すか、下部のボタンを押します。<br />\n凡例: <strong>({{int:cur}})</strong>=最新版との比較、<strong>({{int:last}})</strong>=直前の版との比較、<strong>{{int:minoreditletter}}</strong>=細部の編集",
-       "history-fieldset-title": "履歴の閲覧",
-       "history-show-deleted": "削除済みのみ",
+       "history-fieldset-title": "版の検索",
+       "history-show-deleted": "削除のみ",
        "histfirst": "最古",
        "histlast": "最新",
        "historysize": "({{PLURAL:$1|$1バイト}})",
        "username": "{{GENDER:$1|利用者名}}:",
        "prefs-memberingroups": "{{GENDER:$2|所属}}{{PLURAL:$1|グループ}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 ($2 まで)",
        "prefs-registration": "登録日時:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "本名:",
        "userrights-groupsmember": "所属グループ:",
        "userrights-groupsmember-auto": "自動的に付与される権限:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "この利用者が属するグループを変更できます。\n* チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。\n* チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。\n* 「*」はグループに一旦追加した場合に除去 (あるいはその逆) ができないことを示しています。",
+       "userrights-groups-help": "この利用者が属するグループを変更できます。\n* チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。\n* チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。\n*「*」はグループに一旦追加した場合に除去 (あるいはその逆) ができないことを示しています。\n*「#」は有効期限の延長のみを行うことができますが、現在の期限よりも短縮することはできません。",
        "userrights-reason": "理由:",
        "userrights-no-interwiki": "他ウィキ上における利用者権限の編集権限は、ありません。",
        "userrights-nodatabase": "データベース$1は存在しないか、ローカル上にありません。",
        "userrights-unchangeable-col": "変更できないグループ",
        "userrights-irreversible-marker": "$1*",
        "userrights-expiry-current": "期限 $1",
-       "userrights-expiry-none": "有効期限切れではありません",
+       "userrights-expiry-none": "無期限",
        "userrights-expiry": "有効期限:",
+       "userrights-expiry-existing": "現在の有効期限: $2 $3",
        "userrights-expiry-othertime": "その他の期間:",
+       "userrights-expiry-options": "1日:1 day,1週間:1 week,1か月:1 month,3か月:3 months,6か月:6 months,1 年:1 year",
+       "userrights-invalid-expiry": "「$1」グループに指定された有効期限は無効です。",
+       "userrights-expiry-in-past": "「$1」グループに指定された有効期限は過去の時刻です。",
+       "userrights-cannot-shorten-expiry": "「$1」グループの有効期限を短縮できません。このグループを与奪できる権限を持つ利用者だけが有効期限を短縮できます。",
        "userrights-conflict": "利用者権限の変更が競合しています! 変更内容を確認してください。",
        "group": "グループ:",
        "group-user": "登録利用者",
        "rcfilters-clear-all-filters": "すべてのフィルターをクリア",
        "rcfilters-invalid-filter": "無効なフィルター",
        "rcfilters-filterlist-title": "フィルター",
+       "rcfilters-highlightmenu-title": "色を選ぶ",
        "rcfilters-filterlist-noresults": "フィルターが見つかりませんでした",
        "rcfilters-filtergroup-registration": "利用者登録",
        "rcfilters-filter-registered-label": "登録済み",
        "rcfilters-filter-unregistered-label": "未登録",
        "rcfilters-filter-bots-label": "ボット",
        "rcfilters-filter-humans-label": "人間(ボットではない)",
+       "rcfilters-filter-patrolled-label": "巡回済み",
+       "rcfilters-filter-patrolled-description": "巡回済みとマークされた編集。",
+       "rcfilters-filter-unpatrolled-label": "未巡回",
+       "rcfilters-filter-unpatrolled-description": "まだ巡回済みとマークされていない編集。",
+       "rcfilters-filtergroup-significance": "重要度",
+       "rcfilters-filter-minor-label": "細部の編集",
+       "rcfilters-filter-minor-description": "編集者が細部の編集とマークしたもの。",
+       "rcfilters-filter-major-label": "細部でない編集",
+       "rcfilters-filter-major-description": "細部とマークされていない編集。",
+       "rcfilters-filtergroup-changetype": "変更の種類",
+       "rcfilters-filter-pageedits-label": "ページの編集",
+       "rcfilters-filter-newpages-label": "ページの作成",
+       "rcfilters-filter-newpages-description": "ページを新規作成する編集。",
+       "rcfilters-filter-categorization-label": "カテゴリ変更",
        "rcnotefrom": "以下は<strong>$3 $4</strong>以降の{{PLURAL:$5|更新です}} (最大 <strong>$1</strong> 件)。",
        "rclistfrom": "$3の$2以降の更新を表示する",
        "rcshowhideminor": "細部の編集を$1",
        "editcomment": "編集内容の要約: <em>$1</em>",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による編集を [[User:$1|$1]] による直前の版へ差し戻しました",
        "revertpage-nouser": "非表示の利用者による編集を {{GENDER:$1|[[User:$1|$1]]}} による直前の版へ差し戻しました",
-       "rollback-success": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。",
+       "rollback-success": "{{GENDER:$3|$1}}による編集を差し戻しました。\n{{GENDER:$4|$2}}による直前の版へ変更されました。",
        "rollback-success-notify": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。[$3 変更を表示]",
        "sessionfailure-title": "セッションの失敗",
        "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\n前のページへ戻って再度読み込んだ後に、もう一度試してください。",
        "changecontentmodel-success-text": "[[:$1]]のコンテンツ・タイプは変更されました。",
        "changecontentmodel-cannot-convert": "[[:$1]]のコンテンツは$2の型には変換できません。",
        "changecontentmodel-nodirectediting": "$1 コンテンツ・モデルは、ダイレクト編集をサポートしていません。",
+       "changecontentmodel-emptymodels-title": "利用可能なコンテンツ・モデルがありません",
        "changecontentmodel-emptymodels-text": "[[:$1]]のコンテンツはどの型にも変換できません。",
        "log-name-contentmodel": "コンテンツ・モデル変更記録",
        "log-description-contentmodel": "ページのコンテンツ・モデルに関連する出来事",
        "protect-cantedit": "このページの編集権限がないため、保護レベルを変更できません。",
        "protect-othertime": "その他の期間:",
        "protect-othertime-op": "その他の期間",
-       "protect-existing-expiry": "現在の保護期限: $2 $3",
-       "protect-existing-expiry-infinity": "既存の有効期限: 無期限",
+       "protect-existing-expiry": "現在の有効期限: $2 $3",
+       "protect-existing-expiry-infinity": "現在の有効期限: 無期限",
        "protect-otherreason": "他の、または追加の理由:",
        "protect-otherreason-op": "その他の理由",
        "protect-dropdown": "*よくある保護理由\n** 度重なる荒らし\n** 度重なるスパム投稿\n** 非生産的な編集合戦\n** 高負荷ページ",
        "sorbs": "DNSBL",
        "sorbsreason": "ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。",
        "sorbs_create_account_reason": "ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。\nアカウント作成はできません",
+       "softblockrangesreason": "現在の IP アドレス ($1) からの匿名投稿は許可されていません。ログインしてください。",
        "xffblockreason": "X-Forwarded-For ヘッダーに含まれている IP アドレスがブロックされています。これはあなたのものか、あなたが利用しているプロキシサーバーのものです。元のブロックの理由は: $1",
        "cant-see-hidden-user": "ブロックしようとしている利用者は、既にブロックされ隠されています。\nあなたには hideuser 権限がないため、この利用者のブロックの閲覧/編集はできません。",
        "ipbblocked": "あなた自身がブロックされているため、他の利用者のブロックやブロック解除はできません。",
        "cant-move-to-user-page": "利用者下位ページ以外の利用者ページに、ページを移動させる権限がありません。",
        "cant-move-category-page": "カテゴリのページを移動させる権限がありません。",
        "cant-move-to-category-page": "ページをカテゴリのページに移動させる権限がありません。",
+       "cant-move-subpages": "下位のページを移動する権限がありません。",
+       "namespace-nosubpages": "名前空間「$1」はサブページが許可されていません。",
        "newtitle": "新しいページ名:",
        "move-watch": "移動元と移動先ページをウォッチ",
        "movepagebtn": "ページを移動",
        "newimages-showbots": "ボットによるアップロードを表示",
        "newimages-hidepatrolled": "巡回済みのアップロードを隠す",
        "noimages": "表示できるものがありません。",
+       "gallery-slideshow-toggle": "トグルサムネイル",
        "ilsubmit": "検索",
        "bydate": "日付順",
        "sp-newimages-showfrom": "$1の$2以降の新しいファイルを表示",
        "tag-filter": "[[Special:Tags|タグ]]絞り込み:",
        "tag-filter-submit": "絞り込み",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|タグ}}]]: $2)",
+       "tag-mw-contentmodelchange": "コンテンツ・モデルの変更",
        "tags-title": "タグ",
        "tags-intro": "このページは、ソフトウェアが編集に対して付けるタグとその意味の一覧です。",
        "tags-tag": "タグ名",
        "logentry-tag-update-revision": "$1 がページ「$3」の版 $4 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
        "logentry-tag-update-logentry": "$1 がページ「$3」の記録項目 $5 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
        "rightsnone": "(なし)",
+       "rightslogentry-temporary-group": "$1 ($2までの臨時)",
        "feedback-adding": "ページへのフィードバックの追加...",
        "feedback-back": "戻る",
        "feedback-bugcheck": "Great! [$1 既出のバグ]に既に含まれていないかご確認ください。",
        "pagelang-select-lang": "言語を選択",
        "pagelang-reason": "理由",
        "pagelang-submit": "変更",
+       "pagelang-nonexistent-page": "ページ $1 は存在しません。",
        "right-pagelang": "ページの言語を変更",
        "action-pagelang": "ページの言語の変更",
        "log-name-pagelang": "言語変更の記録",
        "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 による範囲。全帯域からの接続を許可する場合: <pre>0.0.0.0/0\n::/0</pre>"
 }
index f933f87..35762e5 100644 (file)
        "duration-centuries": "taonjato $1{{PLURAL:$1|}}",
        "limitreport-walltime": "Tena fotoam-pampiasana",
        "limitreport-walltime-value": "$1 segondra{{PLURAL:$1|}}",
+       "expandtemplates": "Hanitatra ny endrika",
+       "expand_templates_input": "Wikisoratra loharano:",
        "expand_templates_output": "Valiny",
        "expand_templates_xml_output": "Famoahana XML",
        "expand_templates_html_output": "Famoahana HTML",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Hanala resaka",
+       "expand_templates_generate_rawhtml": "Haneho HTML maina",
        "expand_templates_preview": "Topi-maso",
        "pagelang-name": "Pejy",
        "pagelang-language": "Fiteny",
        "mediastatistics-header-text": "Soratra",
        "mediastatistics-header-executable": "Azo alefa",
        "mediastatistics-header-total": "Rakitra rehetra",
+       "json-error-syntax": "Hadisoan-drariteny",
        "special-characters-group-latin": "latina",
        "special-characters-group-latinextended": "latina nitarina",
        "special-characters-group-ipa": "AAI",
        "special-characters-title-endash": "tsipika anglisy",
        "special-characters-title-emdash": "tsipika em",
        "special-characters-title-minus": "marika mainosy",
+       "mw-widgets-mediasearch-noresults": "Tsy nahitana valiny",
+       "mw-widgets-titleinput-description-new-page": "Tsy mbola misy ilay pejy",
+       "mw-widgets-usersmultiselect-placeholder": "Hanampy be kokoa",
        "sessionmanager-tie": "Tsy afaka mampikambana karazan-kataka fampamantarana maromaro: $1.",
+       "log-action-filter-all": "Manontolo",
+       "log-action-filter-block-block": "Bolongana",
+       "log-action-filter-protect-protect": "Fiarovana",
+       "log-action-filter-protect-unprotect": "Fanalana fiarovana",
        "authmanager-authn-not-in-progress": "Tsy andalam-panaovana ny fampamantarana, na very ny angon'ny sesiôna. Avereno hatramin'ny voalohany azafady.",
        "authmanager-authplugin-setpass-failed-title": "Tsy nahomby ny fanovana tenimiafina",
        "authmanager-authplugin-setpass-failed-message": "Nandà ny fanovana tenimiafina ny plugin fampamantarana.",
        "authmanager-username-help": "Anaram-pikambana ho an'ny fampamantarana.S",
        "authmanager-password-help": "Tenimiafina ho an'ny fampamantarana.",
        "authmanager-retype-help": "tenimiafina indray hanamarinana.",
+       "authmanager-email-label": "Mailaka",
+       "authmanager-email-help": "Adiresy mailaka:",
+       "authmanager-realname-label": "Tena anarana:",
        "authmanager-provider-password": "Fampamamtarana mifototra amin'ny tenimiafina",
        "authmanager-provider-password-domain": "Fampamantarana mifototra amin'ny tenimiafina ary vala",
        "authmanager-provider-temporarypassword": "Tenimiafina vonjimaika",
+       "authprovider-resetpass-skip-label": "Dinganina",
        "authprovider-resetpass-skip-help": "Handingana ny famerenam-tenimiafina.",
-       "authform-nosession-login": "nahomby ny fidirana, fa tsy mahatadidy anao tafiditra ny mpitety tranonkalanao."
+       "authform-nosession-login": "nahomby ny fidirana, fa tsy mahatadidy anao tafiditra ny mpitety tranonkalanao.",
+       "specialpage-securitylevel-not-allowed-title": "Voarara",
+       "changecredentials": "Hanova torohay fampahafantarana",
+       "changecredentials-submit": "Ovaina ny torohay fampahafantarana",
+       "changecredentials-invalidsubpage": "Tsy karazan-torohay fampahafantarana azo ekena $1",
+       "changecredentials-success": "Niova ny torohay fampahafantarana anao.",
+       "removecredentials": "Hanala torohay fampahafantarana",
+       "removecredentials-submit": "Esorina ny torohay fampahafantarana",
+       "credentialsform-provider": "Karazan-torohay fampahafantarana:",
+       "credentialsform-account": "Anaran-kaonty:",
+       "restrictionsfield-badip": "Adiresy na valan'IP tsy azo raisina: $1",
+       "restrictionsfield-label": "Valan' IP ekena:",
+       "revid": "versiona $1",
+       "pageid": "ID pejy $1"
 }
index 9371f3f..7c87e4d 100644 (file)
        "post-expand-template-argument-warning": "'''Предупредување:''' Оваа страница содржи најмалку еден шаблонски аргумент кој е со преголема должина.\nТаквите аргументи ќе бидат изземени при расчленувањето.",
        "post-expand-template-argument-category": "Страници кои содржат изземени аргументи на шаблони",
        "parser-template-loop-warning": "Пронајдена е јамка во шаблонот: [[$1]]",
+       "template-loop-category": "Страници со шаблонски јамки",
+       "template-loop-category-desc": "Страницава содржи шаблонска јамка, т.е. шаблон кој повторливо се самоповикува",
        "parser-template-recursion-depth-warning": "Пречекорена е границата на длабочината на рекурзијата во шаблонот ($1)",
        "language-converter-depth-warning": "Пречекорена е границата на длабочината на јазичниот претворач ($1)",
        "node-count-exceeded-category": "Страници каде е надминат бројот на јазли",
index 4ffdd93..5c04f76 100644 (file)
        "missingsummary": "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fait sens avertiment mai.",
        "missingcommenttext": "Mercé de metre un comentari çaijós.",
        "missingcommentheader": "<strong>Rapèl :</strong> Avètz pas provesit cap de subjècte per aqueste comentari.\nSe clicatz tornamai sus « {{int:Savearticle}} », vòstra modificacion serà enregistrada sens subjècte.",
-       "summary-preview": "Previsualizacion del resumit :",
-       "subject-preview": "Previsualizacion del subjècte",
+       "summary-preview": "Apercebut del resumit de modificacion :",
+       "subject-preview": "Apercebut del subjècte :",
        "blockedtitle": "L'utilizaire es blocat",
        "blockedtext": "'''Vòstre compte d'utilizaire o vòstra adreça IP es estat blocat'''\n\nLo blocatge es estat efectuat per $1.\nLa rason invocada es la seguenta : ''$2''.\n\n* Començament del blocatge : $8\n* Expiracion del blocatge : $6\n* Compte blocat : $7.\n\nPodètz contactar $1 o un autre [[{{MediaWiki:Grouppage-sysop}}|administrator]] per ne discutir.\nPodètz pas utilizar la foncion « Mandar un corrièr electronic a aqueste utilizaire » que se una adreça de corrièr valida es especificada dins vòstras [[Special:Preferences|preferéncias]].\nVòstra adreça IP actuala es $3 e vòstre identificant de blocatge es #$5.\nIncluissètz aquesta adreça dins tota requèsta.",
        "autoblockedtext": "Vòstra adreça IP es estada blocada automaticament perque es estada utilizada per un autre utilizaire, ele-meteis blocat per $1.\nLa rason invocadaa es :\n\n:''$2''\n\n* Començament del blocatge : $8\n* Expiracion del blocatge : $6\n* Compte blocat : $7\n\nPodètz contactar $1 o un dels autres [[{{MediaWiki:Grouppage-sysop}}|administrators]] per discutir d'aqueste blocatge.\n\nNotatz que podètz pas utilizar la foncionalitat \"Mandar un messatge a aqueste utilizaire\" tant qu'auretz pas  una adreça e-mail enregistrada dins vòstras [[Special:Preferences|preferéncias]] e tant que seretz pas blocat per son utilizacion.\n\nVòstra adreça IP actuala es $3, e lo numèro de blocatge es $5.\nPrecisatz aquestas indicacions dins totas las requèstas que faretz.",
        "page_first": "primièra",
        "page_last": "darrièra",
        "histlegend": "Legenda : ({{MediaWiki:Cur}}) = diferéncia amb la version actuala ,\n({{MediaWiki:Last}}) = diferéncia amb la version precedenta, <b>m</b> = cambiament menor",
-       "history-fieldset-title": "Percórrer l'istoric",
-       "history-show-deleted": "Suprimits solament",
+       "history-fieldset-title": "Recercar de revisions",
+       "history-show-deleted": "Revision suprimida unicament",
        "histfirst": "Las mai ancianas",
        "histlast": "Las mai recentas",
        "historysize": "({{PLURAL:$1|1 octet|$1 octets}})",
        "prefs-diffs": "Diferéncias",
        "prefs-help-prefershttps": "Aquesta preferéncia serà efectiva al moment de vòstra connexion que ven.",
        "prefs-tabs-navigation-hint": "Astúcia : Podètz utilizar las sagetas d'esquèrra e de dreita per navigar entre los onglets.",
-       "userrights": "Gestion dels dreits d'utilizaire",
+       "userrights": "Dreits dels utilizaires",
        "userrights-lookup-user": "Seleccionar un utilizaire",
        "userrights-user-editname": "Entrar un nom d’utilizaire :",
        "editusergroup": "Cargar de gropes d’utilizaires",
        "rcfilters-filter-editsbyself-label": "Vòstras pròprias modificacions",
        "rcfilters-filter-editsbyself-description": "Vòstras modificacions.",
        "rcfilters-filter-editsbyother-label": "Modificacions per d’autres.",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Novèls arribants",
-       "rcfilters-filter-userExpLevel-learner-label": "Aprenents",
-       "rcfilters-filter-userExpLevel-experienced-label": "Utilizaires experimentats",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novèls arribants",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprenents",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utilizaires experimentats",
        "rcfilters-filtergroup-automated": "Contribucions automatizadas",
        "rcfilters-filter-bots-label": "Robòt",
        "rcfilters-filter-humans-label": "Èsser uman (pas robòt)",
        "protect-expiry-options": "1 ora:1 hour,1 jorn:1 day,1 setmana:1 week,2 setmanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 an:1 year,indefinidament:infinite",
        "restriction-type": "Permission :",
        "restriction-level": "Nivèl de restriccion :",
-       "minimum-size": "Talha minimoma",
+       "minimum-size": "Talha minimala",
        "maximum-size": "Talha maximala :",
        "pagesize": "(octets)",
        "restriction-edit": "Modificacion",
index 6bfb3c1..64a046e 100644 (file)
        "post-expand-template-argument-warning": "Uwaga – strona zawiera co najmniej jeden argument szablonu, który po rozwinięciu jest zbyt duży.\nArgument ten będzie pominięty.",
        "post-expand-template-argument-category": "Strony, w których użyto szablon z pominięciem argumentów",
        "parser-template-loop-warning": "Wykryto pętlę w szablonie [[$1]]",
+       "template-loop-category-desc": "Strona zawiera pętlę szablonów, czyli szablon, który wywołuje sam siebie rekursywnie.",
        "parser-template-recursion-depth-warning": "Przekroczno limit głębokości rekurencji szablonu ($1)",
        "language-converter-depth-warning": "Przekroczono ograniczenie ($1) głębokości zagnieżdżenia konwersji językowej",
        "node-count-exceeded-category": "Strony, gdzie przekroczono liczbę węzłów",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Pokaż",
        "rcfilters-activefilters": "Aktywne filtry",
-       "rcfilters-restore-default-filters": "Przywrócić domyślne filtry",
+       "rcfilters-restore-default-filters": "Przywróć domyślne filtry",
        "rcfilters-clear-all-filters": "Wyczyść filtry",
        "rcfilters-search-placeholder": "Filtruj ostatnie zmiany (przeglądaj lub zacznij wpisywać)",
        "rcfilters-invalid-filter": "Nieprawidłowy filtr",
        "rcfilters-highlightmenu-help": "Wybierz kolor, aby podświetlić tę właściwość",
        "rcfilters-filterlist-noresults": "Nie znaleziono filtrów",
        "rcfilters-noresults-conflict": "Nie znaleziono wyników z powodu konfliktu kryteriów wyszukiwania",
+       "rcfilters-state-message-subset": "Ten filtr nie wywoła efektu, ponieważ pasujące do niego wyniki są zawarte w bardziej {{PLURAL:$2|szczegółowym filtrze|szczegółowych filtrach}} (spróbuj podświetlić, aby je rozróżnić): $1",
+       "rcfilters-state-message-fullcoverage": "Wybranie wszystkich filtrów w grupie działa tak samo jak niewybranie żadnego, więc ten filtr nie będzie miał efektu. W grupie zawarto też: $1",
        "rcfilters-filtergroup-registration": "Rejestracja użytkownika",
        "rcfilters-filter-registered-label": "Zarejestrowani",
        "rcfilters-filter-registered-description": "Zalogowani edytorzy.",
        "rcfilters-filter-unregistered-label": "Niezarejestrowani",
        "rcfilters-filter-unregistered-description": "Niezalogowani",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ten filtr koliduje z {{PLURAL:$2|poniższym filtrem|poniższymi filtrami}} doświadczenia, {{PLURAL:$2|który wyszukuje|które wyszukują}} tylko zarejestrowanych użytkowników: $1",
        "rcfilters-filtergroup-authorship": "Autorstwo edycji",
        "rcfilters-filter-editsbyself-label": "Moje edycje",
        "rcfilters-filter-editsbyself-description": "Edycje dokonane przez Ciebie.",
        "rcfilters-filter-editsbyother-label": "Edycje inne niż Twoje",
        "rcfilters-filter-editsbyother-description": "Edycje wykonane przez innych (nie Twoje).",
        "rcfilters-filtergroup-userExpLevel": "Poziom doświadczenia (tylko o zarejestrowanych użytkownikach)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filtry doświadczenia wyszukują tylko edycje zarejestrowanych użytkowników, więc ten filtr koliduje z filtrem “Niezarejestrowani”.",
        "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtr \"Niezarejestrowani\" koliduje z jednym lub więcej filtrów z filtrów poziomu doświadczenia, które służą do wyszukiwania wkładu tylko zarejestrowanych użytkowników. Kolidujące filtry zostały odpowiednio oznaczone na pasku Aktywnych filtrów.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Początkujący",
        "rcfilters-filter-user-experience-level-newcomer-description": "Mniej niż 10 edycji i 4 dni aktywności.",
        "rcfilters-filter-categorization-description": "Dodanie lub usunięcie strony z kategorii",
        "rcfilters-filter-logactions-label": "Działania rejestrowane",
        "rcfilters-filter-logactions-description": "Działania administracyjne, tworzenie kont, usuwanie stron, przesyłanie plików...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr \"Drobne zmiany\" koliduje z jednym lub wieloma filtrami Rodzaju zmian, ponieważ niektóre rodzaje zmian nie mogą być uznawane za \"drobne\". Kolidujące filtry zostały odpowiednio zaznaczone na pasku aktywnych filtrów powyżej.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Niektóre rodzaje zmian nie mogą być uznawane za \"drobne\", więc ten filtr koliduje z następującymi filtrami rodzaju zmian: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ten filtr Rodzaju zmian koliduje z filtrem \"Drobne zmiany\". Nie wszystkie zmiany mogą być uznawane za \"drobne\".",
        "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "rcshowhideminor": "$1 drobne edycje",
        "authmanager-autocreate-noperm": "Automatyczne tworzenie konta jest niedozwolone.",
        "authmanager-autocreate-exception": "Automatyczne tworzenie konta tymczasowo wyłączone z powodu wcześniejszych błędów.",
        "authmanager-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
+       "authmanager-userlogin-remembermypassword-help": "Czy hasło powinno być zapamiętane dłużej niż długość sesji.",
        "authmanager-username-help": "Nazwa użytkownika dla uwierzytelniania.",
        "authmanager-password-help": "Hasło do uwierzytelniania.",
        "authmanager-domain-help": "Domena uwierzytelniania zewnętrznego.",
index 2951a4c..d1e6f08 100644 (file)
        "newimages-summary": "This message is displayed at the top of [[Special:NewImages]] to explain what is shown on that special page.",
        "newimages-legend": "Caption of the fieldset for the filter on [[Special:NewImages]]\n\n{{Identical|Filter}}",
        "newimages-label": "Caption of the filter editbox on [[Special:NewImages]]",
+       "newimages-user": "Caption of the username/IP address editbox on [[Special:NewImages]]",
        "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.",
index 3c48c9f..c9e2ed9 100644 (file)
        "shared-repo-from": "из $1",
        "shared-repo": "общего хранилища",
        "shared-repo-name-wikimediacommons": "Викисклада",
-       "filepage.css": "/* CSS и помещены сюда входит на странице описания файла, также на зарубежного заказчика Вики */",
+       "filepage.css": "/* Размещённые здесь CSS будут применены на странице описания файла и на сторонних клиентских вики */",
        "upload-disallowed-here": "Вы не можете перезаписать этот файл.",
        "filerevert": "Возврат к старой версии $1",
        "filerevert-legend": "Возвратить версию файла",
        "sunday-at": "в воскресенье в $1",
        "yesterday-at": "Вчера в $1",
        "bad_image_list": "Формат должен быть следующим:\n\nБудут учитываться только элементы списка (строки, начинающиеся на символ *).\nПервая ссылка строки должна быть ссылкой на запрещённое для вставки изображение.\nПоследующие ссылки в той же строке будут рассматриваться как исключения, то есть статьи, куда изображение может быть включено.",
-       "variantname-zh-hans": "его",
+       "variantname-zh-hans": "hans",
        "metadata": "Метаданные",
        "metadata-help": "Файл содержит дополнительные данные, обычно добавляемые цифровыми камерами или сканерами. Если файл после создания редактировался, то некоторые параметры могут не соответствовать текущему изображению.",
        "metadata-expand": "Показать дополнительные данные",
        "exif-copyrighted-false": "Авторско-правовой статус не задан",
        "exif-photometricinterpretation-1": "Чёрный и белый (чёрный — 0)",
        "exif-photometricinterpretation-4": "Маска прозрачности",
-       "exif-photometricinterpretation-5": "РазделенÑ\8b (видимо Ð² CMYK)",
+       "exif-photometricinterpretation-5": "РазделенÑ\8b (веÑ\80оÑ\8fÑ\82но CMYK)",
        "exif-unknowndate": "Неизвестная дата",
        "exif-orientation-1": "Нормальная",
        "exif-orientation-2": "Отражено по горизонтали",
        "confirmemail_body_set": "Кто-то (возможно вы) с IP-адресом $1\nуказал данный адрес электронной почты для учётной записи «$2» в проекте «{{SITENAME}}».\n\nЧтобы подтвердить, что эта учётная запись действительно принадлежит вам,\nи включить возможность отправки писем с сайта «{{SITENAME}}», откройте в браузере приведённую ниже ссылку:\n\n$3\n\nЕсли данная учётная запись *не* относится к вам, то перейдите по следующей ссылке,\nчтобы отменить подтверждение адреса электронной почты:\n\n$5\n\nКод подтверждения действителен до $4.",
        "confirmemail_invalidated": "Подтверждение адреса электронной почты отменено.",
        "invalidateemail": "Отмена подтверждения адреса электронной почты",
-       "notificationemail_subject_changed": "{{SITENAME}} зарегистрированный адрес электронной почты был изменен",
+       "notificationemail_subject_changed": "Адрес электронной почты для {{SITENAME}} был изменён",
        "notificationemail_subject_removed": "{{SITENAME}} зарегистрированный адрес электронной почты был удален",
        "notificationemail_body_changed": "Кто-то, вероятно, вы, с IP-адреса $1,\nизменил адрес электронной почты учетной записи \"$2\" на \"$3\" на {{SITENAME}}.\n\nЕсли это были не вы, обратитесь к администратору сайта немедленно.",
        "notificationemail_body_removed": "Кто-то, вероятно вы, с IP-адреса $1,\nудалил адрес электронной почты учетной записи \"$2\" на {{SITENAME}}.\n\nЕсли это были не вы, обратитесь к администратору сайта немедленно.",
        "log-action-filter-contentmodel": "Тип изменения модели содержимого:",
        "log-action-filter-delete": "Тип удаления:",
        "log-action-filter-import": "Тип импорта:",
-       "log-action-filter-managetags": "Тип Ñ\82ега Ñ\83пÑ\80авленÑ\87еÑ\81киÑ\85 Ð´ÐµÐ¹Ñ\81Ñ\82вий:",
+       "log-action-filter-managetags": "Ð\94ейÑ\81Ñ\82вие Ð¿Ð¾ Ñ\83пÑ\80авлениÑ\8e Ñ\82егами:",
        "log-action-filter-move": "Тип переименования:",
        "log-action-filter-newusers": "Тип создания учётной записи:",
        "log-action-filter-patrol": "Тип патрулирования:",
        "log-action-filter-managetags-delete": "Удаление тегов",
        "log-action-filter-managetags-activate": "Активация тегов",
        "log-action-filter-managetags-deactivate": "Отключение тега",
-       "log-action-filter-move-move": "Ð\94вигаÑ\82Ñ\8cÑ\81Ñ\8f Ð±ÐµÐ· Ð¿ÐµÑ\80езапиÑ\81и Ð¿ÐµÑ\80еадÑ\80еÑ\81аÑ\86ий",
-       "log-action-filter-move-move_redir": "Ð\9fеÑ\80емеÑ\81Ñ\82иÑ\82Ñ\8c Ñ\81 Ð·Ð°Ð¼ÐµÐ½Ð¾Ð¹ Ð¿ÐµÑ\80еадÑ\80еÑ\81аÑ\86ий",
+       "log-action-filter-move-move": "Ð\9fеÑ\80еименованиÑ\8f Ð½Ðµ Ð² Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ее Ð¿ÐµÑ\80енапÑ\80авление",
+       "log-action-filter-move-move_redir": "Ð\9fеÑ\80еименованиÑ\8f Ð¿Ð¾Ð²ÐµÑ\80Ñ\85 Ð¿ÐµÑ\80енапÑ\80авлениÑ\8f",
        "log-action-filter-newusers-create": "Создание анонимным участником",
        "log-action-filter-newusers-create2": "Создание зарегистрированным участником",
        "log-action-filter-newusers-autocreate": "Автоматическое создание",
index 2bdc449..a441aa4 100644 (file)
        "nstab-template": "Modellu",
        "nstab-help": "Agiudu",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pàgina printzipale",
        "nosuchaction": "No esistit custa atzione",
        "nosuchactiontext": "S'atzione ispetzificada in sa URL no est vàlida.\nEst possìbile chi sa URL siat istada carcada male, o si siat sighidu unu ligòngiu non vàlidu.\nCustu diat pòdere èssere unu \"bug\" de {{SITENAME}}.",
        "nosuchspecialpage": "Custa pàgina ispetziale no esistit",
        "password-change-forbidden": "Non podes cambiare sa password in custa wiki.",
        "login": "Intra",
        "nav-login-createaccount": "Intra / crea contu",
-       "userlogin": "Intra / crea contu",
-       "userloginnocreate": "Intra",
        "logout": "Serra sessione",
        "userlogout": "Essida",
        "notloggedin": "Non ses intradu",
        "userlogin-noaccount": "Non tenes unu contu?",
        "userlogin-joinproject": "Registra⋅ti a {{SITENAME}}",
-       "nologin": "Non tenes unu contu? '''$1'''.",
-       "nologinlink": "Crea unu contu",
        "createaccount": "Crea contu",
-       "gotaccount": "Tenes giai unu contu? $1.",
-       "gotaccountlink": "Identìfica·ti",
-       "userlogin-resetlink": "As ismentigadu is datos pro s'atzessu?",
        "userlogin-resetpassword-link": "As ismentigadu sa password?",
        "userlogin-helplink2": "Agiudu pro s'atzessu",
        "userlogin-createanother": "Crea un àteru contu",
        "createacct-another-email-ph": "Inserta s'indiritzu post.el",
        "createaccountmail": "Imprea una password a sorte e ispedidda a su indiritzu post.el ispetzificadu",
        "createacct-realname": "Nùmene beru (optzionale)",
-       "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
        "createacct-reason-ph": "Pro ite ses creende un àteru contu",
        "createacct-submit": "Crea su contu tuo",
        "passwordreset-emaildisabled": "Is funtzionalidades de email sunt istadas disabilitadas in custa wiki.",
        "passwordreset-username": "Nùmene impitadore:",
        "passwordreset-domain": "Domìniu:",
-       "passwordreset-capture": "Ammustrare su cuntenutu de sa email?",
        "passwordreset-email": "Indiritzu email:",
        "passwordreset-emailtitle": "Particulares de s'impitadore in {{SITENAME}}",
        "passwordreset-emailelement": "Nùmene utente: \n$1\n\nPassword temporànea: \n$2",
        "saveprefs": "Sarba",
        "restoreprefs": "Restàura totus is sèberos predefinidos (in totus is setziones)",
        "prefs-editing": "Casella de modìfica",
-       "rows": "Lìnias:",
-       "columns": "Colunnas:",
        "searchresultshead": "Chirca",
        "stub-threshold": "Valore mìnimu pro is <a href=\"#\" class=\"stub\">ligòngios a is abotzos</a>, in bytes:",
        "stub-threshold-disabled": "Disativadu",
        "boteditletter": "b",
        "rc_categories_any": "Calesisiat",
        "rc-change-size": "$1",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} a pustis de sa modìfica",
        "newsectionsummary": "/* $1 */ setzione noa",
        "rc-enhanced-expand": "Ammustra particulares",
        "rc-enhanced-hide": "Cua particulares",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|carrigadu}} una versione noa de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|carrigadu}} $3",
        "rightsnone": "(nisciunu)",
-       "revdelete-summary": "ogetu de sa modìfica",
        "feedback-cancel": "Annudda",
        "feedback-close": "Fatu",
        "feedback-message": "Messàgiu:",
index 7da531a..9fe4e51 100644 (file)
        "post-expand-template-argument-warning": "'''Opozorilo:'''' Ta stran vsebuje vsaj en argument predloge, ki ima preveliko razširitev.\nNaslednji argumenti so bili izpuščeni.",
        "post-expand-template-argument-category": "Strani z izpuščenimi argumenti predloge",
        "parser-template-loop-warning": "V predlogi je bila odkrita zanka: [[$1]]",
+       "template-loop-category": "Strani z zankami predlog",
+       "template-loop-category-desc": "Stran vsebuje zanko predloge, tj. predlogo, ki rekurzivno kliče sama sebe.",
        "parser-template-recursion-depth-warning": "Prekoračena globina rekurzije predlog ($1)",
        "language-converter-depth-warning": "Prekoračena globina pretvorbe jezikov ($1)",
        "node-count-exceeded-category": "Strani s prekoračenim številom vozlišč",
index 7799835..1f7ae83 100644 (file)
        "recentchanges-summary": "Пратите скорашње измене на овој страници.",
        "recentchanges-noresult": "Нема промена у задатом времену за задате критеријуме.",
        "recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.",
-       "recentchanges-label-newpage": "Ð\9dова страница",
-       "recentchanges-label-minor": "Ð\9cања измена",
+       "recentchanges-label-newpage": "Ð\9eвом Ð¸Ð·Ð¼ÐµÐ½Ð¾Ð¼ Ð½Ð°Ð¿Ñ\80авÑ\99ена Ñ\98е Ð½ова страница",
+       "recentchanges-label-minor": "Ð\9eво Ñ\98е Ð¼ања измена",
        "recentchanges-label-bot": "Ову измену је направио бот",
        "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
        "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
index b47fde5..ba66d17 100644 (file)
        "recentchanges-summary": "Pratite skorašnje izmene na ovoj stranici.",
        "recentchanges-noresult": "Nema promena u zadatom vremenu za zadate kriterijume.",
        "recentchanges-feed-description": "Pratite skorašnje izmene uz pomoć ovog dovoda.",
-       "recentchanges-label-newpage": "Nova stranica",
-       "recentchanges-label-minor": "Manja izmena",
+       "recentchanges-label-newpage": "Ovom izmenom napravljena je nova izmena",
+       "recentchanges-label-minor": "Ovo je manja izmena",
        "recentchanges-label-bot": "Ovu izmenu je napravio bot",
        "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
        "recentchanges-label-plusminus": "Promena veličine stranice u bajtovima",
index 1a8e881..7b0a85f 100644 (file)
        "currentevents-url": "Project:Güncel olaylar",
        "disclaimers": "Sorumluluk reddi",
        "disclaimerpage": "Project:Genel sorumluluk reddi",
-       "edithelp": "Nasıl değiştirilir?",
+       "edithelp": "Düzenleme yardımı",
        "helppage-top-gethelp": "Yardım",
        "mainpage": "Ana Sayfa",
        "mainpage-description": "Ana sayfa",
index 0a467da..aeff357 100644 (file)
        "post-expand-template-argument-warning": "<strong>警告:</strong>本页面包含至少一个展开后过大的模板参数。这些参数会被忽略。",
        "post-expand-template-argument-category": "含有略过模板参数的页面",
        "parser-template-loop-warning": "检查到模板循环:[[$1]]",
+       "template-loop-category": "有模板循环的页面",
+       "template-loop-category-desc": "页面存在模板循环,就是递归进行自我调用的模板。",
        "parser-template-recursion-depth-warning": "模板递归深度越限($1)",
        "language-converter-depth-warning": "字词转换器深度越限($1)",
        "node-count-exceeded-category": "页面的节点数超出限制",
index 62dc36c..a8080c5 100644 (file)
@@ -36,6 +36,7 @@ define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
 
 $maintClass = false;
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\LBFactory;
index 286fb58..60b8a7a 100644 (file)
@@ -28,6 +28,7 @@ require_once __DIR__ . '/Maintenance.php';
 require_once __DIR__ . '/../includes/export/DumpFilter.php';
 
 use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup Dump Maintenance
index 83ab35c..dbaf643 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
 
index 3088baa..feeeb65 100644 (file)
@@ -22,7 +22,7 @@
  * @author Timo Tijhof
  */
 
-use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
 
index 06fcbaf..67f7780 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
index f8eedb3..b0a2b92 100644 (file)
@@ -25,6 +25,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script to run a database query in batches and wait for replica DBs.
  *
index 58472e9..b03620d 100644 (file)
@@ -25,6 +25,7 @@
 require_once __DIR__ . '/Maintenance.php';
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Maintenance script that sends SQL queries from the specified file to the database.
index 631386a..ce52846 100644 (file)
@@ -1302,7 +1302,7 @@ return [
                'dependencies' => [
                        'mediawiki.ForeignStructuredUpload',
                        'mediawiki.Upload.BookletLayout',
-                       'mediawiki.widgets.CategorySelector',
+                       'mediawiki.widgets.CategoryMultiselectWidget',
                        'mediawiki.widgets.DateInputWidget',
                        'mediawiki.jqueryMsg',
                        'mediawiki.api.messages',
@@ -2357,9 +2357,15 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.widgets.CategorySelector' => [
+               'deprecated' => 'Use "mw.widgets.CategoryMultiselectWidget" instead. See T161285.',
+               'dependencies' => [
+                       'mediawiki.widgets.CategoryMultiselectWidget',
+               ],
+       ],
+       'mediawiki.widgets.CategoryMultiselectWidget' => [
                'scripts' => [
                        'resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js',
                ],
                'dependencies' => [
                        'oojs-ui-widgets',
@@ -2369,7 +2375,7 @@ return [
                ],
                'messages' => [
                        'red-link-title',
-                       'mw-widgets-categoryselector-add-category-placeholder'
+                       'mw-widgets-categoryselector-add-category-placeholder',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js b/resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js
new file mode 100644 (file)
index 0000000..ccc5c9d
--- /dev/null
@@ -0,0 +1,416 @@
+/*!
+ * MediaWiki Widgets - CategoryMultiselectWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+       var NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
+
+       /**
+        * Category selector widget. Displays an OO.ui.CapsuleMultiselectWidget
+        * and autocompletes with available categories.
+        *
+        *     mw.loader.using( 'mediawiki.widgets.CategoryMultiselectWidget', function () {
+        *       var selector = new mw.widgets.CategoryMultiselectWidget( {
+        *         searchTypes: [
+        *           mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch,
+        *           mw.widgets.CategoryMultiselectWidget.SearchType.InternalSearch
+        *         ]
+        *       } );
+        *
+        *       $( 'body' ).append( selector.$element );
+        *
+        *       selector.setSearchTypes( [ mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories ] );
+        *     } );
+        *
+        * @class mw.widgets.CategoryMultiselectWidget
+        * @uses mw.Api
+        * @extends OO.ui.CapsuleMultiselectWidget
+        * @mixins OO.ui.mixin.PendingElement
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {mw.Api} [api] Instance of mw.Api (or subclass thereof) to use for queries
+        * @cfg {number} [limit=10] Maximum number of results to load
+        * @cfg {mw.widgets.CategoryMultiselectWidget.SearchType[]} [searchTypes=[mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch]]
+        *   Default search API to use when searching.
+        */
+       mw.widgets.CategoryMultiselectWidget = function MWCategoryMultiselectWidget( config ) {
+               // Config initialization
+               config = $.extend( {
+                       limit: 10,
+                       searchTypes: [ mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch ]
+               }, config );
+               this.limit = config.limit;
+               this.searchTypes = config.searchTypes;
+               this.validateSearchTypes();
+
+               // Parent constructor
+               mw.widgets.CategoryMultiselectWidget.parent.call( this, $.extend( true, {}, config, {
+                       menu: {
+                               filterFromInput: false
+                       },
+                       placeholder: mw.msg( 'mw-widgets-categoryselector-add-category-placeholder' ),
+                       // This allows the user to both select non-existent categories, and prevents the selector from
+                       // being wiped from #onMenuItemsChange when we change the available options in the dropdown
+                       allowArbitrary: true
+               } ) );
+
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
+
+               // Event handler to call the autocomplete methods
+               this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
+
+               // Initialize
+               this.api = config.api || new mw.Api();
+               this.searchCache = {};
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.CategoryMultiselectWidget, OO.ui.CapsuleMultiselectWidget );
+       OO.mixinClass( mw.widgets.CategoryMultiselectWidget, OO.ui.mixin.PendingElement );
+
+       /* Methods */
+
+       /**
+        * Gets new items based on the input by calling
+        * {@link #getNewMenuItems getNewItems} and updates the menu
+        * after removing duplicates based on the data value.
+        *
+        * @private
+        * @method
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.updateMenuItems = function () {
+               this.getMenu().clearItems();
+               this.getNewMenuItems( this.$input.val() ).then( function ( items ) {
+                       var existingItems, filteredItems,
+                               menu = this.getMenu();
+
+                       // Never show the menu if the input lost focus in the meantime
+                       if ( !this.$input.is( ':focus' ) ) {
+                               return;
+                       }
+
+                       // Array of strings of the data of OO.ui.MenuOptionsWidgets
+                       existingItems = menu.getItems().map( function ( item ) {
+                               return item.data;
+                       } );
+
+                       // Remove if items' data already exists
+                       filteredItems = items.filter( function ( item ) {
+                               return existingItems.indexOf( item ) === -1;
+                       } );
+
+                       // Map to an array of OO.ui.MenuOptionWidgets
+                       filteredItems = filteredItems.map( function ( item ) {
+                               return new OO.ui.MenuOptionWidget( {
+                                       data: item,
+                                       label: item
+                               } );
+                       } );
+
+                       menu.addItems( filteredItems ).toggle( true );
+               }.bind( this ) );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.clearInput = function () {
+               mw.widgets.CategoryMultiselectWidget.parent.prototype.clearInput.call( this );
+               // Abort all pending requests, we won't need their results
+               this.api.abort();
+       };
+
+       /**
+        * Searches for categories based on the input.
+        *
+        * @private
+        * @method
+        * @param {string} input The input used to prefix search categories
+        * @return {jQuery.Promise} Resolves with an array of categories
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.getNewMenuItems = function ( input ) {
+               var i,
+                       promises = [],
+                       deferred = $.Deferred();
+
+               if ( $.trim( input ) === '' ) {
+                       deferred.resolve( [] );
+                       return deferred.promise();
+               }
+
+               // Abort all pending requests, we won't need their results
+               this.api.abort();
+               for ( i = 0; i < this.searchTypes.length; i++ ) {
+                       promises.push( this.searchCategories( input, this.searchTypes[ i ] ) );
+               }
+
+               this.pushPending();
+
+               $.when.apply( $, promises ).done( function () {
+                       var categoryNames,
+                               allData = [],
+                               dataSets = Array.prototype.slice.apply( arguments );
+
+                       // Collect values from all results
+                       allData = allData.concat.apply( allData, dataSets );
+
+                       categoryNames = allData
+                               // Remove duplicates
+                               .filter( function ( value, index, self ) {
+                                       return self.indexOf( value ) === index;
+                               } )
+                               // Get Title objects
+                               .map( function ( name ) {
+                                       return mw.Title.newFromText( name );
+                               } )
+                               // Keep only titles from 'Category' namespace
+                               .filter( function ( title ) {
+                                       return title && title.getNamespaceId() === NS_CATEGORY;
+                               } )
+                               // Convert back to strings, strip 'Category:' prefix
+                               .map( function ( title ) {
+                                       return title.getMainText();
+                               } );
+
+                       deferred.resolve( categoryNames );
+
+               } ).always( this.popPending.bind( this ) );
+
+               return deferred.promise();
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.createItemWidget = function ( data ) {
+               var title = mw.Title.makeTitle( NS_CATEGORY, data );
+               if ( !title ) {
+                       return null;
+               }
+               return new mw.widgets.CategoryCapsuleItemWidget( {
+                       apiUrl: this.api.apiUrl || undefined,
+                       title: title
+               } );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.getItemFromData = function ( data ) {
+               // This is a bit of a hack... We have to canonicalize the data in the same way that
+               // #createItemWidget and CategoryCapsuleItemWidget will do, otherwise we won't find duplicates.
+               var title = mw.Title.makeTitle( NS_CATEGORY, data );
+               if ( !title ) {
+                       return null;
+               }
+               return OO.ui.mixin.GroupElement.prototype.getItemFromData.call( this, title.getMainText() );
+       };
+
+       /**
+        * Validates the values in `this.searchType`.
+        *
+        * @private
+        * @return {boolean}
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.validateSearchTypes = function () {
+               var validSearchTypes = false,
+                       searchTypeEnumCount = Object.keys( mw.widgets.CategoryMultiselectWidget.SearchType ).length;
+
+               // Check if all values are in the SearchType enum
+               validSearchTypes = this.searchTypes.every( function ( searchType ) {
+                       return searchType > -1 && searchType < searchTypeEnumCount;
+               } );
+
+               if ( validSearchTypes === false ) {
+                       throw new Error( 'Unknown searchType in searchTypes' );
+               }
+
+               // If the searchTypes has mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories
+               // it can be the only search type.
+               if ( this.searchTypes.indexOf( mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories ) > -1 &&
+                       this.searchTypes.length > 1
+               ) {
+                       throw new Error( 'Can\'t have additional search types with mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories' );
+               }
+
+               // If the searchTypes has mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories
+               // it can be the only search type.
+               if ( this.searchTypes.indexOf( mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories ) > -1 &&
+                       this.searchTypes.length > 1
+               ) {
+                       throw new Error( 'Can\'t have additional search types with mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories' );
+               }
+
+               return true;
+       };
+
+       /**
+        * Sets and validates the value of `this.searchType`.
+        *
+        * @param {mw.widgets.CategoryMultiselectWidget.SearchType[]} searchTypes
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.setSearchTypes = function ( searchTypes ) {
+               this.searchTypes = searchTypes;
+               this.validateSearchTypes();
+       };
+
+       /**
+        * Searches categories based on input and searchType.
+        *
+        * @private
+        * @method
+        * @param {string} input The input used to prefix search categories
+        * @param {mw.widgets.CategoryMultiselectWidget.SearchType} searchType
+        * @return {jQuery.Promise} Resolves with an array of categories
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.searchCategories = function ( input, searchType ) {
+               var deferred = $.Deferred(),
+                       cacheKey = input + searchType.toString();
+
+               // Check cache
+               if ( this.searchCache[ cacheKey ] !== undefined ) {
+                       return this.searchCache[ cacheKey ];
+               }
+
+               switch ( searchType ) {
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch:
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'opensearch',
+                                       namespace: NS_CATEGORY,
+                                       limit: this.limit,
+                                       search: input
+                               } ).done( function ( res ) {
+                                       var categories = res[ 1 ];
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.InternalSearch:
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       list: 'allpages',
+                                       apnamespace: NS_CATEGORY,
+                                       aplimit: this.limit,
+                                       apfrom: input,
+                                       apprefix: input
+                               } ).done( function ( res ) {
+                                       var categories = res.query.allpages.map( function ( page ) {
+                                               return page.title;
+                                       } );
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.Exists:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       prop: 'info',
+                                       titles: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = [];
+
+                                       $.each( res.query.pages, function ( index, page ) {
+                                               if ( !page.missing ) {
+                                                       categories.push( page.title );
+                                               }
+                                       } );
+
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       list: 'categorymembers',
+                                       cmtype: 'subcat',
+                                       cmlimit: this.limit,
+                                       cmtitle: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = res.query.categorymembers.map( function ( category ) {
+                                               return category.title;
+                                       } );
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       prop: 'categories',
+                                       cllimit: this.limit,
+                                       titles: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = [];
+
+                                       $.each( res.query.pages, function ( index, page ) {
+                                               if ( !page.missing && $.isArray( page.categories ) ) {
+                                                       categories.push.apply( categories, page.categories.map( function ( category ) {
+                                                               return category.title;
+                                                       } ) );
+                                               }
+                                       } );
+
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       default:
+                               throw new Error( 'Unknown searchType' );
+               }
+
+               // Cache the result
+               this.searchCache[ cacheKey ] = deferred.promise();
+
+               return deferred.promise();
+       };
+
+       /**
+        * @enum mw.widgets.CategoryMultiselectWidget.SearchType
+        * Types of search available.
+        */
+       mw.widgets.CategoryMultiselectWidget.SearchType = {
+               /** Search using action=opensearch */
+               OpenSearch: 0,
+
+               /** Search using action=query */
+               InternalSearch: 1,
+
+               /** Search for existing categories with the exact title */
+               Exists: 2,
+
+               /** Search only subcategories  */
+               SubCategories: 3,
+
+               /** Search only parent categories */
+               ParentCategories: 4
+       };
+
+       // For backwards compatibility. See T161285.
+       mw.widgets.CategorySelector = mw.widgets.CategoryMultiselectWidget;
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js b/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
deleted file mode 100644 (file)
index 422c048..0000000
+++ /dev/null
@@ -1,417 +0,0 @@
-/*!
- * MediaWiki Widgets - CategorySelector class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-( function ( $, mw ) {
-       var CSP,
-               NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
-
-       /**
-        * Category selector widget. Displays an OO.ui.CapsuleMultiselectWidget
-        * and autocompletes with available categories.
-        *
-        *     mw.loader.using( 'mediawiki.widgets.CategorySelector', function () {
-        *       var selector = new mw.widgets.CategorySelector( {
-        *         searchTypes: [
-        *           mw.widgets.CategorySelector.SearchType.OpenSearch,
-        *           mw.widgets.CategorySelector.SearchType.InternalSearch
-        *         ]
-        *       } );
-        *
-        *       $( 'body' ).append( selector.$element );
-        *
-        *       selector.setSearchTypes( [ mw.widgets.CategorySelector.SearchType.SubCategories ] );
-        *     } );
-        *
-        * @class mw.widgets.CategorySelector
-        * @uses mw.Api
-        * @extends OO.ui.CapsuleMultiselectWidget
-        * @mixins OO.ui.mixin.PendingElement
-        *
-        * @constructor
-        * @param {Object} [config] Configuration options
-        * @cfg {mw.Api} [api] Instance of mw.Api (or subclass thereof) to use for queries
-        * @cfg {number} [limit=10] Maximum number of results to load
-        * @cfg {mw.widgets.CategorySelector.SearchType[]} [searchTypes=[mw.widgets.CategorySelector.SearchType.OpenSearch]]
-        *   Default search API to use when searching.
-        */
-       function CategorySelector( config ) {
-               // Config initialization
-               config = $.extend( {
-                       limit: 10,
-                       searchTypes: [ CategorySelector.SearchType.OpenSearch ]
-               }, config );
-               this.limit = config.limit;
-               this.searchTypes = config.searchTypes;
-               this.validateSearchTypes();
-
-               // Parent constructor
-               mw.widgets.CategorySelector.parent.call( this, $.extend( true, {}, config, {
-                       menu: {
-                               filterFromInput: false
-                       },
-                       placeholder: mw.msg( 'mw-widgets-categoryselector-add-category-placeholder' ),
-                       // This allows the user to both select non-existent categories, and prevents the selector from
-                       // being wiped from #onMenuItemsChange when we change the available options in the dropdown
-                       allowArbitrary: true
-               } ) );
-
-               // Mixin constructors
-               OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
-
-               // Event handler to call the autocomplete methods
-               this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
-
-               // Initialize
-               this.api = config.api || new mw.Api();
-               this.searchCache = {};
-       }
-
-       /* Setup */
-
-       OO.inheritClass( CategorySelector, OO.ui.CapsuleMultiselectWidget );
-       OO.mixinClass( CategorySelector, OO.ui.mixin.PendingElement );
-       CSP = CategorySelector.prototype;
-
-       /* Methods */
-
-       /**
-        * Gets new items based on the input by calling
-        * {@link #getNewMenuItems getNewItems} and updates the menu
-        * after removing duplicates based on the data value.
-        *
-        * @private
-        * @method
-        */
-       CSP.updateMenuItems = function () {
-               this.getMenu().clearItems();
-               this.getNewMenuItems( this.$input.val() ).then( function ( items ) {
-                       var existingItems, filteredItems,
-                               menu = this.getMenu();
-
-                       // Never show the menu if the input lost focus in the meantime
-                       if ( !this.$input.is( ':focus' ) ) {
-                               return;
-                       }
-
-                       // Array of strings of the data of OO.ui.MenuOptionsWidgets
-                       existingItems = menu.getItems().map( function ( item ) {
-                               return item.data;
-                       } );
-
-                       // Remove if items' data already exists
-                       filteredItems = items.filter( function ( item ) {
-                               return existingItems.indexOf( item ) === -1;
-                       } );
-
-                       // Map to an array of OO.ui.MenuOptionWidgets
-                       filteredItems = filteredItems.map( function ( item ) {
-                               return new OO.ui.MenuOptionWidget( {
-                                       data: item,
-                                       label: item
-                               } );
-                       } );
-
-                       menu.addItems( filteredItems ).toggle( true );
-               }.bind( this ) );
-       };
-
-       /**
-        * @inheritdoc
-        */
-       CSP.clearInput = function () {
-               CategorySelector.parent.prototype.clearInput.call( this );
-               // Abort all pending requests, we won't need their results
-               this.api.abort();
-       };
-
-       /**
-        * Searches for categories based on the input.
-        *
-        * @private
-        * @method
-        * @param {string} input The input used to prefix search categories
-        * @return {jQuery.Promise} Resolves with an array of categories
-        */
-       CSP.getNewMenuItems = function ( input ) {
-               var i,
-                       promises = [],
-                       deferred = $.Deferred();
-
-               if ( $.trim( input ) === '' ) {
-                       deferred.resolve( [] );
-                       return deferred.promise();
-               }
-
-               // Abort all pending requests, we won't need their results
-               this.api.abort();
-               for ( i = 0; i < this.searchTypes.length; i++ ) {
-                       promises.push( this.searchCategories( input, this.searchTypes[ i ] ) );
-               }
-
-               this.pushPending();
-
-               $.when.apply( $, promises ).done( function () {
-                       var categoryNames,
-                               allData = [],
-                               dataSets = Array.prototype.slice.apply( arguments );
-
-                       // Collect values from all results
-                       allData = allData.concat.apply( allData, dataSets );
-
-                       categoryNames = allData
-                               // Remove duplicates
-                               .filter( function ( value, index, self ) {
-                                       return self.indexOf( value ) === index;
-                               } )
-                               // Get Title objects
-                               .map( function ( name ) {
-                                       return mw.Title.newFromText( name );
-                               } )
-                               // Keep only titles from 'Category' namespace
-                               .filter( function ( title ) {
-                                       return title && title.getNamespaceId() === NS_CATEGORY;
-                               } )
-                               // Convert back to strings, strip 'Category:' prefix
-                               .map( function ( title ) {
-                                       return title.getMainText();
-                               } );
-
-                       deferred.resolve( categoryNames );
-
-               } ).always( this.popPending.bind( this ) );
-
-               return deferred.promise();
-       };
-
-       /**
-        * @inheritdoc
-        */
-       CSP.createItemWidget = function ( data ) {
-               var title = mw.Title.makeTitle( NS_CATEGORY, data );
-               if ( !title ) {
-                       return null;
-               }
-               return new mw.widgets.CategoryCapsuleItemWidget( {
-                       apiUrl: this.api.apiUrl || undefined,
-                       title: title
-               } );
-       };
-
-       /**
-        * @inheritdoc
-        */
-       CSP.getItemFromData = function ( data ) {
-               // This is a bit of a hack... We have to canonicalize the data in the same way that
-               // #createItemWidget and CategoryCapsuleItemWidget will do, otherwise we won't find duplicates.
-               var title = mw.Title.makeTitle( NS_CATEGORY, data );
-               if ( !title ) {
-                       return null;
-               }
-               return OO.ui.mixin.GroupElement.prototype.getItemFromData.call( this, title.getMainText() );
-       };
-
-       /**
-        * Validates the values in `this.searchType`.
-        *
-        * @private
-        * @return {boolean}
-        */
-       CSP.validateSearchTypes = function () {
-               var validSearchTypes = false,
-                       searchTypeEnumCount = Object.keys( CategorySelector.SearchType ).length;
-
-               // Check if all values are in the SearchType enum
-               validSearchTypes = this.searchTypes.every( function ( searchType ) {
-                       return searchType > -1 && searchType < searchTypeEnumCount;
-               } );
-
-               if ( validSearchTypes === false ) {
-                       throw new Error( 'Unknown searchType in searchTypes' );
-               }
-
-               // If the searchTypes has CategorySelector.SearchType.SubCategories
-               // it can be the only search type.
-               if ( this.searchTypes.indexOf( CategorySelector.SearchType.SubCategories ) > -1 &&
-                       this.searchTypes.length > 1
-               ) {
-                       throw new Error( 'Can\'t have additional search types with CategorySelector.SearchType.SubCategories' );
-               }
-
-               // If the searchTypes has CategorySelector.SearchType.ParentCategories
-               // it can be the only search type.
-               if ( this.searchTypes.indexOf( CategorySelector.SearchType.ParentCategories ) > -1 &&
-                       this.searchTypes.length > 1
-               ) {
-                       throw new Error( 'Can\'t have additional search types with CategorySelector.SearchType.ParentCategories' );
-               }
-
-               return true;
-       };
-
-       /**
-        * Sets and validates the value of `this.searchType`.
-        *
-        * @param {mw.widgets.CategorySelector.SearchType[]} searchTypes
-        */
-       CSP.setSearchTypes = function ( searchTypes ) {
-               this.searchTypes = searchTypes;
-               this.validateSearchTypes();
-       };
-
-       /**
-        * Searches categories based on input and searchType.
-        *
-        * @private
-        * @method
-        * @param {string} input The input used to prefix search categories
-        * @param {mw.widgets.CategorySelector.SearchType} searchType
-        * @return {jQuery.Promise} Resolves with an array of categories
-        */
-       CSP.searchCategories = function ( input, searchType ) {
-               var deferred = $.Deferred(),
-                       cacheKey = input + searchType.toString();
-
-               // Check cache
-               if ( this.searchCache[ cacheKey ] !== undefined ) {
-                       return this.searchCache[ cacheKey ];
-               }
-
-               switch ( searchType ) {
-                       case CategorySelector.SearchType.OpenSearch:
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'opensearch',
-                                       namespace: NS_CATEGORY,
-                                       limit: this.limit,
-                                       search: input
-                               } ).done( function ( res ) {
-                                       var categories = res[ 1 ];
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.InternalSearch:
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       list: 'allpages',
-                                       apnamespace: NS_CATEGORY,
-                                       aplimit: this.limit,
-                                       apfrom: input,
-                                       apprefix: input
-                               } ).done( function ( res ) {
-                                       var categories = res.query.allpages.map( function ( page ) {
-                                               return page.title;
-                                       } );
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.Exists:
-                               if ( input.indexOf( '|' ) > -1 ) {
-                                       deferred.resolve( [] );
-                                       break;
-                               }
-
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       prop: 'info',
-                                       titles: 'Category:' + input
-                               } ).done( function ( res ) {
-                                       var categories = [];
-
-                                       $.each( res.query.pages, function ( index, page ) {
-                                               if ( !page.missing ) {
-                                                       categories.push( page.title );
-                                               }
-                                       } );
-
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.SubCategories:
-                               if ( input.indexOf( '|' ) > -1 ) {
-                                       deferred.resolve( [] );
-                                       break;
-                               }
-
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       list: 'categorymembers',
-                                       cmtype: 'subcat',
-                                       cmlimit: this.limit,
-                                       cmtitle: 'Category:' + input
-                               } ).done( function ( res ) {
-                                       var categories = res.query.categorymembers.map( function ( category ) {
-                                               return category.title;
-                                       } );
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.ParentCategories:
-                               if ( input.indexOf( '|' ) > -1 ) {
-                                       deferred.resolve( [] );
-                                       break;
-                               }
-
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       prop: 'categories',
-                                       cllimit: this.limit,
-                                       titles: 'Category:' + input
-                               } ).done( function ( res ) {
-                                       var categories = [];
-
-                                       $.each( res.query.pages, function ( index, page ) {
-                                               if ( !page.missing && $.isArray( page.categories ) ) {
-                                                       categories.push.apply( categories, page.categories.map( function ( category ) {
-                                                               return category.title;
-                                                       } ) );
-                                               }
-                                       } );
-
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       default:
-                               throw new Error( 'Unknown searchType' );
-               }
-
-               // Cache the result
-               this.searchCache[ cacheKey ] = deferred.promise();
-
-               return deferred.promise();
-       };
-
-       /**
-        * @enum mw.widgets.CategorySelector.SearchType
-        * Types of search available.
-        */
-       CategorySelector.SearchType = {
-               /** Search using action=opensearch */
-               OpenSearch: 0,
-
-               /** Search using action=query */
-               InternalSearch: 1,
-
-               /** Search for existing categories with the exact title */
-               Exists: 2,
-
-               /** Search only subcategories  */
-               SubCategories: 3,
-
-               /** Search only parent categories */
-               ParentCategories: 4
-       };
-
-       mw.widgets.CategorySelector = CategorySelector;
-}( jQuery, mediaWiki ) );
index f2b6f5f..8c80cb8 100644 (file)
                return mw.ForeignStructuredUpload.BookletLayout.parent.prototype.initialize.call( this ).then(
                        function () {
                                return $.when(
-                                       // Point the CategorySelector to the right wiki
+                                       // Point the CategoryMultiselectWidget to the right wiki
                                        booklet.upload.getApi().then( function ( api ) {
                                                // If this is a ForeignApi, it will have a apiUrl, otherwise we don't need to do anything
                                                if ( api.apiUrl ) {
-                                                       // Can't reuse the same object, CategorySelector calls #abort on its mw.Api instance
+                                                       // Can't reuse the same object, CategoryMultiselectWidget calls #abort on its mw.Api instance
                                                        booklet.categoriesWidget.api = new mw.ForeignApi( api.apiUrl );
                                                }
                                                return $.Deferred().resolve();
                        multiline: true,
                        autosize: true
                } );
-               this.categoriesWidget = new mw.widgets.CategorySelector( {
+               this.categoriesWidget = new mw.widgets.CategoryMultiselectWidget( {
                        // Can't be done here because we don't know the target wiki yet... done in #initialize.
                        // api: new mw.ForeignApi( ... ),
                        $overlay: this.$overlay
index 04a2a8d..f68f595 100644 (file)
  * @ingroup Testing
  */
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 class DbTestRecorder extends TestRecorder {
        public $version;
+       /** @var Database */
        private $db;
 
-       public function __construct( IDatabase $db ) {
+       public function __construct( IMaintainableDatabase $db ) {
                $this->db = $db;
        }
 
index 35c2480..f100411 100644 (file)
@@ -25,6 +25,7 @@
  * @file
  * @ingroup Testing
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
index 606a209..45791e2 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @group Database
  * @group Database
index 036baa8..3693a27 100644 (file)
@@ -66,6 +66,13 @@ class HttpTest extends MediaWikiTestCase {
         * @covers Http::getProxy
         */
        public function testGetProxy() {
+               $this->setMwGlobals( 'wgHTTPProxy', false );
+               $this->assertEquals(
+                       '',
+                       Http::getProxy(),
+                       'default setting'
+               );
+
                $this->setMwGlobals( 'wgHTTPProxy', 'proxy.domain.tld' );
                $this->assertEquals(
                        'proxy.domain.tld',
@@ -140,50 +147,56 @@ class HttpTest extends MediaWikiTestCase {
                ];
        }
 
+       public static function provideRelativeRedirects() {
+               return [
+                       [
+                               'location' => [ 'http://newsite/file.ext', '/newfile.ext' ],
+                               'final' => 'http://newsite/newfile.ext',
+                               'Relative file path Location: interpreted as full URL'
+                       ],
+                       [
+                               'location' => [ 'https://oldsite/file.ext' ],
+                               'final' => 'https://oldsite/file.ext',
+                               'Location to the HTTPS version of the site'
+                       ],
+                       [
+                               'location' => [
+                                       '/anotherfile.ext',
+                                       'http://anotherfile/hoster.ext',
+                                       'https://anotherfile/hoster.ext'
+                               ],
+                               'final' => 'https://anotherfile/hoster.ext',
+                               'Relative file path Location: should keep the latest host and scheme!'
+                       ],
+                       [
+                               'location' => [ '/anotherfile.ext' ],
+                               'final' => 'http://oldsite/anotherfile.ext',
+                               'Relative Location without domain '
+                       ],
+                       [
+                               'location' => null,
+                               'final' => 'http://oldsite/file.ext',
+                               'No Location (no redirect) '
+                       ],
+               ];
+       }
+
        /**
         * Warning:
         *
         * These tests are for code that makes use of an artifact of how CURL
         * handles header reporting on redirect pages, and will need to be
-        * rewritten when T31232 is taken care of (high-level handling of
-        * HTTP redirects).
+        * rewritten when T31232 is taken care of (high-level handling of HTTP redirects).
+        *
+        * @dataProvider provideRelativeRedirects
+        * @covers MWHttpRequest::getFinalUrl
         */
-       public function testRelativeRedirections() {
+       public function testRelativeRedirections( $location, $final, $message = null ) {
                $h = MWHttpRequestTester::factory( 'http://oldsite/file.ext', [], __METHOD__ );
-
-               # Forge a Location header
-               $h->setRespHeaders( 'location', [
-                               'http://newsite/file.ext',
-                               '/newfile.ext',
-                       ]
-               );
-               # Verify we correctly fix the Location
-               $this->assertEquals(
-                       'http://newsite/newfile.ext',
-                       $h->getFinalUrl(),
-                       "Relative file path Location: interpreted as full URL"
-               );
-
-               $h->setRespHeaders( 'location', [
-                               'https://oldsite/file.ext'
-                       ]
-               );
-               $this->assertEquals(
-                       'https://oldsite/file.ext',
-                       $h->getFinalUrl(),
-                       "Location to the HTTPS version of the site"
-               );
-
-               $h->setRespHeaders( 'location', [
-                               '/anotherfile.ext',
-                               'http://anotherfile/hoster.ext',
-                               'https://anotherfile/hoster.ext'
-                       ]
-               );
-               $this->assertEquals(
-                       'https://anotherfile/hoster.ext',
-                       $h->getFinalUrl( "Relative file path Location: should keep the latest host and scheme!" )
-               );
+               // Forge a Location header
+               $h->setRespHeaders( 'location', $location );
+               // Verify it correctly fixes the Location
+               $this->assertEquals( $final, $h->getFinalUrl(), $message );
        }
 
        /**
@@ -201,8 +214,6 @@ class HttpTest extends MediaWikiTestCase {
         * Extension API: 20140829
         *
         * Commented out constants that were removed in PHP 5.6.0
-        *
-        * @covers CurlHttpRequest::execute
         */
        public function provideCurlConstants() {
                return [
@@ -481,9 +492,8 @@ class HttpTest extends MediaWikiTestCase {
 
        /**
         * Added this test based on an issue experienced with HHVM 3.3.0-dev
-        * where it did not define a cURL constant.
+        * where it did not define a cURL constant. T72570
         *
-        * T72570
         * @dataProvider provideCurlConstants
         */
        public function testCurlConstants( $value ) {
index 4048ffe..5cab8e2 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
 
index c292e97..e10a97f 100644 (file)
@@ -173,7 +173,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                $user = $this->getTestUser()->getUser();
                $this->assertConditions(
                        [ # expected
-                               "rc_user != '{$user->getId()}'",
+                               "rc_user_text != '{$user->getName()}'",
                        ],
                        [
                                'hidemyself' => 1,
@@ -199,7 +199,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                $user = $this->getTestUser()->getUser();
                $this->assertConditions(
                        [ # expected
-                               "rc_user = '{$user->getId()}'",
+                               "rc_user_text = '{$user->getName()}'",
                        ],
                        [
                                'hidebyothers' => 1,
@@ -225,8 +225,8 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                $user = $this->getTestUser()->getUser();
                $this->assertConditions(
                        [ # expected
-                               "rc_user != '{$user->getId()}'",
-                               "rc_user = '{$user->getId()}'",
+                               "rc_user_text != '{$user->getName()}'",
+                               "rc_user_text = '{$user->getName()}'",
                        ],
                        [
                                'hidemyself' => 1,