Merge "Optimized SqlBagOStuff::getBatch() a bit."
authorBrion VIBBER <brion@wikimedia.org>
Tue, 8 May 2012 20:30:55 +0000 (20:30 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 8 May 2012 20:30:55 +0000 (20:30 +0000)
367 files changed:
CREDITS
INSTALL
RELEASE-NOTES-1.20
api.php
includes/Article.php
includes/AutoLoader.php
includes/Block.php
includes/DefaultSettings.php
includes/EditPage.php
includes/Exception.php
includes/Export.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HttpFunctions.php
includes/ImagePage.php
includes/Linker.php
includes/Namespace.php
includes/PHPVersionError.php
includes/PageQueryPage.php
includes/QueryPage.php
includes/Title.php
includes/User.php
includes/UserMailer.php
includes/WikiPage.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiFeedContributions.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiImport.php
includes/api/ApiMain.php
includes/api/ApiOptions.php [new file with mode: 0644]
includes/api/ApiParse.php
includes/api/ApiProtect.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/cache/CacheDependency.php
includes/cache/FileCacheBase.php
includes/cache/GenderCache.php
includes/cache/HTMLCacheUpdate.php
includes/cache/HTMLFileCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/MemcachedSessions.php
includes/cache/MessageCache.php
includes/cache/ObjectFileCache.php
includes/cache/ResourceFileCache.php
includes/cache/SquidUpdate.php
includes/db/Database.php
includes/diff/DifferenceEngine.php
includes/filerepo/FSRepo.php
includes/filerepo/FileRepo.php
includes/filerepo/FileRepoStatus.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/NullRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/backend/FSFile.php
includes/filerepo/backend/FSFileBackend.php
includes/filerepo/backend/FileBackend.php
includes/filerepo/backend/FileBackendGroup.php
includes/filerepo/backend/FileBackendMultiWrite.php
includes/filerepo/backend/FileBackendStore.php
includes/filerepo/backend/FileOp.php
includes/filerepo/backend/SwiftFileBackend.php
includes/filerepo/backend/TempFSFile.php
includes/filerepo/backend/filejournal/DBFileJournal.php
includes/filerepo/backend/filejournal/FileJournal.php
includes/filerepo/backend/lockmanager/DBLockManager.php
includes/filerepo/backend/lockmanager/FSLockManager.php
includes/filerepo/backend/lockmanager/LSLockManager.php
includes/filerepo/backend/lockmanager/LockManager.php
includes/filerepo/backend/lockmanager/LockManagerGroup.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/filerepo/file/UnregisteredLocalFile.php
includes/installer/CliInstaller.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Ibm_db2Installer.php
includes/installer/Ibm_db2Updater.php
includes/installer/InstallDocFormatter.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleInstaller.php
includes/installer/OracleUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/interwiki/Interwiki.php
includes/job/DoubleRedirectJob.php
includes/job/EmaillingJob.php
includes/job/EnotifNotifyJob.php
includes/job/JobQueue.php
includes/job/RefreshLinksJob.php
includes/job/UploadFromUrlJob.php
includes/json/FormatJson.php
includes/libs/CSSJanus.php
includes/libs/CSSMin.php
includes/libs/HttpStatus.php
includes/libs/IEContentAnalyzer.php
includes/libs/IEUrlExtension.php
includes/libs/JavaScriptMinifier.php
includes/libs/jsminplus.php
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/PatrolLog.php
includes/media/BMP.php
includes/media/Bitmap.php
includes/media/BitmapMetadataHandler.php
includes/media/Bitmap_ClientOnly.php
includes/media/DjVu.php
includes/media/DjVuImage.php
includes/media/Exif.php
includes/media/ExifBitmap.php
includes/media/FormatMetadata.php
includes/media/GIF.php
includes/media/GIFMetadataExtractor.php
includes/media/Generic.php
includes/media/IPTC.php
includes/media/Jpeg.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaTransformOutput.php
includes/media/PNG.php
includes/media/PNGMetadataExtractor.php
includes/media/SVG.php
includes/media/SVGMetadataExtractor.php
includes/media/Tiff.php
includes/media/XCF.php
includes/media/XMP.php
includes/media/XMPInfo.php
includes/media/XMPValidate.php
includes/objectcache/APCBagOStuff.php
includes/objectcache/DBABagOStuff.php
includes/objectcache/EhcacheBagOStuff.php
includes/objectcache/EmptyBagOStuff.php
includes/objectcache/HashBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MemcachedPhpBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/SqlBagOStuff.php
includes/objectcache/WinCacheBagOStuff.php
includes/objectcache/XCacheBagOStuff.php
includes/parser/CoreLinkFunctions.php
includes/parser/CoreParserFunctions.php
includes/parser/CoreTagHooks.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Parser_DiffTest.php
includes/parser/Parser_LinkHooks.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/Preprocessor_HipHop.hphp
includes/parser/StripState.php
includes/parser/Tidy.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimple.php
includes/profiler/ProfilerSimpleTrace.php
includes/profiler/ProfilerSimpleUDP.php
includes/profiler/ProfilerStub.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderFilePageModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderNoscriptModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialContributions.php
includes/specials/SpecialLog.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialWatchlist.php
includes/templates/NoLocalSettings.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/tidy.conf
includes/upload/UploadBase.php
index.php
languages/Names.php
languages/messages/MessagesAr.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAz.php
languages/messages/MessagesBa.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesCs.php
languages/messages/MessagesCu.php
languages/messages/MessagesCv.php
languages/messages/MessagesCy.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesGl.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesLb.php
languages/messages/MessagesLt.php
languages/messages/MessagesLus.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMwl.php
languages/messages/MessagesNan.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOr.php
languages/messages/MessagesPa.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesSa.php
languages/messages/MessagesSat.php [new file with mode: 0644]
languages/messages/MessagesScn.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesStq.php
languages/messages/MessagesSv.php
languages/messages/MessagesTh.php
languages/messages/MessagesTly.php
languages/messages/MessagesTr.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVi.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
load.php
maintenance/Maintenance.php
maintenance/archives/patch-ipb-parent-block-id-index.sql [new file with mode: 0644]
maintenance/archives/patch-ipb-parent-block-id.sql [new file with mode: 0644]
maintenance/backupTextPass.inc
maintenance/cleanupImages.php
maintenance/dumpBackup.php
maintenance/dumpTextPass.php
maintenance/ibm_db2/tables.sql
maintenance/install.php
maintenance/language/messages.inc
maintenance/mssql/tables.sql
maintenance/oracle/tables.sql
maintenance/postgres/tables.sql
maintenance/tables.sql
maintenance/update.php
resources/jquery/jquery.suggestions.js
skins/Vector.php
skins/vector/screen-hd.css
skins/vector/screen.css
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/bootstrap.php
tests/phpunit/includes/CdbTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/RevisionStorageTest.php [new file with mode: 0644]
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/WikiPageTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiOptionsTest.php [new file with mode: 0644]
tests/phpunit/includes/filerepo/FileBackendTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/backupPrefetchTest.php [new file with mode: 0644]
tests/phpunit/maintenance/backupTextPassTest.php [new file with mode: 0644]
tests/phpunit/maintenance/backup_LogTest.php [new file with mode: 0644]
tests/phpunit/maintenance/backup_PageTest.php [new file with mode: 0644]
tests/phpunit/maintenance/fetchTextTest.php [new file with mode: 0644]
tests/phpunit/maintenance/getSlaveServerTest.php [new file with mode: 0644]
tests/phpunit/phpunit.php
tests/selenium/SeleniumConfig.php

diff --git a/CREDITS b/CREDITS
index bac7391..5b876f1 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -135,6 +135,7 @@ following names for their contribution to the product.
 * Manuel Menal
 * Marcin Cieślak
 * Marcus Buck
+* Mark A. Pelletier
 * Marooned
 * Mathias Ertl
 * Matthew Britton
diff --git a/INSTALL b/INSTALL
index 3a2860f..c4bb8be 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -6,7 +6,7 @@ Starting with MediaWiki 1.2.0, it's possible to install and configure the wiki
 "in-place", as long as you have the necessary prerequisites available.
 
 Required software:
-* Web server with PHP 5.2.3 or higher.
+* Web server with PHP 5.3.2 or higher.
 * A SQL server, the following types are supported
 ** MySQL 5.0.2 or higher
 ** PostgreSQL 8.3 or higher
index bd8f775..78c7c95 100644 (file)
@@ -10,7 +10,13 @@ THIS IS NOT A RELEASE YET
 MediaWiki 1.20 is an alpha-quality branch and is not recommended for use in
 production.
 
+=== PHP 5.3 now required ===
+Since 1.20, the lowest supported version of PHP is now 5.3.2. Please
+upgrade PHP if you have not done so prior to upgrading MediaWiki.
+
 === Configuration changes in 1.20 ===
+* $wgGitRepositoryViewers defines a mapping from Git remote repository to the
+  Gitweb instance URL used in Special:Version
 * `$wgUsePathInfo = true;` is no longer needed to make $wgArticlePath work on servers
   using like nginx, lighttpd, and apache over fastcgi. MediaWiki now always extracts
   path info from REQUEST_URI if it's available.
@@ -46,6 +52,10 @@ production.
   Special:Version
 * Edit notices can now be translated.
 * (bug 22887) Add warning and tracking category for preprocessor errors
+* (bug 31704) Allow selection of associated namespace on the watchlist
+* (bug 5445) Now remove autoblocks when a user is unblocked.
+* Added $wgLogExceptionBacktrace, on by default, to allow logging of exception
+  backtraces.
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
@@ -91,6 +101,8 @@ production.
 * (bug 35572) Blocks appear to succeed even if query fails due to wrong DB structure
 * (bug 31757) Add a word-separator between help-messages in HTMLForm
 * (bug 30410) Removed deprecated $wgFilterCallback and the 'filtered' API error.
+* (bug 32604) Some messages needs escaping of wikitext inside username
+* (bug 36537) Rename wfArrayToCGI to wfArrayToCgi for consistency with wfCgiToArray.
 
 === API changes in 1.20 ===
 * (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
@@ -101,6 +113,11 @@ production.
 * (bug 32492) API now allows editing using pageid
 * (bug 32497) API now allows changing of protection level using pageid
 * (bug 32498) API now allows comparing pages using pageids
+* (bug 30975) API import of pages with invalid characters in this wiki leads to Fatal Error
+* (bug 30488) API now allows listing of backlinks/embeddedin/imageusage per pageid
+* (bug 34927) Output media_type for list=filearchive
+* (bug 28814) add properties to output of action=parse
+* (bug 33224) add variants of content language to meta=siteinfo
 
 === Languages updated in 1.20 ===
 
@@ -108,9 +125,10 @@ MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Bugzilla reports.
 
+* Mizo (lus) added.
+* Santali (sat) added.
 * (bug 34192) Namespace gender aliases for Albanian languages (sq & aln).
 * (bug 35541) Namespace gender aliases for Croatian (hr).
-* Mizo (lus) added.
 * (bug 36012) Space in $separatorTransformTable should be non-breaking in
   Portuguese, Esperanto and Udmurt.
 
@@ -124,7 +142,7 @@ changes to languages because of Bugzilla reports.
 
 == Compatibility ==
 
-MediaWiki 1.20 requires PHP 5.2.3. PHP 4 is no longer supported.
+MediaWiki 1.20 requires PHP 5.3.2. PHP 4 is no longer supported.
 
 MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
 support for them is somewhat less mature. There is experimental support for IBM
diff --git a/api.php b/api.php
index 889c5f1..3691ac6 100644 (file)
--- a/api.php
+++ b/api.php
@@ -38,7 +38,7 @@
 define( 'MW_API', true );
 
 // Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
        require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
        wfPHPVersionError( 'api.php' );
 }
index 393f770..6a3e41c 100644 (file)
@@ -191,8 +191,6 @@ class Article extends Page {
         * @return string Return the text of this revision
         */
        public function getContent() {
-               global $wgUser;
-
                wfProfileIn( __METHOD__ );
 
                if ( $this->mPage->getID() === 0 ) {
@@ -204,7 +202,7 @@ class Article extends Page {
                                        $text = '';
                                }
                        } else {
-                               $text = wfMsgExt( $wgUser->isLoggedIn() ? 'noarticletext' : 'noarticletextanon', 'parsemag' );
+                               $text = wfMsgExt( $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon', 'parsemag' );
                        }
                        wfProfileOut( __METHOD__ );
 
@@ -235,11 +233,10 @@ class Article extends Page {
         * @return int The old id for the request
         */
        public function getOldIDFromRequest() {
-               global $wgRequest;
-
                $this->mRedirectUrl = false;
 
-               $oldid = $wgRequest->getIntOrNull( 'oldid' );
+               $request = $this->getContext()->getRequest();
+               $oldid = $request->getIntOrNull( 'oldid' );
 
                if ( $oldid === null ) {
                        return 0;
@@ -262,7 +259,7 @@ class Article extends Page {
                        }
                }
 
-               if ( $wgRequest->getVal( 'direction' ) == 'next' ) {
+               if ( $request->getVal( 'direction' ) == 'next' ) {
                        $nextid = $this->getTitle()->getNextRevisionID( $oldid );
                        if ( $nextid ) {
                                $oldid = $nextid;
@@ -270,7 +267,7 @@ class Article extends Page {
                        } else {
                                $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
                        }
-               } elseif ( $wgRequest->getVal( 'direction' ) == 'prev' ) {
+               } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
                        $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
                        if ( $previd ) {
                                $oldid = $previd;
@@ -404,8 +401,7 @@ class Article extends Page {
         * page of the given title.
         */
        public function view() {
-               global $wgUser, $wgOut, $wgRequest, $wgParser;
-               global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
+               global $wgParser, $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
 
                wfProfileIn( __METHOD__ );
 
@@ -415,17 +411,19 @@ class Article extends Page {
                # the first call of this method even if $oldid is used way below.
                $oldid = $this->getOldID();
 
+               $user = $this->getContext()->getUser();
                # Another whitelist check in case getOldID() is altering the title
-               $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $wgUser );
+               $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $user );
                if ( count( $permErrors ) ) {
                        wfDebug( __METHOD__ . ": denied on secondary read check\n" );
                        wfProfileOut( __METHOD__ );
                        throw new PermissionsError( 'read', $permErrors );
                }
 
+               $outputPage = $this->getContext()->getOutput();
                # getOldID() may as well want us to redirect somewhere else
                if ( $this->mRedirectUrl ) {
-                       $wgOut->redirect( $this->mRedirectUrl );
+                       $outputPage->redirect( $this->mRedirectUrl );
                        wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
                        wfProfileOut( __METHOD__ );
 
@@ -433,7 +431,7 @@ class Article extends Page {
                }
 
                # If we got diff in the query, we want to see a diff page instead of the article.
-               if ( $wgRequest->getCheck( 'diff' ) ) {
+               if ( $this->getContext()->getRequest()->getCheck( 'diff' ) ) {
                        wfDebug( __METHOD__ . ": showing diff page\n" );
                        $this->showDiffPage();
                        wfProfileOut( __METHOD__ );
@@ -442,17 +440,17 @@ class Article extends Page {
                }
 
                # Set page title (may be overridden by DISPLAYTITLE)
-               $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
+               $outputPage->setPageTitle( $this->getTitle()->getPrefixedText() );
 
-               $wgOut->setArticleFlag( true );
+               $outputPage->setArticleFlag( true );
                # Allow frames by default
-               $wgOut->allowClickjacking();
+               $outputPage->allowClickjacking();
 
                $parserCache = ParserCache::singleton();
 
                $parserOptions = $this->getParserOptions();
                # Render printable version, use printable version cache
-               if ( $wgOut->isPrintable() ) {
+               if ( $outputPage->isPrintable() ) {
                        $parserOptions->setIsPrintable( true );
                        $parserOptions->setEditSection( false );
                } elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit' ) ) {
@@ -462,11 +460,11 @@ class Article extends Page {
                # Try client and file cache
                if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
                        if ( $wgUseETag ) {
-                               $wgOut->setETag( $parserCache->getETag( $this, $parserOptions ) );
+                               $outputPage->setETag( $parserCache->getETag( $this, $parserOptions ) );
                        }
 
                        # Is it client cached?
-                       if ( $wgOut->checkLastModified( $this->mPage->getTouched() ) ) {
+                       if ( $outputPage->checkLastModified( $this->mPage->getTouched() ) ) {
                                wfDebug( __METHOD__ . ": done 304\n" );
                                wfProfileOut( __METHOD__ );
 
@@ -475,8 +473,8 @@ class Article extends Page {
                        } elseif ( $wgUseFileCache && $this->tryFileCache() ) {
                                wfDebug( __METHOD__ . ": done file cache\n" );
                                # tell wgOut that output is taken care of
-                               $wgOut->disable();
-                               $this->mPage->doViewUpdates( $wgUser );
+                               $outputPage->disable();
+                               $this->mPage->doViewUpdates( $user );
                                wfProfileOut( __METHOD__ );
 
                                return;
@@ -486,7 +484,7 @@ class Article extends Page {
                # Should the parser cache be used?
                $useParserCache = $this->mPage->isParserCacheUsed( $parserOptions, $oldid );
                wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
-               if ( $wgUser->getStubThreshold() ) {
+               if ( $user->getStubThreshold() ) {
                        wfIncrStats( 'pcache_miss_stub' );
                }
 
@@ -524,14 +522,14 @@ class Article extends Page {
                                                        } else {
                                                                wfDebug( __METHOD__ . ": showing parser cache contents\n" );
                                                        }
-                                                       $wgOut->addParserOutput( $this->mParserOutput );
+                                                       $outputPage->addParserOutput( $this->mParserOutput );
                                                        # Ensure that UI elements requiring revision ID have
                                                        # the correct version information.
-                                                       $wgOut->setRevisionId( $this->mPage->getLatest() );
+                                                       $outputPage->setRevisionId( $this->mPage->getLatest() );
                                                        # Preload timestamp to avoid a DB hit
                                                        $cachedTimestamp = $this->mParserOutput->getTimestamp();
                                                        if ( $cachedTimestamp !== null ) {
-                                                               $wgOut->setRevisionTimestamp( $cachedTimestamp );
+                                                               $outputPage->setRevisionTimestamp( $cachedTimestamp );
                                                                $this->mPage->setTimestamp( $cachedTimestamp );
                                                        }
                                                        $outputDone = true;
@@ -555,16 +553,16 @@ class Article extends Page {
 
                                        # Ensure that UI elements requiring revision ID have
                                        # the correct version information.
-                                       $wgOut->setRevisionId( $this->getRevIdFetched() );
+                                       $outputPage->setRevisionId( $this->getRevIdFetched() );
                                        # Preload timestamp to avoid a DB hit
-                                       $wgOut->setRevisionTimestamp( $this->getTimestamp() );
+                                       $outputPage->setRevisionTimestamp( $this->getTimestamp() );
 
                                        # Pages containing custom CSS or JavaScript get special treatment
                                        if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
                                                wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
                                                $this->showCssOrJsPage();
                                                $outputDone = true;
-                                       } elseif( !wfRunHooks( 'ArticleViewCustom', array( $this->mContent, $this->getTitle(), $wgOut ) ) ) {
+                                       } elseif( !wfRunHooks( 'ArticleViewCustom', array( $this->mContent, $this->getTitle(), $outputPage ) ) ) {
                                                # Allow extensions do their own custom view for certain pages
                                                $outputDone = true;
                                        } else {
@@ -573,10 +571,10 @@ class Article extends Page {
                                                if ( $rt ) {
                                                        wfDebug( __METHOD__ . ": showing redirect=no page\n" );
                                                        # Viewing a redirect page (e.g. with parameter redirect=no)
-                                                       $wgOut->addHTML( $this->viewRedirect( $rt ) );
+                                                       $outputPage->addHTML( $this->viewRedirect( $rt ) );
                                                        # Parse just to get categories, displaytitle, etc.
                                                        $this->mParserOutput = $wgParser->parse( $text, $this->getTitle(), $parserOptions );
-                                                       $wgOut->addParserOutputNoText( $this->mParserOutput );
+                                                       $outputPage->addParserOutputNoText( $this->mParserOutput );
                                                        $outputDone = true;
                                                }
                                        }
@@ -591,12 +589,12 @@ class Article extends Page {
                                        if ( !$poolArticleView->execute() ) {
                                                $error = $poolArticleView->getError();
                                                if ( $error ) {
-                                                       $wgOut->clearHTML(); // for release() errors
-                                                       $wgOut->enableClientCache( false );
-                                                       $wgOut->setRobotPolicy( 'noindex,nofollow' );
+                                                       $outputPage->clearHTML(); // for release() errors
+                                                       $outputPage->enableClientCache( false );
+                                                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
 
                                                        $errortext = $error->getWikiText( false, 'view-pool-error' );
-                                                       $wgOut->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
+                                                       $outputPage->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
                                                }
                                                # Connection or timeout error
                                                wfProfileOut( __METHOD__ );
@@ -604,12 +602,12 @@ class Article extends Page {
                                        }
 
                                        $this->mParserOutput = $poolArticleView->getParserOutput();
-                                       $wgOut->addParserOutput( $this->mParserOutput );
+                                       $outputPage->addParserOutput( $this->mParserOutput );
 
                                        # Don't cache a dirty ParserOutput object
                                        if ( $poolArticleView->getIsDirty() ) {
-                                               $wgOut->setSquidMaxage( 0 );
-                                               $wgOut->addHTML( "<!-- parser cache is expired, sending anyway due to pool overload-->\n" );
+                                               $outputPage->setSquidMaxage( 0 );
+                                               $outputPage->addHTML( "<!-- parser cache is expired, sending anyway due to pool overload-->\n" );
                                        }
 
                                        $outputDone = true;
@@ -638,17 +636,17 @@ class Article extends Page {
                if ( $this->getTitle()->isMainPage() ) {
                        $msg = wfMessage( 'pagetitle-view-mainpage' )->inContentLanguage();
                        if ( !$msg->isDisabled() ) {
-                               $wgOut->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
+                               $outputPage->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
                        }
                }
 
                # Check for any __NOINDEX__ tags on the page using $pOutput
                $policy = $this->getRobotPolicy( 'view', $pOutput );
-               $wgOut->setIndexPolicy( $policy['index'] );
-               $wgOut->setFollowPolicy( $policy['follow'] );
+               $outputPage->setIndexPolicy( $policy['index'] );
+               $outputPage->setFollowPolicy( $policy['follow'] );
 
                $this->showViewFooter();
-               $this->mPage->doViewUpdates( $wgUser );
+               $this->mPage->doViewUpdates( $user );
 
                wfProfileOut( __METHOD__ );
        }
@@ -658,11 +656,10 @@ class Article extends Page {
         * @param $pOutput ParserOutput
         */
        public function adjustDisplayTitle( ParserOutput $pOutput ) {
-               global $wgOut;
                # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
                $titleText = $pOutput->getTitleText();
                if ( strval( $titleText ) !== '' ) {
-                       $wgOut->setPageTitle( $titleText );
+                       $this->getContext()->getOutput()->setPageTitle( $titleText );
                }
        }
 
@@ -671,13 +668,13 @@ class Article extends Page {
         * Article::view() only, other callers should use the DifferenceEngine class.
         */
        public function showDiffPage() {
-               global $wgRequest, $wgUser;
-
-               $diff = $wgRequest->getVal( 'diff' );
-               $rcid = $wgRequest->getVal( 'rcid' );
-               $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
-               $purge = $wgRequest->getVal( 'action' ) == 'purge';
-               $unhide = $wgRequest->getInt( 'unhide' ) == 1;
+               $request = $this->getContext()->getRequest();
+               $user = $this->getContext()->getUser();
+               $diff = $request->getVal( 'diff' );
+               $rcid = $request->getVal( 'rcid' );
+               $diffOnly = $request->getBool( 'diffonly', $user->getOption( 'diffonly' ) );
+               $purge = $request->getVal( 'action' ) == 'purge';
+               $unhide = $request->getInt( 'unhide' ) == 1;
                $oldid = $this->getOldID();
 
                $de = new DifferenceEngine( $this->getContext(), $oldid, $diff, $rcid, $purge, $unhide );
@@ -687,7 +684,7 @@ class Article extends Page {
 
                if ( $diff == 0 || $diff == $this->mPage->getLatest() ) {
                        # Run view updates for current revision only
-                       $this->mPage->doViewUpdates( $wgUser );
+                       $this->mPage->doViewUpdates( $user );
                }
        }
 
@@ -699,22 +696,21 @@ class Article extends Page {
         * page views.
         */
        protected function showCssOrJsPage() {
-               global $wgOut;
-
                $dir = $this->getContext()->getLanguage()->getDir();
                $lang = $this->getContext()->getLanguage()->getCode();
 
-               $wgOut->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
+               $outputPage = $this->getContext()->getOutput();
+               $outputPage->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
                        'clearyourcache' );
 
                // Give hooks a chance to customise the output
-               if ( wfRunHooks( 'ShowRawCssJs', array( $this->mContent, $this->getTitle(), $wgOut ) ) ) {
+               if ( wfRunHooks( 'ShowRawCssJs', array( $this->mContent, $this->getTitle(), $outputPage ) ) ) {
                        // Wrap the whole lot in a <pre> and don't parse
                        $m = array();
                        preg_match( '!\.(css|js)$!u', $this->getTitle()->getText(), $m );
-                       $wgOut->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
-                       $wgOut->addHTML( htmlspecialchars( $this->mContent ) );
-                       $wgOut->addHTML( "\n</pre>\n" );
+                       $outputPage->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
+                       $outputPage->addHTML( htmlspecialchars( $this->mContent ) );
+                       $outputPage->addHTML( "\n</pre>\n" );
                }
        }
 
@@ -726,8 +722,7 @@ class Article extends Page {
         * TODO: actions other than 'view'
         */
        public function getRobotPolicy( $action, $pOutput ) {
-               global $wgOut, $wgArticleRobotPolicies, $wgNamespaceRobotPolicies;
-               global $wgDefaultRobotPolicy, $wgRequest;
+               global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
 
                $ns = $this->getTitle()->getNamespace();
 
@@ -749,13 +744,13 @@ class Article extends Page {
                                'index'  => 'noindex',
                                'follow' => 'nofollow'
                        );
-               } elseif ( $wgOut->isPrintable() ) {
+               } elseif ( $this->getContext()->getOutput()->isPrintable() ) {
                        # Discourage indexing of printable versions, but encourage following
                        return array(
                                'index'  => 'noindex',
                                'follow' => 'follow'
                        );
-               } elseif ( $wgRequest->getInt( 'curid' ) ) {
+               } elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
                        # For ?curid=x urls, disallow indexing
                        return array(
                                'index'  => 'noindex',
@@ -824,15 +819,16 @@ class Article extends Page {
 
        /**
         * If this request is a redirect view, send "redirected from" subtitle to
-        * $wgOut. Returns true if the header was needed, false if this is not a
-        * redirect view. Handles both local and remote redirects.
+        * the output. Returns true if the header was needed, false if this is not
+        * redirect view. Handles both local and remote redirects.
         *
         * @return boolean
         */
        public function showRedirectedFromHeader() {
-               global $wgOut, $wgRequest, $wgRedirectSources;
+               global $wgRedirectSources;
+               $outputPage = $this->getContext()->getOutput();
 
-               $rdfrom = $wgRequest->getVal( 'rdfrom' );
+               $rdfrom = $this->getContext()->getRequest()->getVal( 'rdfrom' );
 
                if ( isset( $this->mRedirectedFrom ) ) {
                        // This is an internally redirected page view.
@@ -845,21 +841,21 @@ class Article extends Page {
                                        array( 'redirect' => 'no' )
                                );
 
-                               $wgOut->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
 
                                // Set the fragment if one was specified in the redirect
                                if ( strval( $this->getTitle()->getFragment() ) != '' ) {
                                        $fragment = Xml::escapeJsString( $this->getTitle()->getFragmentForURL() );
-                                       $wgOut->addInlineScript( "redirectToFragment(\"$fragment\");" );
+                                       $outputPage->addInlineScript( "redirectToFragment(\"$fragment\");" );
                                }
 
                                // Add a <link rel="canonical"> tag
-                               $wgOut->addLink( array( 'rel' => 'canonical',
+                               $outputPage->addLink( array( 'rel' => 'canonical',
                                        'href' => $this->getTitle()->getLocalURL() )
                                );
 
-                               // Tell $wgOut the user arrived at this article through a redirect
-                               $wgOut->setRedirectedFrom( $this->mRedirectedFrom );
+                               // Tell the output object that the user arrived at this article through a redirect
+                               $outputPage->setRedirectedFrom( $this->mRedirectedFrom );
 
                                return true;
                        }
@@ -868,7 +864,7 @@ class Article extends Page {
                        // If it was reported from a trusted site, supply a backlink.
                        if ( $wgRedirectSources && preg_match( $wgRedirectSources, $rdfrom ) ) {
                                $redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
-                               $wgOut->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
 
                                return true;
                        }
@@ -882,11 +878,9 @@ class Article extends Page {
         * [[MediaWiki:Talkpagetext]]. For Article::view().
         */
        public function showNamespaceHeader() {
-               global $wgOut;
-
                if ( $this->getTitle()->isTalkPage() ) {
                        if ( !wfMessage( 'talkpageheader' )->isDisabled() ) {
-                               $wgOut->wrapWikiMsg( "<div class=\"mw-talkpageheader\">\n$1\n</div>", array( 'talkpageheader' ) );
+                               $this->getContext()->getOutput()->wrapWikiMsg( "<div class=\"mw-talkpageheader\">\n$1\n</div>", array( 'talkpageheader' ) );
                        }
                }
        }
@@ -895,11 +889,9 @@ class Article extends Page {
         * Show the footer section of an ordinary page view
         */
        public function showViewFooter() {
-               global $wgOut;
-
                # check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
                if ( $this->getTitle()->getNamespace() == NS_USER_TALK && IP::isValid( $this->getTitle()->getText() ) ) {
-                       $wgOut->addWikiMsg( 'anontalkpagetext' );
+                       $this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
                }
 
                # If we have been passed an &rcid= parameter, we want to give the user a
@@ -916,18 +908,19 @@ class Article extends Page {
         * desired, does nothing.
         */
        public function showPatrolFooter() {
-               global $wgOut, $wgRequest, $wgUser;
-
-               $rcid = $wgRequest->getVal( 'rcid' );
+               $request = $this->getContext()->getRequest();
+               $outputPage = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
+               $rcid = $request->getVal( 'rcid' );
 
                if ( !$rcid || !$this->getTitle()->quickUserCan( 'patrol' ) ) {
                        return;
                }
 
-               $token = $wgUser->getEditToken( $rcid );
-               $wgOut->preventClickjacking();
+               $token = $user->getEditToken( $rcid );
+               $outputPage->preventClickjacking();
 
-               $wgOut->addHTML(
+               $outputPage->addHTML(
                        "<div class='patrollink'>" .
                                wfMsgHtml(
                                        'markaspatrolledlink',
@@ -952,7 +945,8 @@ class Article extends Page {
         * namespace, show the default message text. To be called from Article::view().
         */
        public function showMissingArticle() {
-               global $wgOut, $wgRequest, $wgUser, $wgSend404Code;
+               global $wgSend404Code;
+               $outputPage = $this->getContext()->getOutput();
 
                # Show info in user (talk) namespace. Does the user exist? Is he blocked?
                if ( $this->getTitle()->getNamespace() == NS_USER || $this->getTitle()->getNamespace() == NS_USER_TALK ) {
@@ -962,11 +956,11 @@ class Article extends Page {
                        $ip = User::isIP( $rootPart );
 
                        if ( !($user && $user->isLoggedIn()) && !$ip ) { # User does not exist
-                               $wgOut->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
+                               $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
                                        array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
                        } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
                                LogEventsList::showLogExtract(
-                                       $wgOut,
+                                       $outputPage,
                                        'block',
                                        $user->getUserPage()->getPrefixedText(),
                                        '',
@@ -985,7 +979,7 @@ class Article extends Page {
                wfRunHooks( 'ShowMissingArticle', array( $this ) );
 
                # Show delete and move logs
-               LogEventsList::showLogExtract( $wgOut, array( 'delete', 'move' ), $this->getTitle()->getPrefixedText(), '',
+               LogEventsList::showLogExtract( $outputPage, array( 'delete', 'move' ), $this->getTitle()->getPrefixedText(), '',
                        array(  'lim' => 10,
                                'conds' => array( "log_action != 'revision'" ),
                                'showIfEmpty' => false,
@@ -995,7 +989,7 @@ class Article extends Page {
                if ( !$this->mPage->hasViewableContent() && $wgSend404Code ) {
                        // If there's no backing content, send a 404 Not Found
                        // for better machine handling of broken links.
-                       $wgRequest->response()->header( "HTTP/1.1 404 Not Found" );
+                       $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
                }
 
                $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
@@ -1014,8 +1008,8 @@ class Article extends Page {
                        // Use the default message text
                        $text = $this->getTitle()->getDefaultMessageText();
                } else {
-                       $createErrors = $this->getTitle()->getUserPermissionsErrors( 'create', $wgUser );
-                       $editErrors = $this->getTitle()->getUserPermissionsErrors( 'edit', $wgUser );
+                       $createErrors = $this->getTitle()->getUserPermissionsErrors( 'create', $this->getContext()->getUser() );
+                       $editErrors = $this->getTitle()->getUserPermissionsErrors( 'edit', $this->getContext()->getUser() );
                        $errors = array_merge( $createErrors, $editErrors );
 
                        if ( !count( $errors ) ) {
@@ -1026,37 +1020,36 @@ class Article extends Page {
                }
                $text = "<div class='noarticletext'>\n$text\n</div>";
 
-               $wgOut->addWikiText( $text );
+               $outputPage->addWikiText( $text );
        }
 
        /**
         * If the revision requested for view is deleted, check permissions.
-        * Send either an error message or a warning header to $wgOut.
+        * Send either an error message or a warning header to the output.
         *
         * @return boolean true if the view is allowed, false if not.
         */
        public function showDeletedRevisionHeader() {
-               global $wgOut, $wgRequest;
-
                if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
                        // Not deleted
                        return true;
                }
 
+               $outputPage = $this->getContext()->getOutput();
                // If the user is not allowed to see it...
                if ( !$this->mRevision->userCan( Revision::DELETED_TEXT ) ) {
-                       $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                'rev-deleted-text-permission' );
 
                        return false;
                // If the user needs to confirm that they want to see it...
-               } elseif ( $wgRequest->getInt( 'unhide' ) != 1 ) {
+               } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
                        # Give explanation and add a link to view the revision...
                        $oldid = intval( $this->getOldID() );
                        $link = $this->getTitle()->getFullUrl( "oldid={$oldid}&unhide=1" );
                        $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
                                'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
-                       $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                array( $msg, $link ) );
 
                        return false;
@@ -1064,7 +1057,7 @@ class Article extends Page {
                } else {
                        $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
                                'rev-suppressed-text-view' : 'rev-deleted-text-view';
-                       $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
 
                        return true;
                }
@@ -1076,16 +1069,14 @@ class Article extends Page {
         *   Revision as of \<date\>; view current revision
         *   \<- Previous version | Next Version -\>
         *
-        * @param $oldid String: revision ID of this article revision
+        * @param $oldid int: revision ID of this article revision
         */
        public function setOldSubtitle( $oldid = 0 ) {
-               global $wgLang, $wgOut, $wgUser, $wgRequest;
-
                if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
                        return;
                }
 
-               $unhide = $wgRequest->getInt( 'unhide' ) == 1;
+               $unhide = $this->getContext()->getRequest()->getInt( 'unhide' ) == 1;
 
                # Cascade unhide param in links for easy deletion browsing
                $extraParams = array();
@@ -1102,9 +1093,10 @@ class Article extends Page {
                $timestamp = $revision->getTimestamp();
 
                $current = ( $oldid == $this->mPage->getLatest() );
-               $td = $wgLang->timeanddate( $timestamp, true );
-               $tddate = $wgLang->date( $timestamp, true );
-               $tdtime = $wgLang->time( $timestamp, true );
+               $language = $this->getContext()->getLanguage();
+               $td = $language->timeanddate( $timestamp, true );
+               $tddate = $language->date( $timestamp, true );
+               $tdtime = $language->time( $timestamp, true );
 
                # Show user links if allowed to see them. If hidden, then show them only if requested...
                $userlinks = Linker::revUserTools( $revision, !$unhide );
@@ -1113,7 +1105,8 @@ class Article extends Page {
                        ? 'revision-info-current'
                        : 'revision-info';
 
-               $wgOut->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
+               $outputPage = $this->getContext()->getOutput();
+               $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
                        $td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
                        $tdtime, $revision->getUser() )->parse() . "</div>" );
 
@@ -1188,12 +1181,12 @@ class Article extends Page {
                                array( 'known', 'noclasses' )
                        );
 
-               $cdel = Linker::getRevDeleteLink( $wgUser, $revision, $this->getTitle() );
+               $cdel = Linker::getRevDeleteLink( $this->getContext()->getUser(), $revision, $this->getTitle() );
                if ( $cdel !== '' ) {
                        $cdel .= ' ';
                }
 
-               $wgOut->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
+               $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
                        wfMsgExt( 'revision-nav', array( 'escapenoentities', 'parsemag', 'replaceafter' ),
                        $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff ) . "</div>" );
        }
@@ -1207,7 +1200,7 @@ class Article extends Page {
         * @return string containing HMTL with redirect link
         */
        public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
-               global $wgOut, $wgStylePath;
+               global $wgStylePath;
 
                if ( !is_array( $target ) ) {
                        $target = array( $target );
@@ -1217,7 +1210,7 @@ class Article extends Page {
                $imageDir = $lang->getDir();
 
                if ( $appendSubtitle ) {
-                       $wgOut->appendSubtitle( wfMsgHtml( 'redirectpagesub' ) );
+                       $this->getContext()->getOutput()->appendSubtitle( wfMsgHtml( 'redirectpagesub' ) );
                }
 
                // the loop prepends the arrow image before the link, so the first case needs to be outside
@@ -1255,9 +1248,7 @@ class Article extends Page {
         * Handle action=render
         */
        public function render() {
-               global $wgOut;
-
-               $wgOut->setArticleBodyOnly( true );
+               $this->getContext()->getOutput()->setArticleBodyOnly( true );
                $this->view();
        }
 
@@ -1280,8 +1271,6 @@ class Article extends Page {
         * UI entry point for page deletion
         */
        public function delete() {
-               global $wgOut, $wgRequest, $wgLang;
-
                # This code desperately needs to be totally rewritten
 
                $title = $this->getTitle();
@@ -1303,13 +1292,14 @@ class Article extends Page {
                $conds = $title->pageCond();
                $latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
                if ( $latest === false ) {
-                       $wgOut->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
-                       $wgOut->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+                       $outputPage = $this->getContext()->getOutput();
+                       $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
+                       $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
                                        array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
                                );
-                       $wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+                       $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
                        LogEventsList::showLogExtract(
-                               $wgOut,
+                               $outputPage,
                                'delete',
                                $title->getPrefixedText()
                        );
@@ -1317,8 +1307,9 @@ class Article extends Page {
                        return;
                }
 
-               $deleteReasonList = $wgRequest->getText( 'wpDeleteReasonList', 'other' );
-               $deleteReason = $wgRequest->getText( 'wpReason' );
+               $request = $this->getContext()->getRequest();
+               $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
+               $deleteReason = $request->getText( 'wpReason' );
 
                if ( $deleteReasonList == 'other' ) {
                        $reason = $deleteReason;
@@ -1329,15 +1320,15 @@ class Article extends Page {
                        $reason = $deleteReasonList;
                }
 
-               if ( $wgRequest->wasPosted() && $user->matchEditToken( $wgRequest->getVal( 'wpEditToken' ),
+               if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'wpEditToken' ),
                        array( 'delete', $this->getTitle()->getPrefixedText() ) ) )
                {
                        # Flag to hide all contents of the archived revisions
-                       $suppress = $wgRequest->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
+                       $suppress = $request->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
 
                        $this->doDelete( $reason, $suppress );
 
-                       if ( $wgRequest->getCheck( 'wpWatch' ) && $user->isLoggedIn() ) {
+                       if ( $request->getCheck( 'wpWatch' ) && $user->isLoggedIn() ) {
                                $this->doWatch();
                        } elseif ( $title->userIsWatching() ) {
                                $this->doUnwatch();
@@ -1356,8 +1347,8 @@ class Article extends Page {
                if ( $hasHistory ) {
                        $revisions = $this->mTitle->estimateRevisionCount();
                        // @todo FIXME: i18n issue/patchwork message
-                       $wgOut->addHTML( '<strong class="mw-delete-warning-revisions">' .
-                               wfMsgExt( 'historywarning', array( 'parseinline' ), $wgLang->formatNum( $revisions ) ) .
+                       $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
+                               wfMsgExt( 'historywarning', array( 'parseinline' ), $this->getContext()->getLanguage()->formatNum( $revisions ) ) .
                                wfMsgHtml( 'word-separator' ) . Linker::link( $title,
                                        wfMsgHtml( 'history' ),
                                        array( 'rel' => 'archives' ),
@@ -1367,8 +1358,8 @@ class Article extends Page {
 
                        if ( $this->mTitle->isBigDeletion() ) {
                                global $wgDeleteRevisionsLimit;
-                               $wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
-                                       array( 'delete-warning-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ) );
+                               $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
+                                       array( 'delete-warning-toobig', $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit ) ) );
                        }
                }
 
@@ -1381,16 +1372,15 @@ class Article extends Page {
         * @param $reason String: prefilled reason
         */
        public function confirmDelete( $reason ) {
-               global $wgOut;
-
                wfDebug( "Article::confirmDelete\n" );
 
-               $wgOut->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
-               $wgOut->addBacklinkSubtitle( $this->getTitle() );
-               $wgOut->setRobotPolicy( 'noindex,nofollow' );
-               $wgOut->addWikiMsg( 'confirmdeletetext' );
+               $outputPage = $this->getContext()->getOutput();
+               $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
+               $outputPage->addBacklinkSubtitle( $this->getTitle() );
+               $outputPage->setRobotPolicy( 'noindex,nofollow' );
+               $outputPage->addWikiMsg( 'confirmdeletetext' );
 
-               wfRunHooks( 'ArticleConfirmDelete', array( $this, $wgOut, &$reason ) );
+               wfRunHooks( 'ArticleConfirmDelete', array( $this, $outputPage, &$reason ) );
 
                $user = $this->getContext()->getUser();
 
@@ -1474,9 +1464,9 @@ class Article extends Page {
                                $form .= '<p class="mw-delete-editreasons">' . $link . '</p>';
                        }
 
-               $wgOut->addHTML( $form );
-               $wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
-               LogEventsList::showLogExtract( $wgOut, 'delete',
+               $outputPage->addHTML( $form );
+               $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+               LogEventsList::showLogExtract( $outputPage, 'delete',
                        $this->getTitle()->getPrefixedText()
                );
        }
@@ -1487,34 +1477,33 @@ class Article extends Page {
         * @param $suppress bool
         */
        public function doDelete( $reason, $suppress = false ) {
-               global $wgOut;
-
                $error = '';
+               $outputPage = $this->getContext()->getOutput();
                if ( $this->mPage->doDeleteArticle( $reason, $suppress, 0, true, $error ) ) {
                        $deleted = $this->getTitle()->getPrefixedText();
 
-                       $wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
-                       $wgOut->setRobotPolicy( 'noindex,nofollow' );
+                       $outputPage->setPageTitle( wfMessage( 'actioncomplete' ) );
+                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
 
                        $loglink = '[[Special:Log/delete|' . wfMsgNoTrans( 'deletionlog' ) . ']]';
 
-                       $wgOut->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
-                       $wgOut->returnToMain( false );
+                       $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
+                       $outputPage->returnToMain( false );
                } else {
-                       $wgOut->setPageTitle( wfMessage( 'cannotdelete-title', $this->getTitle()->getPrefixedText() ) );
+                       $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $this->getTitle()->getPrefixedText() ) );
                        if ( $error == '' ) {
-                               $wgOut->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+                               $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
                                        array( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) )
                                );
-                               $wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+                               $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
 
                                LogEventsList::showLogExtract(
-                                       $wgOut,
+                                       $outputPage,
                                        'delete',
                                        $this->getTitle()->getPrefixedText()
                                );
                        } else {
-                               $wgOut->addHTML( $error );
+                               $outputPage->addHTML( $error );
                        }
                }
        }
@@ -1587,9 +1576,7 @@ class Article extends Page {
         * @return ParserOutput or false if the given revsion ID is not found
         */
        public function getParserOutput( $oldid = null, User $user = null ) {
-               global $wgUser;
-
-               $user = is_null( $user ) ? $wgUser : $user;
+               $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
                $parserOptions = $this->mPage->makeParserOptions( $user );
 
                return $this->mPage->getParserOutput( $parserOptions, $oldid );
@@ -1600,9 +1587,8 @@ class Article extends Page {
         * @return ParserOptions
         */
        public function getParserOptions() {
-               global $wgUser;
                if ( !$this->mParserOptions ) {
-                       $this->mParserOptions = $this->mPage->makeParserOptions( $wgUser );
+                       $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext()->getUser() );
                }
                // Clone to allow modifications of the return value without affecting cache
                return clone $this->mParserOptions;
@@ -1688,7 +1674,7 @@ class Article extends Page {
        }
 
        /**
-        * Add this page to $wgUser's watchlist
+        * Add this page to the current user's watchlist
         *
         * This is safe to be called multiple times
         *
@@ -1696,9 +1682,8 @@ class Article extends Page {
         * @deprecated since 1.18
         */
        public function doWatch() {
-               global $wgUser;
                wfDeprecated( __METHOD__, '1.18' );
-               return WatchAction::doWatch( $this->getTitle(), $wgUser );
+               return WatchAction::doWatch( $this->getTitle(), $this->getContext()->getUser() );
        }
 
        /**
@@ -1717,24 +1702,21 @@ class Article extends Page {
         * @deprecated since 1.18
         */
        public function doUnwatch() {
-               global $wgUser;
                wfDeprecated( __METHOD__, '1.18' );
-               return WatchAction::doUnwatch( $this->getTitle(), $wgUser );
+               return WatchAction::doUnwatch( $this->getTitle(), $this->getContext()->getUser() );
        }
 
        /**
         * Output a redirect back to the article.
         * This is typically used after an edit.
         *
-        * @deprecated in 1.18; call $wgOut->redirect() directly
+        * @deprecated in 1.18; call OutputPage::redirect() directly
         * @param $noRedir Boolean: add redirect=no
         * @param $sectionAnchor String: section to redirect to, including "#"
         * @param $extraQuery String: extra query params
         */
        public function doRedirect( $noRedir = false, $sectionAnchor = '', $extraQuery = '' ) {
                wfDeprecated( __METHOD__, '1.18' );
-               global $wgOut;
-
                if ( $noRedir ) {
                        $query = 'redirect=no';
                        if ( $extraQuery )
@@ -1743,7 +1725,7 @@ class Article extends Page {
                        $query = $extraQuery;
                }
 
-               $wgOut->redirect( $this->getTitle()->getFullURL( $query ) . $sectionAnchor );
+               $this->getContext()->getOutput()->redirect( $this->getTitle()->getFullURL( $query ) . $sectionAnchor );
        }
 
        /**
@@ -1842,8 +1824,7 @@ class Article extends Page {
         * @return array
         */
        public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
-               global $wgUser;
-               $user = is_null( $user ) ? $wgUser : $user;
+               $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
                return $this->mPage->doRollback( $fromP, $summary, $token, $bot, $resultDetails, $user );
        }
 
@@ -1856,8 +1837,7 @@ class Article extends Page {
         * @return array
         */
        public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
-               global $wgUser;
-               $guser = is_null( $guser ) ? $wgUser : $guser;
+               $guser = is_null( $guser ) ? $this->getContext()->getUser() : $guser;
                return $this->mPage->commitRollback( $fromP, $summary, $bot, $resultDetails, $guser );
        }
 
index 937f09c..6710796 100644 (file)
@@ -316,6 +316,7 @@ $wgAutoloadLocalClasses = array(
        'ApiMain' => 'includes/api/ApiMain.php',
        'ApiMove' => 'includes/api/ApiMove.php',
        'ApiOpenSearch' => 'includes/api/ApiOpenSearch.php',
+       'ApiOptions' => 'includes/api/ApiOptions.php',
        'ApiPageSet' => 'includes/api/ApiPageSet.php',
        'ApiParamInfo' => 'includes/api/ApiParamInfo.php',
        'ApiParse' => 'includes/api/ApiParse.php',
index dff1a5d..7cdc756 100644 (file)
@@ -28,7 +28,8 @@ class Block {
 
                $mBlockEmail,
                $mDisableUsertalk,
-               $mCreateAccount;
+               $mCreateAccount,
+               $mParentBlockId;
 
        /// @var User|String
        protected $target;
@@ -368,6 +369,7 @@ class Block {
                $this->mAuto = $row->ipb_auto;
                $this->mHideName = $row->ipb_deleted;
                $this->mId = $row->ipb_id;
+               $this->mParentBlockId = $row->ipb_parent_block_id;
 
                // I wish I didn't have to do this
                $db = wfGetDB( DB_SLAVE );
@@ -411,6 +413,7 @@ class Block {
                }
 
                $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'ipblocks', array( 'ipb_parent_block_id' => $this->getId() ), __METHOD__ );
                $dbw->delete( 'ipblocks', array( 'ipb_id' => $this->getId() ), __METHOD__ );
 
                return $dbw->affectedRows() > 0;
@@ -508,7 +511,8 @@ class Block {
                        'ipb_range_end'        => $this->getRangeEnd(),
                        'ipb_deleted'          => intval( $this->mHideName ), // typecast required for SQLite
                        'ipb_block_email'      => $this->prevents( 'sendemail' ),
-                       'ipb_allow_usertalk'   => !$this->prevents( 'editownusertalk' )
+                       'ipb_allow_usertalk'   => !$this->prevents( 'editownusertalk' ),
+                       'ipb_parent_block_id'            => $this->mParentBlockId
                );
 
                return $a;
@@ -666,6 +670,7 @@ class Block {
                # Continue suppressing the name if needed
                $autoblock->mHideName = $this->mHideName;
                $autoblock->prevents( 'editownusertalk', $this->prevents( 'editownusertalk' ) );
+               $autoblock->mParentBlockId = $this->mId;
 
                if ( $this->mExpiry == 'infinity' ) {
                        # Original block was indefinite, start an autoblock now
@@ -1075,8 +1080,6 @@ class Block {
         * @return array( User|String, Block::TYPE_ constant )
         */
        public static function parseTarget( $target ) {
-               $target = trim( $target );
-
                # We may have been through this before
                if( $target instanceof User ){
                        if( IP::isValid( $target->getName() ) ){
@@ -1088,6 +1091,8 @@ class Block {
                        return array( null, null );
                }
 
+               $target = trim( $target );
+
                if ( IP::isValid( $target ) ) {
                        # We can still create a User if it's an IP address, but we need to turn
                        # off validation checking (which would exclude IP addresses)
index d3c24ca..7084bc6 100644 (file)
@@ -4141,6 +4141,11 @@ $wgShowExceptionDetails = false;
  */
 $wgShowDBErrorBacktrace = false;
 
+/**
+ * If true, send the exception backtrace to the error log
+ */
+$wgLogExceptionBacktrace = true;
+
 /**
  * Expose backend server host names through the API and various HTML comments
  */
@@ -4562,6 +4567,20 @@ $wgReadOnlyFile = false;
  */
 $wgUpgradeKey = false;
 
+/**
+ * Map GIT repository URLs to viewer URLs to provide links in Special:Version
+ *
+ * Key is a pattern passed to preg_match() and preg_replace(),
+ * without the delimiters (which are #) and must match the whole URL.
+ * The value is the replacement for the key (it can contain $1, etc.)
+ * %h will be replaced by the short SHA-1 (7 first chars) and %H by the
+ * full SHA-1 of the HEAD revision.
+ */
+$wgGitRepositoryViewers = array(
+    'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+    'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+);
+
 /** @} */ # End of maintenance }
 
 /************************************************************************//**
index dce8d91..5979ed4 100644 (file)
@@ -819,7 +819,7 @@ class EditPage {
 
                                                        # If we just undid one rev, use an autosummary
                                                        $firstrev = $oldrev->getNext();
-                                                       if ( $firstrev->getId() == $undo ) {
+                                                       if ( $firstrev && $firstrev->getId() == $undo ) {
                                                                $undoSummary = wfMsgForContent( 'undo-summary', $undo, $undorev->getUserText() );
                                                                if ( $this->summary === '' ) {
                                                                        $this->summary = $undoSummary;
@@ -1179,9 +1179,10 @@ class EditPage {
 
                wfProfileOut( __METHOD__ . '-checks' );
 
-               # If article is new, insert it.
-               $aid = $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
-               $new = ( $aid == 0 );
+               // Use SELECT FOR UPDATE here to avoid transaction collision in
+               // WikiPage::updateRevisionOn() and ending in the self::AS_END case.
+               $this->mArticle->loadPageData( 'forupdate' );
+               $new = !$this->mArticle->exists();
 
                if ( $new ) {
                        // Late check for create permission, just in case *PARANOIA*
@@ -1250,10 +1251,7 @@ class EditPage {
                } else {
 
                        # Article exists. Check for edit conflict.
-
-                       $this->mArticle->clear(); # Force reload of dates, etc.
                        $timestamp = $this->mArticle->getTimestamp();
-
                        wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}\n" );
 
                        if ( $timestamp != $this->edittime ) {
index 539d483..f7b6b96 100644 (file)
@@ -15,6 +15,8 @@
  * @ingroup Exception
  */
 class MWException extends Exception {
+       var $logId;
+
        /**
         * Should the exception use $wgOut to output the error ?
         * @return bool
@@ -111,9 +113,14 @@ class MWException extends Exception {
                                '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) ) .
                                "</p>\n";
                } else {
-                       return "<p>Set <b><tt>\$wgShowExceptionDetails = true;</tt></b> " .
+                       return 
+                               "<div class=\"errorbox\">" .
+                               '[' . $this->getLogId() . '] ' .
+                               gmdate( 'Y-m-d H:i:s' ) . 
+                               ": Fatal exception of type " . get_class( $this ) . "</div>\n" .
+                               "<!-- Set \$wgShowExceptionDetails = true; " .
                                "at the bottom of LocalSettings.php to show detailed " .
-                               "debugging information.</p>";
+                               "debugging information. -->";
                }
        }
 
@@ -142,6 +149,13 @@ class MWException extends Exception {
                return $this->msg( 'internalerror', "Internal error" );
        }
 
+       function getLogId() {
+               if ( $this->logId === null ) {
+                       $this->logId = wfRandomString( 8 );
+               }
+               return $this->logId;
+       }
+
        /**
         * Return the requested URL and point to file and line number from which the
         * exception occured
@@ -151,6 +165,7 @@ class MWException extends Exception {
        function getLogMessage() {
                global $wgRequest;
 
+               $id = $this->getLogId();
                $file = $this->getFile();
                $line = $this->getLine();
                $message = $this->getMessage();
@@ -164,7 +179,7 @@ class MWException extends Exception {
                        $url = '[no req]';
                }
 
-               return "$url   Exception from line $line of $file: $message";
+               return "[$id] $url   Exception from line $line of $file: $message";
        }
 
        /** Output the exception report using HTML */
@@ -198,10 +213,15 @@ class MWException extends Exception {
         * It will be either HTML or plain text based on isCommandLine().
         */
        function report() {
+               global $wgLogExceptionBacktrace;
                $log = $this->getLogMessage();
 
                if ( $log ) {
-                       wfDebugLog( 'exception', $log );
+                       if ( $wgLogExceptionBacktrace ) {
+                               wfDebugLog( 'exception', $log . "\n" . $this->getTraceAsString() . "\n" );
+                       } else {
+                               wfDebugLog( 'exception', $log );
+                       }
                }
 
                if ( defined( 'MW_API' ) ) {
index 73b07c3..ea6fd94 100644 (file)
@@ -49,6 +49,15 @@ class WikiExporter {
        const TEXT = 0;
        const STUB = 1;
 
+       var $buffer;
+
+       var $text;
+
+       /**
+        * @var DumpOutput
+        */
+       var $sink;
+
        /**
         * If using WikiExporter::STREAM to stream a large amount of data,
         * provide a database connection which is not managed by
@@ -145,6 +154,10 @@ class WikiExporter {
                        ' AND page_title=' . $this->db->addQuotes( $title->getDBkey() ) );
        }
 
+       /**
+        * @param $name string
+        * @throws MWException
+        */
        public function pageByName( $name ) {
                $title = Title::newFromText( $name );
                if ( is_null( $title ) ) {
@@ -154,6 +167,9 @@ class WikiExporter {
                }
        }
 
+       /**
+        * @param $names array
+        */
        public function pagesByName( $names ) {
                foreach ( $names as $name ) {
                        $this->pageByName( $name );
@@ -164,6 +180,10 @@ class WikiExporter {
                $this->dumpFrom( '' );
        }
 
+       /**
+        * @param $start int
+        * @param $end int
+        */
        public function logsByRange( $start, $end ) {
                $condition = 'log_id >= ' . intval( $start );
                if ( $end ) {
@@ -172,9 +192,13 @@ class WikiExporter {
                $this->dumpFrom( $condition );
        }
 
-       # Generates the distinct list of authors of an article
-       # Not called by default (depends on $this->list_authors)
-       # Can be set by Special:Export when not exporting whole history
+       /**
+        * Generates the distinct list of authors of an article
+        * Not called by default (depends on $this->list_authors)
+        * Can be set by Special:Export when not exporting whole history
+        *
+        * @param $cond
+        */
        protected function do_list_authors( $cond ) {
                wfProfileIn( __METHOD__ );
                $this->author_list = "<contributors>";
@@ -205,6 +229,11 @@ class WikiExporter {
                wfProfileOut( __METHOD__ );
        }
 
+       /**
+        * @param $cond string
+        * @throws MWException
+        * @throws Exception
+        */
        protected function dumpFrom( $cond = '' ) {
                wfProfileIn( __METHOD__ );
                # For logging dumps...
@@ -419,6 +448,9 @@ class WikiExporter {
                }
        }
 
+       /**
+        * @param $resultset array
+        */
        protected function outputLogStream( $resultset ) {
                foreach ( $resultset as $row ) {
                        $output = $this->writer->writeLogItem( $row );
@@ -464,6 +496,9 @@ class XmlDumpWriter {
                        $this->siteInfo();
        }
 
+       /**
+        * @return string
+        */
        function siteInfo() {
                $info = array(
                        $this->sitename(),
@@ -476,20 +511,32 @@ class XmlDumpWriter {
                        "\n  </siteinfo>\n";
        }
 
+       /**
+        * @return string
+        */
        function sitename() {
                global $wgSitename;
                return Xml::element( 'sitename', array(), $wgSitename );
        }
 
+       /**
+        * @return string
+        */
        function generator() {
                global $wgVersion;
                return Xml::element( 'generator', array(), "MediaWiki $wgVersion" );
        }
 
+       /**
+        * @return string
+        */
        function homelink() {
                return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalUrl() );
        }
 
+       /**
+        * @return string
+        */
        function caseSetting() {
                global $wgCapitalLinks;
                // "case-insensitive" option is reserved for future
@@ -497,6 +544,9 @@ class XmlDumpWriter {
                return Xml::element( 'case', array(), $sensitivity );
        }
 
+       /**
+        * @return string
+        */
        function namespaces() {
                global $wgContLang;
                $spaces = "<namespaces>\n";
@@ -591,7 +641,7 @@ class XmlDumpWriter {
                if ( $row->rev_deleted & Revision::DELETED_COMMENT ) {
                        $out .= "      " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
                } elseif ( $row->rev_comment != '' ) {
-                       $out .= "      " . Xml::elementClean( 'comment', null, strval( $row->rev_comment ) ) . "\n";
+                       $out .= "      " . Xml::elementClean( 'comment', array(), strval( $row->rev_comment ) ) . "\n";
                }
 
                $text = '';
@@ -671,11 +721,20 @@ class XmlDumpWriter {
                return $out;
        }
 
+       /**
+        * @param $timestamp string
+        * @return string
+        */
        function writeTimestamp( $timestamp ) {
                $ts = wfTimestamp( TS_ISO_8601, $timestamp );
                return "      " . Xml::element( 'timestamp', null, $ts ) . "\n";
        }
 
+       /**
+        * @param $id
+        * @param $text string
+        * @return string
+        */
        function writeContributor( $id, $text ) {
                $out = "      <contributor>\n";
                if ( $id || !IP::isValid( $text ) ) {
@@ -690,6 +749,8 @@ class XmlDumpWriter {
 
        /**
         * Warning! This data is potentially inconsistent. :(
+        * @param $row
+        * @param $dumpContents bool
         * @return string
         */
        function writeUploads( $row, $dumpContents = false ) {
@@ -774,32 +835,55 @@ class XmlDumpWriter {
  * @ingroup Dump
  */
 class DumpOutput {
+
+       /**
+        * @param $string string
+        */
        function writeOpenStream( $string ) {
                $this->write( $string );
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                $this->write( $string );
        }
 
+       /**
+        * @param $page
+        * @param $string string
+        */
        function writeOpenPage( $page, $string ) {
                $this->write( $string );
        }
 
+       /**
+        * @param $string string
+        */
        function writeClosePage( $string ) {
                $this->write( $string );
        }
 
+       /**
+        * @param $rev
+        * @param $string string
+        */
        function writeRevision( $rev, $string ) {
                $this->write( $string );
        }
 
+       /**
+        * @param $rev
+        * @param $string string
+        */
        function writeLogItem( $rev, $string ) {
                $this->write( $string );
        }
 
        /**
         * Override to write to a different stream type.
+        * @param $string string
         * @return bool
         */
        function write( $string ) {
@@ -845,11 +929,17 @@ class DumpOutput {
 class DumpFileOutput extends DumpOutput {
        protected $handle = false, $filename;
 
+       /**
+        * @param $file
+        */
        function __construct( $file ) {
                $this->handle = fopen( $file, "wt" );
                $this->filename = $file;
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                parent::writeCloseStream( $string );
                if ( $this->handle ) {
@@ -858,20 +948,35 @@ class DumpFileOutput extends DumpOutput {
                }
        }
 
+       /**
+        * @param $string string
+        */
        function write( $string ) {
                fputs( $this->handle, $string );
        }
 
+       /**
+        * @param $newname
+        */
        function closeRenameAndReopen( $newname ) {
                $this->closeAndRename( $newname, true );
        }
 
+       /**
+        * @param $newname
+        * @throws MWException
+        */
        function renameOrException( $newname ) {
                        if (! rename( $this->filename, $newname ) ) {
                                throw new MWException( __METHOD__ . ": rename of file {$this->filename} to $newname failed\n" );
                        }
        }
 
+       /**
+        * @param $newname array
+        * @return mixed
+        * @throws MWException
+        */
        function checkRenameArgCount( $newname ) {
                if ( is_array( $newname ) ) {
                        if ( count( $newname ) > 1 ) {
@@ -883,6 +988,10 @@ class DumpFileOutput extends DumpOutput {
                return $newname;
        }
 
+       /**
+        * @param $newname mixed
+        * @param $open bool
+        */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
                if ( $newname ) {
@@ -897,6 +1006,9 @@ class DumpFileOutput extends DumpOutput {
                }
        }
 
+       /**
+        * @return string|null
+        */
        function getFilenames() {
                return $this->filename;
        }
@@ -912,6 +1024,10 @@ class DumpPipeOutput extends DumpFileOutput {
        protected $command, $filename;
        protected $procOpenResource = false;
 
+       /**
+        * @param $command
+        * @param $file null
+        */
        function __construct( $command, $file = null ) {
                if ( !is_null( $file ) ) {
                        $command .=  " > " . wfEscapeShellArg( $file );
@@ -922,6 +1038,9 @@ class DumpPipeOutput extends DumpFileOutput {
                $this->filename = $file;
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                parent::writeCloseStream( $string );
                if ( $this->procOpenResource ) {
@@ -930,6 +1049,9 @@ class DumpPipeOutput extends DumpFileOutput {
                }
        }
 
+       /**
+        * @param $command
+        */
        function startCommand( $command ) {
                $spec = array(
                        0 => array( "pipe", "r" ),
@@ -939,10 +1061,17 @@ class DumpPipeOutput extends DumpFileOutput {
                $this->handle = $pipes[0];
        }
 
+       /**
+        * @param mixed $newname
+        */
        function closeRenameAndReopen( $newname ) {
                $this->closeAndRename( $newname, true );
        }
 
+       /**
+        * @param $newname mixed
+        * @param $open bool
+        */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
                if ( $newname ) {
@@ -970,6 +1099,10 @@ class DumpPipeOutput extends DumpFileOutput {
  * @ingroup Dump
  */
 class DumpGZipOutput extends DumpPipeOutput {
+
+       /**
+        * @param $file string
+        */
        function __construct( $file ) {
                parent::__construct( "gzip", $file );
        }
@@ -980,6 +1113,10 @@ class DumpGZipOutput extends DumpPipeOutput {
  * @ingroup Dump
  */
 class DumpBZip2Output extends DumpPipeOutput {
+
+       /**
+        * @param $file string
+        */
        function __construct( $file ) {
                parent::__construct( "bzip2", $file );
        }
@@ -990,12 +1127,20 @@ class DumpBZip2Output extends DumpPipeOutput {
  * @ingroup Dump
  */
 class Dump7ZipOutput extends DumpPipeOutput {
+
+       /**
+        * @param $file string
+        */
        function __construct( $file ) {
                $command = $this->setup7zCommand( $file );
                parent::__construct( $command );
                $this->filename = $file;
        }
 
+       /**
+        * @param $file string
+        * @return string
+        */
        function setup7zCommand( $file ) {
                $command = "7za a -bd -si " . wfEscapeShellArg( $file );
                // Suppress annoying useless crap from p7zip
@@ -1004,6 +1149,10 @@ class Dump7ZipOutput extends DumpPipeOutput {
                return( $command );
        }
 
+       /**
+        * @param $newname string
+        * @param $open bool
+        */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
                if ( $newname ) {
@@ -1018,8 +1167,6 @@ class Dump7ZipOutput extends DumpPipeOutput {
        }
 }
 
-
-
 /**
  * Dump output filter class.
  * This just does output filtering and streaming; XML formatting is done
@@ -1027,18 +1174,44 @@ class Dump7ZipOutput extends DumpPipeOutput {
  * @ingroup Dump
  */
 class DumpFilter {
+
+       /**
+        * @var DumpOutput
+        * FIXME will need to be made protected whenever legacy code
+        * is updated.
+        */
+       public $sink;
+
+       /**
+        * @var bool
+        */
+       protected $sendingThisPage;
+
+       /**
+        * @param $sink DumpOutput
+        */
        function __construct( &$sink ) {
                $this->sink =& $sink;
        }
 
+       /**
+        * @param $string string
+        */
        function writeOpenStream( $string ) {
                $this->sink->writeOpenStream( $string );
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                $this->sink->writeCloseStream( $string );
        }
 
+       /**
+        * @param $page
+        * @param $string string
+        */
        function writeOpenPage( $page, $string ) {
                $this->sendingThisPage = $this->pass( $page, $string );
                if ( $this->sendingThisPage ) {
@@ -1046,6 +1219,9 @@ class DumpFilter {
                }
        }
 
+       /**
+        * @param $string string
+        */
        function writeClosePage( $string ) {
                if ( $this->sendingThisPage ) {
                        $this->sink->writeClosePage( $string );
@@ -1053,30 +1229,49 @@ class DumpFilter {
                }
        }
 
+       /**
+        * @param $rev
+        * @param $string string
+        */
        function writeRevision( $rev, $string ) {
                if ( $this->sendingThisPage ) {
                        $this->sink->writeRevision( $rev, $string );
                }
        }
 
+       /**
+        * @param $rev
+        * @param $string string
+        */
        function writeLogItem( $rev, $string ) {
                $this->sink->writeRevision( $rev, $string );
        }
 
+       /**
+        * @param $newname string
+        */
        function closeRenameAndReopen( $newname ) {
                $this->sink->closeRenameAndReopen( $newname );
        }
 
+       /**
+        * @param $newname string
+        * @param $open bool
+        */
        function closeAndRename( $newname, $open = false ) {
                $this->sink->closeAndRename( $newname, $open );
        }
 
+       /**
+        * @return array
+        */
        function getFilenames() {
                return $this->sink->getFilenames();
        }
 
        /**
         * Override for page-based filter types.
+        * @param $page
         * @return bool
         */
        function pass( $page ) {
@@ -1089,6 +1284,11 @@ class DumpFilter {
  * @ingroup Dump
  */
 class DumpNotalkFilter extends DumpFilter {
+
+       /**
+        * @param $page
+        * @return bool
+        */
        function pass( $page ) {
                return !MWNamespace::isTalk( $page->page_namespace );
        }
@@ -1102,6 +1302,10 @@ class DumpNamespaceFilter extends DumpFilter {
        var $invert = false;
        var $namespaces = array();
 
+       /**
+        * @param $sink DumpOutput
+        * @param $param
+        */
        function __construct( &$sink, $param ) {
                parent::__construct( $sink );
 
@@ -1144,6 +1348,10 @@ class DumpNamespaceFilter extends DumpFilter {
                }
        }
 
+       /**
+        * @param $page
+        * @return bool
+        */
        function pass( $page ) {
                $match = isset( $this->namespaces[$page->page_namespace] );
                return $this->invert xor $match;
@@ -1158,11 +1366,18 @@ class DumpNamespaceFilter extends DumpFilter {
 class DumpLatestFilter extends DumpFilter {
        var $page, $pageString, $rev, $revString;
 
+       /**
+        * @param $page
+        * @param $string string
+        */
        function writeOpenPage( $page, $string ) {
                $this->page = $page;
                $this->pageString = $string;
        }
 
+       /**
+        * @param $string string
+        */
        function writeClosePage( $string ) {
                if ( $this->rev ) {
                        $this->sink->writeOpenPage( $this->page, $this->pageString );
@@ -1175,6 +1390,10 @@ class DumpLatestFilter extends DumpFilter {
                $this->pageString = null;
        }
 
+       /**
+        * @param $rev
+        * @param $string string
+        */
        function writeRevision( $rev, $string ) {
                if ( $rev->rev_id == $this->page->page_latest ) {
                        $this->rev = $rev;
@@ -1188,51 +1407,82 @@ class DumpLatestFilter extends DumpFilter {
  * @ingroup Dump
  */
 class DumpMultiWriter {
+
+       /**
+        * @param $sinks
+        */
        function __construct( $sinks ) {
                $this->sinks = $sinks;
                $this->count = count( $sinks );
        }
 
+       /**
+        * @param $string string
+        */
        function writeOpenStream( $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->writeOpenStream( $string );
                }
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->writeCloseStream( $string );
                }
        }
 
+       /**
+        * @param $page
+        * @param $string string
+        */
        function writeOpenPage( $page, $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->writeOpenPage( $page, $string );
                }
        }
 
+       /**
+        * @param $string
+        */
        function writeClosePage( $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->writeClosePage( $string );
                }
        }
 
+       /**
+        * @param $rev
+        * @param $string
+        */
        function writeRevision( $rev, $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->writeRevision( $rev, $string );
                }
        }
 
+       /**
+        * @param $newnames
+        */
        function closeRenameAndReopen( $newnames ) {
                $this->closeAndRename( $newnames, true );
        }
 
+       /**
+        * @param $newnames array
+        * @param bool $open
+        */
        function closeAndRename( $newnames, $open = false ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
                        $this->sinks[$i]->closeAndRename( $newnames[$i], $open );
                }
        }
 
+       /**
+        * @return array
+        */
        function getFilenames() {
                $filenames = array();
                for ( $i = 0; $i < $this->count; $i++ ) {
@@ -1243,6 +1493,10 @@ class DumpMultiWriter {
 
 }
 
+/**
+ * @param $string string
+ * @return string
+ */
 function xmlsafe( $string ) {
        wfProfileIn( __FUNCTION__ );
 
index 74c07cc..e1b0379 100644 (file)
@@ -70,7 +70,7 @@ class GitInfo {
                if ( preg_match( "/ref: (.*)/", $HEAD, $m ) ) {
                        return rtrim( $m[1] );
                } else {
-                       return $HEAD;
+                       return rtrim( $HEAD );
                }
        }
 
@@ -187,20 +187,10 @@ class GitInfo {
         * @return array
         */
        protected static function getViewers() {
-               if( self::$viewers === false ) {
-
-                       // Map of repo URLs to viewer URLs.
-                       //
-                       // Key is a pattern passed to preg_match() and preg_replace(),
-                       // without the delimiters (which are #) and must match the whole URL.
-                       // The value is the replacement for the key (it can contain $1, etc.)
-                       // %h will be replaced by the short SHA-1 (7 first chars) and %H by the
-                       // full SHA-1 of the HEAD revision.
-                       self::$viewers = array(
-                               'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
-                               'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
-                       );
+               global $wgGitRepositoryViewers;
 
+               if( self::$viewers === false ) {
+                       self::$viewers = $wgGitRepositoryViewers;
                        wfRunHooks( 'GitViewers', array( &self::$viewers ) );
                }
 
index 74b2ea6..cea7e48 100644 (file)
@@ -368,7 +368,7 @@ function wfUrlencode( $s ) {
  * @param $prefix String
  * @return String
  */
-function wfArrayToCGI( $array1, $array2 = null, $prefix = '' ) {
+function wfArrayToCgi( $array1, $array2 = null, $prefix = '' ) {
        if ( !is_null( $array2 ) ) {
                $array1 = $array1 + $array2;
        }
@@ -387,7 +387,7 @@ function wfArrayToCGI( $array1, $array2 = null, $prefix = '' ) {
                                foreach ( $value as $k => $v ) {
                                        $cgi .= $firstTime ? '' : '&';
                                        if ( is_array( $v ) ) {
-                                               $cgi .= wfArrayToCGI( $v, null, $key . "[$k]" );
+                                               $cgi .= wfArrayToCgi( $v, null, $key . "[$k]" );
                                        } else {
                                                $cgi .= urlencode( $key . "[$k]" ) . '=' . urlencode( $v );
                                        }
@@ -405,7 +405,7 @@ function wfArrayToCGI( $array1, $array2 = null, $prefix = '' ) {
 }
 
 /**
- * This is the logical opposite of wfArrayToCGI(): it accepts a query string as
+ * This is the logical opposite of wfArrayToCgi(): it accepts a query string as
  * its argument and returns the same string in array form.  This allows compa-
  * tibility with legacy functions that accept raw query strings instead of nice
  * arrays.  Of course, keys and values are urldecode()d.
@@ -462,7 +462,7 @@ function wfCgiToArray( $query ) {
  */
 function wfAppendQuery( $url, $query ) {
        if ( is_array( $query ) ) {
-               $query = wfArrayToCGI( $query );
+               $query = wfArrayToCgi( $query );
        }
        if( $query != '' ) {
                if( false === strpos( $url, '?' ) ) {
@@ -2761,9 +2761,7 @@ function wfDl( $extension, $fileName = null ) {
 
        $canDl = false;
        $sapi = php_sapi_name();
-       if( version_compare( PHP_VERSION, '5.3.0', '<' ) ||
-               $sapi == 'cli' || $sapi == 'cgi' || $sapi == 'embed' )
-       {
+       if( $sapi == 'cli' || $sapi == 'cgi' || $sapi == 'embed' ) {
                $canDl = ( function_exists( 'dl' ) && is_callable( 'dl' )
                && wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ) );
        }
@@ -2901,16 +2899,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = array() ) {
        }
        $cmd = $envcmd . $cmd;
 
-       if ( wfIsWindows() ) {
-               if ( version_compare( PHP_VERSION, '5.3.0', '<' ) && /* Fixed in 5.3.0 :) */
-                       ( version_compare( PHP_VERSION, '5.2.1', '>=' ) || php_uname( 's' ) == 'Windows NT' ) )
-               {
-                       # Hack to work around PHP's flawed invocation of cmd.exe
-                       # http://news.php.net/php.internals/21796
-                       # Windows 9x doesn't accept any kind of quotes
-                       $cmd = '"' . $cmd . '"';
-               }
-       } elseif ( php_uname( 's' ) == 'Linux' ) {
+       if ( php_uname( 's' ) == 'Linux' ) {
                $time = intval( $wgMaxShellTime );
                $mem = intval( $wgMaxShellMemory );
                $filesize = intval( $wgMaxShellFileSize );
index 6adef84..054a836 100644 (file)
@@ -756,6 +756,12 @@ class CurlHttpRequest extends MWHttpRequest {
                $this->parseHeader();
                $this->setStatus();
 
+               if ( isset( $this->respHeaders['content-length'] ) ) {
+                       if ( strlen( $this->content ) < $this->respHeaders['content-length'] ) {
+                               $this->status->fatal( 'http-truncated-body' );
+                       }
+               }
+
                return $this->status;
        }
 
index b2393f0..c19e83f 100644 (file)
@@ -30,7 +30,7 @@ class ImagePage extends Article {
        /**
         * Constructor from a page id
         * @param $id Int article ID to load
-        * @returnImagePage|null
+        * @return ImagePage|null
         */
        public static function newFromID( $id ) {
                $t = Title::newFromID( $id );
@@ -51,7 +51,7 @@ class ImagePage extends Article {
 
        protected function loadFile() {
                if ( $this->fileLoaded ) {
-                       return true;
+                       return;
                }
                $this->fileLoaded = true;
 
@@ -75,16 +75,17 @@ class ImagePage extends Article {
         * Include body text only; none of the image extras
         */
        public function render() {
-               global $wgOut;
-               $wgOut->setArticleBodyOnly( true );
+               $this->getContext()->setArticleBodyOnly( true );
                parent::view();
        }
 
        public function view() {
-               global $wgOut, $wgShowEXIF, $wgRequest, $wgUser;
+               global $wgShowEXIF;
 
-               $diff = $wgRequest->getVal( 'diff' );
-               $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
+               $out = $this->getContext()->getOutput();
+               $request = $this->getContext()->getRequest();
+               $diff = $request->getVal( 'diff' );
+               $diffOnly = $request->getBool( 'diffonly', $this->getContext()->getUser()->getOption( 'diffonly' ) );
 
                if ( $this->getTitle()->getNamespace() != NS_FILE || ( isset( $diff ) && $diffOnly ) ) {
                        parent::view();
@@ -97,14 +98,14 @@ class ImagePage extends Article {
                        if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || isset( $diff ) ) {
                                // mTitle is the same as the redirect target so ask Article
                                // to perform the redirect for us.
-                               $wgRequest->setVal( 'diffonly', 'true' );
+                               $request->setVal( 'diffonly', 'true' );
                                parent::view();
                                return;
                        } else {
                                // mTitle is not the same as the redirect target so it is
                                // probably the redirect page itself. Fake the redirect symbol
-                               $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
-                               $wgOut->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
+                               $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+                               $out->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
                                        /* $appendSubtitle */ true, /* $forceKnown */ true ) );
                                $this->mPage->doViewUpdates( $this->getContext()->getUser() );
                                return;
@@ -120,7 +121,7 @@ class ImagePage extends Article {
                }
 
                if ( !$diff && $this->displayImg->exists() ) {
-                       $wgOut->addHTML( $this->showTOC( $showmeta ) );
+                       $out->addHTML( $this->showTOC( $showmeta ) );
                }
 
                if ( !$diff ) {
@@ -132,15 +133,15 @@ class ImagePage extends Article {
                        # NS_FILE is in the user language, but this section (the actual wikitext)
                        # should be in page content language
                        $pageLang = $this->getTitle()->getPageLanguage();
-                       $wgOut->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
+                       $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
                                'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
                                'class' => 'mw-content-'.$pageLang->getDir() ) ) );
                        parent::view();
-                       $wgOut->addHTML( Xml::closeElement( 'div' ) );
+                       $out->addHTML( Xml::closeElement( 'div' ) );
                } else {
                        # Just need to set the right headers
-                       $wgOut->setArticleFlag( true );
-                       $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
+                       $out->setArticleFlag( true );
+                       $out->setPageTitle( $this->getTitle()->getPrefixedText() );
                        $this->mPage->doViewUpdates( $this->getContext()->getUser() );
                }
 
@@ -148,16 +149,16 @@ class ImagePage extends Article {
                if ( $this->mExtraDescription ) {
                        $fol = wfMessage( 'shareddescriptionfollows' );
                        if ( !$fol->isDisabled() ) {
-                               $wgOut->addWikiText( $fol->plain() );
+                               $out->addWikiText( $fol->plain() );
                        }
-                       $wgOut->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
+                       $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
                }
 
                $this->closeShowImage();
                $this->imageHistory();
                // TODO: Cleanup the following
 
-               $wgOut->addHTML( Xml::element( 'h2',
+               $out->addHTML( Xml::element( 'h2',
                        array( 'id' => 'filelinks' ),
                        wfMsg( 'imagelinks' ) ) . "\n" );
                $this->imageDupes();
@@ -169,24 +170,24 @@ class ImagePage extends Article {
                $html = '';
                wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) );
                if ( $html ) {
-                       $wgOut->addHTML( $html );
+                       $out->addHTML( $html );
                }
 
                if ( $showmeta ) {
-                       $wgOut->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" );
-                       $wgOut->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
-                       $wgOut->addModules( array( 'mediawiki.action.view.metadata' ) );
+                       $out->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" );
+                       $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
+                       $out->addModules( array( 'mediawiki.action.view.metadata' ) );
                }
 
                // Add remote Filepage.css
                if( !$this->repo->isLocal() ) {
                        $css = $this->repo->getDescriptionStylesheetUrl();
                        if ( $css ) {
-                               $wgOut->addStyle( $css );
+                               $out->addStyle( $css );
                        }
                }
                // always show the local local Filepage.css, bug 29277
-               $wgOut->addModuleStyles( 'filepage' );
+               $out->addModuleStyles( 'filepage' );
        }
 
        /**
@@ -262,12 +263,16 @@ class ImagePage extends Article {
        }
 
        protected function openShowImage() {
-               global $wgOut, $wgUser, $wgImageLimits, $wgRequest,
-                       $wgLang, $wgEnableUploads, $wgSend404Code;
+               global $wgImageLimits, $wgEnableUploads, $wgSend404Code;
 
                $this->loadFile();
+               $out = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
+               $lang = $this->getContext()->getLanguage();
+               $dirmark = $lang->getDirMarkEntity();
+               $request = $this->getContext()->getRequest();
 
-               $sizeSel = intval( $wgUser->getOption( 'imagesize' ) );
+               $sizeSel = intval( $user->getOption( 'imagesize' ) );
                if ( !isset( $wgImageLimits[$sizeSel] ) ) {
                        $sizeSel = User::getDefaultOption( 'imagesize' );
 
@@ -281,11 +286,10 @@ class ImagePage extends Article {
                $max = $wgImageLimits[$sizeSel];
                $maxWidth = $max[0];
                $maxHeight = $max[1];
-               $dirmark = $wgLang->getDirMarkEntity();
 
                if ( $this->displayImg->exists() ) {
                        # image
-                       $page = $wgRequest->getIntOrNull( 'page' );
+                       $page = $request->getIntOrNull( 'page' );
                        if ( is_null( $page ) ) {
                                $params = array();
                                $page = 1;
@@ -299,7 +303,7 @@ class ImagePage extends Article {
 
                        $longDesc = wfMsg( 'parentheses', $this->displayImg->getLongDesc() );
 
-                       wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$wgOut ) );
+                       wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
 
                        if ( $this->displayImg->allowInlineDisplay() ) {
                                # image
@@ -335,7 +339,7 @@ class ImagePage extends Article {
                                        if ( count( $otherSizes ) && $this->displayImg->getRepo()->canTransformVia404() ) {
                                                $msgsmall .= ' ' .
                                                Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
-                                                       wfMessage( 'show-big-image-other' )->rawParams( $wgLang->pipeList( $otherSizes ) )->
+                                                       wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
                                                        params( count( $otherSizes ) )->parse()
                                                );
                                        }
@@ -357,7 +361,7 @@ class ImagePage extends Article {
 
                                $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
                                if ( $isMulti ) {
-                                       $wgOut->addHTML( '<table class="multipageimage"><tr><td>' );
+                                       $out->addHTML( '<table class="multipageimage"><tr><td>' );
                                }
 
                                if ( $thumbnail ) {
@@ -365,7 +369,7 @@ class ImagePage extends Article {
                                                'alt' => $this->displayImg->getTitle()->getPrefixedText(),
                                                'file-link' => true,
                                        );
-                                       $wgOut->addHTML( '<div class="fullImageLink" id="file">' .
+                                       $out->addHTML( '<div class="fullImageLink" id="file">' .
                                                $thumbnail->toHtml( $options ) .
                                                $anchorclose . "</div>\n" );
                                }
@@ -374,7 +378,7 @@ class ImagePage extends Article {
                                        $count = $this->displayImg->pageCount();
 
                                        if ( $page > 1 ) {
-                                               $label = $wgOut->parse( wfMsg( 'imgmultipageprev' ), false );
+                                               $label = $out->parse( wfMsg( 'imgmultipageprev' ), false );
                                                $link = Linker::link(
                                                        $this->getTitle(),
                                                        $label,
@@ -412,13 +416,13 @@ class ImagePage extends Article {
                                        );
                                        $options = array();
                                        for ( $i = 1; $i <= $count; $i++ ) {
-                                               $options[] = Xml::option( $wgLang->formatNum( $i ), $i, $i == $page );
+                                               $options[] = Xml::option( $lang->formatNum( $i ), $i, $i == $page );
                                        }
                                        $select = Xml::tags( 'select',
                                                array( 'id' => 'pageselector', 'name' => 'page' ),
                                                implode( "\n", $options ) );
 
-                                       $wgOut->addHTML(
+                                       $out->addHTML(
                                                '</td><td><div class="multipageimagenavbox">' .
                                                Xml::openElement( 'form', $formParams ) .
                                                Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
@@ -433,7 +437,7 @@ class ImagePage extends Article {
                                if ( $this->displayImg->isSafeFile() ) {
                                        $icon = $this->displayImg->iconThumb();
 
-                                       $wgOut->addHTML( '<div class="fullImageLink" id="file">' .
+                                       $out->addHTML( '<div class="fullImageLink" id="file">' .
                                                $icon->toHtml( array( 'file-link' => true ) ) .
                                                "</div>\n" );
                                }
@@ -458,13 +462,13 @@ class ImagePage extends Article {
                                        // The dirmark, however, must not be immediately adjacent
                                        // to the filename, because it can get copied with it.
                                        // See bug 25277.
-                                       $wgOut->addWikiText( <<<EOT
+                                       $out->addWikiText( <<<EOT
 <div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
 <div class="mediaWarning">$warning</div>
 EOT
                                                );
                                } else {
-                                       $wgOut->addWikiText( <<<EOT
+                                       $out->addWikiText( <<<EOT
 <div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
 </div>
 EOT
@@ -481,7 +485,7 @@ EOT
                                # No article exists either
                                # Show deletion log to be consistent with normal articles
                                LogEventsList::showLogExtract(
-                                       $wgOut,
+                                       $out,
                                        array( 'delete', 'move' ),
                                        $this->getTitle()->getPrefixedText(),
                                        '',
@@ -493,7 +497,7 @@ EOT
                                );
                        }
 
-                       if ( $wgEnableUploads && $wgUser->isAllowed( 'upload' ) ) {
+                       if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
                                // Only show an upload link if the user can upload
                                $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
                                $nofile = array(
@@ -506,15 +510,15 @@ EOT
                        // Note, if there is an image description page, but
                        // no image, then this setRobotPolicy is overriden
                        // by Article::View().
-                       $wgOut->setRobotPolicy( 'noindex,nofollow' );
-                       $wgOut->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
+                       $out->setRobotPolicy( 'noindex,nofollow' );
+                       $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
                        if ( !$this->getID() && $wgSend404Code ) {
                                // If there is no image, no shared image, and no description page,
                                // output a 404, to be consistent with articles.
-                               $wgRequest->response()->header( 'HTTP/1.1 404 Not Found' );
+                               $request->response()->header( 'HTTP/1.1 404 Not Found' );
                        }
                }
-               $wgOut->setFileVersion( $this->displayImg );
+               $out->setFileVersion( $this->displayImg );
        }
 
        /**
@@ -544,8 +548,7 @@ EOT
         * Show a notice that the file is from a shared repository
         */
        protected function printSharedImageText() {
-               global $wgOut;
-
+               $out = $this->getContext()->getOutput();
                $this->loadFile();
 
                $descUrl = $this->mPage->getFile()->getDescriptionUrl();
@@ -553,18 +556,18 @@ EOT
 
                /* Add canonical to head if there is no local page for this shared file */
                if( $descUrl && $this->mPage->getID() == 0 ) {
-                       $wgOut->addLink( array( 'rel' => 'canonical', 'href' => $descUrl ) );
+                       $out->addLink( array( 'rel' => 'canonical', 'href' => $descUrl ) );
                }
 
                $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
                $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
 
                if ( $descUrl && $descText && wfMsgNoTrans( 'sharedupload-desc-here' ) !== '-'  ) {
-                       $wgOut->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
                } elseif ( $descUrl && wfMsgNoTrans( 'sharedupload-desc-there' ) !== '-' ) {
-                       $wgOut->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
                } else {
-                       $wgOut->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
                }
 
                if ( $descText ) {
@@ -586,7 +589,7 @@ EOT
         * external editing (and instructions link) etc.
         */
        protected function uploadLinksBox() {
-               global $wgUser, $wgOut, $wgEnableUploads, $wgUseExternalEditor;
+               global $wgEnableUploads, $wgUseExternalEditor;
 
                if ( !$wgEnableUploads ) {
                        return;
@@ -597,12 +600,13 @@ EOT
                        return;
                }
 
-               $wgOut->addHTML( "<br /><ul>\n" );
+               $out = $this->getContext()->getOutput();
+               $out->addHTML( "<br /><ul>\n" );
 
                # "Upload a new version of this file" link
-               if ( UploadBase::userCanReUpload( $wgUser, $this->mPage->getFile()->name ) ) {
+               if ( UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
                        $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMsg( 'uploadnewversion-linktext' ) );
-                       $wgOut->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
+                       $out->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
                }
 
                # External editing link
@@ -618,14 +622,14 @@ EOT
                                ),
                                array( 'known', 'noclasses' )
                        );
-                       $wgOut->addHTML(
+                       $out->addHTML(
                                '<li id="mw-imagepage-edit-external">' . $elink . ' <small>' .
                                wfMsgExt( 'edit-externally-help', array( 'parseinline' ) ) .
                                "</small></li>\n"
                        );
                }
 
-               $wgOut->addHTML( "</ul>\n" );
+               $out->addHTML( "</ul>\n" );
        }
 
        protected function closeShowImage() { } # For overloading
@@ -635,12 +639,11 @@ EOT
         * we follow it with an upload history of the image and its usage.
         */
        protected function imageHistory() {
-               global $wgOut;
-
                $this->loadFile();
+               $out = $this->getContext()->getOutput();
                $pager = new ImageHistoryPseudoPager( $this );
-               $wgOut->addHTML( $pager->getBody() );
-               $wgOut->preventClickjacking( $pager->getPreventClickjacking() );
+               $out->addHTML( $pager->getBody() );
+               $out->preventClickjacking( $pager->getPreventClickjacking() );
 
                $this->mPage->getFile()->resetHistory(); // free db resources
 
@@ -669,10 +672,9 @@ EOT
        }
 
        protected function imageLinks() {
-               global $wgOut, $wgLang;
-
                $limit = 100;
 
+               $out = $this->getContext()->getOutput();
                $res = $this->queryImageLinks( $this->getTitle()->getDbKey(), $limit + 1);
                $rows = array();
                $redirects = array();
@@ -696,7 +698,7 @@ EOT
                }
 
                if ( $count == 0 ) {
-                       $wgOut->wrapWikiMsg(
+                       $out->wrapWikiMsg(
                                Html::rawElement( 'div',
                                        array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
                                'nolinkstoimage'
@@ -704,18 +706,18 @@ EOT
                        return;
                }
 
-               $wgOut->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
+               $out->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
                if ( !$hasMore ) {
-                       $wgOut->addWikiMsg( 'linkstoimage', $count );
+                       $out->addWikiMsg( 'linkstoimage', $count );
                } else {
                        // More links than the limit. Add a link to [[Special:Whatlinkshere]]
-                       $wgOut->addWikiMsg( 'linkstoimage-more',
-                               $wgLang->formatNum( $limit ),
+                       $out->addWikiMsg( 'linkstoimage-more',
+                               $this->getContext()->getLanguage()->formatNum( $limit ),
                                $this->getTitle()->getPrefixedDBkey()
                        );
                }
 
-               $wgOut->addHTML(
+               $out->addHTML(
                        Html::openElement( 'ul',
                                array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n"
                );
@@ -754,7 +756,7 @@ EOT
                                $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
                                        $link, $ul )->parse();
                        }
-                       $wgOut->addHTML( Html::rawElement(
+                       $out->addHTML( Html::rawElement(
                                        'li',
                                        array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
                                        $liContents
@@ -762,31 +764,30 @@ EOT
                        );
 
                };
-               $wgOut->addHTML( Html::closeElement( 'ul' ) . "\n" );
+               $out->addHTML( Html::closeElement( 'ul' ) . "\n" );
                $res->free();
 
                // Add a links to [[Special:Whatlinkshere]]
                if ( $count > $limit ) {
-                       $wgOut->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
+                       $out->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
                }
-               $wgOut->addHTML( Html::closeElement( 'div' ) . "\n" );
+               $out->addHTML( Html::closeElement( 'div' ) . "\n" );
        }
 
        protected function imageDupes() {
-               global $wgOut, $wgLang;
-
                $this->loadFile();
+               $out = $this->getContext()->getOutput();
 
                $dupes = $this->mPage->getDuplicates();
                if ( count( $dupes ) == 0 ) {
                        return;
                }
 
-               $wgOut->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
-               $wgOut->addWikiMsg( 'duplicatesoffile',
-                       $wgLang->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
+               $out->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
+               $out->addWikiMsg( 'duplicatesoffile',
+                       $this->getContext()->getLanguage()->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
                );
-               $wgOut->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
+               $out->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
 
                /**
                 * @var $file File
@@ -806,9 +807,9 @@ EOT
                                        $file->getTitle()->getPrefixedText() );
                                $fromSrc = wfMsg( 'shared-repo-from', $file->getRepo()->getDisplayName() );
                        }
-                       $wgOut->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
+                       $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
                }
-               $wgOut->addHTML( "</ul></div>\n" );
+               $out->addHTML( "</ul></div>\n" );
        }
 
        /**
@@ -832,12 +833,12 @@ EOT
         * @param $description String
         */
        function showError( $description ) {
-               global $wgOut;
-               $wgOut->setPageTitle( wfMessage( 'internalerror' ) );
-               $wgOut->setRobotPolicy( 'noindex,nofollow' );
-               $wgOut->setArticleRelated( false );
-               $wgOut->enableClientCache( false );
-               $wgOut->addWikiText( $description );
+               $out = $this->getContext()->getOutput();
+               $out->setPageTitle( wfMessage( 'internalerror' ) );
+               $out->setRobotPolicy( 'noindex,nofollow' );
+               $out->setArticleRelated( false );
+               $out->enableClientCache( false );
+               $out->addWikiText( $description );
        }
 
        /**
@@ -862,7 +863,7 @@ EOT
  *
  * @ingroup Media
  */
-class ImageHistoryList {
+class ImageHistoryList extends ContextSource {
 
        /**
         * @var Title
@@ -897,6 +898,7 @@ class ImageHistoryList {
                $this->title = $imagePage->getTitle();
                $this->imagePage = $imagePage;
                $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
+               $this->setContext( $imagePage->getContext() );
        }
 
        /**
@@ -918,14 +920,13 @@ class ImageHistoryList {
         * @return string
         */
        public function beginImageHistoryList( $navLinks = '' ) {
-               global $wgOut, $wgUser;
                return Xml::element( 'h2', array( 'id' => 'filehistory' ), wfMsg( 'filehist' ) ) . "\n"
                        . "<div id=\"mw-imagepage-section-filehistory\">\n"
-                       . $wgOut->parse( wfMsgNoTrans( 'filehist-help' ) )
+                       . $this->getOutput()->parse( wfMsgNoTrans( 'filehist-help' ) )
                        . $navLinks . "\n"
                        . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
                        . '<tr><td></td>'
-                       . ( $this->current->isLocal() && ( $wgUser->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
+                       . ( $this->current->isLocal() && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
                        . '<th>' . wfMsgHtml( 'filehist-datetime' ) . '</th>'
                        . ( $this->showThumb ? '<th>' . wfMsgHtml( 'filehist-thumb' ) . '</th>' : '' )
                        . '<th>' . wfMsgHtml( 'filehist-dimensions' ) . '</th>'
@@ -948,22 +949,24 @@ class ImageHistoryList {
         * @return string
         */
        public function imageHistoryLine( $iscur, $file ) {
-               global $wgUser, $wgLang, $wgContLang;
+               global $wgContLang;
 
+               $user = $this->getUser();
+               $lang = $this->getLanguage();
                $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
                $img = $iscur ? $file->getName() : $file->getArchiveName();
-               $user = $file->getUser( 'id' );
-               $usertext = $file->getUser( 'text' );
+               $userId = $file->getUser( 'id' );
+               $userText = $file->getUser( 'text' );
                $description = $file->getDescription();
 
                $local = $this->current->isLocal();
                $row = $selected = '';
 
                // Deletion link
-               if ( $local && ( $wgUser->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
+               if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
                        $row .= '<td>';
                        # Link to remove from history
-                       if ( $wgUser->isAllowed( 'delete' ) ) {
+                       if ( $user->isAllowed( 'delete' ) ) {
                                $q = array( 'action' => 'delete' );
                                if ( !$iscur ) {
                                        $q['oldimage'] = $img;
@@ -975,16 +978,16 @@ class ImageHistoryList {
                                );
                        }
                        # Link to hide content. Don't show useless link to people who cannot hide revisions.
-                       $canHide = $wgUser->isAllowed( 'deleterevision' );
-                       if ( $canHide || ( $wgUser->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
-                               if ( $wgUser->isAllowed( 'delete' ) ) {
+                       $canHide = $user->isAllowed( 'deleterevision' );
+                       if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
+                               if ( $user->isAllowed( 'delete' ) ) {
                                        $row .= '<br />';
                                }
                                // If file is top revision or locked from this user, don't link
                                if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED ) ) {
                                        $del = Linker::revDeleteLinkDisabled( $canHide );
                                } else {
-                                       list( $ts, $name ) = explode( '!', $img, 2 );
+                                       list( $ts, ) = explode( '!', $img, 2 );
                                        $query = array(
                                                'type'   => 'oldimage',
                                                'target' => $this->title->getPrefixedText(),
@@ -1002,7 +1005,7 @@ class ImageHistoryList {
                $row .= '<td>';
                if ( $iscur ) {
                        $row .= wfMsgHtml( 'filehist-current' );
-               } elseif ( $local && $wgUser->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
+               } elseif ( $local && $user->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
                        if ( $file->isDeleted( File::DELETED_FILE ) ) {
                                $row .= wfMsgHtml( 'filehist-revert' );
                        } else {
@@ -1013,7 +1016,7 @@ class ImageHistoryList {
                                        array(
                                                'action' => 'revert',
                                                'oldimage' => $img,
-                                               'wpEditToken' => $wgUser->getEditToken( $img )
+                                               'wpEditToken' => $user->getEditToken( $img )
                                        ),
                                        array( 'known', 'noclasses' )
                                );
@@ -1028,7 +1031,7 @@ class ImageHistoryList {
                $row .= "<td $selected style='white-space: nowrap;'>";
                if ( !$file->userCan( File::DELETED_FILE ) ) {
                        # Don't link to unviewable files
-                       $row .= '<span class="history-deleted">' . $wgLang->timeanddate( $timestamp, true ) . '</span>';
+                       $row .= '<span class="history-deleted">' . $lang->timeanddate( $timestamp, true ) . '</span>';
                } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
                        if ( $local ) {
                                $this->preventClickjacking();
@@ -1036,22 +1039,22 @@ class ImageHistoryList {
                                # Make a link to review the image
                                $url = Linker::link(
                                        $revdel,
-                                       $wgLang->timeanddate( $timestamp, true ),
+                                       $lang->timeanddate( $timestamp, true ),
                                        array(),
                                        array(
                                                'target' => $this->title->getPrefixedText(),
                                                'file' => $img,
-                                               'token' => $wgUser->getEditToken( $img )
+                                               'token' => $user->getEditToken( $img )
                                        ),
                                        array( 'known', 'noclasses' )
                                );
                        } else {
-                               $url = $wgLang->timeanddate( $timestamp, true );
+                               $url = $lang->timeanddate( $timestamp, true );
                        }
                        $row .= '<span class="history-deleted">' . $url . '</span>';
                } else {
                        $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
-                       $row .= Xml::element( 'a', array( 'href' => $url ), $wgLang->timeanddate( $timestamp, true ) );
+                       $row .= Xml::element( 'a', array( 'href' => $url ), $lang->timeanddate( $timestamp, true ) );
                }
                $row .= "</td>";
 
@@ -1073,10 +1076,10 @@ class ImageHistoryList {
                        $row .= '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
                } else {
                        if ( $local ) {
-                               $row .= Linker::userLink( $user, $usertext ) . ' <span style="white-space: nowrap;">' .
-                               Linker::userToolLinks( $user, $usertext ) . '</span>';
+                               $row .= Linker::userLink( $userId, $userText ) . ' <span style="white-space: nowrap;">' .
+                               Linker::userToolLinks( $userId, $userText ) . '</span>';
                        } else {
-                               $row .= htmlspecialchars( $usertext );
+                               $row .= htmlspecialchars( $userText );
                        }
                }
                $row .= '</td>';
@@ -1100,8 +1103,7 @@ class ImageHistoryList {
         * @return string
         */
        protected function getThumbForLine( $file ) {
-               global $wgLang;
-
+               $lang = $this->getLanguage();
                if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE ) && !$file->isDeleted( File::DELETED_FILE ) ) {
                        $params = array(
                                'width' => '120',
@@ -1112,9 +1114,9 @@ class ImageHistoryList {
                        $thumbnail = $file->transform( $params );
                        $options = array(
                                'alt' => wfMsg( 'filehist-thumbtext',
-                                       $wgLang->timeanddate( $timestamp, true ),
-                                       $wgLang->date( $timestamp, true ),
-                                       $wgLang->time( $timestamp, true ) ),
+                                       $lang->timeanddate( $timestamp, true ),
+                                       $lang->date( $timestamp, true ),
+                                       $lang->time( $timestamp, true ) ),
                                'file-link' => true,
                        );
 
@@ -1188,6 +1190,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        }
 
        /**
+        * @param $row object
         * @return string
         */
        function formatRow( $row ) {
index 918bebc..2d01d06 100644 (file)
@@ -397,6 +397,31 @@ class Linker {
                return "<strong class=\"selflink\">{$prefix}{$html}{$inside}</strong>{$trail}";
        }
 
+       /**
+        * Get a message saying that an invalid title was encountered.
+        * This should be called after a method like Title::makeTitleSafe() returned
+        * a value indicating that the title object is invalid.
+        *
+        * @param $context IContextSource context to use to get the messages
+        * @param $namespace int Namespace number
+        * @param $title string Text of the title, without the namespace part
+        */
+       public static function getInvalidTitleDescription( IContextSource $context, $namespace, $title ) {
+               global $wgContLang;
+
+               // First we check whether the namespace exists or not.
+               if ( MWNamespace::exists( $namespace ) ) {
+                       if ( $namespace == NS_MAIN ) {
+                               $name = $context->msg( 'blanknamespace' )->text();
+                       } else {
+                               $name = $wgContLang->getFormattedNsText( $namespace );
+                       }
+                       return $context->msg( 'invalidtitle-knownnamespace', $namespace, $name, $title )->text();
+               } else {
+                       return $context->msg( 'invalidtitle-unknownnamespace', $namespace, $title )->text();
+               }
+       }
+
        /**
         * @param $title Title
         * @return Title
index ac788aa..bdccca1 100644 (file)
@@ -354,4 +354,16 @@ class MWNamespace {
                return $index == NS_USER || $index == NS_USER_TALK;
        }
 
+       /**
+        * It is not possible to use pages from this namespace as template?
+        *
+        * @since 1.20
+        * @param $index int Index to check
+        * @return bool
+        */
+       public static function isNonincludableNamespace( $index ) {
+               global $wgNonincludableNamespaces;
+               return $wgNonincludableNamespaces && in_array( $index, $wgNonincludableNamespaces );
+       }
+
 }
index ec6490a..5c79e8b 100644 (file)
@@ -17,9 +17,9 @@
  * version are hardcoded here
  */
 function wfPHPVersionError( $type ){
-       $mwVersion = '1.19';
+       $mwVersion = '1.20';
        $phpVersion = PHP_VERSION;
-       $message = "MediaWiki $mwVersion requires at least PHP version 5.2.3, you are using PHP $phpVersion.";
+       $message = "MediaWiki $mwVersion requires at least PHP version 5.3.2, you are using PHP $phpVersion.";
        if( $type == 'index.php' ) {
                $encLogo = htmlspecialchars(
                        str_replace( '//', '/', pathinfo( $_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME ) . '/'
index dc5e971..367f387 100644 (file)
@@ -16,11 +16,15 @@ abstract class PageQueryPage extends QueryPage {
         */
        public function formatResult( $skin, $row ) {
                global $wgContLang;
+
                $title = Title::makeTitleSafe( $row->namespace, $row->title );
-               $text = $row->title;
+
                if ( $title instanceof Title ) {
                        $text = $wgContLang->convert( $title->getPrefixedText() );
+                       return Linker::linkKnown( $title, htmlspecialchars( $text ) );
+               } else {
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $row->namespace, $row->title ) );
                }
-               return Linker::linkKnown( $title, htmlspecialchars( $text ) );
        }
 }
index 151cc76..55f56f7 100644 (file)
@@ -671,7 +671,7 @@ abstract class QueryPage extends SpecialPage {
                if ( !isset( $row->title ) ) {
                        return null;
                }
-               $title = Title::MakeTitle( intval( $row->namespace ), $row->title );
+               $title = Title::makeTitle( intval( $row->namespace ), $row->title );
                if ( $title ) {
                        $date = isset( $row->timestamp ) ? $row->timestamp : '';
                        $comments = '';
index 6764f8f..3140f02 100644 (file)
@@ -83,6 +83,7 @@ class Title {
        var $mRedirect = null;            // /< Is the article at this title a redirect?
        var $mNotificationTimestamp = array(); // /< Associative array of user ID -> timestamp/false
        var $mBacklinkCache = null;       // /< Cache of links to this title
+       var $mHasSubpage;                 // /< Whether a page has any subpages
        // @}
 
 
@@ -119,7 +120,8 @@ class Title {
         *   fied by a prefix.  If you want to force a specific namespace even if
         *   $text might begin with a namespace prefix, use makeTitle() or
         *   makeTitleSafe().
-        * @return Title, or null on an error.
+        * @throws MWException
+        * @return Title|null - Title or null on an error.
         */
        public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
                if ( is_object( $text ) ) {
@@ -179,13 +181,12 @@ class Title {
         * @return Title the new object, or NULL on an error
         */
        public static function newFromURL( $url ) {
-               global $wgLegalTitleChars;
                $t = new Title();
 
                # For compatibility with old buggy URLs. "+" is usually not valid in titles,
                # but some URLs used it as a space replacement and they still come
                # from some external search tools.
-               if ( strpos( $wgLegalTitleChars, '+' ) === false ) {
+               if ( strpos( self::legalChars(), '+' ) === false ) {
                        $url = str_replace( '+', ' ', $url );
                }
 
@@ -858,6 +859,7 @@ class Title {
         * This is MUCH simpler than individually testing for equivilance
         * against both NS_USER and NS_USER_TALK, and is also forward compatible.
         * @since 1.19
+        * @param $ns int
         * @return bool
         */
        public function hasSubjectNamespace( $ns ) {
@@ -1222,6 +1224,8 @@ class Title {
         * andthe wfArrayToCGI moved to getLocalURL();
         *
         * @since 1.19 (r105919)
+        * @param $query
+        * @param $query2 bool
         * @return String
         */
        private static function fixUrlQueryArgs( $query, $query2 = false ) {
@@ -1404,6 +1408,8 @@ class Title {
         * See getLocalURL for the arguments.
         *
         * @see self::getLocalURL
+        * @param $query string
+        * @param $query2 bool|string
         * @return String the URL
         */
        public function escapeLocalURL( $query = '', $query2 = false ) {
@@ -2468,8 +2474,9 @@ class Title {
        /**
         * Get the expiry time for the restriction against a given action
         *
+        * @param $action
         * @return String|Bool 14-char timestamp, or 'infinity' if the page is protected forever
-        *      or not protected at all, or false if the action is not recognised.
+        *     or not protected at all, or false if the action is not recognised.
         */
        public function getRestrictionExpiry( $action ) {
                if ( !$this->mRestrictionsLoaded ) {
@@ -3911,7 +3918,7 @@ class Title {
         */
        public function getPreviousRevisionID( $revId, $flags = 0 ) {
                $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
-               return $db->selectField( 'revision', 'rev_id',
+               $revId = $db->selectField( 'revision', 'rev_id',
                        array(
                                'rev_page' => $this->getArticleID( $flags ),
                                'rev_id < ' . intval( $revId )
@@ -3919,6 +3926,12 @@ class Title {
                        __METHOD__,
                        array( 'ORDER BY' => 'rev_id DESC' )
                );
+
+               if ( $revId === false ) {
+                       return false;
+               } else {
+                       return intval( $revId );
+               }
        }
 
        /**
@@ -3930,7 +3943,7 @@ class Title {
         */
        public function getNextRevisionID( $revId, $flags = 0 ) {
                $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
-               return $db->selectField( 'revision', 'rev_id',
+               $revId = $db->selectField( 'revision', 'rev_id',
                        array(
                                'rev_page' => $this->getArticleID( $flags ),
                                'rev_id > ' . intval( $revId )
@@ -3938,6 +3951,12 @@ class Title {
                        __METHOD__,
                        array( 'ORDER BY' => 'rev_id' )
                );
+
+               if ( $revId === false ) {
+                       return false;
+               } else {
+                       return intval( $revId );
+               }
        }
 
        /**
@@ -4310,9 +4329,10 @@ class Title {
                $dbr = wfGetDB( DB_SLAVE );
                $this->mNotificationTimestamp[$uid] = $dbr->selectField( 'watchlist',
                        'wl_notificationtimestamp',
-                       array( 'wl_namespace' => $this->getNamespace(),
+                       array(
+                               'wl_user' => $user->getId(),
+                               'wl_namespace' => $this->getNamespace(),
                                'wl_title' => $this->getDBkey(),
-                               'wl_user' => $user->getId()
                        ),
                        __METHOD__
                );
@@ -4467,7 +4487,7 @@ class Title {
         * $wgLang (such as special pages, which are in the user language).
         *
         * @since 1.18
-        * @return object Language
+        * @return Language
         */
        public function getPageLanguage() {
                global $wgLang;
index d3332fd..cb146b5 100644 (file)
@@ -1283,7 +1283,7 @@ class User {
                }
 
                # User/IP blocking
-               $block = Block::newFromTarget( $this->getName(), $ip, !$bFromSlave );
+               $block = Block::newFromTarget( $this, $ip, !$bFromSlave );
 
                # Proxy blocking
                if ( !$block instanceof Block && $ip !== null && !$this->isAllowed( 'proxyunbannable' )
@@ -2281,7 +2281,10 @@ class User {
         * Reset all options to the site defaults
         */
        public function resetOptions() {
+               $this->load();
+
                $this->mOptions = self::getDefaultOptions();
+               $this->mOptionsLoaded = true;
        }
 
        /**
@@ -3362,7 +3365,7 @@ class User {
         * @return String New token URL
         */
        private function invalidationTokenUrl( $token ) {
-               return $this->getTokenUrl( 'Invalidateemail', $token );
+               return $this->getTokenUrl( 'InvalidateEmail', $token );
        }
 
        /**
index e0b8d01..36da6fb 100644 (file)
@@ -436,9 +436,9 @@ class EmailNotification {
                        $res = $dbw->select( array( 'watchlist' ),
                                array( 'wl_user' ),
                                array(
-                                       'wl_title' => $title->getDBkey(),
-                                       'wl_namespace' => $title->getNamespace(),
                                        'wl_user != ' . intval( $editor->getID() ),
+                                       'wl_namespace' => $title->getNamespace(),
+                                       'wl_title' => $title->getDBkey(),
                                        'wl_notificationtimestamp IS NULL',
                                ), __METHOD__
                        );
@@ -453,9 +453,9 @@ class EmailNotification {
                                        array( /* SET */
                                                'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
                                        ), array( /* WHERE */
-                                               'wl_title' => $title->getDBkey(),
+                                               'wl_user' => $watchers,
                                                'wl_namespace' => $title->getNamespace(),
-                                               'wl_user' => $watchers
+                                               'wl_title' => $title->getDBkey(),
                                        ), __METHOD__
                                );
                                $dbw->commit( __METHOD__ );
index 2678f54..93e60e8 100644 (file)
@@ -37,6 +37,28 @@ class WikiPage extends Page {
         */
        const DELETE_NO_REVISIONS = 2;
 
+       // Constants for $mDataLoadedFrom and related
+
+       /**
+        * Data has not been loaded yet (or the object was cleared)
+        */
+       const DATA_NOT_LOADED = 0;
+
+       /**
+        * Data has been loaded from a slave database
+        */
+       const DATA_FROM_SLAVE = 1;
+
+       /**
+        * Data has been loaded from the master database
+        */
+       const DATA_FROM_MASTER = 2;
+
+       /**
+        * Data has been loaded from the master database using FOR UPDATE
+        */
+       const DATA_FOR_UPDATE = 3;
+
        /**
         * @var Title
         */
@@ -51,6 +73,11 @@ class WikiPage extends Page {
        public $mPreparedEdit = false;       // !< Array
        /**@}}*/
 
+       /**
+        * @var int; one of the DATA_* constants
+        */
+       protected $mDataLoadedFrom = self::DATA_NOT_LOADED;
+
        /**
         * @var Title
         */
@@ -117,16 +144,20 @@ class WikiPage extends Page {
         * Constructor from a page id
         *
         * @param $id Int article ID to load
+        * @param $from string|int one of the following values:
+        *        - "fromdb" or self::DATA_FROM_SLAVE to select from a slave database
+        *        - "fromdbmaster" or self::DATA_FROM_MASTER to select from the master database
         *
         * @return WikiPage|null
         */
-       public static function newFromID( $id ) {
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
+       public static function newFromID( $id, $from = 'fromdb' ) {
+               $from = self::convertSelectType( $from );
+               $db = wfGetDB( $from === self::DATA_FROM_MASTER ? DB_MASTER : DB_SLAVE );
+               $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
                if ( !$row ) {
                        return null;
                }
-               return self::newFromRow( $row );
+               return self::newFromRow( $row, $from );
        }
 
        /**
@@ -135,14 +166,38 @@ class WikiPage extends Page {
         * @since 1.20
         * @param $row object: database row containing at least fields returned
         *        by selectFields().
+        * @param $from string|int: source of $data:
+        *        - "fromdb" or self::DATA_FROM_SLAVE: from a slave DB
+        *        - "fromdbmaster" or self::DATA_FROM_MASTER: from the master DB
+        *        - "forupdate" or self::DATA_FOR_UPDATE: from the master DB using SELECT FOR UPDATE
         * @return WikiPage
         */
-       public static function newFromRow( $row ) {
+       public static function newFromRow( $row, $from = 'fromdb' ) {
                $page = self::factory( Title::newFromRow( $row ) );
-               $page->loadFromRow( $row );
+               $page->loadFromRow( $row, $from );
                return $page;
        }
 
+       /**
+        * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to DATA_* constants.
+        *
+        * @param $type object|string|int
+        * @return mixed
+        */
+       private static function convertSelectType( $type ) {
+               switch ( $type ) {
+               case 'fromdb':
+                       return self::DATA_FROM_SLAVE;
+               case 'fromdbmaster':
+                       return self::DATA_FROM_MASTER;
+               case 'forupdate':
+                       return self::DATA_FOR_UPDATE;
+               default:
+                       // It may already be an integer or whatever else
+                       return $type;
+               }
+       }
+
        /**
         * Returns overrides for action handlers.
         * Classes listed here will be used instead of the default one when
@@ -170,6 +225,7 @@ class WikiPage extends Page {
         */
        public function clear() {
                $this->mDataLoaded = false;
+               $this->mDataLoadedFrom = self::DATA_NOT_LOADED;
 
                $this->mCounter = null;
                $this->mRedirectTarget = null; # Title object if set
@@ -207,14 +263,15 @@ class WikiPage extends Page {
         * Fetch a page record with the given conditions
         * @param $dbr DatabaseBase object
         * @param $conditions Array
+        * @param $options Array
         * @return mixed Database result resource, or false on failure
         */
-       protected function pageData( $dbr, $conditions ) {
+       protected function pageData( $dbr, $conditions, $options = array() ) {
                $fields = self::selectFields();
 
                wfRunHooks( 'ArticlePageDataBefore', array( &$this, &$fields ) );
 
-               $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__ );
+               $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
 
                wfRunHooks( 'ArticlePageDataAfter', array( &$this, &$row ) );
 
@@ -227,12 +284,13 @@ class WikiPage extends Page {
         *
         * @param $dbr DatabaseBase object
         * @param $title Title object
+        * @param $options Array
         * @return mixed Database result resource, or false on failure
         */
-       public function pageDataFromTitle( $dbr, $title ) {
+       public function pageDataFromTitle( $dbr, $title, $options = array() ) {
                return $this->pageData( $dbr, array(
                        'page_namespace' => $title->getNamespace(),
-                       'page_title'     => $title->getDBkey() ) );
+                       'page_title'     => $title->getDBkey() ), $options );
        }
 
        /**
@@ -240,38 +298,54 @@ class WikiPage extends Page {
         *
         * @param $dbr DatabaseBase
         * @param $id Integer
+        * @param $options Array
         * @return mixed Database result resource, or false on failure
         */
-       public function pageDataFromId( $dbr, $id ) {
-               return $this->pageData( $dbr, array( 'page_id' => $id ) );
+       public function pageDataFromId( $dbr, $id, $options = array() ) {
+               return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
        }
 
        /**
         * Set the general counter, title etc data loaded from
         * some source.
         *
-        * @param $data Object|String One of the following:
-        *              A DB query result object or...
-        *              "fromdb" to get from a slave DB or...
-        *              "fromdbmaster" to get from the master DB
+        * @param $from object|string|int One of the following:
+        *        - A DB query result object
+        *        - "fromdb" or self::DATA_FROM_SLAVE to get from a slave DB
+        *        - "fromdbmaster" or self::DATA_FROM_MASTER to get from the master DB
+        *        - "forupdate"  or self::DATA_FOR_UPDATE to get from the master DB using SELECT FOR UPDATE
+        *
         * @return void
         */
-       public function loadPageData( $data = 'fromdb' ) {
-               if ( $data === 'fromdbmaster' ) {
+       public function loadPageData( $from = 'fromdb' ) {
+               $from = self::convertSelectType( $from );
+               if ( is_int( $from ) && $from <= $this->mDataLoadedFrom ) {
+                       // We already have the data from the correct location, no need to load it twice.
+                       return;
+               }
+
+               if ( $from === self::DATA_FOR_UPDATE ) {
+                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle, array( 'FOR UPDATE' ) );
+               } elseif ( $from === self::DATA_FROM_MASTER ) {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
-               } elseif ( $data === 'fromdb' ) { // slave
+               } elseif ( $from === self::DATA_FROM_SLAVE ) {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
                        # Use a "last rev inserted" timestamp key to dimish the issue of slave lag.
                        # Note that DB also stores the master position in the session and checks it.
                        $touched = $this->getCachedLastEditTime();
                        if ( $touched ) { // key set
                                if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
+                                       $from = self::DATA_FROM_MASTER;
                                        $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
                                }
                        }
+               } else {
+                       // No idea from where the caller got this data, assume slave database.
+                       $data = $from;
+                       $from = self::DATA_FROM_SLAVE;
                }
 
-               $this->loadFromRow( $data );
+               $this->loadFromRow( $data, $from );
        }
 
        /**
@@ -280,8 +354,13 @@ class WikiPage extends Page {
         * @since 1.20
         * @param $data object: database row containing at least fields returned
         *        by selectFields()
+        * @param $from string|int One of the following:
+        *        - "fromdb" or self::DATA_FROM_SLAVE if the data comes from a slave DB
+        *        - "fromdbmaster" or self::DATA_FROM_MASTER if the data comes from the master DB
+        *        - "forupdate"  or self::DATA_FOR_UPDATE if the data comes from from
+        *          the master DB using SELECT FOR UPDATE
         */
-       public function loadFromRow( $data ) {
+       public function loadFromRow( $data, $from ) {
                $lc = LinkCache::singleton();
 
                if ( $data ) {
@@ -303,6 +382,7 @@ class WikiPage extends Page {
                }
 
                $this->mDataLoaded = true;
+               $this->mDataLoadedFrom = self::convertSelectType( $from );
        }
 
        /**
@@ -1282,7 +1362,9 @@ class WikiPage extends Page {
                $user = is_null( $user ) ? $wgUser : $user;
                $status = Status::newGood( array() );
 
-               # Load $this->mTitle->getArticleID() and $this->mLatest if it's not already
+               // Load the data from the master database if needed.
+               // The caller may already loaded it from the master or even loaded it using
+               // SELECT FOR UPDATE, so do not override that using clear().
                $this->loadPageData( 'fromdbmaster' );
 
                $flags = $this->checkFlags( $flags );
@@ -1718,7 +1800,7 @@ class WikiPage extends Page {
         * @param &$cascade Integer. Set to false if cascading protection isn't allowed.
         * @param $expiry Array: per restriction type expiration
         * @param $user User The user updating the restrictions
-        * @return bool true on success
+        * @return Status
         */
        public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
                global $wgContLang;
@@ -1984,19 +2066,24 @@ class WikiPage extends Page {
                $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
        ) {
                global $wgUser;
-               $user = is_null( $user ) ? $wgUser : $user;
 
                wfDebug( __METHOD__ . "\n" );
 
+               if ( $this->mTitle->getDBkey() === '' ) {
+                       return WikiPage::DELETE_NO_PAGE;
+               }
+
+               $user = is_null( $user ) ? $wgUser : $user;
                if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error ) ) ) {
                        return WikiPage::DELETE_HOOK_ABORTED;
                }
-               $dbw = wfGetDB( DB_MASTER );
-               $t = $this->mTitle->getDBkey();
-               $id = $id ? $id : $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
 
-               if ( $t === '' || $id == 0 ) {
-                       return WikiPage::DELETE_NO_PAGE;
+               if ( $id == 0 ) {
+                       $this->loadPageData( 'forupdate' );
+                       $id = $this->getID();
+                       if ( $id == 0 ) {
+                               return WikiPage::DELETE_NO_PAGE;
+                       }
                }
 
                // Bitfields to further suppress the content
@@ -2011,6 +2098,7 @@ class WikiPage extends Page {
                        $bitfield = 'rev_deleted';
                }
 
+               $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
                // For now, shunt the revision data into the archive table.
                // Text is *not* removed from the text table; bulk storage
index 1103814..f0386a1 100644 (file)
@@ -700,31 +700,49 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * @param $params array
-        * @return Title
+        * @param $load bool|string Whether load the object's state from the database:
+        *        - false: don't load (if the pageid is given, it will still be loaded)
+        *        - 'fromdb': load from a slave database
+        *        - 'fromdbmaster': load from the master database
+        * @return WikiPage
         */
-       public function getTitleOrPageId( $params ) {
+       public function getTitleOrPageId( $params, $load = false ) {
                $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
 
-               $titleObj = null;
+               $pageObj = null;
                if ( isset( $params['title'] ) ) {
                        $titleObj = Title::newFromText( $params['title'] );
                        if ( !$titleObj ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                        }
+                       $pageObj = WikiPage::factory( $titleObj );
+                       if ( $load !== false ) {
+                               $pageObj->loadPageData( $load );
+                       }
                } elseif ( isset( $params['pageid'] ) ) {
-                       $titleObj = Title::newFromID( $params['pageid'] );
-                       if ( !$titleObj ) {
+                       if ( $load === false ) {
+                               $load = 'fromdb';
+                       }
+                       $pageObj = WikiPage::newFromID( $params['pageid'], $load );
+                       if ( !$pageObj ) {
                                $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
                        }
                }
-               return $titleObj;
+
+               return $pageObj;
        }
 
        /**
         * @return array
         */
-       public function getTitleOrPageIdErrorMessage( ) {
-               return $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) );
+       public function getTitleOrPageIdErrorMessage() {
+               return array_merge(
+                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       array(
+                               array( 'invalidtitle', 'title' ),
+                               array( 'nosuchpageid', 'pageid' ),
+                       )
+               );
        }
 
        /**
index 7d3a40b..c566a5c 100644 (file)
@@ -149,7 +149,10 @@ class ApiBlock extends ApiBase {
                                ApiBase::PARAM_REQUIRED => true
                        ),
                        'token' => null,
-                       'gettoken' => false,
+                       'gettoken' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
                        'expiry' => 'never',
                        'reason' => null,
                        'anononly' => false,
@@ -166,7 +169,7 @@ class ApiBlock extends ApiBase {
        public function getParamDescription() {
                return array(
                        'user' => 'Username, IP address or IP range you want to block',
-                       'token' => 'A block token previously obtained through the gettoken parameter or prop=info',
+                       'token' => 'A block token previously obtained through prop=info',
                        'gettoken' => 'If set, a block token will be returned, and no other action will be taken',
                        'expiry' => 'Relative expiry time, e.g. \'5 months\' or \'2 weeks\'. If set to \'infinite\', \'indefinite\' or \'never\', the block will never expire.',
                        'reason' => 'Reason for block (optional)',
index 15c1f82..cefdaac 100644 (file)
@@ -46,13 +46,12 @@ class ApiDelete extends ApiBase {
        public function execute() {
                $params = $this->extractRequestParams();
 
-               $titleObj = $this->getTitleOrPageId( $params );
-               $pageObj = WikiPage::factory( $titleObj );
-               $pageObj->loadPageData( 'fromdbmaster' );
+               $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
                if ( !$pageObj->exists() ) {
                        $this->dieUsageMsg( 'notanarticle' );
                }
 
+               $titleObj = $pageObj->getTitle();
                $reason = ( isset( $params['reason'] ) ? $params['reason'] : null );
                $user = $this->getUser();
 
@@ -230,8 +229,6 @@ class ApiDelete extends ApiBase {
                return array_merge( parent::getPossibleErrors(),
                        $this->getTitleOrPageIdErrorMessage(),
                        array(
-                               array( 'invalidtitle', 'title' ),
-                               array( 'nosuchpageid', 'pageid' ),
                                array( 'notanarticle' ),
                                array( 'hookaborted', 'error' ),
                                array( 'delete-toobig', 'limit' ),
index b45f351..19b1950 100644 (file)
@@ -48,7 +48,8 @@ class ApiEditPage extends ApiBase {
                        $this->dieUsageMsg( 'missingtext' );
                }
 
-               $titleObj = $this->getTitleOrPageId( $params );
+               $pageObj = $this->getTitleOrPageId( $params );
+               $titleObj = $pageObj->getTitle();
                if ( $titleObj->isExternal() ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                }
@@ -371,9 +372,7 @@ class ApiEditPage extends ApiBase {
                return array_merge( parent::getPossibleErrors(),
                        $this->getTitleOrPageIdErrorMessage(),
                        array(
-                               array( 'nosuchpageid', 'pageid' ),
                                array( 'missingtext' ),
-                               array( 'invalidtitle', 'title' ),
                                array( 'createonly-exists' ),
                                array( 'nocreate-missing' ),
                                array( 'nosuchrevid', 'undo' ),
index 5df1ff6..d808075 100644 (file)
@@ -96,7 +96,7 @@ class ApiFeedContributions extends ApiBase {
        }
 
        protected function feedItem( $row ) {
-               $title = Title::MakeTitle( intval( $row->page_namespace ), $row->page_title );
+               $title = Title::makeTitle( intval( $row->page_namespace ), $row->page_title );
                if( $title ) {
                        $date = $row->rev_timestamp;
                        $comments = $title->getTalkPage()->getFullURL();
index 7ef1da0..5ea2571 100644 (file)
@@ -133,7 +133,7 @@ class ApiFileRevert extends ApiBase {
 
        public function getParamDescription() {
                $params = array(
-                       'filename' => 'Target filename',
+                       'filename' => 'Target filename without the File: prefix',
                        'token' => 'Edit token. You can get one of these through prop=info',
                        'comment' => 'Upload comment',
                        'archivename' => 'Archive name of the revision to revert to',
index 17e9225..7dfdffc 100644 (file)
@@ -165,7 +165,7 @@ abstract class ApiFormatBase extends ApiBase {
 You are looking at the HTML representation of the <?php echo( $this->mFormat ); ?> format.<br />
 HTML is good for debugging, but is unsuitable for application use.<br />
 Specify the format parameter to change the output format.<br />
-To see the non HTML representation of the <?php echo( $this->mFormat ); ?> format, set format=<?php echo( $this->mFormat ); ?>.<br />
+To see the non HTML representation of the <?php echo( $this->mFormat ); ?> format, set format=<?php echo( strtolower( $this->mFormat ) ); ?>.<br />
 See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
 <a href='<?php echo( $script ); ?>'>API help</a> for more information.
 </small>
index ade9f1f..5093b6b 100644 (file)
@@ -186,8 +186,16 @@ class ApiImportReporter extends ImportReporter {
        function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
                // Add a result entry
                $r = array();
-               ApiQueryBase::addTitleInfo( $r, $title );
-               $r['revisions'] = intval( $successCount );
+
+               if ( $title === null ) {\r
+                       # Invalid or non-importable title
+                       $r['title'] = $pageInfo['title'];
+                       $r['invalid'] = '';\r
+               } else {\r
+                       ApiQueryBase::addTitleInfo( $r, $title );
+                       $r['revisions'] = intval( $successCount );
+               }
+
                $this->mResultArr[] = $r;
 
                // Piggyback on the parent to do the logging
index 8c035dc..10540a3 100644 (file)
@@ -80,6 +80,7 @@ class ApiMain extends ApiBase {
                'patrol' => 'ApiPatrol',
                'import' => 'ApiImport',
                'userrights' => 'ApiUserrights',
+               'options' => 'ApiOptions',
        );
 
        /**
@@ -361,7 +362,7 @@ class ApiMain extends ApiBase {
                        $this->executeAction();
                } catch ( Exception $e ) {
                        // Log it
-                       if ( $e instanceof MWException ) {
+                       if ( !( $e instanceof UsageException ) ) {
                                wfDebugLog( 'exception', $e->getLogMessage() );
                        }
 
diff --git a/includes/api/ApiOptions.php b/includes/api/ApiOptions.php
new file mode 100644 (file)
index 0000000..7bcfe1e
--- /dev/null
@@ -0,0 +1,154 @@
+<?php
+/**
+ *
+ *
+ * Created on Apr 15, 2012
+ *
+ * Copyright © 2012 Szymon Świerkosz beau@adres.pl
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+* API module that facilitates the changing of user's preferences.
+* Requires API write mode to be enabled.
+*
+ * @ingroup API
+ */
+class ApiOptions extends ApiBase {
+
+       public function __construct( $main, $action ) {
+               parent::__construct( $main, $action );
+       }
+
+       /**
+        * Changes preferences of the current user.
+        */
+       public function execute() {
+               $user = $this->getUser();
+
+               if ( $user->isAnon() ) {
+                       $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
+               }
+
+               $params = $this->extractRequestParams();
+               $changes = 0;
+
+               if ( isset( $params['optionvalue'] ) && !isset( $params['optionname'] ) ) {
+                       $this->dieUsageMsg( array( 'missingparam', 'optionname' ) );
+               }
+
+               if ( $params['reset'] ) {
+                       $user->resetOptions();
+                       $changes++;
+               }
+               if ( count( $params['change'] ) ) {
+                       foreach ( $params['change'] as $entry ) {
+                               $array = explode( '=', $entry, 2 );
+                               $user->setOption( $array[0], isset( $array[1] ) ? $array[1] : null );
+                               $changes++;
+                       }
+               }
+               if ( isset( $params['optionname'] ) ) {
+                       $newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null;
+                       $user->setOption( $params['optionname'], $newValue );
+                       $changes++;
+               }
+
+               if ( $changes ) {
+                       // Commit changes
+                       $user->saveSettings();
+               } else {
+                       $this->dieUsage( 'No changes were requested', 'nochanges' );
+               }
+
+               $this->getResult()->addValue( null, $this->getModuleName(), 'success' );
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
+                       'reset' => false,
+                       'change' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'optionname' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                       ),
+                       'optionvalue' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                       ),
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'token' => 'An options token previously obtained through the action=tokens',
+                       'reset' => 'Resets all preferences to the site defaults',
+                       'change' => 'Pipe-separated list of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters',
+                       'optionname' => 'A name of a option which should have an optionvalue set',
+                       'optionvalue' => 'A value of the option specified by the optionname, can contain pipe characters',
+               );
+       }
+
+       public function getDescription() {
+               return 'Change preferences of the current user';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'notloggedin' ),
+                       array( 'nochanges' ),
+               ) );
+       }
+
+       public function needsToken() {
+               return true;
+       }
+
+       public function getTokenSalt() {
+               return '';
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Options';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=options&reset=&token=123ABC',
+                       'api.php?action=options&change=skin=vector|hideminor=1&token=123ABC',
+                       'api.php?action=options&reset=&change=skin=monobook&optionname=nickname&optionvalue=[[User:Beau|Beau]]%20([[User_talk:Beau|talk]])&token=123ABC',
+               );
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
index c2bdeb1..dbcd43c 100644 (file)
@@ -59,13 +59,13 @@ class ApiParse extends ApiBase {
                // The parser needs $wgTitle to be set, apparently the
                // $title parameter in Parser::parse isn't enough *sigh*
                // TODO: Does this still need $wgTitle?
-               global $wgParser, $wgTitle, $wgLang;
+               global $wgParser, $wgTitle;
 
                // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang breaks
                $oldLang = null;
-               if ( isset( $params['uselang'] ) && $params['uselang'] != $wgLang->getCode() ) {
-                       $oldLang = $wgLang; // Backup wgLang
-                       $wgLang = Language::factory( $params['uselang'] );
+               if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
+                       $oldLang = $this->getContext()->getLanguage(); // Backup language
+                       $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) );
                }
 
                $popts = ParserOptions::newFromContext( $this->getContext() );
@@ -285,6 +285,9 @@ class ApiParse extends ApiBase {
                                $result->setContent( $result_array['psttext'], $this->pstText );
                        }
                }
+               if ( isset( $prop['properties'] ) ) {
+                       $result_array['properties'] = $this->formatProperties( $p_result->getProperties() );
+               }
 
                $result_mapping = array(
                        'redirects' => 'r',
@@ -297,12 +300,13 @@ class ApiParse extends ApiBase {
                        'iwlinks' => 'iw',
                        'sections' => 's',
                        'headitems' => 'hi',
+                       'properties' => 'pp',
                );
                $this->setIndexedTagNames( $result_array, $result_mapping );
                $result->addValue( null, $this->getModuleName(), $result_array );
 
                if ( !is_null( $oldLang ) ) {
-                       $wgLang = $oldLang; // Reset $wgLang to $oldLang
+                       $this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang
                }
        }
 
@@ -464,6 +468,17 @@ class ApiParse extends ApiBase {
                return $result;
        }
 
+       private function formatProperties( $properties ) {
+               $result = array();
+               foreach ( $properties as $name => $value ) {
+                       $entry = array();
+                       $entry['name'] = $name;
+                       $this->getResult()->setContent( $entry, $value );
+                       $result[] = $entry;
+               }
+               return $result;
+       }
+
        private function formatCss( $css ) {
                $result = array();
                foreach ( $css as $file => $link ) {
@@ -499,7 +514,7 @@ class ApiParse extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle',
+                               ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle|iwlinks|properties',
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'text',
@@ -518,6 +533,7 @@ class ApiParse extends ApiBase {
                                        'headhtml',
                                        'iwlinks',
                                        'wikitext',
+                                       'properties',
                                )
                        ),
                        'pst' => false,
@@ -556,6 +572,7 @@ class ApiParse extends ApiBase {
                                ' headhtml       - Gives parsed <head> of the page',
                                ' iwlinks        - Gives interwiki links in the parsed wikitext',
                                ' wikitext       - Gives the original wikitext that was parsed',
+                               ' properties     - Gives various properties defined in the parsed wikitext',
                        ),
                        'pst' => array(
                                'Do a pre-save transform on the input before parsing it',
@@ -572,7 +589,10 @@ class ApiParse extends ApiBase {
        }
 
        public function getDescription() {
-               return 'Parses wikitext and returns parser output';
+               return array(
+                       'Parses wikitext and returns parser output',
+                       'See the various prop-Modules of action=query to get information from the current version of a page',
+               );
        }
 
        public function getPossibleErrors() {
index 57bf111..d156468 100644 (file)
@@ -37,8 +37,8 @@ class ApiProtect extends ApiBase {
                global $wgRestrictionLevels;
                $params = $this->extractRequestParams();
 
-               $titleObj = $this->getTitleOrPageId( $params );
-               $pageObj = WikiPage::factory( $titleObj );
+               $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
+               $titleObj = $pageObj->getTitle();
 
                $errors = $titleObj->getUserPermissionsErrors( 'protect', $this->getUser() );
                if ( $errors ) {
@@ -192,8 +192,6 @@ class ApiProtect extends ApiBase {
                return array_merge( parent::getPossibleErrors(),
                        $this->getTitleOrPageIdErrorMessage(),
                        array(
-                               array( 'invalidtitle', 'title' ),
-                               array( 'nosuchpageid', 'pageid' ),
                                array( 'toofewexpiries', 'noofexpiries', 'noofprotections' ),
                                array( 'create-titleexists' ),
                                array( 'missingtitle-createonly' ),
index ce28d03..b0f272b 100644 (file)
@@ -77,7 +77,8 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                }
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
-               $this->addOption( 'ORDER BY', 'cat_title' . ( $params['dir'] == 'descending' ? ' DESC' : '' ) );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $this->addOption( 'ORDER BY', 'cat_title' . $sort );
 
                $prop = array_flip( $params['prop'] );
                $this->addFieldsIf( array( 'cat_pages', 'cat_subcats', 'cat_files' ), isset( $prop['size'] ) );
index 60a05a7..87e7024 100644 (file)
@@ -137,8 +137,8 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
                $limit = $params['limit'];
                $this->addOption( 'LIMIT', $limit + 1 );
-               $this->addOption( 'ORDER BY', 'img_name' .
-                                               ( $params['dir'] == 'descending' ? ' DESC' : '' ) );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $this->addOption( 'ORDER BY', 'img_name' . $sort );
 
                $res = $this->select( __METHOD__ );
 
index 903f144..7e7fc40 100644 (file)
@@ -105,7 +105,10 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                $this->addOption( 'LIMIT', $limit + 1 );
 
                if ( !$params['unique'] ) {
-                       $this->addOption( 'ORDER BY', 'pl_title, pl_from' );
+                       $this->addOption( 'ORDER BY', array(
+                               'pl_title',
+                               'pl_from'
+                       ));
                }
 
                $res = $this->select( __METHOD__ );
index f3254c5..7e89a95 100644 (file)
@@ -153,7 +153,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        $this->addOption( 'STRAIGHT_JOIN' );
                        // We have to GROUP BY all selected fields to stop
                        // PostgreSQL from whining
-                       $this->addOption( 'GROUP BY', implode( ', ', $selectFields ) );
+                       $this->addOption( 'GROUP BY', $selectFields );
                        $forceNameTitleIndex = false;
                }
 
index 381ef55..8903714 100644 (file)
@@ -369,14 +369,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                if ( !is_null( $this->params['continue'] ) ) {
                        $this->parseContinueParam();
                } else {
-                       if ( $this->params['title'] !== '' ) {
-                               $title = Title::newFromText( $this->params['title'] );
-                               if ( !$title ) {
-                                       $this->dieUsageMsg( array( 'invalidtitle', $this->params['title'] ) );
-                               } else {
-                                       $this->rootTitle = $title;
-                               }
-                       }
+                       $this->rootTitle = $this->getTitleOrPageId( $this->params )->getTitle();
                }
 
                // only image titles are allowed for the root in imageinfo mode
@@ -436,7 +429,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $retval = array(
                        'title' => array(
                                ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
+                       ),
+                       'pageid' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
                        ),
                        'continue' => null,
                        'namespace' => array(
@@ -468,7 +463,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 
        public function getParamDescription() {
                $retval = array(
-                       'title' => 'Title to search',
+                       'title' => "Title to search. Cannot be used together with {$this->bl_code}pageid",
+                       'pageid' => "Pageid to search. Cannot be used together with {$this->bl_code}title",
                        'continue' => 'When more results are available, use this to continue',
                        'namespace' => 'The namespace to enumerate',
                );
@@ -499,11 +495,13 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        }
 
        public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'invalidtitle', 'title' ),
-                       array( 'code' => 'bad_image_title', 'info' => "The title for {$this->getModuleName()} query must be an image" ),
-                       array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
-               ) );
+               return array_merge( parent::getPossibleErrors(),
+                       $this->getTitleOrPageIdErrorMessage(),
+                       array(
+                               array( 'code' => 'bad_image_title', 'info' => "The title for {$this->getModuleName()} query must be an image" ),
+                               array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
+                       )
+               );
        }
 
        public function getExamples() {
index 243d1ac..cbda6ab 100644 (file)
@@ -124,14 +124,14 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
 
                $this->addOption( 'USE INDEX', array( 'categorylinks' => 'cl_from' ) );
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                // Don't order by cl_from if it's constant in the WHERE clause
                if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
-                       $this->addOption( 'ORDER BY', 'cl_to' . $dir );
+                       $this->addOption( 'ORDER BY', 'cl_to' . $sort );
                } else {
                        $this->addOption( 'ORDER BY', array(
-                                               'cl_from' . $dir,
-                                               'cl_to' . $dir
+                                               'cl_from' . $sort,
+                                               'cl_to' . $sort
                        ));
                }
 
index 7f0b827..82c28f4 100644 (file)
@@ -54,7 +54,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
        private function run( $resultPageSet = null ) {
                $params = $this->extractRequestParams();
 
-               $categoryTitle = $this->getTitleOrPageId( $params );
+               $categoryTitle = $this->getTitleOrPageId( $params )->getTitle();
                if ( $categoryTitle->getNamespace() != NS_CATEGORY ) {
                        $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
                }
@@ -374,7 +374,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                        array(
                                array( 'code' => 'invalidcategory', 'info' => 'The category name you entered is not valid' ),
                                array( 'code' => 'badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
-                               array( 'nosuchpageid', 'pageid' ),
                        )
                );
        }
index 397bdc4..c25f561 100644 (file)
@@ -180,7 +180,10 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        if ( $params['unique'] ) {
                                $this->addOption( 'GROUP BY', 'ar_title' );
                        } else {
-                               $this->addOption( 'ORDER BY', 'ar_title, ar_timestamp' );
+                               $this->addOption( 'ORDER BY', array(
+                                       'ar_title',
+                                       'ar_timestamp'
+                               ));
                        }
                } else {
                        if ( $mode == 'revs' ) {
index 0132d67..6fb3ea3 100644 (file)
@@ -91,14 +91,14 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                        );
                }
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                // Don't order by i1.img_name if it's constant in the WHERE clause
                if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
-                       $this->addOption( 'ORDER BY', 'i2.img_name' . $dir );
+                       $this->addOption( 'ORDER BY', 'i2.img_name' . $sort );
                } else {
                        $this->addOption( 'ORDER BY', array(
-                                       'i1.img_name' . $dir,
-                                       'i2.img_name' . $dir
+                                       'i1.img_name' . $sort,
+                                       'i2.img_name' . $sort
                        ));
                }
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
index 7bf97d3..4d99055 100644 (file)
@@ -56,6 +56,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $fld_dimensions = isset( $prop['dimensions'] );
                $fld_description = isset( $prop['description'] ) || isset( $prop['parseddescription'] );
                $fld_mime = isset( $prop['mime'] );
+               $fld_mediatype = isset( $prop['mediatype'] );
                $fld_metadata = isset( $prop['metadata'] );
                $fld_bitdepth = isset( $prop['bitdepth'] );
 
@@ -68,6 +69,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $this->addFieldsIf( array( 'fa_height', 'fa_width', 'fa_size' ), $fld_dimensions || $fld_size );
                $this->addFieldsIf( 'fa_description', $fld_description );
                $this->addFieldsIf( array( 'fa_major_mime', 'fa_minor_mime' ), $fld_mime );
+               $this->addFieldsIf( 'fa_media_type', $fld_mediatype );
                $this->addFieldsIf( 'fa_metadata', $fld_metadata );
                $this->addFieldsIf( 'fa_bits', $fld_bitdepth );
 
@@ -117,8 +119,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
 
                $limit = $params['limit'];
                $this->addOption( 'LIMIT', $limit + 1 );
-               $this->addOption( 'ORDER BY', 'fa_name' .
-                                               ( $params['dir'] == 'descending' ? ' DESC' : '' ) );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $this->addOption( 'ORDER BY', 'fa_name' . $sort );
 
                $res = $this->select( __METHOD__ );
 
@@ -165,6 +167,9 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                                $row->fa_description, $title );
                                }
                        }
+                       if ( $fld_mediatype ) {
+                               $file['mediatype'] = $row->fa_media_type;
+                       }
                        if ( $fld_metadata ) {
                                $file['metadata'] = $row->fa_metadata
                                                ? ApiQueryImageInfo::processMetaData( unserialize( $row->fa_metadata ), $result )
@@ -235,6 +240,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                        'description',
                                        'parseddescription',
                                        'mime',
+                                       'mediatype',
                                        'metadata',
                                        'bitdepth'
                                ),
@@ -261,9 +267,10 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                ' description       - Adds description the image version',
                                ' parseddescription - Parse the description on the version',
                                ' mime              - Adds MIME of the image',
+                               ' mediatype         - Adds the media type of the image',
                                ' metadata          - Lists EXIF metadata for the version of the image',
                                ' bitdepth          - Adds the bit depth of the version',
-            ),
+                       ),
                );
        }
 
index feda177..8ebe3ec 100644 (file)
@@ -89,10 +89,17 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                                $this->addWhereFld( 'iwl_title', $params['title'] );
                                $this->addOption( 'ORDER BY', 'iwl_from' );
                        } else {
-                               $this->addOption( 'ORDER BY', 'iwl_title, iwl_from' );
+                               $this->addOption( 'ORDER BY', array(
+                                       'iwl_title',
+                                       'iwl_from'
+                               ));
                        }
                } else {
-                       $this->addOption( 'ORDER BY', 'iwl_prefix, iwl_title, iwl_from' );
+                       $this->addOption( 'ORDER BY', array(
+                               'iwl_prefix',
+                               'iwl_title',
+                               'iwl_from'
+                       ));
                }
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
@@ -205,7 +212,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
        public function getExamples() {
                return array(
                        'api.php?action=query&list=iwbacklinks&iwbltitle=Test&iwblprefix=wikibooks',
-                       'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&iwblprefix=wikibooks&prop=info'
+                       'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info'
                );
        }
 
index bc42fe0..f39835a 100644 (file)
@@ -76,26 +76,26 @@ class ApiQueryIWLinks extends ApiQueryBase {
                        );
                }
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                if ( isset( $params['prefix'] ) ) {
                        $this->addWhereFld( 'iwl_prefix', $params['prefix'] );
                        if ( isset( $params['title'] ) ) {
                                $this->addWhereFld( 'iwl_title', $params['title'] );
-                               $this->addOption( 'ORDER BY', 'iwl_from' . $dir );
+                               $this->addOption( 'ORDER BY', 'iwl_from' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                               'iwl_title' . $dir,
-                                               'iwl_from' . $dir
+                                               'iwl_title' . $sort,
+                                               'iwl_from' . $sort
                                ));
                        }
                } else {
                        // Don't order by iwl_from if it's constant in the WHERE clause
                        if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
-                               $this->addOption( 'ORDER BY', 'iwl_prefix' . $dir );
+                               $this->addOption( 'ORDER BY', 'iwl_prefix' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array (
-                                               'iwl_from' . $dir,
-                                               'iwl_prefix' . $dir
+                                               'iwl_from' . $sort,
+                                               'iwl_prefix' . $sort
                                ));
                        }
                }
index 03a2482..135979a 100644 (file)
@@ -430,7 +430,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @param $img File
         * @return string
         */
-       private function getContinueStr( $img ) {
+       protected function getContinueStr( $img ) {
                return $img->getOriginalTitle()->getText() .
                        '|' .  $img->getTimestamp();
        }
index 64d7ff4..6f488cd 100644 (file)
@@ -75,14 +75,14 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                        );
                }
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                // Don't order by il_from if it's constant in the WHERE clause
                if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
-                       $this->addOption( 'ORDER BY', 'il_to' . $dir );
+                       $this->addOption( 'ORDER BY', 'il_to' . $sort );
                } else {
                        $this->addOption( 'ORDER BY', array(
-                                               'il_from' . $dir,
-                                               'il_to' . $dir
+                                               'il_from' . $sort,
+                                               'il_to' . $sort
                        ));
                }
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
index d28642a..e5db4d8 100644 (file)
@@ -228,6 +228,21 @@ class ApiQueryInfo extends ApiQueryBase {
                return $cachedWatchToken;
        }
 
+       public static function getOptionsToken( $pageid, $title ) {
+               global $wgUser;
+               if ( !$wgUser->isLoggedIn() ) {
+                       return false;
+               }
+
+               static $cachedOptionsToken = null;
+               if ( !is_null( $cachedOptionsToken ) ) {
+                       return $cachedOptionsToken;
+               }
+
+               $cachedOptionsToken = $wgUser->getEditToken();
+               return $cachedOptionsToken;
+       }
+
        public function execute() {
                $this->params = $this->extractRequestParams();
                if ( !is_null( $this->params['prop'] ) ) {
index 1573494..4233560 100644 (file)
@@ -89,10 +89,17 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                                $this->addWhereFld( 'll_title', $params['title'] );
                                $this->addOption( 'ORDER BY', 'll_from' );
                        } else {
-                               $this->addOption( 'ORDER BY', 'll_title, ll_from' );
+                               $this->addOption( 'ORDER BY', array(
+                                       'll_title',
+                                       'll_from'
+                               ));
                        }
                } else {
-                       $this->addOption( 'ORDER BY', 'll_lang, ll_title, ll_from' );
+                       $this->addOption( 'ORDER BY', array(
+                               'll_lang',
+                               'll_title',
+                               'll_from'
+                       ));
                }
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
@@ -205,7 +212,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
        public function getExamples() {
                return array(
                        'api.php?action=query&list=langbacklinks&lbltitle=Test&lbllang=fr',
-                       'api.php?action=query&generator=langbacklinks&glbltitle=Test&lbllang=fr&prop=info'
+                       'api.php?action=query&generator=langbacklinks&glbltitle=Test&glbllang=fr&prop=info'
                );
        }
 
index d505d72..b6f9a99 100644 (file)
@@ -70,26 +70,26 @@ class ApiQueryLangLinks extends ApiQueryBase {
                        );
                }
 
-           $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
-           if ( isset( $params['lang'] ) ) {
+                       $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+                       if ( isset( $params['lang'] ) ) {
                        $this->addWhereFld( 'll_lang', $params['lang'] );
                        if ( isset( $params['title'] ) ) {
                                $this->addWhereFld( 'll_title', $params['title'] );
-                               $this->addOption( 'ORDER BY', 'll_from' . $dir );
+                               $this->addOption( 'ORDER BY', 'll_from' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                                       'll_title' . $dir,
-                                                       'll_from' . $dir
+                                                       'll_title' . $sort,
+                                                       'll_from' . $sort
                                ));
                        }
                } else {
                        // Don't order by ll_from if it's constant in the WHERE clause
                        if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
-                               $this->addOption( 'ORDER BY', 'll_lang' . $dir );
+                               $this->addOption( 'ORDER BY', 'll_lang' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                                       'll_from' . $dir,
-                                                       'll_lang' . $dir
+                                                       'll_from' . $sort,
+                                                       'll_lang' . $sort
                                ));
                        }
                }
index 6e6da53..4dea419 100644 (file)
@@ -129,7 +129,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                        );
                }
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                // Here's some MySQL craziness going on: if you use WHERE foo='bar'
                // and later ORDER BY foo MySQL doesn't notice the ORDER BY is pointless
                // but instead goes and filesorts, because the index for foo was used
@@ -137,13 +137,13 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                // clause from the ORDER BY clause
                $order = array();
                if ( count( $this->getPageSet()->getGoodTitles() ) != 1 ) {
-                       $order[] = $this->prefix . '_from' . $dir;
+                       $order[] = $this->prefix . '_from' . $sort;
                }
                if ( count( $params['namespace'] ) != 1 ) {
-                       $order[] = $this->prefix . '_namespace' . $dir;
+                       $order[] = $this->prefix . '_namespace' . $sort;
                }
 
-               $order[] = $this->prefix . "_title" . $dir;
+               $order[] = $this->prefix . '_title' . $sort;
                $this->addOption( 'ORDER BY', $order );
                $this->addOption( 'USE INDEX', $this->prefix . '_from' );
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
index fa58bdf..7390546 100644 (file)
@@ -327,7 +327,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        "rev_id >= '$revid')"
                                );
                        }
-                       $this->addOption( 'ORDER BY', 'rev_page, rev_id' );
+                       $this->addOption( 'ORDER BY', array(
+                               'rev_page',
+                               'rev_id'
+                       ));
 
                        // assumption testing -- we should never get more then $pageCount rows.
                        $limit = $pageCount;
index e11d110..fc5d7bb 100644 (file)
@@ -142,6 +142,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['fallback'] = $fallbacks;
                $this->getResult()->setIndexedTagName( $data['fallback'], 'lang' );
 
+               if( $wgContLang->hasVariants() ) {
+                       $variants = array();
+                       foreach( $wgContLang->getVariants() as $code ) {
+                               $variants[] = array( 'code' => $code );
+                       }
+                       $data['variants'] = $variants;
+                       $this->getResult()->setIndexedTagName( $data['variants'], 'lang' );
+               }
+
                if ( $wgContLang->isRTL() ) {
                        $data['rtl'] = '';
                }
@@ -206,6 +215,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        if ( MWNamespace::isContent( $ns ) ) {
                                $data[$ns]['content'] = '';
                        }
+
+                       if ( MWNamespace::isNonincludableNamespace( $ns ) ) {
+                               $data[$ns]['nonincludable'] = '';
+                       }
                }
 
                $this->getResult()->setIndexedTagName( $data, 'ns' );
index 8e2f20d..1654382 100644 (file)
@@ -185,7 +185,7 @@ class ApiQueryContributions extends ApiQueryBase {
                if ( !is_null( $show ) ) {
                        $show = array_flip( $show );
                        if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
-                                       || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) ) ) {
+                                       || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) ) ) {
                                $this->dieUsageMsg( 'show' );
                        }
 
index a0ee227..cbb35ae 100644 (file)
@@ -50,7 +50,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        protected function getCurrentUserInfo() {
-               global $wgRequest, $wgHiddenPrefs;
+               global $wgHiddenPrefs;
                $user = $this->getUser();
                $result = $this->getResult();
                $vals = array();
@@ -136,7 +136,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                }
 
                if ( isset( $this->prop['acceptlang'] ) ) {
-                       $langs = $wgRequest->getAcceptLang();
+                       $langs = $this->getRequest()->getAcceptLang();
                        $acceptLang = array();
                        foreach ( $langs as $lang => $val ) {
                                $r = array( 'q' => $val );
index 31624bd..38244ff 100644 (file)
@@ -61,10 +61,10 @@ class ApiQueryUsers extends ApiQueryBase {
                return $this->tokenFunctions;
        }
 
-        /**
-         * @param $user User
-         * @return String
-         */
+       /**
+        * @param $user User
+        * @return String
+        */
        public static function getUserrightsToken( $user ) {
                global $wgUser;
                // Since the permissions check for userrights is non-trivial,
index 4adadf1..ce4ce50 100644 (file)
@@ -90,7 +90,10 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                if ( count( $params['namespace'] ) == 1 ) {
                        $this->addOption( 'ORDER BY', 'wl_title' . $sort );
                } else {
-                       $this->addOption( 'ORDER BY', 'wl_namespace' . $sort . ', wl_title' . $sort );
+                       $this->addOption( 'ORDER BY', array(
+                               'wl_namespace' . $sort,
+                               'wl_title' . $sort
+                       ));
                }
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
                $res = $this->select( __METHOD__ );
index 4a68826..c56d646 100644 (file)
@@ -64,9 +64,9 @@ class ApiTokens extends ApiBase {
                wfProfileIn( __METHOD__ );
                $types = array( 'patrol' => 'ApiQueryRecentChanges::getPatrolToken' );
                $names = array( 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
-                       'email', 'import', 'watch' );
+                       'email', 'import', 'watch', 'options' );
                foreach ( $names as $name ) {
-                       $types[$name] = 'ApiQUeryInfo::get' . ucfirst( $name ) . 'Token';
+                       $types[$name] = 'ApiQueryInfo::get' . ucfirst( $name ) . 'Token';
                }
                wfRunHooks( 'ApiTokensGetTokenTypes', array( &$types ) );
                ksort( $types );
index e599e32..32e0d88 100644 (file)
@@ -98,7 +98,10 @@ class ApiUnblock extends ApiBase {
                        ),
                        'user' => null,
                        'token' => null,
-                       'gettoken' => false,
+                       'gettoken' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
                        'reason' => null,
                );
        }
@@ -108,7 +111,7 @@ class ApiUnblock extends ApiBase {
                return array(
                        'id' => "ID of the block you want to unblock (obtained through list=blocks). Cannot be used together with {$p}user",
                        'user' => "Username, IP address or IP range you want to unblock. Cannot be used together with {$p}id",
-                       'token' => "An unblock token previously obtained through the gettoken parameter or {$p}prop=info",
+                       'token' => "An unblock token previously obtained through prop=info",
                        'gettoken' => 'If set, an unblock token will be returned, and no other action will be taken',
                        'reason' => 'Reason for unblock (optional)',
                );
index d342997..856e2ac 100644 (file)
@@ -76,7 +76,7 @@ class ApiUndelete extends ApiBase {
                $info['title'] = $titleObj->getPrefixedText();
                $info['revisions'] = intval( $retval[0] );
                $info['fileversions'] = intval( $retval[1] );
-               $info['reason'] = intval( $retval[2] );
+               $info['reason'] = $retval[2];
                $this->getResult()->addValue( null, $this->getModuleName(), $info );
        }
 
index 0df0cd8..a3c2b52 100644 (file)
@@ -1,11 +1,32 @@
 <?php
+/**
+ * Data caching with dependencies.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+
 /**
  * This class stores an arbitrary value along with its dependencies.
  * Users should typically only use DependencyWrapper::getValueFromCache(),
  * rather than instantiating one of these objects directly.
  * @ingroup Cache
  */
-
 class DependencyWrapper {
        var $value;
        var $deps;
index 26602f4..c0c5609 100644 (file)
@@ -1,9 +1,31 @@
 <?php
 /**
- * Contain the FileCacheBase class
+ * Data storage in the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Cache
  */
+
+/**
+ * Base class for data storage in the file system.
+ *
+ * @ingroup Cache
+ */
 abstract class FileCacheBase {
        protected $mKey;
        protected $mType = 'object';
index c27ab00..6a9ecd2 100644 (file)
@@ -1,8 +1,30 @@
 <?php
-
 /**
  * Caches user genders when needed to use correct namespace aliases.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
  * @author Niklas Laxström
+ * @ingroup Cache
+ */
+
+/**
+ * Caches user genders when needed to use correct namespace aliases.
+ *
  * @since 1.18
  */
 class GenderCache {
index 11e2ae7..0a3c002 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * HTML cache invalidation of all pages linking to a given title.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * Class to invalidate the HTML cache of all the pages linking to a given title.
index 256df57..f9ea135 100644 (file)
@@ -1,9 +1,33 @@
 <?php
 /**
- * Contain the HTMLFileCache class
+ * Page view caching in the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Cache
  */
+
+/**
+ * Page view caching in the file system.
+ * The only cacheable actions are "view" and "history". Also special pages
+ * will not be cached.
+ *
+ * @ingroup Cache
+ */
 class HTMLFileCache extends FileCacheBase {
        /**
         * Construct an ObjectFileCache from a Title and an action
index ab33dcf..372f983 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Batch query to determine page existence.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * Class representing a list of titles
index a73eaaa..f759c02 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Page existence cache.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+
 /**
  * Cache for article titles (prefixed DB keys) and ids linked from one source
  *
index 3673359..fe43635 100644 (file)
@@ -1,11 +1,28 @@
 <?php
 /**
+ * Session storage in object cache.
+ *
  * This file gets included if $wgSessionsInMemcache is set in the config.
  * It redirects session handling functions to store their data in memcached
  * instead of the local filesystem. Depending on circumstances, it may also
  * be necessary to change the cookie settings to work across hostnames.
  * See: http://www.php.net/manual/en/function.session-set-save-handler.php
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Cache
  */
index d1e658b..91de65f 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Localisation messages cache.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Cache
  */
index 3356f1f..ed1e49a 100644 (file)
@@ -1,9 +1,31 @@
 <?php
 /**
- * Contain the ObjectFileCache class
+ * Object cache in the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Cache
  */
+
+/**
+ * Object cache in the file system.
+ *
+ * @ingroup Cache
+ */
 class ObjectFileCache extends FileCacheBase {
        /**
         * Construct an ObjectFileCache from a key and a type
index e73fc2d..61f1e8c 100644 (file)
@@ -1,9 +1,31 @@
 <?php
 /**
- * Contain the ResourceFileCache class
+ * Resource loader request result caching in the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Cache
  */
+
+/**
+ * Resource loader request result caching in the file system.
+ *
+ * @ingroup Cache
+ */
 class ResourceFileCache extends FileCacheBase {
        protected $mCacheWorthy;
 
index e560e0e..e8e57cd 100644 (file)
@@ -1,6 +1,22 @@
 <?php
 /**
- * See deferred.txt
+ * Squid cache purging.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Cache
  */
index 84ed9f4..6eb51af 100644 (file)
@@ -798,7 +798,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @return bool
         */
        function isWriteQuery( $sql ) {
-               return !preg_match( '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|\(SELECT)\b/i', $sql );
+               return !preg_match( '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|EXPLAIN|\(SELECT)\b/i', $sql );
        }
 
        /**
@@ -1475,6 +1475,7 @@ abstract class DatabaseBase implements DatabaseType {
        function selectRow( $table, $vars, $conds, $fname = 'DatabaseBase::selectRow',
                $options = array(), $join_conds = array() )
        {
+               $options = (array)$options;
                $options['LIMIT'] = 1;
                $res = $this->select( $table, $vars, $conds, $fname, $options, $join_conds );
 
index e8f35f0..37a732b 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * User interface for the difference engine
+ * User interface for the difference engine.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup DifferenceEngine
index 22dbdef..7435ca9 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * A repository for files accessible via the local filesystem.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileRepo
  */
index 196c9de..6533dae 100644 (file)
 /**
  * Base code for file repositories.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileRepo
  */
index 4eea903..6f28b10 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Generic operation result for FileRepo-related operations
+ * Generic operation result for FileRepo-related operations.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup FileRepo
index ba2694e..4f515a9 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Foreign repository accessible through api.php requests.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileRepo
  */
@@ -87,6 +102,10 @@ class ForeignAPIRepo extends FileRepo {
                                # same repo.
                                $results[$k] = false;
                                unset( $files[$k] );
+                       } elseif ( FileBackend::isStoragePath( $f ) ) {
+                               $results[$k] = false;
+                               unset( $files[$k] );
+                               wfWarn( "Got mwstore:// path '$f'." );
                        }
                }
 
@@ -203,6 +222,9 @@ class ForeignAPIRepo extends FileRepo {
         */
        function getThumbUrlFromCache( $name, $width, $height, $params="" ) {
                global $wgMemc;
+               // We can't check the local cache using FileRepo functions because
+               // we override fileExistsBatch(). We have to use the FileBackend directly.
+               $backend = $this->getBackend(); // convenience
 
                if ( !$this->canCacheThumbs() ) {
                        $result = null; // can't pass "null" by reference, but it's ok as default value
@@ -243,9 +265,11 @@ class ForeignAPIRepo extends FileRepo {
                $localFilename = $localPath . "/" . $fileName;
                $localUrl =  $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
 
-               if( $this->fileExists( $localFilename ) && isset( $metadata['timestamp'] ) ) {
+               if( $backend->fileExists( array( 'src' => $localFilename ) )
+                       && isset( $metadata['timestamp'] ) )
+               {
                        wfDebug( __METHOD__ . " Thumbnail was already downloaded before\n" );
-                       $modified = $this->getFileTimestamp( $localFilename );
+                       $modified = $backend->getFileTimestamp( array( 'src' => $localFilename ) );
                        $remoteModified = strtotime( $metadata['timestamp'] );
                        $current = time();
                        $diff = abs( $modified - $current );
@@ -264,15 +288,13 @@ class ForeignAPIRepo extends FileRepo {
                }
 
                # @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
-               wfSuppressWarnings();
-               $backend = $this->getBackend();
+               $backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
                $op = array( 'op' => 'create', 'dst' => $localFilename, 'content' => $thumb );
                if( !$backend->doOperation( $op )->isOK() ) {
                        wfRestoreWarnings();
                        wfDebug( __METHOD__ . " could not write to thumb path\n" );
                        return $foreignUrl;
                }
-               wfRestoreWarnings();
                $knownThumbUrls[$sizekey] = $localUrl;
                $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
                wfDebug( __METHOD__ . " got local thumb $localUrl, saving to cache \n" );
index 30f9977..6a1cfaf 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * A foreign repository with an accessible MediaWiki database
+ * A foreign repository with an accessible MediaWiki database.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup FileRepo
index 602902d..2132ba6 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * A foreign repository with a MediaWiki database accessible via the configured LBFactory
+ * A foreign repository with a MediaWiki database accessible via the configured LBFactory.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup FileRepo
index eecd67a..1b8042d 100644 (file)
@@ -3,6 +3,21 @@
  * Local repository that stores files in the local filesystem and registers them
  * in the wiki's own database.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileRepo
  */
index 9d58bc8..3f39f60 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * File repository with no files.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileRepo
  */
index b109803..0def2d8 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Prioritized list of file repositories
+ * Prioritized list of file repositories.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup FileRepo
index 5d2bb52..ec21c8f 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Non-directory file on the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileBackend
  */
index 9839fa1..d9a9c59 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * File system based backend.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileBackend
  * @author Aaron Schulz
@@ -175,7 +192,12 @@ class FSFileBackend extends FileBackendStore {
                }
 
                $ok = copy( $params['src'], $dest );
-               if ( !$ok ) {
+               // In some cases (at least over NFS), copy() returns true when it fails.
+               if ( !$ok || ( filesize( $params['src'] ) !== filesize( $dest ) ) ) {
+                       if ( $ok ) { // PHP bug
+                               unlink( $dest ); // remove broken file
+                               trigger_error( __METHOD__ . ": copy() failed but returned true." );
+                       }
                        $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
                        return $status;
                }
@@ -218,7 +240,12 @@ class FSFileBackend extends FileBackendStore {
                }
 
                $ok = copy( $source, $dest );
-               if ( !$ok ) {
+               // In some cases (at least over NFS), copy() returns true when it fails.
+               if ( !$ok || ( filesize( $source ) !== filesize( $dest ) ) ) {
+                       if ( $ok ) { // PHP bug
+                               unlink( $dest ); // remove broken file
+                               trigger_error( __METHOD__ . ": copy() failed but returned true." );
+                       }
                        $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
                        return $status;
                }
@@ -625,21 +652,13 @@ abstract class FSFileBackendList implements Iterator {
                        return new DirectoryIterator( $dir );
                } else { // recursive
                        # Get an iterator that will return leaf nodes (non-directories)
-                       if ( MWInit::classExists( 'FilesystemIterator' ) ) { // PHP >= 5.3
-                               # RecursiveDirectoryIterator extends FilesystemIterator.
-                               # FilesystemIterator::SKIP_DOTS default is inconsistent in PHP 5.3.x.
-                               $flags = FilesystemIterator::CURRENT_AS_SELF | FilesystemIterator::SKIP_DOTS;
-                               return new RecursiveIteratorIterator(
-                                       new RecursiveDirectoryIterator( $dir, $flags ),
-                                       RecursiveIteratorIterator::CHILD_FIRST // include dirs
-                               );
-                       } else { // PHP < 5.3
-                               # RecursiveDirectoryIterator extends DirectoryIterator
-                               return new RecursiveIteratorIterator(
-                                       new RecursiveDirectoryIterator( $dir ),
-                                       RecursiveIteratorIterator::CHILD_FIRST // include dirs
-                               );
-                       }
+                       # RecursiveDirectoryIterator extends FilesystemIterator.
+                       # FilesystemIterator::SKIP_DOTS default is inconsistent in PHP 5.3.x.
+                       $flags = FilesystemIterator::CURRENT_AS_SELF | FilesystemIterator::SKIP_DOTS;
+                       return new RecursiveIteratorIterator(
+                               new RecursiveDirectoryIterator( $dir, $flags ),
+                               RecursiveIteratorIterator::CHILD_FIRST // include dirs
+                       );
                }
        }
 
index 544c9c2..6f2d291 100644 (file)
@@ -8,6 +8,23 @@
  */
 
 /**
+ * Base class for all file backends.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileBackend
  * @author Aaron Schulz
index d705f76..69c227d 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * File backend registration handling.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileBackend
  * @author Aaron Schulz
@@ -35,7 +52,7 @@ class FileBackendGroup {
 
        /**
         * Destroy the singleton instance
-        * 
+        *
         * @return void
         */
        public static function destroySingleton() {
@@ -44,7 +61,7 @@ class FileBackendGroup {
 
        /**
         * Register file backends from the global variables
-        * 
+        *
         * @return void
         */
        protected function initFromGlobals() {
index 208d34b..769aef6 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Proxy backend that mirrors writes to several internal backends.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileBackend
  * @author Aaron Schulz
index fab62e5..30a64e2 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Base class for all backends using particular storage medium.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileBackend
  * @author Aaron Schulz
index 9c9f3e2..8a2d428 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Helper class for representing operations with transaction support.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileBackend
  * @author Aaron Schulz
index 41d30dd..f40c323 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * OpenStack Swift based file backend.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileBackend
  * @author Russ Nelson
index 7843d6c..ae22a1c 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Location holder of files stored temporarily
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileBackend
  */
index 1eb9eca..078f3be 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Version of FileJournal that logs to a DB table.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileJournal
  * @author Aaron Schulz
index f60b7f9..99f2887 100644 (file)
@@ -5,6 +5,23 @@
  */
 
 /**
+ * File operation journaling.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileJournal
  * @author Aaron Schulz
index dcba1eb..0a0ba54 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Version of LockManager based on using DB table locks.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup LockManager
+ */
 
 /**
  * Version of LockManager based on using DB table locks.
index d35a1ae..21a3a4e 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Simple version of LockManager based on using FS lock files.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup LockManager
+ */
 
 /**
  * Simple version of LockManager based on using FS lock files.
@@ -27,7 +48,7 @@ class FSLockManager extends LockManager {
 
        /**
         * Construct a new instance from configuration.
-        * 
+        *
         * $config includes:
         *     'lockDirectory' : Directory containing the lock files
         *
@@ -80,7 +101,7 @@ class FSLockManager extends LockManager {
         *
         * @param $path string
         * @param $type integer
-        * @return Status 
+        * @return Status
         */
        protected function doSingleLock( $path, $type ) {
                $status = Status::newGood();
@@ -118,10 +139,10 @@ class FSLockManager extends LockManager {
 
        /**
         * Unlock a single resource key
-        * 
+        *
         * @param $path string
         * @param $type integer
-        * @return Status 
+        * @return Status
         */
        protected function doSingleUnlock( $path, $type ) {
                $status = Status::newGood();
@@ -138,8 +159,16 @@ class FSLockManager extends LockManager {
                                // If a LOCK_SH comes in while we have a LOCK_EX, we don't
                                // actually add a handler, so check for handler existence.
                                if ( isset( $this->handles[$path][$type] ) ) {
-                                       // Mark this handle to be unlocked and closed
-                                       $handlesToClose[] = $this->handles[$path][$type];
+                                       if ( $type === self::LOCK_EX
+                                               && isset( $this->locksHeld[$path][self::LOCK_SH] )
+                                               && !isset( $this->handles[$path][self::LOCK_SH] ) )
+                                       {
+                                               // EX lock came first: move this handle to the SH one
+                                               $this->handles[$path][self::LOCK_SH] = $this->handles[$path][$type];
+                                       } else {
+                                               // Mark this handle to be unlocked and closed
+                                               $handlesToClose[] = $this->handles[$path][$type];
+                                       }
                                        unset( $this->handles[$path][$type] );
                                }
                        }
@@ -151,7 +180,7 @@ class FSLockManager extends LockManager {
                                $status->merge( $this->closeLockHandles( $path, $handlesToClose ) );
                                $status->merge( $this->pruneKeyLockFiles( $path ) );
                        } else {
-                               // Unix: unlink() can be used on files currently open by this 
+                               // Unix: unlink() can be used on files currently open by this
                                // process and we must do so in order to avoid race conditions
                                $status->merge( $this->pruneKeyLockFiles( $path ) );
                                $status->merge( $this->closeLockHandles( $path, $handlesToClose ) );
@@ -164,14 +193,12 @@ class FSLockManager extends LockManager {
        private function closeLockHandles( $path, array $handlesToClose ) {
                $status = Status::newGood();
                foreach ( $handlesToClose as $handle ) {
-                       wfSuppressWarnings();
                        if ( !flock( $handle, LOCK_UN ) ) {
                                $status->fatal( 'lockmanager-fail-releaselock', $path );
                        }
                        if ( !fclose( $handle ) ) {
                                $status->warning( 'lockmanager-fail-closelock', $path );
                        }
-                       wfRestoreWarnings();
                }
                return $status;
        }
@@ -179,12 +206,10 @@ class FSLockManager extends LockManager {
        private function pruneKeyLockFiles( $path ) {
                $status = Status::newGood();
                if ( !count( $this->locksHeld[$path] ) ) {
-                       wfSuppressWarnings();
                        # No locks are held for the lock file anymore
                        if ( !unlink( $this->getLockPath( $path ) ) ) {
                                $status->warning( 'lockmanager-fail-deletelock', $path );
                        }
-                       wfRestoreWarnings();
                        unset( $this->locksHeld[$path] );
                        unset( $this->handles[$path] );
                }
index 742c9d0..4f78ede 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Version of LockManager based on using lock daemon servers.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup LockManager
+ */
 
 /**
  * Manage locks using a lock daemon server.
index 9f29eb3..8b3e229 100644 (file)
@@ -5,6 +5,23 @@
  */
 
 /**
+ * Resource locking handling.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup LockManager
  * @author Aaron Schulz
index 8465d58..7caff62 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Lock manager registration handling.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup LockManager
+ */
+
 /**
  * Class to handle file lock manager registration
  * 
index 05e1eb8..c5a0bd1 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Deleted file in the 'filearchive' table
+ * Deleted file in the 'filearchive' table.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup FileAbstraction
index d32a0e3..c9395c6 100644 (file)
@@ -9,6 +9,21 @@
 /**
  * Base code for files.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileAbstraction
  */
index 8014413..a5b8582 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Foreign file accessible through api.php requests.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup FileAbstraction
  */
index 191a712..fa7834a 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Foreign file with an accessible MediaWiki database
+ * Foreign file with an accessible MediaWiki database.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup FileAbstraction
index 701a1ec..467bf1b 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Local file in the wiki's own database
+ * Local file in the wiki's own database.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup FileAbstraction
@@ -1231,19 +1246,18 @@ class LocalFile extends File {
                }
 
                wfDebugLog( 'imagemove', "Got request to move {$this->name} to " . $target->getText() );
-               $this->lock(); // begin
-
                $batch = new LocalFileMoveBatch( $this, $target );
+
+               $this->lock(); // begin
                $batch->addCurrent();
                $batch->addOlds();
-
                $status = $batch->execute();
+               $this->unlock(); // done
+
                wfDebugLog( 'imagemove', "Finished moving {$this->name}" );
 
                $this->purgeEverything();
-               $this->unlock(); // done
-
-               if ( $status->isOk() ) {
+               if ( $status->isOK() ) {
                        // Now switch the object
                        $this->title = $target;
                        // Force regeneration of the name and hashpath
@@ -1273,31 +1287,33 @@ class LocalFile extends File {
                        return $this->readOnlyFatalStatus();
                }
 
-               $this->lock(); // begin
-
+               $dbw = $this->repo->getMasterDB();
                $batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
-               $batch->addCurrent();
+               $archiveNames = array();
 
+               $this->lock(); // begin
+               $batch->addCurrent();
                # Get old version relative paths
-               $dbw = $this->repo->getMasterDB();
                $result = $dbw->select( 'oldimage',
                        array( 'oi_archive_name' ),
                        array( 'oi_name' => $this->getName() ) );
                foreach ( $result as $row ) {
                        $batch->addOld( $row->oi_archive_name );
-                       $this->purgeOldThumbnails( $row->oi_archive_name );
+                       $archiveNames[] = $row->oi_archive_name;
                }
                $status = $batch->execute();
-
                if ( $status->isOK() ) {
                        // Update site_stats
                        $site_stats = $dbw->tableName( 'site_stats' );
                        $dbw->query( "UPDATE $site_stats SET ss_images=ss_images-1", __METHOD__ );
-                       $this->purgeEverything();
                }
-
                $this->unlock(); // done
 
+               $this->purgeEverything();
+               foreach ( $archiveNames as $archiveName ) {
+                       $this->purgeOldThumbnails( $archiveName );
+               }
+
                return $status;
        }
 
@@ -1353,25 +1369,21 @@ class LocalFile extends File {
                        return $this->readOnlyFatalStatus();
                }
 
-               $this->lock(); // begin
-
                $batch = new LocalFileRestoreBatch( $this, $unsuppress );
 
+               $this->lock(); // begin
                if ( !$versions ) {
                        $batch->addAll();
                } else {
                        $batch->addIds( $versions );
                }
-
                $status = $batch->execute();
-
                if ( $status->isGood() ) {
                        $cleanupStatus = $batch->cleanup();
                        $cleanupStatus->successCount = 0;
                        $cleanupStatus->failCount = 0;
                        $status->merge( $cleanupStatus );
                }
-
                $this->unlock(); // done
 
                return $status;
@@ -2171,7 +2183,7 @@ class LocalFileRestoreBatch {
 class LocalFileMoveBatch {
 
        /**
-        * @var File
+        * @var LocalFile
         */
        var $file;
 
@@ -2266,17 +2278,17 @@ class LocalFileMoveBatch {
                        return $statusMove;
                }
 
-               $this->db->begin( __METHOD__ );
+               $this->file->lock(); // begin
                $statusDb = $this->doDBUpdates();
                wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: {$statusDb->successCount} successes, {$statusDb->failCount} failures" );
                if ( !$statusDb->isGood() ) {
-                       $this->db->rollback( __METHOD__ );
+                       $this->file->unlockAndRollback();
                        // Something went wrong with the DB updates, so remove the target files
                        $this->cleanupTarget( $triplets );
                        $statusDb->ok = false;
                        return $statusDb;
                }
-               $this->db->commit( __METHOD__ );
+               $this->file->unlock(); // done
 
                // Everything went ok, remove the source files
                $this->cleanupSource( $triplets );
index cec70d6..bd3ff1e 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Old file in the oldimage table
+ * Old file in the oldimage table.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup FileAbstraction
index 7c5eab0..b217d60 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * File without associated database record
+ * File without associated database record.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup FileAbstraction
index f9afbb2..0c3876c 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Core installer command line interface.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index 046fa16..2cc539b 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * DBMS-specific installation helper.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index 923b994..6483c4e 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * DBMS-specific updater helper.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index a6c4fd6..76df7af 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * IBM_DB2-specific installer.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index 02d7cb1..f812ac2 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * IBM_DB2-specific updater.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index 5801f26..9a389dd 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Installer-specific wikitext formating.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
 
 class InstallDocFormatter {
        static function format( $text ) {
index b380787..f703c7a 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Base code for MediaWiki installer.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
@@ -24,7 +39,7 @@
 abstract class Installer {
 
        // This is the absolute minimum PHP version we can support
-       const MINIMUM_PHP_VERSION = '5.2.3';
+       const MINIMUM_PHP_VERSION = '5.3.2';
 
        /**
         * @var array
index 46c6a90..9ed486c 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Generator for LocalSettings.php file.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index caec558..5230c81 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * MySQL-specific installer.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index 5e6ae7e..e453b01 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * MySQL-specific updater.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
@@ -196,6 +211,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        // 1.20
                        array( 'addTable', 'config',                            'patch-config.sql' ),
                        array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
+                       array( 'addField', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id.sql' ),
+                       array( 'addIndex', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id-index.sql' ),
                );
        }
 
index 50f18c9..863a625 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Oracle-specific installer.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index 73bbc57..aa3c334 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Oracle-specific updater.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index 5144686..641f6e3 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * PostgreSQL-specific installer.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index a03c6c4..43005a8 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * PostgreSQL-specific updater.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
@@ -97,6 +112,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'ipblocks',      'ipb_create_account',   'SMALLINT NOT NULL DEFAULT 1' ),
                        array( 'addPgField', 'ipblocks',      'ipb_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'ipblocks',      'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
+                       array( 'addPgField', 'ipblocks',      'ipb_parent_block_id',            'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
                        array( 'addPgField', 'filearchive',   'fa_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'logging',       'log_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'logging',       'log_id',               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
@@ -194,6 +210,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        # New indexes
                        array( 'addPgIndex', 'archive',       'archive_user_text',      '(ar_user_text)' ),
                        array( 'addPgIndex', 'image',         'img_sha1',               '(img_sha1)' ),
+                       array( 'addPgIndex', 'ipblocks',      'ipb_parent_block_id',              '(ipb_parent_block_id)' ),
                        array( 'addPgIndex', 'oldimage',      'oi_sha1',                '(oi_sha1)' ),
                        array( 'addPgIndex', 'page',          'page_mediawiki_title',   '(page_title) WHERE page_namespace = 8' ),
                        array( 'addPgIndex', 'pagelinks',     'pagelinks_title',        '(pl_title)' ),
@@ -290,6 +307,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'changeFkeyDeferrable', 'imagelinks',       'il_from',         'page(page_id) ON DELETE CASCADE' ),
                        array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_by',          'mwuser(user_id) ON DELETE CASCADE' ),
                        array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_user',        'mwuser(user_id) ON DELETE SET NULL' ),
+                       array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_parent_block_id',       'ipblocks(ipb_id) ON DELETE SET NULL' ),
                        array( 'changeFkeyDeferrable', 'langlinks',        'll_from',         'page(page_id) ON DELETE CASCADE' ),
                        array( 'changeFkeyDeferrable', 'logging',          'log_user',        'mwuser(user_id) ON DELETE SET NULL' ),
                        array( 'changeFkeyDeferrable', 'oldimage',         'oi_name',         'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ),
index 89444bc..6e1a74f 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Sqlite-specific installer.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index a98c4db..8146274 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Sqlite-specific updater.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
@@ -75,6 +90,8 @@ class SqliteUpdater extends DatabaseUpdater {
                        // 1.20
                        array( 'addTable', 'config',                            'patch-config.sql' ),
                        array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
+                       array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
+                       array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
                );
        }
 
index eeeb768..5bbe642 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Core installer web interface.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index fdc1746..972d8ac 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Output handler for the web installer.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index 73a5ef2..b6e7717 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Base code for web installer pages.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Deployment
  */
index 2dacd85..179ff4c 100644 (file)
@@ -1,7 +1,23 @@
 <?php
 /**
+ * Interwiki table entry.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
- * Interwiki table entry
  */
 
 /**
index 2a14445..4e02258 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Job to fix double redirects after moving a page
+ * Job to fix double redirects after moving a page.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup JobQueue
index 89b74a4..d359988 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Old job for notification emails.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup JobQueue
  */
index eb154ec..b4c925e 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Job for notification emails.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup JobQueue
  */
index ac70dcb..a53905f 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Job queue base code
+ * Job queue base code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @defgroup JobQueue JobQueue
@@ -186,6 +201,11 @@ abstract class Job {
                $namespace = $row->job_namespace;
                $dbkey = $row->job_title;
                $title = Title::makeTitleSafe( $namespace, $dbkey );
+
+               if ( is_null( $title ) ) {
+                       return false;
+               }
+
                $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id );
 
                // Remove any duplicates it may have later in the queue
@@ -204,7 +224,7 @@ abstract class Job {
         * @param $id Int: Job identifier
         * @return Job
         */
-       static function factory( $command, $title, $params = false, $id = 0 ) {
+       static function factory( $command, Title $title, $params = false, $id = 0 ) {
                global $wgJobClasses;
                if( isset( $wgJobClasses[$command] ) ) {
                        $class = $wgJobClasses[$command];
index 1aa206f..f711f8d 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Job to update links for a given title.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup JobQueue
  */
index 26f6e4b..55ccc27 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Job for asynchronous upload-by-url.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup JobQueue
  */
index f7373e4..4ef59ed 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Simple wrapper for json_econde and json_decode that falls back on Services_JSON class
+ * Simple wrapper for json_econde and json_decode that falls back on Services_JSON class.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  */
index 792079a..e6672b4 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * PHP port of CSSJanus.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -15,6 +17,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  */
 
 /**
index 4f4b28b..e9c2bad 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Minification of CSS stylesheets.
+ *
  * Copyright 2010 Wikimedia Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may
  * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
  * OF ANY KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations under the License.
- */
-
-/**
- * Transforms CSS data
- *
- * This class provides minification, URL remapping, URL extracting, and data-URL embedding.
  *
  * @file
  * @version 0.1.1 -- 2010-09-11
  * @copyright Copyright 2010 Wikimedia Foundation
  * @license http://www.apache.org/licenses/LICENSE-2.0
  */
+
+/**
+ * Transforms CSS data
+ *
+ * This class provides minification, URL remapping, URL extracting, and data-URL embedding.
+ */
 class CSSMin {
 
        /* Constants */
index 2985c65..78d8180 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * List of HTTP status codes.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
 /**
  * @todo document
  */
index 01e72e6..cfc7f53 100644 (file)
@@ -1,4 +1,10 @@
 <?php
+/**
+ * Simulation of Microsoft Internet Explorer's MIME type detection algorithm.
+ *
+ * @file
+ * @todo Define the exact license of this file.
+ */
 
 /**
  * This class simulates Microsoft Internet Explorer's terribly broken and
index 99461b0..e9cfa99 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Checks for validity of requested URL's extension.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
 
 /**
  * Internet Explorer derives a cache filename from a URL, and then in certain
index baf9338..0b4be9a 100644 (file)
@@ -2,17 +2,19 @@
 /**
  * JavaScript Minifier
  *
+ * @file
+ * @author Paul Copperman <paul.copperman@gmail.com>
+ * @license Choose any of Apache, MIT, GPL, LGPL
+ */
+
+/**
  * This class is meant to safely minify javascript code, while leaving syntactically correct
  * programs intact. Other libraries, such as JSMin require a certain coding style to work
  * correctly. OTOH, libraries like jsminplus, that do parse the code correctly are rather
  * slow, because they construct a complete parse tree before outputting the code minified.
  * So this class is meant to allow arbitrary (but syntactically correct) input, while being
  * fast enough to be used for on-the-fly minifying.
- *
- * Author: Paul Copperman <paul.copperman@gmail.com>
- * License: choose any of Apache, MIT, GPL, LGPL
  */
-
 class JavaScriptMinifier {
 
        /* Class constants */
index 8ed08d7..7c4e32b 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * JSMinPlus version 1.4
  *
@@ -25,6 +24,7 @@
  *
  * Latest version of this script: http://files.tweakers.net/jsminplus/jsminplus.zip
  *
+ * @file
  */
 
 /* ***** BEGIN LICENSE BLOCK *****
index 0be0740..37560d8 100644 (file)
@@ -7,6 +7,21 @@
  * - formatting log entries based on database fields
  * - user is now part of the action message
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @author Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
index eccbcdb..ef63335 100644 (file)
@@ -515,16 +515,9 @@ class LogEventsList {
                                $canHide = $wgUser->isAllowed( 'deleterevision' );
                                // If event was hidden from sysops
                                if( !self::userCan( $row, LogPage::DELETED_RESTRICTED ) ) {
-                                       $del = Linker::revDeleteLinkDisabled( $canHide );
+                                       $del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
                                } else {
-                                       $target = SpecialPage::getTitleFor( 'Log', $row->log_type );
-                                       $query = array(
-                                               'target' => $target->getPrefixedDBkey(),
-                                               'type'   => 'logging',
-                                               'ids'    => $row->log_id,
-                                       );
-                                       $del = Linker::revDeleteLink( $query,
-                                               self::isDeleted( $row, LogPage::DELETED_RESTRICTED ), $canHide );
+                                       $del = Xml::check( 'showhiderevisions', false, array( 'name' => 'ids[' . $row->log_id . ']' ) );
                                }
                        }
                }
index e463c45..6d8ece1 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Contains classes for formatting log entries
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @author Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
index 65c523d..339688d 100644 (file)
@@ -1,12 +1,31 @@
 <?php
-
 /**
- * Class containing static functions for working with
- * logs of patrol events
+ * Specific methods for the patrol log.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @author Rob Church <robchur@gmail.com>
  * @author Niklas Laxström
  */
+
+/**
+ * Class containing static functions for working with
+ * logs of patrol events
+ */
 class PatrolLog {
 
        /**
index 6886e95..a515c63 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Handler for Microsoft's bitmap format
+ * Handler for Microsoft's bitmap format.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Media
index 3e039ff..8cf30ab 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Generic handler for bitmap images
+ * Generic handler for bitmap images.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Media
index d158fe4..0a19554 100644 (file)
@@ -1,13 +1,36 @@
 <?php
 /**
-Class to deal with reconciling and extracting metadata from bitmap images.
-This is meant to comply with http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf
+ * Extraction of metadata from different bitmap image types.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
 
-This sort of acts as an intermediary between MediaHandler::getMetadata
-and the various metadata extractors.
-
-@todo other image formats.
-*/
+/**
+ * Class to deal with reconciling and extracting metadata from bitmap images.
+ * This is meant to comply with http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf
+ *
+ * This sort of acts as an intermediary between MediaHandler::getMetadata
+ * and the various metadata extractors.
+ *
+ * @todo other image formats.
+ * @ingroup Media
+ */
 class BitmapMetadataHandler {
 
        private $metadata = array();
index 3c5d973..8cb5138 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Handler for bitmap images that will be resized by clients
+ * Handler for bitmap images that will be resized by clients.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Media
index 2f960d9..ed38bd1 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Handler for DjVu images
+ * Handler for DjVu images.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Media
index 25aacdc..6aef562 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * DjVu image handler
+ * DjVu image handler.
  *
  * Copyright © 2006 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
@@ -21,6 +21,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
+ * @ingroup Media
  */
 
 /**
index 4fb13c6..f5dc020 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Extraction and validation of image metadata.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 7b9867f..65575ec 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Handler for bitmap images with exif metadata.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Media
  */
index 2416252..c22ea08 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Formating of image metadata values into human readable form.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 32618e9..2ec523d 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Handler for GIF images.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Media
  */
index 90bc726..5fc5c1a 100644 (file)
@@ -7,6 +7,21 @@
  * Deliberately not using MWExceptions to avoid external dependencies, encouraging
  * redistribution.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Media
  */
index c6833f3..b41ac32 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Media-handling base classes and generic functionality
+ * Media-handling base classes and generic functionality.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Media
index 666ce40..8fd3552 100644 (file)
@@ -1,8 +1,31 @@
 <?php
 /**
-*Class for some IPTC functions.
+ * Class for some IPTC functions.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
 
-*/
+/**
+ * Class for some IPTC functions.
+ *
+ * @ingroup Media
+ */
 class IPTC {
 
        /**
index 7033409..a15b652 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Handler for JPEG images.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Media
  */
index 0522dfc..8d7e43b 100644 (file)
@@ -1,10 +1,34 @@
 <?php
 /**
-* Class for reading jpegs and extracting metadata.
-* see also BitmapMetadataHandler.
-*
-* Based somewhat on GIFMetadataExtrator.
-*/
+ * Extraction of JPEG image metadata.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Class for reading jpegs and extracting metadata.
+ * see also BitmapMetadataHandler.
+ *
+ * Based somewhat on GIFMetadataExtrator.
+ *
+ * @ingroup Media
+ */
 class JpegMetadataExtractor {
 
        const MAX_JPEG_SEGMENTS = 200;
index 380731c..bf08de6 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Base class for the output of file transformation methods.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Media
  */
index 8fe9ecb..afc7d6a 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Handler for PNG images.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Media
  */
index d3c44d4..9dcde40 100644 (file)
@@ -1,10 +1,26 @@
 <?php
 /**
  * PNG frame counter and metadata extractor.
+ *
  * Slightly derived from GIFMetadataExtractor.php
  * Deliberately not using MWExceptions to avoid external dependencies, encouraging
  * redistribution.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Media
  */
index 5e72ab0..9c8fc5e 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Handler for SVG images.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Media
  */
index 26e42d1..da7d428 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * SVGMetadataExtractor.php
+ * Extraction of SVG image metadata.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,6 +25,9 @@
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
  */
 
+/**
+ * @ingroup Media
+ */
 class SVGMetadataExtractor {
        static function getMetadata( $filename ) {
                $svg = new SVGReader( $filename );
@@ -32,6 +35,9 @@ class SVGMetadataExtractor {
        }
 }
 
+/**
+ * @ingroup Media
+ */
 class SVGReader {
        const DEFAULT_WIDTH = 512;
        const DEFAULT_HEIGHT = 512;
index 0f317e1..d95c907 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Handler for Tiff images.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Media
  */
index ce71290..555fa1f 100644 (file)
@@ -7,6 +7,21 @@
  * Specification in Gnome repository:
  *   http://svn.gnome.org/viewvc/gimp/trunk/devel-docs/xcf.txt?view=markup
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Media
  */
index 0dbf563..adb85df 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Reader for XMP data containing properties relevant to images.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
 /**
 * Class for reading xmp data containing properties relevant to
 * images, and spitting out an array that FormatExif accepts.
index 156d9b5..83b8a10 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Definitions for XMPReader class.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
 /**
 * This class is just a container for a big array
 * used by XMPReader to determine which XMP items to
index 600d99d..5ce3c00 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Methods for validating XMP properties.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
 /**
 * This contains some static methods for
 * validating XMP properties. See XMPInfo and XMPReader classes.
index dd4a76e..b9a6a69 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using PHP's APC accelerator.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * This is a wrapper for APC's shared memory functions
index ade8c0a..d03771e 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using DBA backend.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * Cache that uses DBA as a backend.
index 75aad27..fb31d5c 100644 (file)
@@ -1,8 +1,31 @@
 <?php
+/**
+ * Object caching using the Ehcache RESTful web service.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * Client for the Ehcache RESTful web service - http://ehcache.org/documentation/cache_server.html
  * TODO: Simplify configuration and add to the installer.
+ *
+ * @ingroup Cache
  */
 class EhcacheBagOStuff extends BagOStuff {
        var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions, 
index 2aee6b1..abc6bcf 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Dummy object caching.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * A BagOStuff object with no objects in it. Used to provide a no-op object to calling code.
index 3677330..26b949f 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using PHP arrays.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * This is a test of the interface, mainly. It stores things in an associative
index 1ddf3b9..e816078 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Memcached client for PHP.
+ *
  * +---------------------------------------------------------------------------+
  * | memcached client, PHP                                                     |
  * +---------------------------------------------------------------------------+
index d2c7a2d..79f3241 100644 (file)
@@ -1,7 +1,30 @@
 <?php
+/**
+ * Object caching using memcached.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * A wrapper class for the pure-PHP memcached client, exposing a BagOStuff interface.
+ *
+ * @ingroup Cache
  */
 class MemcachedPhpBagOStuff extends BagOStuff {
 
index 9063093..fd60e72 100644 (file)
@@ -1,9 +1,32 @@
 <?php
+/**
+ * Wrapper for object caching in different caches.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * A cache class that replicates all writes to multiple child caches. Reads 
  * are implemented by reading from the caches in the order they are given in 
  * the configuration until a cache gives a positive result.
+ *
+ * @ingroup Cache
  */
 class MultiWriteBagOStuff extends BagOStuff {
        var $caches;
index 6225bb2..a59ca05 100644 (file)
@@ -1,10 +1,31 @@
 <?php
 /**
- * Functions to get cache objects
+ * Functions to get cache objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Cache
  */
+
+/**
+ * Functions to get cache objects
+ *
+ * @ingroup Cache
+ */
 class ObjectCache {
        static $instances = array();
 
index 3e9aaff..54a67e0 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using a SQL database.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * Class to store objects in the database
index 7f46494..4fd3cf4 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using WinCache.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * Wrapper for WinCache object caching functions; identical interface
index 0ddf124..08f52b7 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Object caching using XCache.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
 
 /**
  * Wrapper for XCache object caching functions; identical interface
index 8de1327..4bfa9d3 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Link functions provided by MediaWiki core; experimental
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Parser
  */
 
 /**
index 8be9946..912de41 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Parser functions provided by MediaWiki core
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Parser
  */
 
 /**
index 7d488c4..296be66 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Tag hooks provided by MediaWiki core
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Parser
  */
 
 /**
index 2199004..1638fb0 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Date formatter
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Parser
  */
 
 /**
index b5d5cb4..def1aee 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Holder of replacement pairs for wiki links
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Parser
  */
 
 /**
index 56197ea..ba7ff60 100644 (file)
@@ -1,12 +1,29 @@
 <?php
 /**
- * @defgroup Parser Parser
+ * PHP parser that converts wiki markup to HTML.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Parser
- * File for Parser and related classes
  */
 
+/**
+ * @defgroup Parser Parser
+ */
 
 /**
  * PHP Parser - Processes wiki markup (which uses a more user-friendly
@@ -144,7 +161,7 @@ class Parser {
        var $mLinkHolders;
 
        var $mLinkID;
-       var $mIncludeSizes, $mPPNodeCount, $mDefaultSort;
+       var $mIncludeSizes, $mPPNodeCount, $mHighestExpansionDepth, $mDefaultSort;
        var $mTplExpandCache; # empty-frame expansion cache
        var $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores;
        var $mExpensiveFunctionCount; # number of expensive parser function calls
@@ -287,6 +304,7 @@ class Parser {
                        'arg' => 0,
                );
                $this->mPPNodeCount = 0;
+               $this->mHighestExpansionDepth = 0;
                $this->mDefaultSort = false;
                $this->mHeadings = array();
                $this->mDoubleUnderscores = array();
@@ -445,9 +463,12 @@ class Parser {
                                array_values( $tidyregs ),
                                $text );
                }
-               global $wgExpensiveParserFunctionLimit;
-               if ( $this->mExpensiveFunctionCount > $wgExpensiveParserFunctionLimit ) {
-                       $this->limitationWarn( 'expensive-parserfunction', $this->mExpensiveFunctionCount, $wgExpensiveParserFunctionLimit );
+
+               if ( $this->mExpensiveFunctionCount > $this->mOptions->getExpensiveParserFunctionLimit() ) {
+                       $this->limitationWarn( 'expensive-parserfunction',
+                               $this->mExpensiveFunctionCount,
+                               $this->mOptions->getExpensiveParserFunctionLimit()
+                       );
                }
 
                wfRunHooks( 'ParserAfterTidy', array( &$this, &$text ) );
@@ -455,12 +476,13 @@ class Parser {
                # Information on include size limits, for the benefit of users who try to skirt them
                if ( $this->mOptions->getEnableLimitReport() ) {
                        $max = $this->mOptions->getMaxIncludeSize();
-                       $PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/$wgExpensiveParserFunctionLimit\n";
+                       $PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/{$this->mOptions->getExpensiveParserFunctionLimit()}\n";
                        $limitReport =
                                "NewPP limit report\n" .
                                "Preprocessor node count: {$this->mPPNodeCount}/{$this->mOptions->getMaxPPNodeCount()}\n" .
                                "Post-expand include size: {$this->mIncludeSizes['post-expand']}/$max bytes\n" .
                                "Template argument size: {$this->mIncludeSizes['arg']}/$max bytes\n".
+                               "Highest expansion depth: {$this->mHighestExpansionDepth}/{$this->mOptions->getMaxPPExpandDepth()}\n".
                                $PFreport;
                        wfRunHooks( 'ParserLimitReport', array( $this, &$limitReport ) );
                        $text .= "\n<!-- \n$limitReport-->\n";
@@ -707,8 +729,8 @@ class Parser {
        }
 
        /**
-        * Get the target language for the content being parsed. This is usually the 
-        * language that the content is in. 
+        * Get the target language for the content being parsed. This is usually the
+        * language that the content is in.
         */
        function getTargetLanguage() {
                $target = $this->mOptions->getTargetLanguage();
@@ -1254,7 +1276,7 @@ class Parser {
                $text = $this->maybeMakeExternalImage( $url );
                if ( $text === false ) {
                        # Not an image, make a link
-                       $text = Linker::makeExternalLink( $url, 
+                       $text = Linker::makeExternalLink( $url,
                                $this->getConverterLanguage()->markNoConversion($url), true, 'free',
                                $this->getExternalLinkAttribs( $url ) );
                        # Register it in the output object...
@@ -1735,7 +1757,7 @@ class Parser {
                }
 
                if ( $this->getConverterLanguage()->hasVariants() ) {
-                       $selflink = $this->getConverterLanguage()->autoConvertToAllVariants( 
+                       $selflink = $this->getConverterLanguage()->autoConvertToAllVariants(
                                $this->mTitle->getPrefixedText() );
                } else {
                        $selflink = array( $this->mTitle->getPrefixedText() );
@@ -3054,7 +3076,7 @@ class Parser {
         * @private
         */
        function braceSubstitution( $piece, $frame ) {
-               global $wgNonincludableNamespaces, $wgContLang;
+               global $wgContLang;
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__.'-setup' );
 
@@ -3249,8 +3271,11 @@ class Parser {
 
                # Load from database
                if ( !$found && $title ) {
-                       $titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
-                       wfProfileIn( $titleProfileIn ); // template in
+                       if ( !Profiler::instance()->isPersistent() ) {
+                               # Too many unique items can kill profiling DBs/collectors
+                               $titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
+                               wfProfileIn( $titleProfileIn ); // template in
+                       }
                        wfProfileIn( __METHOD__ . '-loadtpl' );
                        if ( !$title->isExternal() ) {
                                if ( $title->isSpecialPage()
@@ -3284,7 +3309,7 @@ class Parser {
                                                $isHTML = true;
                                                $this->disableCache();
                                        }
-                               } elseif ( $wgNonincludableNamespaces && in_array( $title->getNamespace(), $wgNonincludableNamespaces ) ) {
+                               } elseif ( MWNamespace::isNonincludableNamespace( $title->getNamespace() ) ) {
                                        $found = false; # access denied
                                        wfDebug( __METHOD__.": template inclusion denied for " . $title->getPrefixedDBkey() );
                                } else {
@@ -3811,12 +3836,8 @@ class Parser {
         * @return Boolean: false if the limit has been exceeded
         */
        function incrementExpensiveFunctionCount() {
-               global $wgExpensiveParserFunctionLimit;
                $this->mExpensiveFunctionCount++;
-               if ( $this->mExpensiveFunctionCount <= $wgExpensiveParserFunctionLimit ) {
-                       return true;
-               }
-               return false;
+               return $this->mExpensiveFunctionCount <= $this->mOptions->getExpensiveParserFunctionLimit();
        }
 
        /**
@@ -4377,8 +4398,7 @@ class Parser {
                ) );
 
                # Context links: [[|name]] and [[name (context)|]]
-               global $wgLegalTitleChars;
-               $tc = "[$wgLegalTitleChars]";
+               $tc = '[' . Title::legalChars() . ']';
                $nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
 
                $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";           # [[ns:page (context)|]]
index a8899cb..bb99039 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Cache for outputs of the PHP parser
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Cache Parser
  */
 
 /**
index bf9611f..211fcd6 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * \brief Options for the PHP parser
+ * Options for the PHP parser
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Parser
@@ -90,6 +105,11 @@ class ParserOptions {
         */
        var $mMaxTemplateDepth;
        
+       /**
+        * Maximum number of calls per parse to expensive parser functions
+        */
+       var $mExpensiveParserFunctionLimit;
+       
        /**
         * Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS
         */
@@ -201,6 +221,8 @@ class ParserOptions {
        function getMaxPPNodeCount()                { return $this->mMaxPPNodeCount; }
        function getMaxPPExpandDepth()              { return $this->mMaxPPExpandDepth; }
        function getMaxTemplateDepth()              { return $this->mMaxTemplateDepth; }
+       /* @since 1.20 */
+       function getExpensiveParserFunctionLimit()  { return $this->mExpensiveParserFunctionLimit; }
        function getRemoveComments()                { return $this->mRemoveComments; }
        function getTemplateCallback()              { return $this->mTemplateCallback; }
        function getEnableLimitReport()             { return $this->mEnableLimitReport; }
@@ -286,6 +308,8 @@ class ParserOptions {
        function setMaxIncludeSize( $x )            { return wfSetVar( $this->mMaxIncludeSize, $x ); }
        function setMaxPPNodeCount( $x )            { return wfSetVar( $this->mMaxPPNodeCount, $x ); }
        function setMaxTemplateDepth( $x )          { return wfSetVar( $this->mMaxTemplateDepth, $x ); }
+       /* @since 1.20 */
+       function setExpensiveParserFunctionLimit( $x ) { return wfSetVar( $this->mExpensiveParserFunctionLimit, $x ); }
        function setRemoveComments( $x )            { return wfSetVar( $this->mRemoveComments, $x ); }
        function setTemplateCallback( $x )          { return wfSetVar( $this->mTemplateCallback, $x ); }
        function enableLimitReport( $x = true )     { return wfSetVar( $this->mEnableLimitReport, $x ); }
@@ -380,7 +404,7 @@ class ParserOptions {
                global $wgUseDynamicDates, $wgInterwikiMagic, $wgAllowExternalImages,
                        $wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion,
                        $wgMaxArticleSize, $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth,
-                       $wgCleanSignatures, $wgExternalLinkTarget;
+                       $wgCleanSignatures, $wgExternalLinkTarget, $wgExpensiveParserFunctionLimit;
 
                wfProfileIn( __METHOD__ );
 
@@ -394,6 +418,7 @@ class ParserOptions {
                $this->mMaxPPNodeCount = $wgMaxPPNodeCount;
                $this->mMaxPPExpandDepth = $wgMaxPPExpandDepth;
                $this->mMaxTemplateDepth = $wgMaxTemplateDepth;
+               $this->mExpensiveParserFunctionLimit = $wgExpensiveParserFunctionLimit;
                $this->mCleanSignatures = $wgCleanSignatures;
                $this->mExternalLinkTarget = $wgExternalLinkTarget;
 
index 0d597e8..6340787 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Output of the PHP parser
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Parser
  */
@@ -10,7 +25,6 @@
  * @todo document
  * @ingroup Parser
  */
-
 class CacheTime {
        var     $mVersion = Parser::VERSION,  # Compatibility check
                $mCacheTime = '',             # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
index efad33f..f25340f 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Fake parser that output the difference of two different parsers
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Parser
  */
 
 /**
index 244890f..9555bdb 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Modified version of the PHP parser with hooks for wiki links; experimental
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Parser
  */
 
 /**
index ae088fd..3d2f2f8 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Interfaces for preprocessors
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Parser
  */
 
 /**
index 18bd01c..602d88f 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Preprocessor using PHP's dom extension
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Parser
  */
@@ -974,6 +989,9 @@ class PPFrame_DOM implements PPFrame {
                }
                wfProfileIn( __METHOD__ );
                ++$expansionDepth;
+               if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+                       $this->parser->mHighestExpansionDepth = $expansionDepth;
+               }
 
                if ( $root instanceof PPNode_DOM ) {
                        $root = $root->node;
index 4acb124..dc2d63a 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Preprocessor using PHP arrays
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Parser
  */
@@ -929,6 +944,9 @@ class PPFrame_Hash implements PPFrame {
                        return '<span class="error">Expansion depth limit exceeded</span>';
                }
                ++$expansionDepth;
+               if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+                       $this->parser->mHighestExpansionDepth = $expansionDepth;
+               }
 
                $outStack = array( '', '' );
                $iteratorStack = array( false, $root );
index a23168a..b30b096 100644 (file)
@@ -3,6 +3,21 @@
  * A preprocessor optimised for HipHop, using HipHop-specific syntax.
  * vim: ft=php
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Parser
  */
@@ -1087,6 +1102,9 @@ class PPFrame_HipHop implements PPFrame {
                        return '<span class="error">Expansion depth limit exceeded</span>';
                }
                ++$expansionDepth;
+               if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+                       $this->parser->mHighestExpansionDepth = $expansionDepth;
+               }
 
                $outStack = array( '', '' );
                $iteratorStack = array( false, $root );
index 7ad80fa..321fcd8 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Holder for stripped items when parsing wiki markup.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Parser
+ */
 
 /**
  * @todo document, briefly.
index 8bd80b2..ed2d436 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * HTML validation and correction
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Parser
  */
 
 /**
@@ -14,6 +30,8 @@
  *
  * This re-uses some of the parser's UNIQ tricks, though some of it is private so it's
  * duplicated. Perhaps we should create an abstract marker hiding class.
+ *
+ * @ingroup Parser
  */
 class MWTidyWrapper {
 
index f2054b5..62be39e 100644 (file)
@@ -114,6 +114,16 @@ class Profiler {
                return false;
        }
 
+       /**
+        * Return whether this profiler stores data
+        *
+        * @see Profiler::logData()
+        * @return Boolean
+        */
+       public function isPersistent() {
+               return true;
+       }
+
        public function setProfileID( $id ) {
                $this->mProfileID = $id;
        }
@@ -479,7 +489,7 @@ class Profiler {
                }
                wfProfileOut( '-overhead-total' );
        }
-       
+
        /**
         * Counts the number of profiled function calls sitting under
         * the given point in the call graph. Not the most efficient algo.
@@ -549,7 +559,7 @@ class Profiler {
                        $rc = $dbw->affectedRows();
                        if ( $rc == 0 ) {
                                $dbw->insert('profiling', array ('pf_name' => $name, 'pf_count' => $eventCount,
-                                       'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ), 
+                                       'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ),
                                        __METHOD__, array ('IGNORE'));
                        }
                        // When we upgrade to mysql 4.1, the insert+update
index 82197fd..d1d1c5d 100644 (file)
@@ -32,6 +32,11 @@ class ProfilerSimple extends Profiler {
        var $zeroEntry = array('cpu'=> 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0);
        var $errorEntry;
 
+       public function isPersistent() {
+               /* Implement in output subclasses */
+               return false;
+       }
+
        protected function addInitialStack() {
                $this->errorEntry = $this->zeroEntry;
                $this->errorEntry['count'] = 1;
index f14139e..822e9fe 100644 (file)
@@ -61,7 +61,7 @@ class ProfilerSimpleTrace extends ProfilerSimple {
                                        str_repeat(" ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
                }
        }
-       
+
        function memoryDiff() {
                $diff = memory_get_usage() - $this->memory;
                $this->memory = memory_get_usage();
index 0de3a85..a95ccb0 100644 (file)
  * @ingroup Profiler
  */
 class ProfilerSimpleUDP extends ProfilerSimple {
+       public function isPersistent() {
+               return true;
+       }
+
        public function logData() {
                global $wgUDPProfilerHost, $wgUDPProfilerPort;
 
index a498860..c0eb0fb 100644 (file)
@@ -30,6 +30,9 @@ class ProfilerStub extends Profiler {
        public function isStub() {
                return true;
        }
+       public function isPersistent() {
+               return false;
+       }
        public function profileIn( $fn ) {}
        public function profileOut( $fn ) {}
        public function getOutput() {}
index 71b2c59..71e68d1 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Base class for resource loading system.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -599,7 +601,7 @@ class ResourceLoader {
        /**
         * Send out code for a response from file cache if possible
         *
-        * @param $fileCache ObjectFileCache: Cache object for this request URL
+        * @param $fileCache ResourceFileCache: Cache object for this request URL
         * @param $context ResourceLoaderContext: Context in which to generate a response
         * @return bool If this found a cache file and handled the response
         */
index dd69bb0..4e28e76 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Context for resource loader modules.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 3d657e1..e8542ac 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module based on local JavaScript/CSS files.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index e3b719b..61ed520 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Resource loader module for MediaWiki:Filepage.css
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
 /**
  * ResourceLoader definition for MediaWiki:Filepage.css
  */
index e1d6fb4..4eb38f6 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for populating language specific data.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 1a232ec..fa76a25 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Abstraction for resource loader modules.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 28f629a..8e81c8d 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader for site customizations for users without JavaScript enabled.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 2527a0a..03fe1fe 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for site customizations.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 3384631..74724a6 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Module for resource loader initialization.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index ccfc378..139048c 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for user preference customizations.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index b5d96ca..36ca712 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for user customizations.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 9fa9bce..58fa79b 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for user customizations.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 933c55e..4624cbc 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for user preference customizations.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 852cc2c..62d096a 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource loader module for user tokens.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 8dddb5b..a69676d 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Abstraction for resource loader modules which pull from wiki pages.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 31a3994..0f8b255 100644 (file)
@@ -477,7 +477,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 
                        if( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
                                # $s is the first link of the next chunk
-                               $t = Title::MakeTitle($namespace, $s->page_title);
+                               $t = Title::makeTitle($namespace, $s->page_title);
                                $query = array( 'from' => $t->getText() );
 
                                if( $namespace )
index a58e62e..4d74fe1 100644 (file)
@@ -277,7 +277,7 @@ class SpecialBlock extends FormSpecialPage {
                        }
 
                        $this->alreadyBlocked = true;
-                       $this->preErrors[] = array( 'ipb-needreblock', (string)$block->getTarget() );
+                       $this->preErrors[] = array( 'ipb-needreblock', wfEscapeWikiText( (string)$block->getTarget() ) );
                }
 
                # We always need confirmation to do HideUser
@@ -349,7 +349,7 @@ class SpecialBlock extends FormSpecialPage {
 
                # Link to unblock the specified user, or to a blank unblock form
                if( $this->target instanceof User ) {
-                       $message = $this->msg( 'ipb-unblock-addr', $this->target->getName() )->parse();
+                       $message = $this->msg( 'ipb-unblock-addr', wfEscapeWikiText( $this->target->getName() ) )->parse();
                        $list = SpecialPage::getTitleFor( 'Unblock', $this->target->getName() );
                } else {
                        $message = $this->msg( 'ipb-unblock' )->parse();
@@ -904,7 +904,7 @@ class SpecialBlock extends FormSpecialPage {
        public function onSuccess() {
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'blockipsuccesssub' ) );
-               $out->addWikiMsg( 'blockipsuccesstext',  $this->target );
+               $out->addWikiMsg( 'blockipsuccesstext', wfEscapeWikiText( $this->target ) );
        }
 }
 
index e84118b..1b7494f 100644 (file)
@@ -54,6 +54,9 @@ class SpecialContributions extends SpecialPage {
                if ( $request->getVal( 'contribs' ) == 'newbie' ) {
                        $target = 'newbies';
                        $this->opts['contribs'] = 'newbie';
+               } elseif ( $par === 'newbies' ) { // b/c for WMF
+                       $target = 'newbies';
+                       $this->opts['contribs'] = 'newbie';
                } else {
                        $this->opts['contribs'] = 'user';
                }
@@ -654,7 +657,7 @@ class ContribsPager extends ReverseChronologicalPager {
                        } else {
                                $condition['rev_user_text'] = $this->target;
                                $index = 'usertext_timestamp';
-                       } 
+                       }
                }
                if ( $this->deletedOnly ) {
                        $condition[] = "rev_deleted != '0'";
index 64190df..177b34d 100644 (file)
@@ -152,9 +152,7 @@ class SpecialLog extends SpecialPage {
                if ( $logBody ) {
                        $this->getOutput()->addHTML(
                                $pager->getNavigationBar() .
-                               $loglist->beginLogEventsList() .
-                               $logBody .
-                               $loglist->endLogEventsList() .
+                               $this->getRevisionButton( $loglist->beginLogEventsList() . $logBody . $loglist->endLogEventsList() ) .
                                $pager->getNavigationBar()
                        );
                } else {
@@ -162,6 +160,29 @@ class SpecialLog extends SpecialPage {
                }
        }
 
+       private function getRevisionButton( $formcontents ) {
+               # If the user doesn't have the ability to delete revisions, don't bother showing him/her the button.
+               if ( !$this->getUser()->isAllowed( 'deleterevision' ) ) {
+                       return $formcontents;
+               }
+
+               # Show button to hide log entries
+               global $wgScript;
+               $s = Html::openElement( 'form', array( 'action' => $wgScript, 'id' => 'mw-log-deleterevision-submit' ) ) . "\n";
+               $s .= Html::hidden( 'title', SpecialPage::getTitleFor( 'Revisiondelete' ) ) . "\n";
+               $s .= Html::hidden( 'target', SpecialPage::getTitleFor( 'Log' ) ) . "\n";
+               $s .= Html::hidden( 'type', 'logging' ) . "\n";
+               $button = Html::element( 'button',
+                       array( 'type' => 'submit', 'class' => "deleterevision-log-submit mw-log-deleterevision-button" ),
+                       $this->msg( 'showhideselectedversions' )->text()
+               ) . "\n";
+               $s .= $button . $formcontents . $button;
+               $s .= Html::closeElement( 'form' );
+
+               return $s;
+       }
+
+
        /**
         * Set page title and show header for this log type
         * @param $type string
index 1bcbac7..44097c8 100644 (file)
@@ -432,7 +432,7 @@ class SpecialNewpages extends IncludableSpecialPage {
        }
 
        protected function feedItem( $row ) {
-               $title = Title::MakeTitle( intval( $row->rc_namespace ), $row->rc_title );
+               $title = Title::makeTitle( intval( $row->rc_namespace ), $row->rc_title );
                if( $title ) {
                        $date = $row->rc_timestamp;
                        $comments = $title->getTalkPage()->getFullURL();
index c05aaad..a7a87f0 100644 (file)
@@ -190,8 +190,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        public function getFeedObject( $feedFormat ){
                $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
                $formatter = $changesFeed->getFeedObject(
-                       wfMsgForContent( 'recentchanges' ),
-                       wfMsgForContent( 'recentchanges-feed-description' ),
+                       $this->msg( 'recentchanges' )->inContentLanguage()->text(),
+                       $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
                        $this->getTitle()->getFullURL()
                );
                return array( $changesFeed, $formatter );
@@ -565,7 +565,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $extraOpts = $this->getExtraOptions( $opts );
                $extraOptsCount = count( $extraOpts );
                $count = 0;
-               $submit = ' ' . Xml::submitbutton( wfMsg( 'allpagessubmit' ) );
+               $submit = ' ' . Xml::submitbutton( $this->msg( 'allpagessubmit' )->text() );
 
                $out = Xml::openElement( 'table', array( 'class' => 'mw-recentchanges-table' ) );
                foreach( $extraOpts as $name => $optionRow ) {
@@ -596,7 +596,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $panelString = implode( "\n", $panel );
 
                $this->getOutput()->addHTML(
-                       Xml::fieldset( wfMsg( 'recentchanges-legend' ), $panelString, array( 'class' => 'rcoptions' ) )
+                       Xml::fieldset( $this->msg( 'recentchanges-legend' )->text(), $panelString, array( 'class' => 'rcoptions' ) )
                );
 
                $this->setBottomText( $opts );
@@ -636,7 +636,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $this->getOutput()->addWikiText(
                        Html::rawElement( 'p',
                                array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
-                               "\n" . wfMsgForContentNoTrans( 'recentchangestext' ) . "\n"
+                               "\n" . $this->msg( 'recentchangestext' )->inContentLanguage()->plain() . "\n"
                        ), 
                        /* $lineStart */ false,
                        /* $interface */ false
@@ -663,16 +663,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        array( 'selected' => $opts['namespace'], 'all' => '' ),
                        array( 'name' => 'namespace', 'id' => 'namespace' )
                );
-               $nsLabel = Xml::label( wfMsg( 'namespace' ), 'namespace' );
+               $nsLabel = Xml::label( $this->msg( 'namespace' )->text(), 'namespace' );
                $invert = Xml::checkLabel(
-                       wfMsg( 'invert' ), 'invert', 'nsinvert',
+                       $this->msg( 'invert' )->text(), 'invert', 'nsinvert',
                        $opts['invert'],
-                       array( 'title' => wfMsg( 'tooltip-invert' ) )
+                       array( 'title' => $this->msg( 'tooltip-invert' )->text() )
                );
                $associated = Xml::checkLabel(
-                       wfMsg( 'namespace_association' ), 'associated', 'nsassociated',
+                       $this->msg( 'namespace_association' )->text(), 'associated', 'nsassociated',
                        $opts['associated'],
-                       array( 'title' => wfMsg( 'tooltip-namespace_association' ) )
+                       array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
                );
                return array( $nsLabel, "$nsSelect $invert $associated" );
        }
@@ -684,10 +684,10 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * @return Array
         */
        protected function categoryFilterForm( FormOptions $opts ) {
-               list( $label, $input ) = Xml::inputLabelSep( wfMsg( 'rc_categories' ),
+               list( $label, $input ) = Xml::inputLabelSep( $this->msg( 'rc_categories' )->text(),
                        'categories', 'mw-categories', false, $opts['categories'] );
 
-               $input .= ' ' . Xml::checkLabel( wfMsg( 'rc_categories_any' ),
+               $input .= ' ' . Xml::checkLabel( $this->msg( 'rc_categories_any' )->text(),
                        'categories_any', 'mw-categories_any', $opts['categories_any'] );
 
                return array( $label, $input );
@@ -788,16 +788,18 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $options = $nondefaults + $defaults;
 
                $note = '';
-               if( !wfEmptyMsg( 'rclegend' ) ) {
-                       $note .= '<div class="mw-rclegend">' .
-                               wfMsgExt( 'rclegend', array( 'parseinline' ) ) . "</div>\n";
+               $msg = $this->msg( 'rclegend' );
+               if( !$msg->isDisabled() ) {
+                       $note .= '<div class="mw-rclegend">' . $msg->parse() . "</div>\n";
                }
+
+               $lang = $this->getLanguage();
+               $user = $this->getUser();
                if( $options['from'] ) {
-                       $note .= wfMsgExt( 'rcnotefrom', array( 'parseinline' ),
-                               $this->getLanguage()->formatNum( $options['limit'] ),
-                               $this->getLanguage()->timeanddate( $options['from'], true ),
-                               $this->getLanguage()->date( $options['from'], true ),
-                               $this->getLanguage()->time( $options['from'], true ) ) . '<br />';
+                       $note .= $this->msg( 'rcnotefrom' )->numParams( $options['limit'] )->params(
+                               $lang->userTimeAndDate( $options['from'], $user ),
+                               $lang->userDate( $options['from'], $user ),
+                               $lang->userTime( $options['from'], $user ) )->parse() . '<br />';
                }
 
                # Sort data for display and make sure it's unique after we've added user data.
@@ -810,21 +812,21 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                // limit links
                foreach( $wgRCLinkLimits as $value ) {
-                       $cl[] = $this->makeOptionsLink( $this->getLanguage()->formatNum( $value ),
+                       $cl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'limit' => $value ), $nondefaults, $value == $options['limit'] );
                }
-               $cl = $this->getLanguage()->pipeList( $cl );
+               $cl = $lang->pipeList( $cl );
 
                // day links, reset 'from' to none
                foreach( $wgRCLinkDays as $value ) {
-                       $dl[] = $this->makeOptionsLink( $this->getLanguage()->formatNum( $value ),
+                       $dl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] );
                }
-               $dl = $this->getLanguage()->pipeList( $dl );
+               $dl = $lang->pipeList( $dl );
 
 
                // show/hide links
-               $showhide = array( wfMsg( 'show' ), wfMsg( 'hide' ) );
+               $showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
                $filters = array(
                        'hideminor'     => 'rcshowhideminor',
                        'hidebots'      => 'rcshowhidebots',
@@ -837,7 +839,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $filters[$key] = $params['msg'];
                }
                // Disable some if needed
-               if ( !$this->getUser()->useRCPatrol() ) {
+               if ( !$user->useRCPatrol() ) {
                        unset( $filters['hidepatrolled'] );
                }
 
@@ -845,19 +847,18 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                foreach ( $filters as $key => $msg ) {
                        $link = $this->makeOptionsLink( $showhide[1 - $options[$key]],
                                array( $key => 1-$options[$key] ), $nondefaults );
-                       $links[] = wfMsgHtml( $msg, $link );
+                       $links[] = $this->msg( $msg )->rawParams( $link )->escaped();
                }
 
                // show from this onward link
                $timestamp = wfTimestampNow();
-               $now = $this->getLanguage()->timeanddate( $timestamp, true );
+               $now = $lang->userTimeAndDate( $timestamp, $user );
                $tl = $this->makeOptionsLink(
                        $now, array( 'from' => $timestamp ), $nondefaults
                );
 
-               $rclinks = wfMsgExt( 'rclinks', array( 'parseinline', 'replaceafter' ),
-                       $cl, $dl, $this->getLanguage()->pipeList( $links ) );
-               $rclistfrom = wfMsgExt( 'rclistfrom', array( 'parseinline', 'replaceafter' ), $tl );
+               $rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )->parse();
+               $rclistfrom = $this->msg( 'rclistfrom' )->rawParams( $tl )->parse();
                return "{$note}$rclinks<br />$rclistfrom";
        }
 
index 238e181..9010e10 100644 (file)
@@ -54,8 +54,9 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
        public function getFeedObject( $feedFormat ){
                $feed = new ChangesFeed( $feedFormat, false );
                $feedObj = $feed->getFeedObject(
-                       wfMsgForContent( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() ),
-                       wfMsgForContent( 'recentchangeslinked-feed' ),
+                       $this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
+                               ->inContentLanguage()->text(),
+                       $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
                        $this->getTitle()->getFullUrl()
                );
                return array( $feed, $feedObj );
@@ -224,10 +225,10 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                $opts->consumeValues( array( 'showlinkedto', 'target', 'tagfilter' ) );
                $extraOpts = array();
                $extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
-               $extraOpts['target'] = array( wfMsgHtml( 'recentchangeslinked-page' ),
+               $extraOpts['target'] = array( $this->msg( 'recentchangeslinked-page' )->escaped(),
                        Xml::input( 'target', 40, str_replace('_',' ',$opts['target']) ) .
                        Xml::check( 'showlinkedto', $opts['showlinkedto'], array('id' => 'showlinkedto') ) . ' ' .
-                       Xml::label( wfMsg("recentchangeslinked-to"), 'showlinkedto' ) );
+                       Xml::label( $this->msg( 'recentchangeslinked-to' )->text(), 'showlinkedto' ) );
                $tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'] );
                if ($tagFilter) {
                        $extraOpts['tagfilter'] = $tagFilter;
index 0388f5b..d089c73 100644 (file)
@@ -221,7 +221,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $links = array();
                        $links[] = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Log' ),
-                               wfMsgHtml( 'viewpagelogs' ),
+                               $this->msg( 'viewpagelogs' )->escaped(),
                                array(),
                                array( 'page' => $this->targetObj->getPrefixedText() )
                        );
@@ -229,7 +229,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                # Give a link to the page history
                                $links[] = Linker::linkKnown(
                                        $this->targetObj,
-                                       wfMsgHtml( 'pagehist' ),
+                                       $this->msg( 'pagehist' )->escaped(),
                                        array(),
                                        array( 'action' => 'history' )
                                );
@@ -238,7 +238,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                        $undelete = SpecialPage::getTitleFor( 'Undelete' );
                                        $links[] = Linker::linkKnown(
                                                $undelete,
-                                               wfMsgHtml( 'deletedhist' ),
+                                               $this->msg( 'deletedhist' )->escaped(),
                                                array(),
                                                array( 'target' => $this->targetObj->getPrefixedDBkey() )
                                        );
@@ -276,7 +276,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->getOutput()->addWikiMsg( 'revdelete-no-file' );
                        return;
                }
-               if( !$oimage->userCan( File::DELETED_FILE, $this->getUser() ) ) {
+               $user = $this->getUser();
+               if( !$oimage->userCan( File::DELETED_FILE, $user ) ) {
                        if( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
                                $this->getOutput()->permissionRequired( 'suppressrevision' );
                        } else {
@@ -284,21 +285,22 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        }
                        return;
                }
-               if ( !$this->getUser()->matchEditToken( $this->token, $archiveName ) ) {
+               if ( !$user->matchEditToken( $this->token, $archiveName ) ) {
+                       $lang = $this->getLanguage();
                        $this->getOutput()->addWikiMsg( 'revdelete-show-file-confirm',
                                $this->targetObj->getText(),
-                               $this->getLanguage()->date( $oimage->getTimestamp() ),
-                               $this->getLanguage()->time( $oimage->getTimestamp() ) );
+                               $lang->userDate( $oimage->getTimestamp(), $user ),
+                               $lang->userTime( $oimage->getTimestamp(), $user ) );
                        $this->getOutput()->addHTML(
                                Xml::openElement( 'form', array(
                                        'method' => 'POST',
                                        'action' => $this->getTitle()->getLocalUrl(
-                                               'target=' . urlencode( $oimage->getName() ) .
+                                               'target=' . urlencode( $this->targetObj->getPrefixedDBkey() ) .
                                                '&file=' . urlencode( $archiveName ) .
-                                               '&token=' . urlencode( $this->getUser()->getEditToken( $archiveName ) ) )
+                                               '&token=' . urlencode( $user->getEditToken( $archiveName ) ) )
                                        )
                                ) .
-                               Xml::submitButton( wfMsg( 'revdelete-show-file-submit' ) ) .
+                               Xml::submitButton( $this->msg( 'revdelete-show-file-submit' )->text() ) .
                                '</form>'
                        );
                        return;
@@ -377,22 +379,23 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $out = Xml::openElement( 'form', array( 'method' => 'post',
                                        'action' => $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) ),
                                        'id' => 'mw-revdel-form-revisions' ) ) .
-                               Xml::fieldset( wfMsg( 'revdelete-legend' ) ) .
+                               Xml::fieldset( $this->msg( 'revdelete-legend' )->text() ) .
                                $this->buildCheckBoxes() .
                                Xml::openElement( 'table' ) .
                                "<tr>\n" .
                                        '<td class="mw-label">' .
-                                               Xml::label( wfMsg( 'revdelete-log' ), 'wpRevDeleteReasonList' ) .
+                                               Xml::label( $this->msg( 'revdelete-log' )->text(), 'wpRevDeleteReasonList' ) .
                                        '</td>' .
                                        '<td class="mw-input">' .
                                                Xml::listDropDown( 'wpRevDeleteReasonList',
-                                                       wfMsgForContent( 'revdelete-reason-dropdown' ),
-                                                       wfMsgForContent( 'revdelete-reasonotherlist' ), '', 'wpReasonDropDown', 1
+                                                       $this->msg( 'revdelete-reason-dropdown' )->inContentLanguage()->text(),
+                                                       $this->msg( 'revdelete-reasonotherlist' )->inContentLanguage()->text(),
+                                                       '', 'wpReasonDropDown', 1
                                                ) .
                                        '</td>' .
                                "</tr><tr>\n" .
                                        '<td class="mw-label">' .
-                                               Xml::label( wfMsg( 'revdelete-otherreason' ), 'wpReason' ) .
+                                               Xml::label( $this->msg( 'revdelete-otherreason' )->text(), 'wpReason' ) .
                                        '</td>' .
                                        '<td class="mw-input">' .
                                                Xml::input( 'wpReason', 60, $this->otherReason, array( 'id' => 'wpReason', 'maxlength' => 100 ) ) .
@@ -400,7 +403,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                "</tr><tr>\n" .
                                        '<td></td>' .
                                        '<td class="mw-submit">' .
-                                               Xml::submitButton( wfMsgExt('revdelete-submit','parsemag',$numRevisions),
+                                               Xml::submitButton( $this->msg( 'revdelete-submit', $numRevisions )->text(),
                                                        array( 'name' => 'wpSubmit' ) ) .
                                        '</td>' .
                                "</tr>\n" .
@@ -420,7 +423,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                $title = Title::makeTitle( NS_MEDIAWIKI, 'revdelete-reason-dropdown' );
                                $link = Linker::link(
                                        $title,
-                                       wfMsgHtml( 'revdelete-edit-reasonlist' ),
+                                       $this->msg( 'revdelete-edit-reasonlist' )->escaped(),
                                        array(),
                                        array( 'action' => 'edit' )
                                );
@@ -459,7 +462,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        }
                        foreach( $this->checks as $item ) {
                                list( $message, $name, $field ) = $item;
-                               $innerHTML = Xml::checkLabel( wfMsg($message), $name, $name, $bitfield & $field );
+                               $innerHTML = Xml::checkLabel( $this->msg( $message )->text(), $name, $name, $bitfield & $field );
                                if( $field == Revision::DELETED_RESTRICTED )
                                        $innerHTML = "<b>$innerHTML</b>";
                                $line = Xml::tags( 'td', array( 'class' => 'mw-input' ), $innerHTML );
@@ -468,9 +471,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                // Otherwise, use tri-state radios
                } else {
                        $html .= '<tr>';
-                       $html .= '<th class="mw-revdel-checkbox">'.wfMsgHtml('revdelete-radio-same').'</th>';
-                       $html .= '<th class="mw-revdel-checkbox">'.wfMsgHtml('revdelete-radio-unset').'</th>';
-                       $html .= '<th class="mw-revdel-checkbox">'.wfMsgHtml('revdelete-radio-set').'</th>';
+                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-same' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
                        $html .= "<th></th></tr>\n";
                        foreach( $this->checks as $item ) {
                                list( $message, $name, $field ) = $item;
@@ -483,7 +486,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                $line = '<td class="mw-revdel-checkbox">' . Xml::radio( $name, -1, $selected == -1 ) . '</td>';
                                $line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 0, $selected == 0 ) . '</td>';
                                $line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 1, $selected == 1 ) . '</td>';
-                               $label = wfMsgHtml($message);
+                               $label = $this->msg( $message )->escaped();
                                if( $field == Revision::DELETED_RESTRICTED ) {
                                        $label = "<b>$label</b>";
                                }
@@ -512,7 +515,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $comment = $listReason;
                if( $comment != 'other' && $this->otherReason != '' ) {
                        // Entry from drop down menu + additional comment
-                       $comment .= wfMsgForContent( 'colon-separator' ) . $this->otherReason;
+                       $comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->otherReason;
                } elseif( $comment == 'other' ) {
                        $comment = $this->otherReason;
                }
index fab21cd..fb2005b 100644 (file)
@@ -60,14 +60,14 @@ class SpecialUnblock extends SpecialPage {
                        switch( $this->type ){
                                case Block::TYPE_USER:
                                case Block::TYPE_IP:
-                                       $out->addWikiMsg( 'unblocked',  $this->target );
+                                       $out->addWikiMsg( 'unblocked', wfEscapeWikiText( $this->target ) );
                                        break;
                                case Block::TYPE_RANGE:
-                                       $out->addWikiMsg( 'unblocked-range', $this->target );
+                                       $out->addWikiMsg( 'unblocked-range', wfEscapeWikiText( $this->target ) );
                                        break;
                                case Block::TYPE_ID:
                                case Block::TYPE_AUTO:
-                                       $out->addWikiMsg( 'unblocked-id', $this->target );
+                                       $out->addWikiMsg( 'unblocked-id', wfEscapeWikiText( $this->target ) );
                                        break;
                        }
                }
index 06b578d..d1bb3f0 100644 (file)
@@ -1015,7 +1015,7 @@ class SpecialUndelete extends SpecialPage {
                }
                $out->wrapWikiMsg(
                        "<div class='mw-undelete-pagetitle'>\n$1\n</div>\n",
-                       array( 'undeletepagetitle', $this->mTargetObj->getPrefixedText() )
+                       array( 'undeletepagetitle', wfEscapeWikiText( $this->mTargetObj->getPrefixedText() ) )
                );
 
                $archive = new PageArchive( $this->mTargetObj );
index 0c5f11c..eafdde4 100644 (file)
@@ -116,6 +116,7 @@ class SpecialWatchlist extends SpecialPage {
                /* bool  */ 'hideOwn'   => (int)$user->getBoolOption( 'watchlisthideown' ),
                /* ?     */ 'namespace' => 'all',
                /* ?     */ 'invert'    => false,
+               /* bool  */ 'associated' => false,
                );
                $this->customFilters = array();
                wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
@@ -148,13 +149,20 @@ class SpecialWatchlist extends SpecialPage {
 
                # Get namespace value, if supplied, and prepare a WHERE fragment
                $nameSpace = $request->getIntOrNull( 'namespace' );
-               $invert = $request->getIntOrNull( 'invert' );
+               $invert = $request->getBool( 'invert' );
+               $associated = $request->getBool( 'associated' );
                if ( !is_null( $nameSpace ) ) {
+                       $eq_op = $invert ? '!=' : '=';\r
+                       $bool_op = $invert ? 'AND' : 'OR';
                        $nameSpace = intval( $nameSpace ); // paranioa
-                       if ( $invert ) {
-                               $nameSpaceClause = "rc_namespace != $nameSpace";
+                       if ( !$associated ) {
+                               $nameSpaceClause = "rc_namespace $eq_op $nameSpace";
                        } else {
-                               $nameSpaceClause = "rc_namespace = $nameSpace";
+                               $associatedNS = MWNamespace::getAssociated( $nameSpace );\r
+                               $nameSpaceClause =
+                                       "rc_namespace $eq_op $nameSpace " .\r
+                                       $bool_op .\r
+                                       " rc_namespace $eq_op $associatedNS";
                        }
                } else {
                        $nameSpace = '';
@@ -162,6 +170,7 @@ class SpecialWatchlist extends SpecialPage {
                }
                $values['namespace'] = $nameSpace;
                $values['invert'] = $invert;
+               $values['associated'] = $associated;
 
                if( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
                        $big = 1000; /* The magical big */
@@ -262,7 +271,14 @@ class SpecialWatchlist extends SpecialPage {
                $tables = array( 'recentchanges', 'watchlist' );
                $fields = array( $dbr->tableName( 'recentchanges' ) . '.*' );
                $join_conds = array(
-                       'watchlist' => array('INNER JOIN',"wl_user='{$user->getId()}' AND wl_namespace=rc_namespace AND wl_title=rc_title"),
+                       'watchlist' => array(
+                               'INNER JOIN',
+                               array(
+                                       'wl_user' => $user->getId(),
+                                       'wl_namespace=rc_namespace',
+                                       'wl_title=rc_title'
+                               ),
+                       ),
                );
                $options = array( 'ORDER BY' => 'rc_timestamp DESC' );
                if( $wgShowUpdatedMarker ) {
@@ -338,7 +354,20 @@ class SpecialWatchlist extends SpecialPage {
                                'class' => 'namespaceselector',
                        )
                ) . '&#160;';
-               $form .= Xml::checkLabel( $this->msg( 'invert' )->text(), 'invert', 'nsinvert', $invert ) . '&#160;';
+               $form .= Xml::checkLabel(
+                       $this->msg( 'invert' )->text(),
+                       'invert',
+                       'nsinvert',
+                       $invert,
+                       array( 'title' => $this->msg( 'tooltip-invert' )->text() )
+               ) . '&#160;';
+               $form .= Xml::checkLabel(
+                       $this->msg( 'namespace_association' )->text(),
+                       'associated',
+                       'associated',
+                       $associated,
+                       array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
+               ) . '&#160;';
                $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . '</p>';
                $form .= Html::hidden( 'days', $values['days'] );
                foreach ( $filters as $key => $msg ) {
index 59284af..bf5c487 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Template used when there is no LocalSettings.php file
+ * Template used when there is no LocalSettings.php file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Templates
index c93b02c..b22c144 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Html form for account creation
+ * Html form for account creation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Templates
index efe826f..5a2c633 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Html form for user login
+ * Html form for user login.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup Templates
index 09412f0..479083e 100644 (file)
@@ -16,3 +16,4 @@ quiet: yes
 quote-nbsp: yes
 fix-backslash: no
 fix-uri: no
+new-inline-tags: video,audio,source,track
index f6078dc..83ffed9 100644 (file)
@@ -972,24 +972,100 @@ abstract class UploadBase {
         * @return bool
         */
        public function checkSvgScriptCallback( $element, $attribs ) {
-               $stripped = $this->stripXmlNamespace( $element );
+               $strippedElement = $this->stripXmlNamespace( $element );
 
-               if( $stripped == 'script' ) {
+               /*
+                * check for elements that can contain javascript
+                */
+               if( $strippedElement == 'script' ) {
                        wfDebug( __METHOD__ . ": Found script element '$element' in uploaded file.\n" );
                        return true;
                }
 
+               # e.g., <svg xmlns="http://www.w3.org/2000/svg"> <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
+               if( $strippedElement == 'handler' ) {
+                       wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+                       return true;
+               }
+
+               # SVG reported in Feb '12 that used xml:stylesheet to generate javascript block
+               if( $strippedElement == 'stylesheet' ) {
+                       wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+                       return true;
+               }
+
                foreach( $attribs as $attrib => $value ) {
                        $stripped = $this->stripXmlNamespace( $attrib );
+                       $value = strtolower($value);
+
                        if( substr( $stripped, 0, 2 ) == 'on' ) {
-                               wfDebug( __METHOD__ . ": Found script attribute '$attrib'='value' in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
                                return true;
                        }
+
+                       # href with javascript target
                        if( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
-                               wfDebug( __METHOD__ . ": Found script href attribute '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
+                               return true;
+                       }
+
+                       # href with embeded svg as target
+                       if( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
+                               wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+                               return true;
+                       }
+
+                       # href with embeded (text/xml) svg as target
+                       if( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
+                               wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+                               return true;
+                       }
+
+                       # use set/animate to add event-handler attribute to parent
+                       if( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
+                               wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
                                return true;
                        }
+
+                       # use set to add href attribute to parent element
+                       if( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
+                               wfDebug( __METHOD__ . ": Found svg setting href attibute '$value' in uploaded file.\n" );
+                               return true;
+                       }
+
+                       # use set to add a remote / data / script target to an element
+                       if( $strippedElement == 'set' && $stripped == 'to' &&  preg_match( '!(http|https|data|script):!sim', $value ) ) {
+                               wfDebug( __METHOD__ . ": Found svg setting attibute to '$value' in uploaded file.\n" );
+                               return true;
+                       }
+
+
+                       # use handler attribute with remote / data / script 
+                       if( $stripped == 'handler' &&  preg_match( '!(http|https|data|script):!sim', $value ) ) {
+                               wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
+                               return true;
+                       }
+
+                       # use CSS styles to bring in remote code
+                       # catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
+                       if( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
+                               foreach ($matches[1] as $match) {
+                                       if (!preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
+                                               wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
+                                               return true;
+                                       }
+                               }
+                       }
+
+                       # image filters can pull in url, which could be svg that executes scripts
+                       if( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
+                               wfDebug( __METHOD__ . ": Found image filter with url: \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+                               return true;
+                       }
+
                }
+
+               return false; //No scripts detected
        }
 
        private function stripXmlNamespace( $name ) {
index e14823a..2010878 100644 (file)
--- a/index.php
+++ b/index.php
@@ -40,7 +40,7 @@
 # has structures (try/catch, foo()->bar(), etc etc) which throw parse errors in
 # PHP 4. Setup.php and ObjectCache.php have structures invalid in PHP 5.0 and
 # 5.1, respectively.
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
        require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
        wfPHPVersionError( 'index.php' );
 }
index 1f69cbf..a3140b2 100644 (file)
        'rw' => 'Kinyarwanda',  # Kinyarwanda, should possibly be Kinyarwandi
        'sa' => 'संस्कृतम्',  # Sanskrit
        'sah' => 'Саха тыла', # Sakha
+       'sat' => 'Santali',     # Santali
        'sc' => 'Sardu',                # Sardinian
        'scn' => 'Sicilianu',   # Sicilian
        'sco' => 'Scots',       # Scots
index 665121f..c6155b6 100644 (file)
@@ -981,7 +981,7 @@ $2',
 'resetpass-temp-password' => 'كلمة سر مؤقتة:',
 
 # Special:PasswordReset
-'passwordreset' => 'تÙ\85ت Ø¥Ø¹Ø§Ø¯Ø© Ø¶Ø¨Ø· Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر',
+'passwordreset' => 'إعادة ضبط كلمة السر',
 'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتفاصيل حسابك.',
 'passwordreset-legend' => 'إعادة تعيين كلمة السر',
 'passwordreset-disabled' => 'عُطّلت إعادة تعيين كلمة السر على هذه الويكي.',
@@ -1592,6 +1592,7 @@ $1",
 'yourrealname' => 'الاسم الحقيقي:',
 'yourlanguage' => 'اللغة:',
 'yourvariant' => 'لهجة المحتوى:',
+'prefs-help-variant' => 'عرض لهجتك المفضلة أو إملاؤها في صفحات المحتوى لهذا الويكي.',
 'yournick' => 'التوقيع:',
 'prefs-help-signature' => 'يجب أن توقع تعليقات صفحات النقاش باستخدام "<nowiki>~~~~</nowiki>" الذي سيحول إلى توقيعك مع طابع زمني.',
 'badsig' => 'توقيع خام غير صحيح؛ تحقق من وسوم HTML.',
@@ -1766,6 +1767,7 @@ $1",
 'action-suppressionlog' => 'رؤية هذا السجل الخاص',
 'action-block' => 'منع هذا المستخدم من التعديل',
 'action-protect' => 'تغيير مستويات الحماية لهذه الصفحة',
+'action-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا',
 'action-import' => 'استيراد هذه الصفحة من ويكي آخر',
 'action-importupload' => 'استيراد هذه الصفحة من ملف مرفوع',
 'action-patrol' => 'التعليم على تعديلات الآخرين كمراجعة',
@@ -1974,11 +1976,32 @@ $1',
 'upload-http-error' => 'صودف خطأ HTTP: $1',
 
 # File backend
+'backend-fail-stream' => 'لا يمكن عرض الملف $1.',
+'backend-fail-backup' => 'لا يمكن صنع نسخة أحتياطية للملف $1.',
 'backend-fail-notexists' => 'الملف $1 غير موجود.',
+'backend-fail-notsame' => 'يوجد بالفعل ملف غير متطابق في $1.',
+'backend-fail-invalidpath' => '$1 ليس مسارا صالحا للتخزين.',
+'backend-fail-delete' => 'لم يمكن حذف الملف $1.',
+'backend-fail-alreadyexists' => 'الملف $1 موجود بالفعل.',
+'backend-fail-store' => 'لا يمكن تخزين الملف $1 في $2 .',
 'backend-fail-copy' => 'لا يمكن نسخ الملف  $1  إلى  $2 .',
+'backend-fail-move' => 'تعذر نقل ملف $1 إلى $2 .',
 'backend-fail-opentemp' => 'تعذّر فتح ملف مؤقت.',
 'backend-fail-writetemp' => 'تعذّرت كتابة ملف مؤقت.',
 'backend-fail-closetemp' => 'تعذّر إغلاق ملف مؤقت.',
+'backend-fail-read' => 'لا يمكن قراءة الملف $1.',
+'backend-fail-create' => 'تعذر إنشاء الملف $1.',
+
+# Lock manager
+'lockmanager-notlocked' => 'تعذر فتح "$1"، الملف غير مغلق.',
+'lockmanager-fail-closelock' => 'تعذر إغلاق ملف التأمين "$1".',
+'lockmanager-fail-deletelock' => 'تعذر حذف ملف التأمين "$1".',
+'lockmanager-fail-acquirelock' => 'لا يمكن الحصول على تأمين لـ "$1".',
+'lockmanager-fail-openlock' => 'تعذر إغلاق ملف التأمين "$1".',
+'lockmanager-fail-releaselock' => 'تعذر تحرير التأمين لـ "$1"..',
+'lockmanager-fail-db-bucket' => 'تعذر الإتصال بعدد كافي من قواعد تأمين البيانات في الحزمة $1.',
+'lockmanager-fail-db-release' => 'تعذر تحرير الأقفال في  قاعدة البيانات $1.',
+'lockmanager-fail-svr-release' => 'تعذر تحرير الأقفال على الخادم $1.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'صودف خطأ أثناء فتح الملف لفحوصات ZIP.',
@@ -1996,6 +2019,7 @@ $1',
 'uploadstash-badtoken' => 'لم ينجح أداء ذلك العمل، ربما لأن وثائق تفويض التحرير الخاصة بك منتهية الصلاحية. حاول مرة أخرى.',
 'uploadstash-errclear' => 'لم تنجح عملية مسح الملفات.',
 'uploadstash-refresh' => 'تحديث قائمة الملفات',
+'invalid-chunk-offset' => 'قطعة أوفست غير صالحة',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'رفض الوصول',
@@ -2088,6 +2112,10 @@ $1',
 من فضلك انظر [$2 صفحة وصف الملف] لمزيد من المعلومات.',
 'sharedupload-desc-here' => 'هذا الملف من $1 ويمكن استخدامه بواسطة المشاريع الأخرى.
 الوصف على [$2 صفحة وصف الملف] هناك معروض بالأسفل.',
+'sharedupload-desc-edit' => 'هذا ملف من $1 وقد يكون مستخدما في مشاريع أخرى.
+يمكن لك تريد أن تعدل وصف الملف في [$2  صفحته] هناك.',
+'sharedupload-desc-create' => 'هذا ملف من $1 وقد يكون مستخدما في مشاريع أخرى.
+يمكن لك تريد أن تعدل وصف الملف في [$2  صفحته] هناك.',
 'filepage-nofile' => 'لا ملف موجود بهذا الاسم.',
 'filepage-nofile-link' => 'لا يوجد ملف بهذا الاسم، لكن يمكنك [$1 رفعه].',
 'uploadnewversion-linktext' => 'ارفع نسخة جديدة من هذا الملف',
@@ -2223,6 +2251,8 @@ $1',
 'wantedpages' => 'صفحات مطلوبة',
 'wantedpages-badtitle' => 'عنوان غير صحيح في مجموعة النتائج: $1',
 'wantedfiles' => 'ملفات مطلوبة',
+'wantedfiletext-cat' => 'الملفات التالية مستعملة ولكن لا وجود لها. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة. بالإضافة، أي صفحات تتضمن الملفات الغير موجودة تم سردها في [[:$1]].',
+'wantedfiletext-nocat' => 'الملفات التالية مستعملة ولكن  غير متوفرة. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة.',
 'wantedtemplates' => 'قوالب مطلوبة',
 'mostlinked' => 'أكثر الصفحات وصلا',
 'mostlinkedcategories' => 'أكثر التصنيفات ارتباطا',
@@ -2231,6 +2261,7 @@ $1',
 'mostimages' => 'أكثر الملفات ارتباطا',
 'mostrevisions' => 'أكثر الصفحات تعديلا',
 'prefixindex' => 'كل الصفحات بالبادئة',
+'prefixindex-namespace' => 'كل الصفحات مع بادئة ($1 مساحة الأسم)',
 'shortpages' => 'صفحات قصيرة',
 'longpages' => 'صفحات طويلة',
 'deadendpages' => 'صفحات نهاية مسدودة',
@@ -2540,6 +2571,8 @@ $UNWATCHURL
 'protect-title' => 'ضبط مستوى الحماية ل"$1"',
 'protect-title-notallowed' => 'عرض مستوى الحماية ل "$1"',
 'prot_1movedto2' => 'نُقلت [[$1]] إلى [[$2]]',
+'protect-badnamespace-title' => 'مساحة إسم غير محمية',
+'protect-badnamespace-text' => 'لا يمكن حماية الصفحات الموجودة في مساحة الإسم',
 'protect-legend' => 'تأكيد الحماية',
 'protectcomment' => 'السبب:',
 'protectexpiry' => 'تنتهي في:',
@@ -2641,6 +2674,7 @@ $UNWATCHURL
 'undelete-cleanup-error' => 'خطأ حذف ملف أرشيف غير مستخدم "$1".',
 'undelete-missing-filearchive' => 'غير قادر على استرجاع ملف الأرشيف رقم $1 لأنه ليس في قاعدة البيانات.
 ربما يكون قد تم استرجاعه.',
+'undelete-error' => 'وقع خطأ عند إلغاء حذف الصفحة',
 'undelete-error-short' => 'خطأ استرجاع ملف: $1',
 'undelete-error-long' => 'حدثت أخطاء أثناء استرجاع الملف:
 
@@ -2961,6 +2995,7 @@ $1',
 'exportcuronly' => 'ضمن المراجعة الحالية فقط، وليس التاريخ الكامل',
 'exportnohistory' => "----
 ملاحظة:''' تصدير التاريخ الكامل للصفحات من خلال هذه الاستمارة تم تعطيله لأسباب تتعلق بالأداء'''",
+'exportlistauthors' => 'أضف قائمة كاملة بالمساهمين لكل صفحة',
 'export-submit' => 'صدر',
 'export-addcattext' => 'أضف صفحات من تصنيف:',
 'export-addcat' => 'أضف',
@@ -2993,6 +3028,8 @@ $1',
 'thumbnail_error' => 'خطأ في إنشاء صورة مصغرة: $1',
 'djvu_page_error' => 'صفحة DjVu خارج النطاق',
 'djvu_no_xml' => 'لا يمكن جلب XML لملف DjVu',
+'thumbnail-temp-create' => 'تعذر إنشاء ملف الصورة المصغرة المؤقت',
+'thumbnail-dest-create' => 'تعذر حفظ الصورة المصغرة للوجهة',
 'thumbnail_invalid_params' => 'محددات التصغير غير صحيحة',
 'thumbnail_dest_directory' => 'غير قادر على إنشاء المجلد الهدف',
 'thumbnail_image-type' => 'نوع الصورة غير مدعوم',
index 87825da..7d9ea1c 100644 (file)
@@ -785,7 +785,8 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'userinvalidcssjstitle' => "'''সতৰ্কবাণী:'''  \"\$1\" নামৰ কোনো আৱৰণ নাই। Custom .css আৰু .js পৃষ্ঠাই সৰুফলাৰ শিৰোনামা ব্যৱহাৰ কৰে, যেনে-  {{ns:user}}:Foo/Vector.css ৰ সলনি {{ns:user}}:Foo/vector.css।",
 'updated' => "(আপডেট কৰা হ'ল)",
 'note' => "'''টোকা:'''",
-'previewnote' => "'''এয়া প্ৰাকদৰ্শনহে মাথোন। পৰিৱৰ্তনসমূহ এতিয়ও সংৰক্ষণ কৰা হোৱা নাই!'''",
+'previewnote' => "'''মনত ৰাখিব এয়া মাথোন প্ৰাক্‌দৰ্শনহে।'''
+আপোনাৰ সালসলনিসমূহ এতিয়াও সংৰক্ষণ কৰা হোৱা নাই!",
 'previewconflict' => 'এই প্ৰাকদৰ্শনে ওপৰৰ সম্পাদনা ক্ষেত্ৰৰ লেখা সাঁচি ৰাখিলে যেনেকুৱা দেখা যাব তেনেকুৱা দেখাইছে ।',
 'session_fail_preview' => "'''দুঃখিত! চেচন ডাটা হেৰাই যোৱাৰ কাৰণে আপোনাৰ সম্পাদনা কৃতকাৰ্য্য নহ'ল ।'''
 অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক ।
@@ -1031,8 +1032,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'নিবাৰণ ল’গ',
-'suppressionlogtext' => 'প্ৰশাসকৰ পৰা গোপনে ৰখা অৱলুপ্তি আৰু প্ৰতিবন্ধকৰ তালিকা তলত দিয়া হৈছে ।
-বৰ্তমান কাৰ্য্যৰত নিষেধ আৰু প্ৰতিবন্ধকসমূহৰ বাবে [[Special:BlockList|IP প্ৰতিবন্ধক তালিকা]] ।',
+'suppressionlogtext' => 'পà§\8dৰশাসà¦\95ৰ à¦ªà§°à¦¾ à¦\97à§\8bপনà§\87 à§°à¦\96া à¦¸à¦®à¦² à¦¸à¦®à§\8dপৰà§\8dà¦\95à§\80য় à¦\85ৱলà§\81পà§\8dতি à¦\86ৰà§\81 à¦ªà§\8dৰতিবনà§\8dধà¦\95ৰ à¦¤à¦¾à¦²à¦¿à¦\95া à¦¤à¦²à¦¤ à¦¦à¦¿à¦¯à¦¼à¦¾ à¦¹à§\88à¦\9bà§\87 à¥¤
+বৰà§\8dতমান à¦\95াৰà§\8dযà§\8dযৰত à¦¨à¦¿à¦·à§\87ধ à¦\86ৰà§\81 à¦ªà§\8dৰতিবনà§\8dধà¦\95সমà§\82হৰ à¦¬à¦¾à¦¬à§\87 [[Special:BlockList|IP à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦¤à¦¾à¦²à¦¿à¦\95া]] à¦\9aাà¦\93à¦\95।',
 
 # History merging
 'mergehistory' => 'পৃষ্ঠাৰ ইতিহাসবোৰ মিলাই দিয়ক',
@@ -2429,8 +2430,8 @@ $1',
 'ipb-confirm' => 'প্ৰতিবন্ধক নিশ্চিত কৰক',
 'badipaddress' => 'অগ্ৰহণযোগ্য আই-পি ঠিকনা',
 'blockipsuccesssub' => "বাৰণ কৰা সফল হ'ল",
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ক বাধা দিয়া হৈছে ।<br />
-প্ৰতিবন্ধকৰ পুনৰ্বিবেচনাৰ বাবে [[Special:BlockList|IP প্ৰতিবন্ধক তালিকা]]',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ক বাধা দিয়া হৈছে।<br />
+প্ৰতিবন্ধকৰ পুনৰ্বিবেচনাৰ বাবে [[Special:BlockList|প্ৰতিবন্ধক তালিকা]] চাওক।',
 'ipb-blockingself' => 'আপুনি নিজকে বাধাপ্ৰদান কৰিব বিচাৰিছে ! আপুনি নিশ্চিতনে আপুনি এনে কৰিব ?',
 'ipb-confirmhideuser' => 'আপুনি "সদস্য গোপন কৰক" বৈশিষ্ট সক্ৰিয় থকা এজন সদস্যক বাৰণ কৰিবলৈ ওলাইছে । এই কাৰ্যই সকলো তালিকা আৰু ল\'গ ভৰ্তিৰ পৰা তেওঁৰ নাম আঁতৰাই পেলাব । এই কাম কৰিব বুলি আপুনি নিশ্চিতনে ?',
 'ipb-edit-dropdown' => 'প্ৰতিবন্ধকৰ কাৰণসমূহ সম্পাদনা কৰক',
@@ -2483,9 +2484,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 তথ্যসূত্ৰ হিছাপে নিবাৰণ ল’গ তলত দিয়া হ’ল ।',
 'blocklogentry' => '"[[$1]]" ক $2 $3 লৈ সাল-সলনি কৰাৰ পৰা বাৰণ কৰা হৈছে।',
 'reblock-logentry' => '[[$1]]ৰ প্ৰতিবন্ধক ছেটিং ম্যাদ উকলা সময় $2 $3ৰ সৈতে সলনি কৰা হ’ল ।',
-'blocklogtext' => 'এই ল’গখন অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয় 
-স্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই 
-সামà§\8dপà§\8dৰতিà¦\95 à¦\95াৰà§\8dযৰত à¦¨à¦¿à¦·à§\87ধ à¦\86ৰà§\81 à¦ªà§\8dৰতিবনà§\8dধà¦\95ৰ à¦¬à¦¾à¦¬à§\87 [[Special:BlockList|à¦\86à¦\87.পি. à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦¤à¦¾à¦²à¦¿à¦\95া]] à¦\9aাà¦\93à¦\95 ।',
+'blocklogtext' => 'এই ল’গখন অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয়।
+স্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই।
+সামà§\8dপà§\8dৰতিà¦\95 à¦\95াৰà§\8dযৰত à¦¨à¦¿à¦·à§\87ধ à¦\86ৰà§\81 à¦ªà§\8dৰতিবনà§\8dধà¦\95ৰ à¦¬à¦¾à¦¬à§\87 [[Special:BlockList|পà§\8dৰতিবনà§\8dধà¦\95 à¦¤à¦¾à¦²à¦¿à¦\95া]] à¦\9aাà¦\93à¦\95।',
 'unblocklogentry' => '$1 বাৰণ উঠাই লোৱা হ’ল',
 'block-log-flags-anononly' => 'কেৱল বেনামী সদস্য',
 'block-log-flags-nocreate' => 'একাউন্ট সৃষ্টি নিষ্ক্ৰিয় কৰা হৈছে',
index 71aa803..ffb34ca 100644 (file)
@@ -859,6 +859,10 @@ Estos parámetros s'omitieron.",
 'parser-template-loop-warning' => 'Hai una rueda de plantíes: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Se pasó la llende de fondura recursiva de les plantíes ($1)',
 'language-converter-depth-warning' => 'Se pasó la llende de fondura del convertidor de llingües ($1)',
+'node-count-exceeded-category' => 'Páxines onde se pasó la cuenta de nodios',
+'node-count-exceeded-warning' => 'La páxina pasó la cuenta de nodios',
+'expansion-depth-exceeded-category' => "Páxines onde se pasó la fondura d'espansión",
+'expansion-depth-exceeded-warning' => "La páxina pasó la fondura d'espansión",
 
 # "Undo" feature
 'undo-success' => "La edición se pue esfacer.
index 8d7ad25..b835a7f 100644 (file)
@@ -681,6 +681,7 @@ Bloklama qeydlərinin sonuncusu aşağıda göstərilmişdir:',
 'previewconflict' => 'Bu sınaq göstərişidir və yaddaşda saxlayacağınız təqdirdə mətnin redaktə səhifəsinin yuxarı hissəsində nəticənin necə olacağını göstərir.',
 'session_fail_preview' => "'''Üzr istəyirik! Sizin redaktəniz saxlanılmadı. Serverdə identifikasiyanızla bağlı problemlər yaranmışdır. Lütfən bir daha təkrar edin. Problem həll olunmazsa hesabınızdan çıxın və yenidən daxil olun.'''",
 'editing' => 'Redaktə $1',
+'creating' => 'Qurulur $1',
 'editingsection' => 'Redaktə $1 (bölmə)',
 'editingcomment' => 'Redaktə et $1 (yeni bölmə)',
 'editconflict' => 'Eyni vaxtda redaktə: $1',
@@ -1606,6 +1607,7 @@ Qeyd növü, istifadəçi adı və ya təsir edilmiş səhifəni seçməklə dah
 'allpagesnext' => 'Sonrakı',
 'allpagessubmit' => 'Seç',
 'allpagesprefix' => 'Bu prefiksli səhifələri göstər:',
+'allpages-hide-redirects' => 'Yönləndirmələri gizlət',
 
 # Special:Categories
 'categories' => 'Kateqoriyalar',
@@ -2888,6 +2890,7 @@ Variants for Chinese language
 'version-poweredby-others' => 'digərləri',
 'version-software-product' => 'Məhsul',
 'version-software-version' => 'Versiya',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Fayl yolu',
@@ -2995,4 +2998,15 @@ Bu saytda texniki problemlər var.',
 'api-error-unknownerror' => 'Naməlum xəta: "$1".',
 'api-error-uploaddisabled' => 'Bu vikidə fayl yükləmə mümkün deyil.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|saniyə|saniyə}}',
+'duration-minutes' => '$1 {{PLURAL:$1|dəqiqə|dəqiqə}}',
+'duration-hours' => '$1 {{PLURAL:$1|saat|saat}}',
+'duration-days' => '$1 {{PLURAL:$1|gün|gün}}',
+'duration-weeks' => '$1 {{PLURAL:$1|həftə|həftə}}',
+'duration-years' => '$1 {{PLURAL:$1|il|il}}',
+'duration-decades' => '$1 {{PLURAL:$1|onillik|onillik}}',
+'duration-centuries' => '$1 {{PLURAL:$1|əsr|əsr}}',
+'duration-millennia' => '$1 {{PLURAL:$1|minillik|minillik}}',
+
 );
index 51a904b..034a58b 100644 (file)
@@ -13,6 +13,7 @@
  * @author Kaganer
  * @author Reedy
  * @author Roustammr
+ * @author Sagan
  * @author Timming
  * @author Рустам Нурыев
  * @author ҒатаУлла
@@ -304,6 +305,7 @@ $1',
 'versionrequiredtext' => 'Был бит менән эшләү өсөн MediaWiki-ның $1 версияһы кәрәк. [[Special:Version|Ҡулланылған версия тураһында мәғлүмәт битен]] ҡара.',
 
 'ok' => 'Тамам',
+'pagetitle' => '{{SITENAME}} проектынан',
 'retrievedfrom' => 'Сығанағы — «$1»',
 'youhavenewmessages' => 'Яңы $1 бар ($2).',
 'newmessageslink' => 'яңы хәбәр',
@@ -711,6 +713,7 @@ $2
 'note' => "'''Иҫкәрмә:'''",
 'previewnote' => "'''Ҡарап сығыу өлгөһө, әлегә үҙгәрештәр яҙҙырылмаған!'''
 Һеҙҙең үҙгәртеүҙәр әле яҙылмаған!",
+'continue-editing' => 'Мөхәррирләүҙе дауам итергә',
 'previewconflict' => 'Әлеге алдан ҡарау, мөхәррирләү тәҙрәһенең өҫтөндә, һаҡланғандан һуң текстың нисек күренәсәген күрһәтә.',
 'session_fail_preview' => "'''Ҡыҙғанысҡа ҡаршы, һеҙҙең ултырыш идентификаторығыҙ юғалды. Һөҙөмтәлә үҙгәртеүҙәрегеҙ ҡабул ителмәйәсәк.
 Зинһар, тағы бер тапҡыр ҡабатлағыҙ.
@@ -789,6 +792,7 @@ $2
 'edit-no-change' => 'Текста үҙгәртеүҙер булмау сәбәпле үҙгәртеүегеҙгә иғтибар ителмәне.',
 'edit-already-exists' => 'Яңы бит яһап булмай.
 Ул былай ҙа бар.',
+'defaultmessagetext' => 'Алдан билдәләнгән яҙма',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Иғтибар:''' был биттә хәтерҙе күп ҡулланыусы функциялар ныҡ күп.
@@ -1545,6 +1549,10 @@ $1',
 'backend-fail-internal' => '$1 һаҡлағысында билдәһеҙ хата килеп сыҡты',
 'backend-fail-contenttype' => 'Файлды $1 адресына һаҡлар өсөн уның эстәлеге төрөн билдәләп булманы.',
 
+# File journal errors
+'filejournal-fail-dbconnect' => '"$1" мәғлүмәт базаһы журналына тоташып булманы.',
+'filejournal-fail-dbquery' => '«$1» мәғлүмәт базаһын һаҡлағын журналды яңыртып булманы.',
+
 # Lock manager
 'lockmanager-notlocked' => '" $1 " асҡысының биген сисеп булмай; ул бикле түгел.',
 'lockmanager-fail-closelock' => '"$1" асҡысының бикләү файлын ябып булманы.',
@@ -1877,6 +1885,9 @@ $1',
 'allpages-bad-ns' => '{{SITENAME}} проектында "$1" исемдәр арауығы юҡ.',
 'allpages-hide-redirects' => 'Йүнәлтеүҙәрҙе йәшерергә',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Һуңғы версияны ҡарарға',
+
 # Special:Categories
 'categories' => 'Категориялар',
 'categoriespagetext' => 'Түбәндәге {{PLURAL:$1|категорияла|категорияларҙа}} биттәр йәки файлдар бар.
@@ -2319,7 +2330,7 @@ $1',
 'badipaddress' => 'IP адрес дөрөҫ түгел',
 'blockipsuccesssub' => 'Бикләү уңышлы башҡарылды',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] бикләнде.<br />
-[[Special:BlockList|Бикләнгән IP адрестарҙы]] ҡарарға.',
+Биктәрҙе күреү өсөн [[Special:BlockList|бикләнгән IP адрестарҙы]] ҡарағыҙ.',
 'ipb-blockingself' => 'Һеҙ үҙегеҙҙе бикләргә теләйһегеҙ! Быны эшләүҙе раҫлайһығыҙмы?',
 'ipb-confirmhideuser' => '"Ҡулланыусыны йәшер" ғәмәлдә саҡта ҡулланыусыны блокларға теләйһегеҙ. Уның исеме исемлектәрҙә һәм журналдарҙа күренмәйәсәк. Быны эшләргә теләүегеҙҙе раҫлайһығыҙмы?',
 'ipb-edit-dropdown' => 'Бикләү сәбәптәрен мөхәррирләргә',
@@ -2372,8 +2383,8 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 Түбәндә белешмә өсөн йәшереү яҙмалары журналы килтерелгән:',
 'blocklogentry' => '[[$1]] бикләгән, тамамланыу ваҡыты: $2 $3',
 'reblock-logentry' => '[[$1]] ҡатнашыусыһының бикләү көйләүҙәрен үҙгәрткән, тамамланыу ваҡыты — $2 $3',
-'blocklogtext' => 'Ҡатнашыусыларҙы бикләү һәм бикте алыу яҙмалары журналы.
-Авто бикләнеүсе IP адрестар бында күрһәтелмәй.
+'blocklogtext' => 'Ҡатнашыусыларҙы бикләү һәм бикте алыу журналы.
+Автоматик бикләнгән IP адрестар бында күрһәтелмәй.
 [[Special:BlockList|Ғәмәлдәге тыйыуҙырҙы һәм бикләүҙәрҙе]] ҡарай алаһығыҙ.',
 'unblocklogentry' => '$1 ҡулланыусыһының блокланыу ваҡыты тамамланды',
 'block-log-flags-anononly' => 'танылмаған ҡатнашыусылар ғына',
@@ -2620,6 +2631,8 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 'import-invalid-interwiki' => 'Күрһәтелгән вики проекттан тейәү мөмкин түгел.',
 'import-error-edit' => '«$1» битен импортлап булманы, сөнки һеҙгә ул битте мөхәррирләү тыйылған.',
 'import-error-create' => '«$1» битен импортлап булманы, сөнки һеҙгә ул битте яһау тыйылған.',
+'import-error-interwiki' => '«$1» бите импортҡа сығарылманы, сөнки уның исеме тышҡы һылианма  (интервики)өсөн резервланған.',
+'import-error-special' => ' «$1» бите импортҡа сығарылманы, сөнки ул биттәр яһау мөмкин булмаған исемдәр арауығына ҡарай.',
 'import-error-invalid' => '"$1" бите яраҡһыҙ исеме өсөн импортланманы.',
 
 # Import log
@@ -2638,7 +2651,9 @@ JavaScript тикшереү',
 'javascripttest-pagetext-noframework' => 'Был бит JavaScript тикшеренеүҙәре үткәреү өсөн  резервланған.',
 'javascripttest-pagetext-unknownframework' => 'Билдәһеҙ тикшеренеүҙәр мөхитнамәһе "$1".',
 'javascripttest-pagetext-frameworks' => 'Зинһар өсөн киләһе тикшеренеүҙәр мөхитнамәһенең береһен һайлап алығыҙ: $1',
+'javascripttest-pagetext-skins' => 'Һынауҙы башлау өсөн тышса һыйлағыҙ.',
 'javascripttest-qunit-intro' => 'mediawiki.org адресы буйынса ҡарағыҙ [$1 тест үткәреү документацияһы].',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit өсөн һынауҙар йыйлмаһы.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ҡулланыусы битегеҙ',
@@ -2701,6 +2716,7 @@ JavaScript тикшереү',
 'tooltip-diff' => 'Сығанаҡ текстҡа ҡарата эшләгән үҙгәртеүҙәрҙе күрһәтергә.',
 'tooltip-compareselectedversions' => 'Был биттең һайланған ике өлгөһө араһындағы айырманы ҡарарға',
 'tooltip-watch' => 'Битте күҙәтеү исемлегемә өҫтәргә',
+'tooltip-watchlistedit-normal-submit' => 'Биттәрҙе юйырға',
 'tooltip-watchlistedit-raw-submit' => 'Күҙәтеү исемлеген яңыртырға',
 'tooltip-recreate' => 'Битте юйылған булыуына ҡарамаҫтан тергеҙергә',
 'tooltip-upload' => 'Күсерә башларға',
@@ -3441,6 +3457,9 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'version-software' => 'Ҡуйылған программалар',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Өлгөһө',
+'version-entrypoints' => 'Инеш өсөн URL адрестар',
+'version-entrypoints-header-entrypoint' => 'Инеш урыны',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Файлға юл',
@@ -3593,23 +3612,52 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'feedback-bugnew' => 'Тикшерҙем. Яңы хата тураһында белдерергә',
 
 # API errors
+'api-error-badaccess-groups' => 'Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй',
+'api-error-badtoken' => 'Эске хата: дөрөҫ булмаған токен',
+'api-error-copyuploaddisabled' => 'Был серверҙа URL адрес буйынса йөкләү өҙөлгән',
+'api-error-duplicate' => 'Бындай эстәлекле {{PLURAL:$1|[$2 файл]}}  бар.',
+'api-error-duplicate-archive' => 'Сайтта бындай эстәлекле {{PLURAL:$1|[$2 башҡа файл]}} бар ине инде, ләкин {{PLURAL:$1|ул юйылды|улар юйылды}}',
+'api-error-duplicate-archive-popup-title' => 'Элек юйылған {{PLURAL:$1|файлдың|файлдарҙың}} дубликаты',
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|файлы|файлдары}} дубликаты.',
 'api-error-empty-file' => 'Һеҙ ебәргән файл буш.',
 'api-error-emptypage' => 'Яңы буш биттәр яһау тыйыла.',
+'api-error-fetchfileerror' => 'Эске хата: файлды күсергән ваҡытта хата китте',
 'api-error-file-too-large' => 'Һеҙ ебәргән файл үтә ҙур.',
 'api-error-filename-tooshort' => 'Файл исеме бик ҡыҫҡа.',
 'api-error-filetype-banned' => 'Был файл төрө тыйылған.',
+'api-error-filetype-missing' => 'Был файлдың ҡушымтаһы юҡ',
+'api-error-hookaborted' => 'Һеҙ эшләргә теләгән үҙгәртеүҙәр ҡушымтаны тикшереүсе тарафынан өҙөлдө',
 'api-error-http' => 'Эске хата: серверға бәйләнеп булмай.',
 'api-error-illegal-filename' => 'Рөхсәт ителмәгән файл исеме.',
+'api-error-internal-error' => 'Эске хата: һеҙ викиға йөкләгәнде тикшергән ваҡытта хата китте',
+'api-error-invalid-file-key' => 'Эске хата: ваҡытлыса һаҡлағыста файл табылманы',
+'api-error-missingparam' => 'Эске хата: мөрәжәғеттең параматрҙары юҡ.',
+'api-error-missingresult' => 'Эске хата: күсереү уңышлы булыуын билдәләп булманы.',
 'api-error-mustbeloggedin' => 'Файлдарҙы йөкмәтеү өсөн һеҙ сисемаға танышырға тейешһегеҙ.',
+'api-error-mustbeposted' => 'Эске хата: мөрәжәғәт HTTP POST адресын талап итә.',
+'api-error-noimageinfo' => 'Йөкләү уңышлы тамамланды, әммә сервер файл тураһында бер ниндәйҙә мәғлүмәт бирмәне.',
 'api-error-nomodule' => 'Эске хата: тейәү модуле көйләнмәгән.',
 'api-error-ok-but-empty' => 'Эске хата: серверҙан яуап юҡ.',
 'api-error-overwrite' => 'Булған файлды алыштырыу рөхсәт ителмәй.',
+'api-error-stashfailed' => 'Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.',
 'api-error-timeout' => 'Көтөлгән ваҡыт эсендә сервер яуып бирмәне.',
 'api-error-unclassified' => 'Билдәһеҙ хата барлыҡҡа килде.',
 'api-error-unknown-code' => 'Билдәһеҙ хата: «$1»',
+'api-error-unknown-error' => 'Эске хата: файлды йөкләгәндә ниндәйҙер хата китте.',
 'api-error-unknown-warning' => 'Билдәһеҙ белдереү: "$1".',
 'api-error-unknownerror' => 'Билдәһеҙ хата: «$1»',
 'api-error-uploaddisabled' => 'Был викила файл тейәү мөмкинлеге ябылған.',
+'api-error-verification-error' => 'Был файл боҙолған, йәки дөрөҫ булмаған ҡушымтаһы бар.',
+
+# Durations
+'duration-seconds' => 'секунд',
+'duration-minutes' => 'минут',
+'duration-hours' => 'сәғәт',
+'duration-days' => 'көн',
+'duration-weeks' => 'аҙна',
+'duration-years' => 'йыл',
+'duration-decades' => 'декада',
+'duration-centuries' => 'быуат',
+'duration-millennia' => 'меңйыллыҡ',
 
 );
index 11c12de..ca894f9 100644 (file)
@@ -927,6 +927,7 @@ $2
 'note' => "'''Заўвага: '''",
 'previewnote' => "'''Гэта толькі папярэдні прагляд.'''
 Вашыя зьмены яшчэ не былі захаваныя!",
+'continue-editing' => 'Працягнуць рэдагаваньне',
 'previewconflict' => 'Гэта папярэдні прагляд тэксту зь верхняга вакна рэдагаваньня, так ён будзе выглядаць, калі Вы вырашыце яго захаваць.',
 'session_fail_preview' => "'''Не атрымалася захаваць Вашую праўку праз тое, што былі страчаныя зьвесткі пра сэсію.
 Калі ласка, паспрабуйце яшчэ раз. Калі памылка ня зьнікне, паспрабуйце [[Special:UserLogout|выйсьці з сыстэмы]] і ўвайсьці ізноў.'''",
@@ -1022,6 +1023,10 @@ $2
 'parser-template-loop-warning' => 'Выяўлены цыкль у шаблёнах: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Перавышана мяжа глыбіні рэкурсіі шаблёнаў ($1)',
 'language-converter-depth-warning' => 'Перавышанае абмежаваньне глыбіні канвэртару варыянтаў мовы ($1)',
+'node-count-exceeded-category' => 'Старонкі зь перавышанай колькасьцю вузлоў',
+'node-count-exceeded-warning' => 'Старонка перавысіла дазволеную колькасьць вузлоў',
+'expansion-depth-exceeded-category' => 'Старонкі зь перавышанай глыбінёй уключэньня',
+'expansion-depth-exceeded-warning' => 'Старонка перавысіла дазволеную глыбіню ўключэньняў',
 
 # "Undo" feature
 'undo-success' => 'Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.',
@@ -2546,8 +2551,8 @@ $1',
 'ipb-confirm' => 'Пацьвердзіць блякаваньне',
 'badipaddress' => 'Некарэктны IP-адрас',
 'blockipsuccesssub' => 'Блякаваньне пасьпяховае',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] {{GENDER:$1|быў заблякаваны|была заблякаваная}}.
-<br />Глядзіце [[Special:BlockList|сьпіс заблякаваных IP-адрасоў]] дзеля перагляду блякаваньняў.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] {{GENDER:$1|быў заблякаваны|была заблякаваная}}.<br />
+Глядзіце [[Special:BlockList|сьпіс блякаваньняў]] дзеля іх перагляду.',
 'ipb-blockingself' => 'Вы зьбіраецеся заблякаваць самога сябе! Вы ўпэўнены, што жадаеце гэта зрабіць?',
 'ipb-confirmhideuser' => 'Вы зьбіраецеся заблякаваць удзельніка са статусам «схаваны». Гэтае дзеяньне прывядзе да таго, што яго імя зьявіцца ва ўсіх сьпісах і журналах уваходу. Вы ўпэўнены, што жадаеце гэта зрабіць?',
 'ipb-edit-dropdown' => 'Рэдагаваць прычыны блякіровак',
@@ -2597,7 +2602,9 @@ $1',
 'blocklog-showsuppresslog' => 'Гэты ўдзельнік ужо заблякаваны і схаваны. Журнал хаваньняў пададзены ніжэй:',
 'blocklogentry' => 'заблякаваны [[$1]] на тэрмін: $2 $3',
 'reblock-logentry' => 'зьмененыя парамэтры блякаваньня для [[$1]] на тэрмін: з $2 да $3',
-'blocklogtext' => 'Гэта журнал уліку блякаваньняў і разблякаваньняў удзельнікаў. Аўтаматычна заблякаваныя IP-адрасы не пазначаныя. Глядзіце [[Special:BlockList|сьпіс заблякаваных IP-адрасоў]], каб пабачыць дзейныя ў гэты момант блякаваньні.',
+'blocklogtext' => 'Гэта журнал уліку блякаваньняў і разблякаваньняў удзельнікаў.
+Аўтаматычна заблякаваныя IP-адрасы не пазначаныя.
+Глядзіце [[Special:BlockList|сьпіс блякаваньняў]], каб пабачыць дзейныя ў гэты момант блякаваньні.',
 'unblocklogentry' => 'разблякаваны $1',
 'block-log-flags-anononly' => 'толькі ананімныя ўдзельнікі',
 'block-log-flags-nocreate' => 'стварэньне рахункаў забароненае',
@@ -3676,6 +3683,9 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'version-software' => 'Усталяванае праграмнае забесьпячэньне',
 'version-software-product' => 'Прадукт',
 'version-software-version' => 'Вэрсія',
+'version-entrypoints' => 'Уваходныя адрасы',
+'version-entrypoints-header-entrypoint' => 'Пункт уваходу',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Шлях да файла',
index d9fb268..7915c90 100644 (file)
@@ -908,6 +908,7 @@ $2
 'updated' => '(обновена)',
 'note' => "'''Забележка:'''",
 'previewnote' => "'''Това е само предварителен преглед. Промените все още не са съхранени!'''",
+'continue-editing' => 'Продължаване на редактирането',
 'previewconflict' => 'Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.',
 'session_fail_preview' => "'''За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия. Опитайте отново. Ако все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново.'''",
 'session_fail_preview_html' => "'''За съжаление редакцията ви не беше записана поради изтичането на сесията ви.'''
@@ -918,6 +919,7 @@ $2
 'token_suffix_mismatch' => "'''Редакцията ви беше отхвърлена, защото браузърът ви е развалил пунктуационните знаци в редакционната отметка. Евентуалното съхранение би унищожило съдържанието на страницата. Понякога това се случва при използването на грешно работещи анонимни междинни сървъри.'''",
 'edit_form_incomplete' => "'''Някои части от формуляра за редактиране не достигнаха до сървъра; проверете дали редакциите ви са непокътнати и опитайте отново.'''",
 'editing' => 'Редактиране на „$1“',
+'creating' => 'Създаване на $1',
 'editingsection' => 'Редактиране на „$1“ (раздел)',
 'editingcomment' => 'Редактиране на „$1“ (нов раздел)',
 'editconflict' => 'Различна редакция: $1',
@@ -2014,6 +2016,7 @@ $1',
 'allpagesprefix' => 'Показване на страници, започващи със:',
 'allpagesbadtitle' => 'Зададеното име е невалидно. Възможно е да съдържа междуезикова или междупроектна представка или пък знаци, които не могат да се използват в заглавия.',
 'allpages-bad-ns' => 'В {{SITENAME}} не съществува именно пространство „$1“.',
+'allpages-hide-redirects' => 'Скриване на пренасочванията',
 
 # Special:Categories
 'categories' => 'Категории',
@@ -2337,6 +2340,7 @@ $UNWATCHURL
 'undelete-bad-store-key' => 'Не е възможно възстановяването на файловата версия с времеви отпечатък $1: файлът е липсвал преди изтриването.',
 'undelete-cleanup-error' => 'Грешка при изтриване на неизползвания архивен файл „$1“.',
 'undelete-missing-filearchive' => 'Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни. Вероятно вече е възстановен.',
+'undelete-error' => 'Грешка при възстановяване на страницата',
 'undelete-error-short' => 'Грешка при възстановяването на изтрития файл: $1',
 'undelete-error-long' => 'Възникнаха грешки при възстановяването на изтрития файл:
 
@@ -3085,9 +3089,11 @@ $1',
 'exif-serialnumber' => 'Сериен номер на фотоапарата',
 'exif-cameraownername' => 'Собственик на фотоапарата',
 'exif-label' => 'Етикет',
+'exif-datetimemetadata' => 'Дата на последна модификация на метаданните',
 'exif-nickname' => 'Неформално име на изображението',
 'exif-rating' => 'Рейтинг (от 5)',
 'exif-rightscertificate' => 'Сертификат за управление на правата',
+'exif-copyrighted' => 'Авторскоправен статут',
 'exif-copyrightowner' => 'Носител на авторското право',
 'exif-usageterms' => 'Условия за използване',
 'exif-originaldocumentid' => 'Уникален номер на оригиналния документ',
@@ -3591,9 +3597,15 @@ MediaWiki се разпространява с надеждата, че ще б
 'logentry-delete-restore' => '$1 възстанови страницата $3',
 'logentry-suppress-revision' => '$1 тайно промени видимостта на {{PLURAL:$5|една версия|$5 версии}} на страницата $3: $4',
 'logentry-suppress-revision-legacy' => '$1 тайно промени видимостта на версиите на страница $3',
+'revdelete-content-hid' => 'скрито съдържание',
+'revdelete-summary-hid' => 'скрито резюме на редакцията',
+'revdelete-uname-hid' => 'скрито потребителско име',
 'revdelete-restricted' => 'добавени ограничения за администраторите',
 'revdelete-unrestricted' => 'премахнати ограничения за администраторите',
+'logentry-move-move' => '$1 премести страницата $3 към заглавие $4',
+'logentry-move-move-noredirect' => '$1 премести страницата $3 към заглавие $4 без да оставя пренасочване',
 'logentry-move-move_redir' => '$1 премести страницата $3 като $4 (върху пренасочване)',
+'logentry-move-move_redir-noredirect' => '$1 премести върху пренасочване страницата $3 към заглавие $4 (без пренасочване)',
 'logentry-patrol-patrol' => '$1 отбеляза като патрулирана версия $4 на страницата „$3“',
 'logentry-patrol-patrol-auto' => '$1 автоматично отбеляза като патрулирана версия $4 на страницата $3',
 'logentry-newusers-newusers' => '$1 създаде потребителска сметка',
@@ -3652,4 +3664,15 @@ MediaWiki се разпространява с надеждата, че ще б
 'api-error-uploaddisabled' => 'Достъпът за качване на файлове в това уики е прекратен.',
 'api-error-verification-error' => 'Файлът може би е повреден или има грешно разширение.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'duration-minutes' => '$1 {{PLURAL:$1|минута|минути}}',
+'duration-hours' => '$1 {{PLURAL:$1|час|часа}}',
+'duration-days' => '$1 {{PLURAL:$1|ден|дни}}',
+'duration-weeks' => '$1 {{PLURAL:$1|седмица|седмици}}',
+'duration-years' => '$1 {{PLURAL:$1|година|години}}',
+'duration-decades' => '$1 {{PLURAL:$1|десетилетие|десетилетия}}',
+'duration-centuries' => '$1 {{PLURAL:$1|век|века}}',
+'duration-millennia' => '$1 {{PLURAL:$1|хилядолетие|хилядолетия}}',
+
 );
index 35aade9..c8c79ec 100644 (file)
@@ -170,11 +170,11 @@ $messages = array(
 'category-empty' => '"Kada tadapat artikal maupun média dalam tumbung ini."',
 'hidden-categories' => '{{PLURAL:$1|Tumbung tasungkup|Tutumbung tasungkup}}',
 'hidden-category-category' => 'Tumbung tasungkup',
-'category-subcat-count' => '{{PLURAL:$2|Tumbung ini baisi asa sub-tumbung barikut.|Tumbung ini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut, matan sabarataan $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Tumbung ngini baisi asa sub-tumbung barikut.|Tumbung ngini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut, matan sabarataan $2.}}',
 'category-subcat-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut.',
-'category-article-count' => '{{PLURAL:$2|Tumbung ni baisi asa tungkaran barikut haja.|Tutumbung ini baisi {{PLURAL:$1|tungkaran|$1 tutungkaran}}, matan $2 sabarataan.}}',
+'category-article-count' => '{{PLURAL:$2|Tumbung ni baisi asa tungkaran barikut haja.|Tutumbung ngini baisi {{PLURAL:$1|tungkaran|$1 tutungkaran}}, matan $2 sabarataan.}}',
 'category-article-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|asa tungkaran|$1 tutungkaran}} barikut.',
-'category-file-count' => '{{PLURAL:$2|Tumbung ini hanya baisi asa barakas barikut.|Tumbung ini baisi {{PLURAL:$1|barakas|$1 babarakas}} barikut, matan $2 sabarataan.}}',
+'category-file-count' => '{{PLURAL:$2|Tumbung ngini hanya baisi asa barakas barikut.|Tumbung ngini baisi {{PLURAL:$1|barakas|$1 babarakas}} barikut, matan $2 sabarataan.}}',
 'category-file-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|barakas|$1 barakas}} barikut.',
 'listingcontinuesabbrev' => 'samb.',
 'index-category' => 'Tungkaran tasusun bapadalakan kata',
@@ -269,7 +269,7 @@ $messages = array(
 'otherlanguages' => 'Dalam bahasa lain',
 'redirectedfrom' => '(Diugahakan matan $1)',
 'redirectpagesub' => 'Tungkaran paugahan',
-'lastmodifiedat' => 'Tungkaran ini tauncit diubah pada $1, $2.',
+'lastmodifiedat' => 'Tungkaran ngini tauncit diubah pada $1, $2.',
 'viewcount' => 'Tungkaran ini sudah diungkai {{PLURAL:$1|kali|$1 kali}}.',
 'protectedpage' => 'Tungkaran nang dilindungi',
 'jumpto' => 'Malacung ka',
@@ -359,7 +359,7 @@ Lihati [[Special:Version|Tungkaran mudil]]',
 'nosuchaction' => 'Kadada palakuan nangkaitu',
 'nosuchactiontext' => 'Palakuan nang diminta URL kada sah.
 Pian pinanya salah katik URL, atawa maumpati sabuah tautan nang kada bujur.
-Ini jua bisa ai ada bug di parangkat lunak nang dipuruk {{SITENAME}}.',
+Ngini jua bisa ai ada bug di parangkat lunak nang dipuruk {{SITENAME}}.',
 'nosuchspecialpage' => 'Kadada tungkaran istimiwa nangitu',
 'nospecialpagetext' => '<strong>Pian maminta tungkaran istimiwa nang kada sah.</strong>
 Daptar tungkaran istimiwa sah kawa diugai pada [[Special:SpecialPages|{{int:specialpages}}]].',
@@ -368,7 +368,7 @@ Daptar tungkaran istimiwa sah kawa diugai pada [[Special:SpecialPages|{{int:spec
 'error' => 'Kasalahan',
 'databaseerror' => 'Kasalahan Basisdata',
 'dberrortext' => 'Ada kasalahan sintaks pada parmintaan basisdata.
-Kasalahan ini pina manandai adanya sabuah bug dalam parangkat lunak.
+Kasalahan ngini pina manandai adanya sabuah bug dalam parangkat lunak.
 Parmintaan basisdata yang tadudi adalah:
 <blockquote><tt>$1</tt></blockquote>
 matan dalam pungsi "<tt>$2</tt>".
@@ -378,7 +378,7 @@ Parmintaan basisdata nang tadudi adalah:
 "$1"
 matan dalam pungsi "$2".
 Basisdata kasalahan  babulik "$3: $4".',
-'laggedslavemode' => "'''Paringatan:''' Tungkaran ini pinanya kada baisi parubahan tahanyar.",
+'laggedslavemode' => "'''Paringatan:''' Tungkaran ngini pinanya kada baisi parubahan tahanyar.",
 'readonly' => 'Basisdata tasunduk',
 'enterlockreason' => 'Buati sabuah alasan manyunduk, tamasuk jua wayah apa handak dibuka pulang sundukannya.',
 'readonlytext' => 'Basisdata lagi basunduk hagan masukan hanyar wan parubahan lain, pinanya pang lagi ada jadwal paharaguan basis data, imbah ini akan babulik nangkaya biasa.
@@ -388,8 +388,8 @@ Pambakal nang manyunduk mamadahi nangkaini: $1',
 
 Nangkaini biasanya dimargakan tautan lawas ka sabuah tungkaran nang halamnya sudah dihapus.
 
-Munnya lainan ini pasalnya, Pian mungkin batamu bug dalam perangkat lunak.
-Silakan lapurakan ini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah catatan URL nang ditulaki',
+Munnya lainan ngini pasalnya, Pian mungkin batamu bug dalam perangkat lunak.
+Silakan lapurakan ngini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah catatan URL nang ditulaki',
 'missingarticle-rev' => '(ralatan#: $1)',
 'missingarticle-diff' => '(Lain: $1, $2)',
 'readonly_lag' => 'Basisdata sudah utumatis tasunduk pas server basisdata dua lagi marungkuti basisdata tatambaian',
@@ -405,29 +405,29 @@ Silakan lapurakan ini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah cata
 'fileexistserror' => 'Kada kawa manulis ka barakas "$1": barakas sudah ada',
 'unexpected' => 'Nilai kada sasuai harapan: "$1"="$2".',
 'formerror' => 'Kasalahan: kada kawa mangirim purmulir',
-'badarticleerror' => 'Palakuan ini kada kawa dicungulakan pada tungkaran ini.',
+'badarticleerror' => 'Palakuan ngini kada kawa dicungulakan pada tungkaran ngini.',
 'cannotdelete' => "Tungkaran atawa barakas ''$1'' kada kawa dihapus. Pinanya sudah dihapus urang lain badahulu.",
 'cannotdelete-title' => 'Kada kawa mahapus tungkaran "$1"',
 'badtitle' => 'Judul buruk',
 'badtitletext' => 'Judul tungkaran nang diminta kada sah, kada baisi, atawa kada pasnya tautan judul antar-bahasa atawa antar-wiki.
 Nangini bisa baisi satu atawa labih hurup nang saharusnya kadada di judul.',
 'perfcached' => 'Data barikut adalah timbuluk wan pina kada mutakhir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Data nang dudi ini adalah timbuluk, wan tauncit dihahanyari pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
-'querypage-no-updates' => 'Pamugaan matan tungkaran ini rahat dipajahkan. Data nang ada di sia wayahini kada akan dimuat ulang.',
+'perfcachedts' => 'Data nang dudi ni adalah timbuluk, wan tauncit dihahanyari pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'querypage-no-updates' => 'Pamugaan matan tungkaran ngini rahat dipajahkan. Data nang ada di sia wayahini kada akan dimuat ulang.',
 'wrong_wfQuery_params' => 'Kada bujur ukuran ka wfQuery ()<br />
 Pungsi: $1<br />
 Parmintaan: $2',
 'viewsource' => 'Tiringi asal mulanya',
 'viewsource-title' => 'Tiringi asalmula matan $1',
 'actionthrottled' => 'Kalakuan dikiripi',
-'actionthrottledtext' => 'Sawagai sabuah takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ini.
+'actionthrottledtext' => 'Sawagai sabuah takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ngini.
 Muhun cubai pulang dalam babarapa minit.',
-'protectedpagetext' => 'Tungkaran ini sudah dilindungi hagan mancagah babakan.',
-'viewsourcetext' => 'Pian kawa maniringi wan manyalin asal mula tungkaran ini:',
+'protectedpagetext' => 'Tungkaran ngini sudah dilindungi hagan mancagah babakan.',
+'viewsourcetext' => 'Pian kawa maniringi wan manyalin asal mula tungkaran ngini:',
 'viewyourtext' => "Pian kawa maniringi wan salain asalmula matan '''babakan pian''' ka tungkaran ngini:",
 'protectedinterface' => 'Tungkaran ini manyadiakan naskah antarmuha gasan parangkat lunak, wan dilindungi hagan mancagah tasalah puruk.',
 'editinginterface' => "'''Paringatan:''' Pian mambabak sabuah tungkaran nang dipuruk hagan manyadiakan naskah antarmuha gasan parangkat lunak.
-Parubahan ka tungkaran ini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
+Parubahan ka tungkaran ngini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
 Gasan tarjamahan, muhun puruk [//translatewiki.net/wiki/Main_Page?setlang=bjn translatewiki.net], rangka gawian palokalan MediaWiki.",
 'sqlhidden' => '(Parmintaan SQL disungkupakan)',
 'cascadeprotected' => 'Tungkaran ini sudah dilindungi matan pambabakan, marga nangini tamasuk dalam {{PLURAL:$1|tungkaran|tutungkaran}} dudi nang dilindungi "barénténg": $2',
@@ -435,7 +435,7 @@ Gasan tarjamahan, muhun puruk [//translatewiki.net/wiki/Main_Page?setlang=bjn tr
 'customcssprotected' => 'Pian kada baisi ijin mambabak tungkaran CSS ngini, karana ngini baisi setelan paribadi pamakai lain.',
 'customjsprotected' => 'Pian kada baisi ijin mambabak tungkaran JavaScript ngini, karana ngini baisi setelan paribadi pamakai lain.',
 'ns-specialprotected' => 'Tungkaran istimiwa kada kawa dibabak.',
-'titleprotected' => "Judul ini dilindungi matan paulahan ulih [[User:$1|$1]].
+'titleprotected' => "Judul ngini dilindungi matan paulahan ulih [[User:$1|$1]].
 Alasan nang dibariakan adalah ''$2''.",
 
 # Virus scanner
@@ -444,7 +444,7 @@ Alasan nang dibariakan adalah ''$2''.",
 'virus-unknownscanner' => 'Antivirus kada dipinandui:',
 
 # Login and logout pages
-'logouttext' => "'''Pian parhatan ini sudah kaluar log.'''
+'logouttext' => "'''Pian parhatan ni sudah kaluar log.'''
 
 Pian kawa manyambung hagan mangguna'akan {{SITENAME}} kada bangaran, atawa Pian kawa [[Special:UserLogin|babuat log pulang]] sawagai pamakai nang sama atawa sawagai pamakai balain.
 Catatan bahwasa babarapa tungkaran pinanya masih ha tarus manampaiakan Pian masih babuat log, sampai Pian mahabisakan timbuluk panjalajah web Pian.",
@@ -490,7 +490,7 @@ Muhun kawa'akan nang itu wan cubai pulang.",
 Yakinakan Pian hudah mangkawa-akan cookies, muat pulang tungkaran naya wan cubai ja lagi.",
 'noname' => 'Ngaran pamakai nang Pian ajuakan kada sah.',
 'loginsuccesstitle' => 'Kulihan babuat log',
-'loginsuccess' => "'''Pian parhatan ini babuat log dalam {{SITENAME}} sawagai \"\$1\".'''",
+'loginsuccess' => "'''Pian parhatan ni babuat log dalam {{SITENAME}} sawagai \"\$1\".'''",
 'nosuchuser' => 'Kadada pamakai bangaran "$1".
 Ngaran pamakai adalah kasus marinci.
 Lihati pulang ijaan Pian, atawa [[Special:UserLogin/signup|ulah sabuting akun hanyar]]',
@@ -507,9 +507,9 @@ Muhun cubai pulang.',
 'password-login-forbidden' => 'Mamakai ngaran wan katasunduk nangini hudah ditangati.',
 'mailmypassword' => 'Kirimi kata sunduk hanyar',
 'passwordremindertitle' => 'Kata sunduk pahadangan gasan {{SITENAME}}',
-'passwordremindertext' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting katasunduk hanyar gasan {{SITENAME}} ($4). Sabuting katasunduk pahadangan gasan pamakai "$2" hudah diulah wan disetel ka "$3". Amun bujur Pian nang maminta, Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Katasunduk pahadangan Pian akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
+'passwordremindertext' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting katasunduk hanyar gasan {{SITENAME}} ($4). Sabuting katasunduk pahadangan gasan pamakai "$2" hudah diulah wan disetel ka "$3". Amun bujur Pian nang maminta, Pian parlu babuat log wan mamilih katasunduk hanyar wayah ni jua. Katasunduk pahadangan Pian akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
 
-Amun urang lain nang maminta ini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamakai katasunduk lawas Pian.',
+Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamakai katasunduk lawas Pian.',
 'noemail' => 'Kadada alamat suril tarakam gasan pamakai "$1".',
 'noemailcreate' => 'Pian parlu manyadiakan sabuah alamat suril nang sah',
 'passwordsent' => 'Sabuting kata sunduk hanyar sudah dikirim ka suril tadaptar gasan "$1".
@@ -531,10 +531,10 @@ Muhun buati sabuting alamat suril nang bujur pormatnya atawa puangkan haja isian
 'accountcreated' => 'Akun diulah',
 'accountcreatedtext' => 'Akun pamakai gasan $1 sudah diulah.',
 'createaccount-title' => 'Paulahan akun gasan {{SITENAME}}',
-'createaccount-text' => 'Ada urang nang maulah akun gasan alam suril Pian pada {{SITENAME}} ($4) bangaran "$2", awan kata sunduk "$3".
-Pian dianjurakan babuat log wan maubah kata sunduk Pian parhatan ini.
+'createaccount-text' => 'Ada urang nang maulah akun gasan alamat suril Pian pada {{SITENAME}} ($4) bangaran "$2", awan kata sunduk "$3".
+Pian dianjurakan babuat log wan maubah kata sunduk Pian parhatan ni.
 
-Pian kawa kada mahual pasan ini, amun paulahan akun ini adalah kasalahan.',
+Pian kawa kada mahual pasan ngini, amun paulahan akun ini adalah kasalahan.',
 'usernamehasherror' => 'Ngaran pamakai kada kawa mangandung tanda kurung',
 'login-throttled' => 'Pian sudah kabanyakan mancuba babuat log.
 Muhun hadangi dahulu sapandang hanyar cubai pulang.',
@@ -556,12 +556,12 @@ Hagan manuntungakan babuat log, Pian musti manyetel sabuah katasunduk hanyar di
 'retypenew' => 'Katik pulang katasunduk hanyar:',
 'resetpass_submit' => 'Setel katasunduk wan babuat log',
 'resetpass_success' => 'Katasunduk Pian bahasil diubah!
-Wayah ini Pian sudah babuat log...',
+Wayah ni Pian sudah babuat log...',
 'resetpass_forbidden' => 'Katasunduk kada kawa diubah',
 'resetpass-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ini langsung.',
 'resetpass-submit-loggedin' => 'Ubah katasunduk',
 'resetpass-submit-cancel' => 'Walangi',
-'resetpass-wrong-oldpass' => 'Katasunduk samantara atawa wayah ini kada sah.
+'resetpass-wrong-oldpass' => 'Katasunduk samantara atawa wayah ni kada sah.
 Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasunduk samantara hanyar.',
 'resetpass-temp-password' => 'Katasunduk samantara:',
 
@@ -569,7 +569,7 @@ Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasundu
 'passwordreset' => 'Bulikakan setelan katasunduk',
 'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuah suril pangingat rarincian akun Pian.',
 'passwordreset-legend' => 'Bulikakan setelan katasunduk',
-'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ini.',
+'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ngini.',
 'passwordreset-pretext' => '{{PLURAL:$1||Buati asa data di bawah ngini}}',
 'passwordreset-username' => 'Ngaran pamakai:',
 'passwordreset-domain' => 'Dumain:',
@@ -583,14 +583,14 @@ tarait awan suril:
 $2
 
 {{PLURAL:$3|katasunduk pahadangan ngini|kakatasunduk pahadangan ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
-Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamuruk katasunduk lawas Pian.',
+Pian parlu babuat log wan mamilih katasunduk hanyar wayah ni jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.',
 'passwordreset-emailtext-user' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamakai barikut {{PLURAL:$3|akun|akun}}
 tarait awan suril:
 
 $2
 
 {{PLURAL:$3|katasunduk pahadangan ngini|kakatasunduk pahadangan ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
-Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamuruk katasunduk lawas Pian.',
+Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.',
 'passwordreset-emailelement' => 'Ngaran pamakai: $1
 Katasunduk pahadangan: $2',
 'passwordreset-emailsent' => 'Sabuah suril pangingat sudah takirim.',
@@ -601,8 +601,8 @@ Katasunduk pahadangan: $2',
 'changeemail' => 'Ganti alamat suril',
 'changeemail-header' => 'Ganti akun alamat suril',
 'changeemail-text' => 'Manuntungakan purmulir ngini hagan mangganti alamat suril Pian. Pian akan parlu mamasukakan katasunduk Pian hagan mayakinakan parubahan ngini.',
-'changeemail-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ini langsung.',
-'changeemail-oldemail' => 'Alamat suril wayah ini:',
+'changeemail-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ngini langsung.',
+'changeemail-oldemail' => 'Alamat suril wayah ni:',
 'changeemail-newemail' => 'Alamat suril puga:',
 'changeemail-none' => '(kadada)',
 'changeemail-submit' => 'Ganti suril',
@@ -629,8 +629,8 @@ Katasunduk pahadangan: $2',
 # Edit pages
 'summary' => 'Kasimpulan:',
 'subject' => 'Subyek/judul:',
-'minoredit' => 'Ini adalah babakan sapalih',
-'watchthis' => 'Itihi tungkaran ini',
+'minoredit' => 'Ngini adalah babakan sapalih',
+'watchthis' => 'Itihi tungkaran ngini',
 'savearticle' => 'Simpan tungkaran',
 'preview' => 'Tilik',
 'showpreview' => 'Tampaiakan titilikan',
@@ -638,11 +638,11 @@ Katasunduk pahadangan: $2',
 'showdiff' => 'Tampaiakan parubahan',
 'anoneditwarning' => "'''Paringatan:''' Pian baluman babuat log.
 Alamat IP Pian akan dirakam dalam tungkaran babakan halam",
-'anonpreviewwarning' => "''Pian baluman babuat log. Manyimpan akan tarakam alamat IP Pian pada sajarah bahari tungkaran ini.''",
+'anonpreviewwarning' => "''Pian baluman babuat log. Manyimpan akan tarakam alamat IP Pian pada sajarah bahari tungkaran ngini.''",
 'missingsummary' => "'''Pangingat:''' Pian kada manyadiakan sabuah kasimpulan babakan.
 Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada bakasimpulan.",
-'missingcommenttext' => 'Muhun buati sabuah kumintar di bawah ini.',
-'missingcommentheader' => "'''Pangingat:''' Pian kada manyadiakan sabuah subjek/judul gasan kumin ini.
+'missingcommenttext' => 'Muhun buati sabuah kumintar di bawah ngini.',
+'missingcommentheader' => "'''Pangingat:''' Pian kada manyadiakan sabuah subjek/judul gasan kumin ngini.
 Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada basubjek/bajudul.",
 'summary-preview' => 'Tilikan kasimpulan:',
 'subject-preview' => 'Titilikan subyek/judul:',
@@ -688,15 +688,15 @@ Pinanya ini sudah diugahakan atawa dihapus parhatan Pian maniringi tungkaran nan
 Katasunduk gasan pamakai hanyar nangini kawa diubah pintang tungkaran ''[[Special:ChangePassword|ubah katasunduk]]'' wayah babuat log.",
 'newarticle' => '(Hanyar)',
 'newarticletext' => "Pian maumpati sabuah tautan ka tungkaran nang baluman ada lagi. Gasan maulah tungkaran, mulai ja mangatik pada kutak di bawah (lihati [[{{MediaWiki:Helppage}}|tungkaran patulung]] gasan panjalasan labih). Amun Pian ka sia cagaran tasalah, klik picikan '''back''' di panjalajah web Pian.",
-'anontalkpagetext' => "----''Ini adalah tungkaran pamandiran gasan pamuruk kada bangaran nang baluman maulah akun pulang, atawa  kada mamuruknya. Kami tapaksa mamuruk numurik alamat IP hagan maminanduinya.
-Alamat IP nangkaini kawaai dipuruk ulih babarapa pamuruk.
+'anontalkpagetext' => "----''Ngini adalah tungkaran pamandiran gasan pamakai kada bangaran nang baluman ma-ulah akun pulang, atawa  kada mamakainya. Kami tapaksa mamakai numurik alamat IP hagan maminanduinya.
+Alamat IP nangkaini kawaai dipuruk ulih babarapa pamakai.
 Amun Pian adalah pamuruk kada bangaran wan marasa kumin nang kada pas ta ka Pian, muhun [[Special:UserLogin/signup|ulah sabuah akun]] or [[Special:UserLogin|babuat log]] hagan mahindari kabingungan awan pamuruk kada bangaran lain kaina.",
-'noarticletext' => 'Parhatan ini kadada naskah di tungkaran ini.
-Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ini]] pintang tungkaran lain,
+'noarticletext' => 'Parhatan ni kadada naskah di tungkaran ngini.
+Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ngini]] pintang tungkaran lain,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} manggagai log barait].</span>,
-atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} mambabak tungkaran ini]</span>.',
-'noarticletext-nopermission' => 'Parhatan ini kadada naskah di tungkaran ini.
-Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ini]] pintang tungkaran lain,
+atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} mambabak tungkaran ngini]</span>.',
+'noarticletext-nopermission' => 'Parhatan ni kadada naskah di tungkaran ngini.
+Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ngini]] pintang tungkaran lain,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} manggagai log barait].</span>.',
 'userpage-userdoesnotexist' => 'Akun pamuruk "<nowiki>$1</nowiki>" kada tadaptar.
 Muhun pariksa amun Pian handak maulah/mambabak tungkaran ini.',
@@ -723,7 +723,7 @@ Log blukir pahabisannya tasadia di bawah ini gasan rujukan:',
 Inatakan bahwasa saragam  tungkaran-tungkaran .css wan .js mamuruk aksara halus, cuntuh {{ns:user}}:Foo/vector.css sawagai tandingan {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Dihanyarakan)',
 'note' => "'''Catatan:'''",
-'previewnote' => "'''Ingatakanlah bahwasa ini titilikan haja nang balum disimpan!'''",
+'previewnote' => "'''Ingatakanlah bahwasa ngini titilikan haja''' Parubahan Pian nang baluman disimpan!",
 'previewconflict' => 'Titilikan ini mancarminakan naskah dalam naskah wilayah atas babakan sawagai mana ini akan mancungul amun disimpan.',
 'session_fail_preview' => "'''Ampun! Kami kada kawa manarusakan babakan Pian karana kahilangan sési data.'''
 Cubai pang sa'asa pulang.
@@ -739,6 +739,7 @@ Babakan ini kada ditarima hagan mancagah kasalahan pada naskah tungkaran.
 Nangini ambahanu tajadi amun Pian mamuruk sabuah layanan proxy buggy bapandal web kada bangaran.",
 'edit_form_incomplete' => "'''Babarapa hagian matan purmulir babakan kada sampai server; pariksa pulang apakah babakan Pian tatap utuh wan cubai lagi.'''",
 'editing' => 'Mambabak $1',
+'creating' => 'Ma-ulah $1',
 'editingsection' => 'Mambabak $1 (hagian)',
 'editingcomment' => 'Mambabak $1 (hagian hanyar)',
 'editconflict' => 'Babakan bacakut: $1',
@@ -761,7 +762,7 @@ Pian jua bajanji ka kami amun Pian manulis ini saurangan, atawa manjumput ini ma
 Amun Pian kada hakun tulisan Pian dibabak kada baumpat lalu, lalu ai kada usah manyumbang di sia.<br />
 Pian jua bajanji ka kami amun Pian manulis ini saurangan, atawa manjumput ini matan sabuah asal mula ampun umum atawa nang samacam asal mula bibas (lihati $1 gasan rarincian).
 '''Jangan kirimkan gawian bahak cipta kada baijin!'''",
-'longpageerror' => "'''Kasalahan: Naskah nang Pian kirim panjangnya $1 kilubita, nangapa tapanjang pada pamanjangnya nang kawa $2 kilubita.'''
+'longpageerror' => "'''Kasalahan: Naskah nang Pian kirim panjangnya {{PLURAL:$1|asa kilubita|$1 kilubita}}, nangapa tapanjang pada pamanjangnya nang kawa {{PLURAL:$2|asa kilubita|$2 kilubita}}.'''
 Nangini kada kawa disimpan.",
 'readonlywarning' => "'''Paringatan: Basis data sudah tasunduk gasan diharagu, jadinya Pian kada kawa manyimpan babakab Pian parhatan ini.'''
 Pian kawa amun handak cut-n-paste naskah ka sabuah barakas naskah wan simpan ini gasan kaina.
@@ -804,6 +805,7 @@ Ini cungul pinanya sudah tahapus.',
 'edit-no-change' => 'Babakan Pian diabaiakan, karana kadada parubahan diulah ka naskah ini.',
 'edit-already-exists' => 'Kada kawa maulah sabuah tungkaran hanyar.
 Nangini sudah ada.',
+'defaultmessagetext' => 'Naskah baku pasan',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Paringatan:''' Tungkaran ini mangandung kabanyakan pungsi parser kiauan.
@@ -961,7 +963,7 @@ Muhun pariksa lolog.',
 
 # Suppression log
 'suppressionlog' => 'Log panikinan',
-'suppressionlogtext' => 'Nang di bawah adalah sabuah daptar matan pahahapusan wan Pamblublukiran tamasuk isi tasungkup matan papambakal. Lihati [[Special:IPBlockList|Daptar IP diblukir]] gasan daptar matan uprasi tahanyar tatangatan wan blublukir.',
+'suppressionlogtext' => 'Nang di bawah adalah sabuting daptar matan pahapusan wan pamblukiran tamasuk isi tasungkup matan pambakal. Lihati [[Special:BlockList|Daptar diblukir]] gasan daptar matan uprasi tahanyar tatangatan wan blukir.',
 
 # History merging
 'mergehistory' => 'Gabungakan hahalam tungkaran',
@@ -1002,7 +1004,7 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 'compareselectedversions' => 'Tandingakan ralatan nang dipilih',
 'showhideselectedversions' => 'Tampaiakan/sungkupakan ralatan-ralatan',
 'editundo' => 'walangi',
-'diff-multi' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih {{PLURAL:$2|asa pamuruk|$2 papamuruk}} kada ditampaiakan)',
+'diff-multi' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih {{PLURAL:$2|asa pamakai|$2 papamakai}} kada ditampaiakan)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih labih pada $2 {{PLURAL:$2|pamuruk|papamuruk}} kada ditampaiakan)',
 
 # Search results
@@ -1024,7 +1026,7 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 'viewprevnext' => 'Tiringi ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Papilihan manggagai',
 'searchmenu-exists' => "'''Ada tungkaran bangaran \"[[:\$1]]\" dalam wiki ini.'''",
-'searchmenu-new' => "'''Maulah tungkaran \"[[:\$1]]\" dalam wiki ini!'''",
+'searchmenu-new' => "'''Maulah tungkaran \"[[:\$1]]\" dalam wiki ngini!'''",
 'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Janaki daptar tungkaran lawan awalan ngini]]',
 'searchprofile-articles' => 'Tungkaran isi',
@@ -1042,7 +1044,7 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 'search-result-score' => 'Kacucukan: $1%',
 'search-redirect' => '(Paugahan $1)',
 'search-section' => '(hagian $1)',
-'search-suggest' => 'Inikah maksud Pian: $1',
+'search-suggest' => 'Nginikah maksud Pian: $1',
 'search-interwiki-caption' => 'Dingsanak rangka gawian',
 'search-interwiki-default' => 'Kulihan $1',
 'search-interwiki-more' => '(lagi)',
@@ -1179,7 +1181,7 @@ Pariksa tag HTML.',
 'prefs-help-realname' => 'Ngaran bujur adalah pilihan haja.
 Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan gawian Pian.',
 'prefs-help-email' => 'Alamat suril adalah opsional, tagal pun parlu gasan mambulikakan setelan katasunduk, amunai Pian kada ingatan.',
-'prefs-help-email-others' => 'Pian kawa jua maijinakan urang mangiau Pian lung tungkaran pamuruk atawa pamandiran Pian kada parlu manampaiakan identitas Pian.',
+'prefs-help-email-others' => 'Pian kawa jua maijinakan urang mangiau Pian lung tungkaran pamakai atawa pamandiran Pian kada parlu manampaiakan identitas Pian.',
 'prefs-help-email-required' => 'Alamat suril diparluakan.',
 'prefs-info' => 'Panjalasan pandal',
 'prefs-i18n' => 'Intarnasionalisasi',
@@ -1357,17 +1359,17 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'recentchanges-legend' => 'Pilihan parubahan tahanyar',
 'recentchangestext' => 'Jajak parubahan wiki pahanyarnya pada tungkaran ngini',
 'recentchanges-feed-description' => 'Susuri parubahan pahanyarnya dalam wiki di kitihan ini',
-'recentchanges-label-newpage' => 'Babakan ini maulah sabuah tungkaran hanyar',
-'recentchanges-label-minor' => 'Ini adalah sabuah babakan sapalih',
-'recentchanges-label-bot' => 'Babakan ini digawi ulih saikung bot',
-'recentchanges-label-unpatrolled' => "Babakan ini baluman ta'awasi",
+'recentchanges-label-newpage' => 'Babakan ngini maulah sabuah tungkaran hanyar',
+'recentchanges-label-minor' => 'Ngini adalah sabuah babakan sapalih',
+'recentchanges-label-bot' => 'Babakan ngini digawi ulih saikung bot',
+'recentchanges-label-unpatrolled' => "Babakan ngini baluman ta'awasi",
 'rcnote' => "Di bawah ni {{PLURAL:$1|'''1'''|'''$1'''}} parubahan tahanyar dalam {{PLURAL:$2|'''1''' hari|'''$2''' hari}} tauncit, sampai $4 pukul $5.",
 'rcnotefrom' => "Di bawah ngini parubahan tumatan '''$2''' (ditampaiakan sampai '''$1''' parubahan)",
 'rclistfrom' => 'Tampaiakan parubahan tahanyar matan $1',
 'rcshowhideminor' => '$1 pambabakan sapalih',
 'rcshowhidebots' => '$1 bot',
-'rcshowhideliu' => '$1 pamuruk nang babuat di log',
-'rcshowhideanons' => '$1 pamuruk kada bangaran',
+'rcshowhideliu' => '$1 pamakai nang babuat di log',
+'rcshowhideanons' => '$1 pamakai kada bangaran',
 'rcshowhidepatr' => "$1 babakan ta'awasi",
 'rcshowhidemine' => '$1 babakan ulun',
 'rclinks' => 'Tampaiakan $1 parubahan tahanyar dalam $2 hari tauncit<br />$3',
@@ -1393,7 +1395,7 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'recentchangeslinked-toolbox' => 'Parubahan tarait',
 'recentchangeslinked-title' => 'Parubahan nang tarait lawan "$1"',
 'recentchangeslinked-noresult' => 'Kadada parubahan pada tautan tutungkaran salawas wayah ditantuakan',
-'recentchangeslinked-summary' => "Ini adalah sabuah daptar parubahan nang diulah hahanyar ini pada tungkaran batautan matan sabuah tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
+'recentchangeslinked-summary' => "Ngini adalah sabuah daptar parubahan nang diulah hahanyar ngini pada tungkaran batautan matan sabuah tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
 Tutungkaran dalam [[Special:Watchlist|daptar itihan Pian]] ditandai '''kandal'''.",
 'recentchangeslinked-page' => 'Ngaran tungkaran:',
 'recentchangeslinked-to' => 'Tampaiakan parubahan matan tungkaran-tungkaran nang tataut lawan tungkaran nang disurungakan',
@@ -1651,7 +1653,7 @@ Parhatan disaring ulih pamuruk, babarakas nang pamuruk hunggah ralatan pahanyarn
 # File description page
 'file-anchor-link' => 'Barakas',
 'filehist' => 'Barakas halam',
-'filehist-help' => 'Klik pada tanggal/waktu gasan maniringi barakas ini pada wayah itu.',
+'filehist-help' => 'Klik pada tanggal/waktu gasan maniringi barakas ngini pada wayah itu.',
 'filehist-deleteall' => 'hapus samunyaan',
 'filehist-deleteone' => 'hapus',
 'filehist-revert' => 'bulikakan',
@@ -1660,13 +1662,13 @@ Parhatan disaring ulih pamuruk, babarakas nang pamuruk hunggah ralatan pahanyarn
 'filehist-thumb' => 'Pahalusan',
 'filehist-thumbtext' => 'Pahalusan gasan bantuk per $1',
 'filehist-nothumb' => 'Kadada thumbnail',
-'filehist-user' => 'Pamuruk',
+'filehist-user' => 'Pamakai',
 'filehist-dimensions' => 'Matra',
 'filehist-filesize' => 'Ukuran barakas',
 'filehist-comment' => 'Ulasan',
 'filehist-missing' => 'Barakas hilang',
 'imagelinks' => 'Tautan barakas',
-'linkstoimage' => '{{PLURAL:$1|tautan tungkaran|$1 tautan tungkaran}} dudi ka barakas ini:',
+'linkstoimage' => '{{PLURAL:$1|tautan tungkaran|$1 tautan tungkaran}} dudi ka barakas ngini:',
 'linkstoimage-more' => 'Labihan pada $1 {{PLURAL:$1|tatautan tungkaran|tautan tutungkaran}} ka barakas ngini.
 Daptar barikut manampaiakan {{PLURAL:$1|tautan panambaian tungkaran|$1 panambaian tatautan tungkaran}} ka barakas ngini haja.
 Sabuah [[Special:WhatLinksHere/$2|daptar hibak]] tasadia.',
@@ -1932,7 +1934,7 @@ Protokol nang didukung: <tt>$1</tt> (jangan tambahakan dalam panggagaian Pian)',
 'activeusers-noresult' => 'Kadada papamuruk tatamu.',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Log pamuruk hanyar',
+'newuserlogpage' => 'Log pamakai hanyar',
 'newuserlogpagetext' => 'Ngini adalah sabuah log paulahan pamuruk.',
 
 # Special:ListGroupRights
@@ -2075,7 +2077,7 @@ kitihan-bulik wan pangganian labih jauh:
 'historywarning' => "'''Paringatan:''' Tungkaran nang Pian pasal hagan hapus baisi sabuah halam sakitar $1 {{PLURAL:$1|ralatan|raralatan}}:",
 'confirmdeletetext' => 'Pian handak mahapus sabuah tungkaran awan samunyaan halamnya.
 Muhun mamastiakan amun Pian handak manggawi ini, bahwasa Pian paham akibatnya, wan apa nang Pian gawi ini sasuai awan [[{{MediaWiki:Policy-url}}|kabijakan {{SITENAME}}]].',
-'actioncomplete' => 'Pangulahan tuntung',
+'actioncomplete' => 'Pa-ulahan tuntung',
 'actionfailed' => 'Palakuan luput',
 'deletedtext' => '"$1" sudah tahapus. Lihati $2 sabuah rakaman gasan nang hanyar ni tahapus.',
 'dellogpage' => 'Log pahapusan',
@@ -2250,8 +2252,8 @@ $1',
 'blanknamespace' => '(Tatambaian)',
 
 # Contributions
-'contributions' => 'Sumbangan pamuruk',
-'contributions-title' => 'Sumbangan pamuruk gasan $1',
+'contributions' => 'Sumbangan pamakai',
+'contributions-title' => 'Sumbangan pamakai gasan $1',
 'mycontris' => 'Sumbangan ulun',
 'contribsub2' => 'Gasan $1 ($2)',
 'nocontribs' => 'Kadada parubahan taugai parsis awan karitaria ngini.',
@@ -2259,7 +2261,7 @@ $1',
 'month' => 'Matan bulan (wan sabalumnya):',
 'year' => 'Matan tahun (wan sabalumnya):',
 
-'sp-contributions-newbies' => 'Tampaiakan sumbangan pamuruk-pamuruk hanyar haja',
+'sp-contributions-newbies' => 'Tampaiakan sumbangan papamakai hanyar haja',
 'sp-contributions-newbies-sub' => 'Gasan akun hanyar',
 'sp-contributions-newbies-title' => 'Sumbangan pamuruk gasan akun hanyar',
 'sp-contributions-blocklog' => 'Log blukir',
@@ -2273,7 +2275,7 @@ Log blukir pahabisannya tasadia di bawah ni gasan rujukan:',
 'sp-contributions-blocked-notice-anon' => 'Alamat IP ngini parhatan ini diblukir.
 Log blukir pahabisannya tasadia di bawah ngini gasan rujukan:',
 'sp-contributions-search' => 'Gagai gasan sumbangan',
-'sp-contributions-username' => 'Alamat IP atawa ngaran pamuruk:',
+'sp-contributions-username' => 'Alamat IP atawa ngaran-pamakai:',
 'sp-contributions-toponly' => 'Tampaiakan hanya ralatan tauncit',
 'sp-contributions-submit' => 'Gagai',
 
@@ -2334,8 +2336,8 @@ Isi sabuah alasan khas di bawah (gasan cuntuh, manulisakan tutungkaran nang suah
 'ipb-confirm' => 'Yakinakan blukir',
 'badipaddress' => 'Alamat IP kada sah',
 'blockipsuccesssub' => 'Pamblukiran ruhui',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] sudah diblukir.<br />
-Janaki [[Special:BlockList|daptar IP dibluk]] hagan maniring-pulang blukir.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] hudah diblukir.<br />
+Janaki [[Special:BlockList|daptar dibluk]] hagan maniring-pulang blukir.',
 'ipb-blockingself' => 'Pian pasal mamblukir Pian surang! Bujurkah Pian mahandaki ngitu?',
 'ipb-confirmhideuser' => 'Pian pasal mamblukir saurang pamuruk awan "sungkupakan pamuruk" di-kawa-akan. Ngini akan manikin/kadada ngaran pamuruk dalam samunyaan daptar wan log masukan. Pian yakin kah handak manggawi ngitu?',
 'ipb-edit-dropdown' => 'Aalasan pamblukiran babakan',
@@ -2350,7 +2352,7 @@ Janaki [[Special:BlockList|daptar IP dibluk]] hagan maniring-pulang blukir.',
 'unblocked-range' => '$1 sudah dilapas blukirnya',
 'unblocked-id' => 'Blukir $1 sudah dibuang',
 'blocklist' => 'Pamuruk tablukir',
-'ipblocklist' => 'Pamuruk tablukir',
+'ipblocklist' => 'Pamakai tablukir',
 'ipblocklist-legend' => 'Ugai saurang pamuruk tablukir',
 'blocklist-userblocks' => 'Sungkupakan pamblukiran akun',
 'blocklist-tempblocks' => 'Sungkupakan pamblukiran samantara',
@@ -2389,8 +2391,8 @@ Log panikinan disadiakan di bawah gasan rujukan:',
 'blocklogentry' => 'mamblukir [[$1]] sampai wayah $2 $3',
 'reblock-logentry' => 'setelan blukir diubah gasan [[$1]] awan sabuah wayah kadaluarsa $2 $3',
 'blocklogtext' => 'Ngini adalah log matan blukir wan lapas-blukir pamuruk.
-Blukir alamat IP utumatis kada didaptar.
-Janaki [[Special:BlockList|daptar IP diblukir]] gasan daptar oparasi diikat wan diblukir tadamini.',
+Blukir alamat IP utumatis kada tadaptar.
+Janaki [[Special:BlockList|daptar diblukir]] gasan daptar uprasi dibabat wan pamblukiran pahanyarnya.',
 'unblocklogentry' => 'Mahilangakan blukir "$1"',
 'block-log-flags-anononly' => 'papamuruk kada bangaran haja',
 'block-log-flags-nocreate' => 'Paulahan akun dipajahakan',
@@ -2639,31 +2641,31 @@ Muhun cubai pulang.',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ralatan|raralatan}} matan $2',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tungkaran pamuruk Pian',
+'tooltip-pt-userpage' => 'Tungkaran pamakai Pian',
 'tooltip-pt-anonuserpage' => 'Tungkaran pamuruk matan alamat IP Pian mambabak sawagai',
 'tooltip-pt-mytalk' => 'Tungkaran pamandiran Pian',
 'tooltip-pt-anontalk' => 'Pamandiran pasal bababakan matan alamat IP ngini',
 'tooltip-pt-preferences' => 'Nang Pian katuju',
 'tooltip-pt-watchlist' => 'Daptar tungkaran-tungkaran nang Pian itihi parubahannya',
 'tooltip-pt-mycontris' => 'Daptar sumbangan Pian',
-'tooltip-pt-login' => 'Pian sabaiknya babuat ka dalam log; tagal ini kada kawajiban pang',
+'tooltip-pt-login' => 'Pian sabaiknya babuat ka dalam log; tagal ngini kada kawajiban pang',
 'tooltip-pt-anonlogin' => 'Pian sabaiknya babuat ka dalam log; tagal ini kada kawajiban pang',
 'tooltip-pt-logout' => 'Kaluar',
 'tooltip-ca-talk' => 'Pamandiran pasal isi tungkaran',
-'tooltip-ca-edit' => 'Pian kawa mambabak tungkaran ini. Tabéngkéng amun mamuruk picikan titilikan sabalum manyimpan',
+'tooltip-ca-edit' => 'Pian kawa mambabak tungkaran ngini. Tabéngkéng amun mamakai picikan titilikan sabalum manyimpan',
 'tooltip-ca-addsection' => 'Mulai hagian hanyar',
-'tooltip-ca-viewsource' => 'Tungkaran ini dilindungi. Pian kawa maniring asal mulanya.',
-'tooltip-ca-history' => 'Raralatan bahari tungkaran ini',
+'tooltip-ca-viewsource' => 'Tungkaran ngini dilindungi. Pian kawa maniring asal mulanya.',
+'tooltip-ca-history' => 'Raralatan bahari tungkaran ngini',
 'tooltip-ca-protect' => 'Lindungi tungkaran ini',
 'tooltip-ca-unprotect' => 'Ganti parlindungan tungkaran ngini',
 'tooltip-ca-delete' => 'Hapus tungkaran ini',
 'tooltip-ca-undelete' => 'Bulikakan babakan ka tungkaran ini sabalum tungkaran ini dihapus',
-'tooltip-ca-move' => 'Pindahakan tungkaran ini',
-'tooltip-ca-watch' => 'Tambahi tungkaran ini ka daptar itihan Pian',
-'tooltip-ca-unwatch' => 'Buang tungkaran ini matan daptar itihan Pian',
+'tooltip-ca-move' => 'Pindahakan tungkaran ngini',
+'tooltip-ca-watch' => 'Tambahi tungkaran ngini ka daptar itihan Pian',
+'tooltip-ca-unwatch' => 'Buang tungkaran ngini matan daptar itihan Pian',
 'tooltip-search' => 'Gagai {{SITENAME}}',
 'tooltip-search-go' => 'Tulak ka sabuah tungkaran bangaran sama munnya sudah ada',
-'tooltip-search-fulltext' => 'Gagai tungkaran nang baisi naskah nangkaya ini',
+'tooltip-search-fulltext' => 'Gagai tungkaran nang baisi naskah nangkaya ngini',
 'tooltip-p-logo' => 'Ilangi tungkaran tatambaian',
 'tooltip-n-mainpage' => 'Ilangi tungkaran tatambaian',
 'tooltip-n-mainpage-description' => 'Ilangi Tungkaran Tatambaian',
@@ -2673,17 +2675,17 @@ Muhun cubai pulang.',
 'tooltip-n-randompage' => 'Tampaiakan sabuah babarang tungkaran',
 'tooltip-n-help' => 'Wadah maugai patulung',
 'tooltip-t-whatlinkshere' => 'Daptar samunyaan tungkaran wiki nang ada tautan ka sia',
-'tooltip-t-recentchangeslinked' => 'Parubahan tahanyar dalam tutungkaran tataut matan tungkaran ini',
+'tooltip-t-recentchangeslinked' => 'Parubahan tahanyar dalam tutungkaran tataut matan tungkaran ngini',
 'tooltip-feed-rss' => 'Kitihan RSS gasan tungkaran ini',
-'tooltip-feed-atom' => 'Kitihan Atum gasan tungkaran ini',
-'tooltip-t-contributions' => 'Tiringi daptar sumbangan pamuruk ini',
-'tooltip-t-emailuser' => 'Kirimi surel ka pamuruk ini',
+'tooltip-feed-atom' => 'Kitihan Atum gasan tungkaran ngini',
+'tooltip-t-contributions' => 'Sabuah daptar sumbangan pamakai ngini',
+'tooltip-t-emailuser' => 'Kirimi surel ka pamakai ini',
 'tooltip-t-upload' => 'Hunggahakan babarakas',
 'tooltip-t-specialpages' => 'Daptar samunyaan tungkaran istimiwa',
-'tooltip-t-print' => 'Nang kawa dicitaknya tungkaran ini',
-'tooltip-t-permalink' => 'Tautan tatap ka raralatan tungkaran ini',
+'tooltip-t-print' => 'Nang kawa dicitaknya tungkaran ngini',
+'tooltip-t-permalink' => 'Tautan tatap ka raralatan tungkaran ngini',
 'tooltip-ca-nstab-main' => 'Tiringi tungkaran isi',
-'tooltip-ca-nstab-user' => 'Tiring tungkaran pamuruk',
+'tooltip-ca-nstab-user' => 'Tiring tungkaran pamakai',
 'tooltip-ca-nstab-media' => 'Tiringi tungkaran media',
 'tooltip-ca-nstab-special' => 'Nangini sabuah tungkaran istimiwa nang kada kawa dibabak.',
 'tooltip-ca-nstab-project' => 'Tiringi tungkaran rangka gawian',
@@ -2694,14 +2696,14 @@ Muhun cubai pulang.',
 'tooltip-ca-nstab-category' => 'Lihati tungkaran tumbung',
 'tooltip-minoredit' => 'Tandai ini sabagai sabuah pambabakan sapalih',
 'tooltip-save' => 'Simpan parubahan Pian',
-'tooltip-preview' => 'Tilik parubahan Pian, muhun puruk ini sabalum manyimpan!',
+'tooltip-preview' => 'Tilik parubahan Pian, muhun pakai ngini sabalum manyimpan!',
 'tooltip-diff' => 'Tampaiakan nang apa parubahan nang Pian ulah',
-'tooltip-compareselectedversions' => 'Lihati nang balain antara dua ralatan tungkaran tapilih ini',
+'tooltip-compareselectedversions' => 'Lihati nang balain antara dua ralatan tungkaran tapilih ngini',
 'tooltip-watch' => 'Tambahakan tungkaran ini ka daptar itihan Pian',
 'tooltip-recreate' => 'Ulah pulang tungkaran biar gin suah dihapus',
 'tooltip-upload' => 'Mulai pangunggahan',
-'tooltip-rollback' => 'Bulikakan ka babakan-babakan tungkaran ini matan panyumbang tauncit dalam sakali klik.',
-'tooltip-undo' => 'Mamantukakan ralatan ini wan mambuka kutak pambabakan lawan mode tilik. Alasan kawa ditambahakan di kutak kasimpulan.',
+'tooltip-rollback' => 'Bulikakan ka babakan-babakan tungkaran ngini matan panyumbang tauncit dalam sakali klik.',
+'tooltip-undo' => 'Mamantukakan ralatan ngini wan mambuka kutak pambabakan lawan mode tilik. Alasan kawa ditambahakan di kutak kasimpulan.',
 'tooltip-preferences-save' => 'Simpan kakatujuan',
 'tooltip-summary' => 'Buati sabuah kasimpulan handap',
 
@@ -2786,7 +2788,7 @@ Manarusakan ngini, kawa manyarang sistem Pian.",
 'svg-long-desc' => 'Barakas SVG, nominal $1 × $2 piksel, basar barakas: $3',
 'show-big-image' => 'Ukuran hibak',
 'show-big-image-preview' => 'Takaran tilikan ngini: $1.',
-'show-big-image-other' => 'Resolusi lain: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Risulusi|Risulusi}} lain: $1.',
 'show-big-image-size' => '$1 × $2 piksal',
 'file-info-gif-looped' => 'mambulat',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|pigura|pipigura}}',
@@ -2822,7 +2824,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => 'Barakas ini mangandung panjalasan tambahan, mungkin ditambahakan ulih kudakan atawa paundai nang dipurukakan gasan maulah atawa digitalisasi barakas. Amun barakas ini sudah diubah, parincian nang ada mungkin kada sapanuhnya sasuai lawan barakas nang diubah.',
+'metadata-help' => 'Barakas ngini mangandung panjalasan tambahan, mungkin ditambahakan ulih kudakan atawa paundai nang dipurukakan gasan maulah atawa digitalisasi barakas. Amun barakas ngini sudah diubah, parincian nang ada mungkin kada sapanuhnya sasuai lawan barakas nang diubah.',
 'metadata-expand' => 'Tampaiakan tambahan rincian',
 'metadata-collapse' => 'Sungkupakan tambahan rincian',
 'metadata-fields' => 'Pancitraan metadata tadaptar dalam pasan ngini akan masuk dalam tungkaran pancitraan wayah tabel metadata tasungkup. Nang lainnya cagaran babaku tasungkup.
@@ -3230,7 +3232,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
 'exif-urgency-other' => 'Ganti-suai utamaan ($1)',
 
 # External editor support
-'edit-externally' => 'Babak barakas ini puruk sabuah aplikasi luar',
+'edit-externally' => 'Babak barakas ngini puruk sabuah aplikasi luar',
 'edit-externally-help' => '(Lihati [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] untuk panjalasan labih)',
 
 # 'all' in various places, this might be different for inflected languages
@@ -3560,9 +3562,9 @@ Situs ngini mangalami kangalihan teknik.',
 'logentry-move-move_redir-noredirect' => '$1 diugah tungkaran $3 ka $4 lung sabuah paugahan awan-kada maninggalakan sabuah paugahan',
 'logentry-patrol-patrol' => "$1 diciri'i ralatan $4 matan tungkaran $3 taawasi",
 'logentry-patrol-patrol-auto' => "$1 utumatis diciri'i ralatan $4 matan tungkaran $3 taawasi",
-'logentry-newusers-newusers' => '$1 diulah sabuah akun pamuruk',
-'logentry-newusers-create' => '$1 diulah sabuah akun pamuruk',
-'logentry-newusers-create2' => '$1 diulah sabuah akun pamuruk $3',
+'logentry-newusers-newusers' => '$1 ma-ulah sabuting akun pamakai',
+'logentry-newusers-create' => '$1 ma-ulah sabuting akun pamakai',
+'logentry-newusers-create2' => '$1 ma-ulah sabuting akun pamakai $3',
 'logentry-newusers-autocreate' => 'Akun $1 utumatis diulah',
 'newuserlog-byemail' => 'Katasunduk dikirimakan lung suril.',
 
index cbb5f01..306ed62 100644 (file)
@@ -451,6 +451,9 @@ $2',
 'customjsprotected' => 'আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।',
 'ns-specialprotected' => '{{ns:special}} নামস্থানে পাতাসমূহ সম্পাদনা করা যাবে না।',
 'titleprotected' => "[[User:$1|$1]]-কে এই শিরোনামের পাতা সৃষ্টি করতে বাধা দেয়া হচ্ছে। কারণ: ''$2''।",
+'filereadonlyerror' => '"$1" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারন "$2" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।
+
+একজন প্রশাসক যিনি এটাকে লকড করেছেন তার যৌক্তিকতা দেওয়া হল: "$3"',
 
 # Virus scanner
 'virus-badscanner' => "ভুল কনফিগারেশন: অজ্ঞাত ভাইরাস স্কেনার: ''$1''",
@@ -534,6 +537,7 @@ $2',
 'emailconfirmlink' => 'আপনার ই-মেইলের ঠিকানা নিশ্চিত করুন',
 'invalidemailaddress' => 'এই ই-মেইল ঠিকানাটি গ্রহণযোগ্য নয়, কারণ সম্ভবত এটি সঠিক ফরম্যাটে লেখা হয়নি। অনুগ্রহ করে সঠিক ফরম্যাটে লেখা ই-মেইল ঠিকানা দিন, অথবা ক্ষেত্রটি খালি রাখুন।',
 'cannotchangeemail' => 'একাউন্ট ইমেইল ঠিকানা এই উইকিতে পরিবর্তন করা যাবে না।',
+'emaildisabled' => 'এই সাইটটিতে ই-মেইল প্রদানের সুবিধা নেই।',
 'accountcreated' => 'অ্যাকাউন্ট তৈরি করা হয়েছে',
 'accountcreatedtext' => '$1 এর জন্য ব্যবহারকারী অ্যাকাউন্ট তৈরি করা হয়েছে।',
 'createaccount-title' => '{{SITENAME}}-এর জন্য অ্যাকাউন্ট সৃষ্টি',
@@ -578,6 +582,7 @@ $2',
 'passwordreset-username' => 'ব্যবহারকারী নাম:',
 'passwordreset-domain' => 'ডোমেইন:',
 'passwordreset-capture' => 'অনুসন্ধানের ফলাফলের ইমেইল দেখুন?',
+'passwordreset-capture-help' => 'আপনি যদি এই চেক বক্সে ক্লিক করেন, তবে অস্থায়ী শব্দচাবিসহ একটি ই-মেইল আপনাকে দেখানো হবে ও সেইসাথে ব্যবহারকারীকে তা পাঠানো হবে।',
 'passwordreset-email' => 'ইমেইল ঠিকানা:',
 'passwordreset-emailtitle' => '{{SITENAME}} সাইটে ব্যবহারকারীর বিস্তারিত তথ্যাদি',
 'passwordreset-emailtext-ip' => 'কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার
@@ -712,12 +717,12 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'userpage-userdoesnotexist-view' => 'ব্যবহারকারী অ্যাকাউন্ট "$1" অনিবন্ধিত।',
 'blocked-notice-logextract' => 'এই ব্যবহারকারী বর্তমানে ব্লক রয়েছে।
 রেফারেন্সের জন্য সাম্প্রতিক ব্লক লগ ভুক্তি নিচে দেওয়া হল:',
-'clearyourcache' => "'''লক্ষ্য করুন:আপনার পছন্দগুলো রক্ষা করার পর পরিবর্তনগুলো দেখার জন্য আপনাকে ব্রাউজারের ক্যাশ এড়াতে হতে পারে।'''
-*'''ফায়ারফক্স/সাফারি:''' ''শিফট'' কী চেপে ধরে ''রিলোড''-এ ক্লিক করুন, কিংবা হয় ''কন্ট্রোল-F5'' অথবা ''কন্ট্রোল-R''(ম্যাক-এ ''কমান্ড-R'') একসাথে চাপুন;
-*'''গুগল ক্রোম:''' ''কন্ট্রোল-শিফট-R''  (ম্যাক-এ ''কমান্ড-শিফট-R'') চাপতে হবে
-*'''ইন্টারনেট এক্সপ্লোরার:''' ''কন্ট্রোল'' চেপে ধরে ''রিফ্রেশ''-এ ক্লিক করুন, কিংবা ''কন্ট্রোল-F5'' চাপুন
-*'''কংকারার:''' কেবল ''রিলোড'' ক্লিক করলেই বা ''F5'' চাপলেই চলবে;
-*'''অপেরা:''' ''Tools→Preferences''-এ গিয়ে ক্যাশ পরিষ্কার করে নিন;",
+'clearyourcache' => "'''লক্ষ্য করুন:''' সংরক্ষণের পর, পরিবর্তনগুলো দেখতে আপনাকে আপনার ব্রাউজারে ক্যাশে পরিস্কার করার প্রয়োজন হতে পারে।
+* '''ফায়ারফক্স / সাফারি:''' ''শিফট'' কি ধরে রাখা অবস্থায় ''রিলোড''-এ ক্লিক করুন, অথবা ''Ctrl-F5'' বা ''Ctrl-R'' (ম্যাক-এ ''⌘-R'') চাপুন
+* '''গুগল ক্রোম:''' ''Ctrl-Shift-R'' (ম্যাক-এ ''⌘-Shift-R'') চাপুন
+* '''ইন্টারনেট এক্সপ্লোরার:''' ''Ctrl'' কি ধরে রাখা অবস্থায় ''রিফ্রেশ''-এ ক্লিক করুন, অথবা ''Ctrl-F5'' চাপুন
+* '''কনকুয়েরার:''' ''রিলোড''-এ ক্লিক করুন বা ''F5'' চাপুন
+* '''অপেরা:''' ''টুলস → প্রিফারেন্স''-এ গিয়ে ক্যাশে পরিস্কার করে নিন",
 'usercssyoucanpreview' => "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন CSS পরীক্ষা করুন।",
 'userjsyoucanpreview' => "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন JavaScript পরীক্ষা করুন।",
 'usercsspreview' => "'''মনে রাখবেন আপনি আপনার জন্য বরাদ্ধকৃত সিএসএস প্রাকদর্শন করছেন।
@@ -732,6 +737,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'note' => "'''নোট:'''",
 'previewnote' => "'''খেয়াল করুন, এটি একটি প্রাকদর্শন মাত্র।'''
 আপনার পরিবর্তন এখনও সংরক্ষণ করা হয়নি!",
+'continue-editing' => 'সম্পাদনা চালিয়ে যান',
 'previewconflict' => 'এই প্রাকদর্শনটি সম্পাদনা ক্ষেত্রের উপরের অংশটির টেক্সট সংরক্ষণ করলে যেরকম দেখাবে, তা দেখাচ্ছে।',
 'session_fail_preview' => "'''দুঃখিত! সেশন ডাটা হারিয়ে যাওয়ার কারণে আপনার সম্পাদনাটি সংরক্ষণ করা সম্ভব হয়নি। দয়া করে লেখাটি আবার জমা দেয়ার চেষ্টা করুন। যদি এতেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে বেরিয়ে গিয়ে আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন।'''",
 'session_fail_preview_html' => "'''দুঃখিত! সেশন উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়া করতে পারিনি।'''
@@ -742,6 +748,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'token_suffix_mismatch' => "'''আপনার সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে, কারণ আপনার ক্লায়েন্ট প্রোগ্রামটি সম্পাদনা টেক্সটের বিরামচিহ্নগুলি গুলিয়ে ফেলেছে। পাতাটির টেক্সটে যাতে ক্ষতি না হয় সেজন্য সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে। আপনি কোন ত্রুটিপূর্ণ ওয়েব-ভিত্তিক বেনামী প্রক্সি সেবা ব্যবহার করলে এরকম হতে পারে।'''",
 'edit_form_incomplete' => "'''আপনার সম্পাদনার কিছু অংশ সার্ভারে পৌছায় নি; আপনার সম্পাদনা সম্পূর্ণরুপে আছে কিনা নিশ্চিত হয়ে আবার চেষ্টা করুন'''",
 'editing' => 'সম্পাদনা করছেন: $1',
+'creating' => '$1 পাতাটি তৈরি করছেন',
 'editingsection' => 'সম্পাদনা করছেন $1 (অনুচ্ছেদ)',
 'editingcomment' => 'সম্পাদনা করছেন $1 (নতুন অনুচ্ছেদ)',
 'editconflict' => 'সম্পাদনা দ্বন্দ্ব: $1',
@@ -760,7 +767,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন, বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন।
 '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না!'''",
 'copyrightwarning2' => "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
-'longpageerror' => "'''ত্রুটি: আপনার জমা দেয়া টেক্সটের পরিমাণ $1 কিলোবাইট, যা সর্বোচ্চ সীমা $2 কিলোবাইটের চেয়ে বেশি। এটি সংরক্ষণ করা সম্ভব নয়।'''",
+'longpageerror' => " '''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ $1 কিলোবাইট, যা সর্বোচ্চ সীমা $2 কিলোবাইটের চেয়ে বেশি। এটি সংরক্ষণ করা সম্ভব নয়।'''",
 'readonlywarning' => "'''সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।
 আপনি চাইলে লেখাটি কাট এবং পেষ্ট করে ভবিষ্যতের জন্য কোন টেক্সট ফাইলে সংরক্ষণ করতে পারেন।'''
 
@@ -802,6 +809,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'edit-no-change' => 'আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।',
 'edit-already-exists' => 'নতুন পাতা সৃষ্টি করা যায়নি।
 পাতাটি ইতিমধ্যেই বিদ্যমান।',
+'defaultmessagetext' => 'আদি টেক্সট',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।
@@ -815,6 +823,8 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 তাই এই আর্গুমেন্টটি বাদ দেওয়া হয়েছে।",
 'post-expand-template-argument-category' => 'বাদ ফর্মা আর্গুমেন্ট ধারণকারী পাতা',
 'parser-template-loop-warning' => 'টেম্পলেট লুপ সনাক্ত হয়েছে: [[$1]]',
+'parser-template-recursion-depth-warning' => 'টেমপ্লেট  পুনরাবৃত্তি (রিকার্শন)  ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
+'language-converter-depth-warning' => 'ভাষা পরিবর্তন  ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
 
 # "Undo" feature
 'undo-success' => 'সম্পাদনাটি বাতিল করা যাবে। অনুগ্রহ করে নিচের তুলনাটি পরীক্ষা করে দেখুন ও নিশ্চিত করুন যে এটাই আপনি করতে চান, এবং তারপর নিচের সম্পাদনাগুলি সংরক্ষণ করে সম্পাদনাটির বাতিল প্রক্রিয়া সমাপ্ত করুন।',
@@ -905,6 +915,8 @@ $3-এর দেয়া কারণ হল ''$2''",
 'revdelete-submit' => 'নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো',
 'revdelete-success' => "'''সংশোধন দৃশ্যমানতা সফলভাবে হালনাগাদ করা হয়েছে।'''",
 'logdelete-success' => "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
+'logdelete-failure' => "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''
+$1",
 'revdel-restore' => 'দৃশ্যমানতা পরিবর্তন করো',
 'revdel-restore-deleted' => 'অপসারিত সংস্করণ',
 'revdel-restore-visible' => 'প্রদর্শনযোগ্য সংস্করণ',
@@ -1153,7 +1165,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'userrights-lookup-user' => 'ব্যবহারকারী দল ব্যবস্থাপনা করুন',
 'userrights-user-editname' => 'ব্যবহারকারীর নাম লিখুন:',
 'editusergroup' => 'ব্যবহারকারীর দল সম্পাদনা করো',
-'editinguser' => "ব্যবহারকারী সম্পাদনা করছেন '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "'''[[User:$1|$1]]''' $2 ব্যবহারকারীর জন্য ব্যবহারকারী অধিকার পরিবর্তন করছেন",
 'userrights-editusergroup' => 'ব্যবহারকারীর দল সম্পাদনা করো',
 'saveusergroups' => 'ব্যবহারকারীর দল সংরক্ষণ করো',
 'userrights-groupsmember' => 'সদস্য:',
@@ -1363,6 +1375,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'illegalfilename' => '"$1" ফাইলনামটিতে এমন কিছু ক্যারেক্টার আছে যেগুলি পাতার শিরোনামে ব্যবহার করা অবৈধ। অনুগ্রহ করে ফাইলটি নতুন করে নামকরণ করুন এবং তারপর আপলোড করার চেষ্টা করুন।',
 'badfilename' => 'ফাইলের নামটি পরিবর্তন করে $1" করা হয়েছে।',
 'filetype-badmime' => '"$1" MIME ধরনের ফাইল আপলোড করা যাবে না।',
+'filetype-bad-ie-mime' => 'এই ফাইলটি আপলোড করা সম্ভব নয় কারণ ইন্টারনেট এক্সপ্লোরার একে "$1" হিসেবে সনাক্ত করতে পারে, যা অননুমোদিত এবং সম্ভাব্য ক্ষতিকারক ফাইল টাইপ।',
 'filetype-unwanted-type' => "'''\".\$1\"''' ফাইল ধরনটি অগ্রহণযোগ্য।
 পছন্দনীয় {{PLURAL:\$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হলো \$2।",
 'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|ফাইল ধরনটি অনুমোদিত নয়|ফাইল ধরনগুলো অনুমোদিত নয়}}। অনুমোদিত {{PLURAL:$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হল $2।',
@@ -1372,12 +1385,14 @@ $3-এর দেয়া কারণ হল ''$2''",
 'filename-tooshort' => 'ফাইল নামটি খুব ছোট।',
 'filetype-banned' => 'এই ধরনের ফাইল নিষিদ্ধ।',
 'illegal-filename' => 'ফাইলের এই নামটি গ্রহণযোগ্য নয়।',
+'overwrite' => 'বিদ্যমান কোনো ফাইল প্রতিস্থাপন গ্রহণযোগ্য নয়।',
 'unknown-error' => 'একটি অজানা ত্রুটি দেখা দিয়েছে।',
 'tmp-create-error' => 'অস্থায়ী ফাইল তৈরি করা যাবে না।',
 'tmp-write-error' => 'অস্থায়ী ফাইলে লিখতে সমস্যা হয়েছে।',
 'large-file' => '$1-এর চেয়ে বড় আকারের ফাইল সুপারিশ করা হয় না; এই ফাইলটি $2।',
 'largefileserver' => 'সার্ভারে যতখানি অনুমোদিত তার চেয়ে এই ফাইলের আকার বড়।',
 'emptyfile' => 'আপনি যে ফাইলটি আপলোড করেছেন, তা খালি মনে হচ্ছে। ফাইলের নামে টাইপিং ত্রুটির কারণে এরকম হতে পারে। অনুগ্রহ করে পরীক্ষা করে দেখুন আপনি আসলেই এই ফাইলটি আপলোড করতে চান কি না।',
+'windows-nonascii-filename' => 'এই উইকি বিশেষ ক্যারেক্টারসমৃদ্ধ ফাইলের নাম সমর্থন করে না।',
 'fileexists' => "এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান। অনুগ্রহ করে '''<tt>[[:$1]]</tt>''' পরীক্ষা করে দেখুন, যদি আপনি এটি পরিবর্তনের ব্যাপারে নিশ্চিত না হন। [[$1|thumb]]",
 'fileexists-extension' => "একই নামের আরেকটি ফাইল আছে: [[$2|thumb]]
 * আপলোড করা ফাইলের নাম: '''<tt>[[:$1]]</tt>'''
@@ -1402,6 +1417,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'overwroteimage' => '"[[$1]]"-এর একটি নতুন সংস্করণ আপলোড করা হয়েছে',
 'uploaddisabled' => 'আপলোড নিষ্ক্রিয় আছে',
 'copyuploaddisabled' => 'ইউআরএল এর মাধ্যমে আপলোড নিস্ক্রিয় রয়েছে।',
+'uploadfromurl-queued' => 'আপনার আপলোড সারিবদ্ধ হয়েছে।',
 'uploaddisabledtext' => 'ফাইল আপলোড নিষ্ক্রিয়।',
 'php-uploaddisabledtext' => 'পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।
 অনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।',
@@ -1418,8 +1434,10 @@ $3-এর দেয়া কারণ হল ''$2''",
 'filewasdeleted' => 'এই নামের একটি ফাইল পূর্বে আপলোড করা হয়েছিল এবং তারপর মুছে ফেলা হয়েছিল। আপনি ফাইলটি আবার আপলোড করার আগে $1 পরীক্ষা করে দেখুন।',
 'filename-bad-prefix' => "আপনি যে ফাইলটি আপলোড করছেন, তার নাম '''\"\$1\"''' দিয়ে শুরু হয়েছে। এ ধরনের নাম সাধারণত ডিজিটাল ক্যামেরাগুলি স্বয়ংক্রিয়ভাবে দিয়ে থাকে এবং এগুলি ব্যাখ্যামূলক নয়। অনুগ্রহ করে আপনার ফাইলের জন্য আরও ব্যাখ্যামূলক একটি নাম পছন্দ করুন।",
 'upload-success-subj' => 'আপলোড সফল হয়েছে',
+'upload-success-msg' => '[$2] থেকে আপনার আপলোড সফল হয়েছে। এটি এখানে: [[:{{ns:file}}:$1]] পাওয়া যাবে',
 'upload-failure-subj' => 'আপলোড সমস্যা',
 'upload-warning-subj' => 'আপলোড সতর্কীকরণ',
+'upload-warning-msg' => '[$2] থেকে করা আপনার আপলোডে সমস্যা হয়েছে। সমস্যার সমাধানকল্পে আপনাকে সম্ভবত [[Special:Upload/stash/$1|আপলোড ফর্ম]]-এ ফিরে যেতে হবে।',
 
 'upload-proto-error' => 'ভুল প্রোটোকল',
 'upload-proto-error-text' => 'দূরবর্তী আপলোডের জন্য URLগুলি <code>http://</code> বা <code>ftp://</code> দিয়ে শুরু হওয়া আবশ্যক।',
@@ -1461,6 +1479,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'http-invalid-url' => 'ভুল ইউআরএল: $1',
 'http-read-error' => 'HTTP পঠন ত্রুটি।',
 'http-timed-out' => 'HTTP অনুরোধের সময় পার হয়েছে।',
+'http-curl-error' => 'ইউআরএল নিয়ে আসার ক্ষেত্রে ত্রুটি: $1',
 'http-host-unreachable' => 'URL-এ পৌঁছানো যায়নি',
 'http-bad-status' => 'HTTP অনুরোধের সময় কোন সমস্যা হয়েছে: $1 $2',
 
@@ -1545,6 +1564,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 ** ফাইলের অনুলিপি',
 'filedelete-edit-reasonlist' => 'অপসারণের কারণ সম্পাদনা',
 'filedelete-maintenance' => 'রক্ষণাবেক্ষণের সময় ফাইল অপরাসণ এবং পুনরুদ্ধার সাময়িকভাবে নিস্ক্রিয় রয়েছে।',
+'filedelete-maintenance-title' => 'ফাইলটি অপসারণ করা সম্ভব নয়',
 
 # MIME search
 'mimesearch' => 'MIME অনুসন্ধান',
@@ -1591,7 +1611,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'statistics-users-active-desc' => 'ব্যবহারকারী যারা বিগত {{PLURAL:$1|দিনে|$1 দিনে}} একটি কাজ করেছেন।',
 'statistics-mostpopular' => 'সবচেয়ে বেশী বার দেখা পাতাসমূহ',
 
-'disambiguations' => 'দ্ব্যর্থতা-দূরীকরণ পাতাসমূহ',
+'disambiguations' => 'দ্ব্যর্থতা-দূরীকরণ পাতাসমূহে সংযোগকৃত পাতাসমূহ',
 'disambiguationspage' => 'Template:দ্ব্যর্থতা_নিরসন',
 'disambiguations-text' => "নিচের পাতাগুলি থেকে একটি '''দ্ব্যর্থতা নিরসন পাতা'''-তে সংযোগ আছে। এর পরিবর্তে এগুলি থেকে একটি উপযুক্ত বিষয়ে সংযোগ থাকা আবশ্যক।<br />যদি কোন পাতায় এমন কোন টেমপ্লেট থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে একটি দ্ব্যর্থতা নিরসন পাতা হিসেবে গণ্য করা হয়।",
 
@@ -1709,6 +1729,10 @@ $3-এর দেয়া কারণ হল ''$2''",
 'allpagesprefix' => 'এই উপসর্গবিশিষ্ট পাতাগুলো দেখাও:',
 'allpagesbadtitle' => 'প্রদত্ত পাতার শিরোনামটি অবৈধ ছিল অথবা এটিতে কোন আন্তঃভাষা বা আন্তঃউইকি উপসর্গ ছিল। এটিতে এক বা একাধিক ক্যারেক্টার থাকতে পারে যা শিরোনামে ব্যবহার করা সম্ভব নয়।',
 'allpages-bad-ns' => '{{SITENAME}}-এ "$1" নামের কোন নামস্থান নেই।',
+'allpages-hide-redirects' => 'পুনর্নির্দেশনাগুলো লুকাও',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'সাম্প্রতিকগুলো প্রদর্শন করো।',
 
 # Special:Categories
 'categories' => 'বিষয়শ্রেণীসমূহ',
@@ -2354,6 +2378,9 @@ $1',
 'import-logentry-interwiki' => '$1 উইকি-স্থানান্তরিত',
 'import-logentry-interwiki-detail' => '$2-এর করা $1 {{PLURAL:$1|সংশোধন|টি সংশোধন}}',
 
+# JavaScriptTest
+'javascripttest' => 'জাভাস্ক্রিপ্ট পরীক্ষা',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'আপনার ব্যবহারকারী পাতা',
 'tooltip-pt-anonuserpage' => 'যে আইপি ঠিকানা থেকে আপনি সম্পাদনা করছেন, তার ব্যবহারকারী পাতা',
@@ -2414,6 +2441,7 @@ $1',
 'tooltip-diff' => 'আপনি টেক্সটে কী কী পরিবর্তন করেছেন, তা দেখানো হোক।',
 'tooltip-compareselectedversions' => 'এই পাতার দুইটি নির্বাচিত সংস্করণের মধ্যে তুলনা দেখুন।',
 'tooltip-watch' => 'এই পাতাটি আমার নজরতালিকায় যোগ করো',
+'tooltip-watchlistedit-normal-submit' => 'শিরোনাম অপসারণ',
 'tooltip-recreate' => 'মুছে ফেলা সত্ত্বেও পাতাটি পুনরায় সৃষ্টি করুন',
 'tooltip-upload' => 'আপলোড শুরু করো',
 'tooltip-rollback' => '"পুনর্বহাল" এই পাতায় সর্বশেষ অবদানকারীর সম্পাদনাসমূহ বাতিল করে পাতাটিকে পূর্বাবস্থায় ফিরিয়ে দেয়',
@@ -2867,6 +2895,7 @@ $1',
 # Pseudotags used for GPSDestDistanceRef
 'exif-gpsdestdistance-k' => 'কিলোমিটার',
 'exif-gpsdestdistance-m' => 'ফাইল',
+'exif-gpsdestdistance-n' => 'নটিক্যাল মাইল',
 
 'exif-gpsdop-excellent' => 'খুব ভাল ($1)',
 'exif-gpsdop-good' => 'ভাল ($1)',
@@ -2894,6 +2923,7 @@ $1',
 
 'exif-rating-rejected' => 'প্রত্যাখাত',
 
+'exif-iimcategory-ace' => 'শিল্প, সংস্কৃতি এবং বিনোদন',
 'exif-iimcategory-clj' => 'অপরাধ ও আইন',
 'exif-iimcategory-dis' => 'দুর্যোগ ও দুর্ঘটনা',
 'exif-iimcategory-fin' => 'অর্থনীতি এবং বাণিজ্য',
@@ -2972,11 +3002,13 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 # action=purge
 'confirm_purge_button' => 'ঠিক আছে',
 'confirm-purge-top' => 'এই পাতার ক্যাশে পরিষ্কার করতে চান?',
+'confirm-purge-bottom' => 'পাতার ক্যাশে পরিস্কারের ফলে তা আপনাকে পাতাটির সবচেয়ে সাম্প্রতিক সংস্করণ প্রদর্শনে বাধ্য করে।',
 
 # action=watch/unwatch
 'confirm-watch-button' => 'ঠিক আছে',
 'confirm-watch-top' => 'এই পাতাটি আপনার নজরতালিকায় যুক্ত করা হবে?',
 'confirm-unwatch-button' => 'ঠিক আছে',
+'confirm-unwatch-top' => 'এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলতে ইচ্ছুক?',
 
 # Multipage image navigation
 'imgmultipageprev' => '← পূর্ববর্তী পাতা',
@@ -3065,6 +3097,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-software' => 'ইনস্টলকৃত সফটওয়্যার',
 'version-software-product' => 'পণ্য',
 'version-software-version' => 'সংস্করণ',
+'version-entrypoints-header-url' => 'ইউআরএল',
 
 # Special:FilePath
 'filepath' => 'ফাইলের পাথ',
@@ -3156,8 +3189,24 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 # New logging system
 'logentry-delete-delete' => '$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে',
 'logentry-delete-restore' => '$1 কর্তৃক $3 পাতাটি ফিরিয়ে আনা হয়েছে',
+'revdelete-content-hid' => 'বিষয়বস্তু লুকায়িত',
+'revdelete-summary-hid' => 'সম্পাদনা সারাংশ লুকায়িত',
+'revdelete-uname-hid' => 'ব্যবহারকারী নাম লুকায়িত',
+'revdelete-content-unhid' => 'বিষয়বস্তু প্রদর্শিত',
+'revdelete-summary-unhid' => 'সম্পাদনা সারাংশ প্রদর্শিত',
+'revdelete-uname-unhid' => 'ব্যবহারকারী নাম প্রদর্শিত',
 'revdelete-restricted' => 'এই সীমাবদ্ধতা প্রশাসকের ক্ষেত্রে প্রয়োগ করো',
 'revdelete-unrestricted' => 'এই সীমাবদ্ধতা প্রশাসকের ক্ষেত্রে তুলে নাও',
+'logentry-move-move' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে স্থানান্তর করেছেন',
+'logentry-move-move-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
+'logentry-move-move_redir' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার ওপর দিয়ে স্থানান্তর করেছেন',
+'logentry-move-move_redir-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনার ওপর দিয়ে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
+'logentry-patrol-patrol' => '$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে চিহ্নিত করেছেন',
+'logentry-patrol-patrol-auto' => '$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে চিহ্নিত করেছেন',
+'logentry-newusers-newusers' => '$1 একটি অ্যাকাউন্ট তৈরি করেছেন',
+'logentry-newusers-create' => '$1 একটি অ্যাকাউন্ট তৈরি করেছেন',
+'logentry-newusers-create2' => '$1 ব্যবহারকারী $3 নামে একটি অ্যাকাউন্ট তৈরি করেছেন',
+'logentry-newusers-autocreate' => '$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে তৈরি হয়েছে',
 'newuserlog-byemail' => 'শব্দচাবি ইমেইলের মাধ্যমে পাঠানো হয়েছে',
 
 # Feedback
@@ -3170,6 +3219,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'feedback-error2' => 'ত্রুটি: সম্পাদনা ব্যর্থ',
 'feedback-error3' => 'ত্রুটি: এপিআই থেকে কোন সাড়া নেই',
 'feedback-close' => 'সম্পন্ন',
+'feedback-bugnew' => 'আমি পরীক্ষা করেছি। নতুন একটি বাগ রিপোর্ট করুন।',
 
 # API errors
 'api-error-badaccess-groups' => 'আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।',
@@ -3180,6 +3230,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'api-error-duplicate-archive-popup-title' => 'অনুলিপি {{PLURAL:$1|ফাইল|ফাইল}} যা ইতমধ্যে অপসারণ করা হয়েছে',
 'api-error-duplicate-popup-title' => 'অনুলিপি {{PLURAL:$1|ফাইল|ফাইল}}',
 'api-error-empty-file' => 'আপনার জমাদানকৃত ফাইলটি খালি।',
+'api-error-emptypage' => 'নতুন ও খালি পাতা তৈরি গ্রহণযোগ্য নয়।',
 'api-error-fetchfileerror' => 'অভ্যন্তরীণ ত্রুটি: ফাইল নিয়ে আসার সময় কোনো সমস্যা হয়েছিলো।',
 'api-error-file-too-large' => 'আপনার জমাদানকৃত ফাইলটি অনেক বড়।',
 'api-error-filename-tooshort' => 'এই ফাইল নামটি খুবই ছোট।',
@@ -3204,6 +3255,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'api-error-unknown-code' => 'অজানা ত্রুটি: "$1"',
 'api-error-unknown-error' => 'অভ্যন্তরীণ ত্রুটি: আপনার ফাইলটি আপলোড করার সময় কিছু সমস্যা হয়েছে।',
 'api-error-unknown-warning' => 'অজানা সতর্কীকরণ: $1',
+'api-error-unknownerror' => 'অজানা ত্রুটি: "$1"',
 'api-error-uploaddisabled' => 'এই উইকির জন্য আপলোড সুবিধা নিস্ক্রিয় রয়েছে।',
 'api-error-verification-error' => 'সম্ভবত এই ফাইলটি ত্রুটিপূর্ণ অথবা এর এক্সটেনশনটি ভুল।',
 
index 14e4eff..4c78b6f 100644 (file)
@@ -850,6 +850,7 @@ Dindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
 'note' => "'''Notenn :'''",
 'previewnote' => "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''
 N'eo ket bet enrollet ho kemmoù evit c'hoazh !",
+'continue-editing' => "Kenderc'hel da gemmañ",
 'previewconflict' => 'Gant ar rakweled e teu testenn ar bajenn war wel evel ma vo pa vo bet enrollet.',
 'session_fail_preview' => "'''Ho tigarez! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.'''
 Klaskit en-dro mar plij.
@@ -939,6 +940,10 @@ A-gostez eo bet lezet an arventenn-se.',
 'parser-template-loop-warning' => "Patrom e kelc'h detektet : [[$1]]",
 'parser-template-recursion-depth-warning' => 'Tizhet bevenn donder galvoù 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ù",
+'node-count-exceeded-warning' => "Pajenn a ya en tu all d'an niver a skoulmoù",
+'expansion-depth-exceeded-category' => "Pajennoù m'eur aet dreist d'an donder astenn",
+'expansion-depth-exceeded-warning' => "Pajenn a ya dreist d'an donder astenn",
 
 # "Undo" feature
 'undo-success' => "Gallout a reer disteurel ar c'hemmoù-mañ. Gwiriit, mar plij, gant ar geñveriadenn a-is evit bezañ sur eo an dra-se a fell deoc'h ober; goude-se enrollit ar c'hemmoù a-is a-benn echuiñ disteurel ar c'hemmoù.",
@@ -3770,7 +3775,7 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
 'feedback-bugornote' => "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [\$1 kemenn un draen].
 A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc'h evezhiadenn d'ar bajenn \"[\$3 \$2]\", a-gevret gant hoc'h anv implijer hag anv ar merdeer a rit gantañ.",
 'feedback-subject' => 'Danvez :',
-'feedback-message' => 'Kemennadenn:',
+'feedback-message' => 'Kemennadenn :',
 'feedback-cancel' => 'Nullañ',
 'feedback-submit' => 'Kas ho soñj',
 'feedback-adding' => "Oc'h ouzhpennañ ho soñj war ar bajenn...",
index f55e957..b492d78 100644 (file)
@@ -1115,6 +1115,10 @@ Tyto argumenty byly vynechány.',
 'parser-template-loop-warning' => 'Nalezena smyčka šablon: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Překročen limit hloubky rekurzivního vkládání šablon ($1)',
 'language-converter-depth-warning' => 'Překročen limit vnoření u jazykové konverze ($1)',
+'node-count-exceeded-category' => 'Stránky překračující počet uzlů',
+'node-count-exceeded-warning' => 'Stránka překročila počet uzlů',
+'expansion-depth-exceeded-category' => 'Stránky překračující hloubku expanze',
+'expansion-depth-exceeded-warning' => 'Stránka překročila hloubku expanze',
 
 # "Undo" feature
 'undo-success' => 'Editace může být zrušena. Zkontrolujte a pak potvrďte změny zobrazené níže.',
index 19227ca..ab49bf6 100644 (file)
@@ -89,355 +89,360 @@ $linkTrail = '/^([a-zабвгдеєжѕзїіıићклмнопсстѹфхѡѿ
 
 $messages = array(
 # Dates
-'sunday'        => 'нєдѣлꙗ',
-'monday'        => 'понедѣл҄ьникъ',
-'tuesday'       => 'въторьникъ',
-'wednesday'     => 'срѣда',
-'thursday'      => 'чєтврьтъкъ',
-'friday'        => 'пѧтъкъ',
-'saturday'      => 'сѫбота',
-'sun'           => 'н҃д',
-'mon'           => 'п҃н',
-'tue'           => 'в҃т',
-'wed'           => 'с҃р',
-'thu'           => 'ч҃т',
-'fri'           => 'п҃т',
-'sat'           => 'с҃б',
-'january'       => 'їаноуарїи',
-'february'      => 'фєвроуарїи',
-'march'         => 'мартїи',
-'april'         => 'апрїлїи',
-'may_long'      => 'маїи',
-'june'          => 'їоунїи',
-'july'          => 'їоулїи',
-'august'        => 'аѷгоустъ',
-'september'     => 'сєптємврїи',
-'october'       => 'октѡврїи',
-'november'      => 'ноємврїи',
-'december'      => 'дєкємврїи',
-'january-gen'   => 'їаноуарїꙗ',
-'february-gen'  => 'фєвроуарїꙗ',
-'march-gen'     => 'мартїꙗ',
-'april-gen'     => 'апрїлїꙗ',
-'may-gen'       => 'маїꙗ',
-'june-gen'      => 'їоунїꙗ',
-'july-gen'      => 'їоулїꙗ',
-'august-gen'    => 'аѷгоуста',
+'sunday' => 'нєдѣлꙗ',
+'monday' => 'понедѣл҄ьникъ',
+'tuesday' => 'въторьникъ',
+'wednesday' => 'срѣда',
+'thursday' => 'чєтврьтъкъ',
+'friday' => 'пѧтъкъ',
+'saturday' => 'сѫбота',
+'sun' => 'н҃д',
+'mon' => 'п҃н',
+'tue' => 'в҃т',
+'wed' => 'с҃р',
+'thu' => 'ч҃т',
+'fri' => 'п҃т',
+'sat' => 'с҃б',
+'january' => 'їаноуарїи',
+'february' => 'фєвроуарїи',
+'march' => 'мартїи',
+'april' => 'апрїлїи',
+'may_long' => 'маїи',
+'june' => 'їоунїи',
+'july' => 'їоулїи',
+'august' => 'аѷгоустъ',
+'september' => 'сєптємврїи',
+'october' => 'октѡврїи',
+'november' => 'ноємврїи',
+'december' => 'дєкємврїи',
+'january-gen' => 'їаноуарїꙗ',
+'february-gen' => 'фєвроуарїꙗ',
+'march-gen' => 'мартїꙗ',
+'april-gen' => 'апрїлїꙗ',
+'may-gen' => 'маїꙗ',
+'june-gen' => 'їоунїꙗ',
+'july-gen' => 'їоулїꙗ',
+'august-gen' => 'аѷгоуста',
 'september-gen' => 'сєптємврїꙗ',
-'october-gen'   => 'октѡврїꙗ',
-'november-gen'  => 'ноємврїꙗ',
-'december-gen'  => 'дєкємврїꙗ',
-'jan'           => 'ꙗ҃н',
-'feb'           => 'фє҃в',
-'mar'           => 'ма҃р',
-'apr'           => 'ап҃р',
-'may'           => 'маїи',
-'jun'           => 'їо҃ун',
-'jul'           => 'їо҃ул',
-'aug'           => 'аѵ҃г',
-'sep'           => 'сє҃п',
-'oct'           => 'ок҃т',
-'nov'           => 'но҃є',
-'dec'           => 'дє҃к',
+'october-gen' => 'октѡврїꙗ',
+'november-gen' => 'ноємврїꙗ',
+'december-gen' => 'дєкємврїꙗ',
+'jan' => 'ꙗ҃н',
+'feb' => 'фє҃в',
+'mar' => 'ма҃р',
+'apr' => 'ап҃р',
+'may' => 'маїи',
+'jun' => 'їо҃ун',
+'jul' => 'їо҃ул',
+'aug' => 'аѵ҃г',
+'sep' => 'сє҃п',
+'oct' => 'ок҃т',
+'nov' => 'но҃є',
+'dec' => 'дє҃к',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Катигорїꙗ|Катигорїи|Катигорїѩ|Катигорїѩ}}',
-'category_header'        => 'катигорїѩ ⁖ $1 ⁖ страницѧ',
-'subcategories'          => 'подъкатигорїѩ',
-'hidden-categories'      => '{{PLURAL:$1|съкрꙑта катигорїꙗ|съкрꙑти катигорїи|съкрꙑтꙑ катигорїѩ}}',
-'category-subcat-count'  => '{{PLURAL:$2|Сѥи катигорїи тъкъмо сꙗ подъкатигорїꙗ ѥстъ|Сѥи катигорїи {{PLURAL:$1|ѥдина подъкатигорїꙗ ѥстъ|2 подъкатигорїи ѥстє|$1 подъкатигорїѩ сѫтъ}} · а вьсѩ жє подъкатигорїѩ число $2 ѥстъ}}',
+'pagecategories' => '{{PLURAL:$1|Катигорїꙗ|Катигорїи|Катигорїѩ|Катигорїѩ}}',
+'category_header' => 'катигорїѩ ⁖ $1 ⁖ страницѧ',
+'subcategories' => 'подъкатигорїѩ',
+'hidden-categories' => '{{PLURAL:$1|съкрꙑта катигорїꙗ|съкрꙑти катигорїи|съкрꙑтꙑ катигорїѩ}}',
+'category-subcat-count' => '{{PLURAL:$2|Сѥи катигорїи тъкъмо сꙗ подъкатигорїꙗ ѥстъ|Сѥи катигорїи {{PLURAL:$1|ѥдина подъкатигорїꙗ ѥстъ|2 подъкатигорїи ѥстє|$1 подъкатигорїѩ сѫтъ}} · а вьсѩ жє подъкатигорїѩ число $2 ѥстъ}}',
 'listingcontinuesabbrev' => '· вѧщє',
 
 'linkprefix' => '/^(.*?)(„|«)$/sD',
 
-'about'         => 'опьсаниѥ',
-'article'       => 'члѣнъ',
-'newwindow'     => '(иномь окънѣ)',
+'about' => 'опьсаниѥ',
+'article' => 'члѣнъ',
+'newwindow' => '(иномь окънѣ)',
 'moredotdotdot' => 'вѧщє ···',
-'mypage'        => 'моꙗ страница',
-'mytalk'        => 'моꙗ бєсѣда',
-'navigation'    => 'плаваниѥ',
-'and'           => '&#32;и',
+'mypage' => 'моꙗ страница',
+'mytalk' => 'моꙗ бєсѣда',
+'navigation' => 'плаваниѥ',
+'and' => '&#32;и',
 
 # Cologne Blue skin
-'qbedit'         => 'исправи',
-'qbpageoptions'  => 'си страни́ца',
-'qbmyoptions'    => 'моꙗ страницѧ',
+'qbedit' => 'исправи',
+'qbpageoptions' => 'си страни́ца',
+'qbmyoptions' => 'моꙗ страницѧ',
 'qbspecialpages' => 'нарочьнꙑ страницѧ',
-'faq'            => 'чѧстꙑ въпросꙑ',
+'faq' => 'чѧстꙑ въпросꙑ',
 
 # Vector skin
 'vector-action-addsection' => 'новꙑ бєсѣдꙑ чѧсти сътворѥниѥ',
-'vector-action-delete'     => 'поничьжєниѥ',
-'vector-action-move'       => 'прѣимєнованиѥ',
-'vector-action-protect'    => 'ꙁабранѥниѥ',
-'vector-action-unprotect'  => 'поущєниѥ',
-'vector-view-create'       => 'сътворѥниѥ',
-'vector-view-edit'         => 'исправи',
-'vector-view-history'      => 'їсторїꙗ',
-'vector-view-view'         => 'чьтѥниѥ',
-'vector-view-viewsource'   => 'страницѧ источьнъ обраꙁъ',
-'actions'                  => 'дѣиства',
-'namespaces'               => 'имєнъ просторꙑ',
-
-'errorpagetitle'    => 'блаꙁна',
-'tagline'           => '{{grammar:genitive|{{SITENAME}}}} страница',
-'help'              => 'помощь',
-'search'            => 'исканиѥ',
-'searchbutton'      => 'ищи',
-'go'                => 'прѣиди',
-'searcharticle'     => 'прѣиди',
-'history'           => 'страницѧ їсторїꙗ',
-'history_short'     => 'їсторїꙗ',
-'printableversion'  => 'пєчатьнъ обраꙁъ',
-'permalink'         => 'въиньна съвѧꙁь',
-'print'             => 'пєчатаниѥ',
-'edit'              => 'исправи',
-'create'            => 'сътворѥниѥ',
-'editthispage'      => 'си страницѧ исправлѥниѥ',
-'create-this-page'  => 'си страницѧ сътворѥниѥ',
-'delete'            => 'поничьжєниѥ',
-'deletethispage'    => 'си страницѧ поничьжєниѥ',
-'protect'           => 'ꙁабранѥниѥ',
-'protect_change'    => 'иꙁмѣнѥниѥ',
-'protectthispage'   => 'си страницѧ ꙁабранєниѥ',
-'unprotect'         => 'поущєниѥ',
-'newpage'           => 'нова страница',
-'talkpage'          => 'си страницѧ бєсѣда',
-'talkpagelinktext'  => 'бєсѣда',
-'specialpage'       => 'нарочьна страница',
-'personaltools'     => 'моꙗ орѫдиꙗ',
-'postcomment'       => 'нова чѧсть',
-'talk'              => 'бєсѣда',
-'toolbox'           => 'орѫдиꙗ',
-'otherlanguages'    => 'дроугꙑ ѩꙁꙑкꙑ',
-'redirectedfrom'    => '(прѣнаправлѥниѥ отъ ⁖ $1 ⁖)',
-'redirectpagesub'   => 'прѣнаправлѥниѥ',
-'lastmodifiedat'    => 'страницѧ послѣдьнꙗ мѣна сътворѥна $2 · $1 бѣ ⁙',
-'jumpto'            => 'прѣиди къ :',
-'jumptonavigation'  => 'плаваниѥ',
-'jumptosearch'      => 'исканиѥ',
+'vector-action-delete' => 'поничьжєниѥ',
+'vector-action-move' => 'прѣимєнованиѥ',
+'vector-action-protect' => 'ꙁабранѥниѥ',
+'vector-action-unprotect' => 'иꙁмѣни ꙁабранѥниꙗ обраꙁъ',
+'vector-view-create' => 'сътворѥниѥ',
+'vector-view-edit' => 'исправи',
+'vector-view-history' => 'їсторїꙗ',
+'vector-view-view' => 'чьтѥниѥ',
+'vector-view-viewsource' => 'страницѧ источьнъ обраꙁъ',
+'actions' => 'дѣиства',
+'namespaces' => 'имєнъ просторꙑ',
+
+'errorpagetitle' => 'блаꙁна',
+'tagline' => '{{grammar:genitive|{{SITENAME}}}} страница',
+'help' => 'помощь',
+'search' => 'исканиѥ',
+'searchbutton' => 'ищи',
+'go' => 'прѣиди',
+'searcharticle' => 'прѣиди',
+'history' => 'страницѧ їсторїꙗ',
+'history_short' => 'їсторїꙗ',
+'printableversion' => 'пєчатьнъ обраꙁъ',
+'permalink' => 'въиньна съвѧꙁь',
+'print' => 'пєчатаниѥ',
+'edit' => 'исправи',
+'create' => 'сътворѥниѥ',
+'editthispage' => 'си страницѧ исправлѥниѥ',
+'create-this-page' => 'си страницѧ сътворѥниѥ',
+'delete' => 'поничьжєниѥ',
+'deletethispage' => 'си страницѧ поничьжєниѥ',
+'protect' => 'ꙁабранѥниѥ',
+'protect_change' => 'иꙁмѣнѥниѥ',
+'protectthispage' => 'си страницѧ ꙁабранєниѥ',
+'unprotect' => 'поущєниѥ',
+'newpage' => 'нова страница',
+'talkpage' => 'си страницѧ бєсѣда',
+'talkpagelinktext' => 'бєсѣда',
+'specialpage' => 'нарочьна страница',
+'personaltools' => 'моꙗ орѫдиꙗ',
+'postcomment' => 'нова чѧсть',
+'talk' => 'бєсѣда',
+'toolbox' => 'орѫдиꙗ',
+'otherlanguages' => 'дроугꙑ ѩꙁꙑкꙑ',
+'redirectedfrom' => '(прѣнаправлѥниѥ отъ ⁖ $1 ⁖)',
+'redirectpagesub' => 'прѣнаправлѥниѥ',
+'lastmodifiedat' => 'страницѧ послѣдьнꙗ мѣна сътворѥна $2 · $1 бѣ ⁙',
+'jumpto' => 'прѣиди къ :',
+'jumptonavigation' => 'плаваниѥ',
+'jumptosearch' => 'исканиѥ',
 'pool-errorunknown' => 'нєвѣдома блаꙁна',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => 'О {{grammar:instrumental|{{SITENAME}}}}',
-'aboutpage'            => 'Project:О сѥмь опꙑтьствовании',
-'copyright'            => 'подъ прощєниѥмь $1 пьсано ѥстъ',
-'copyrightpage'        => '{{ns:project}}:Творьцъ права',
-'currentevents'        => 'сѫщѧѩ вѣщи',
-'currentevents-url'    => 'Project:Сѫщѧѩ вѣщи',
-'edithelp'             => 'помощь по исправлѥниѭ',
-'edithelppage'         => 'Help:Исправлѥниѥ страницѧ',
-'helppage'             => 'Help:Каталогъ',
-'mainpage'             => 'главьна страница',
+'aboutsite' => 'О {{grammar:instrumental|{{SITENAME}}}}',
+'aboutpage' => 'Project:О сѥмь опꙑтьствовании',
+'copyright' => 'подъ прощєниѥмь $1 пьсано ѥстъ',
+'copyrightpage' => '{{ns:project}}:Творьцъ права',
+'currentevents' => 'сѫщѧѩ вѣщи',
+'currentevents-url' => 'Project:Сѫщѧѩ вѣщи',
+'edithelp' => 'помощь по исправлѥниѭ',
+'edithelppage' => 'Help:Исправлѥниѥ страницѧ',
+'helppage' => 'Help:Каталогъ',
+'mainpage' => 'главьна страница',
 'mainpage-description' => 'главьна страница',
-'policy-url'           => 'Project:Полїтїка',
-'portal'               => 'обьщєниꙗ съвѣтъ',
-'portal-url'           => 'Project:Обьщєниꙗ съвѣтъ',
-
-'pagetitle'           => '$1 · {{SITENAME}}',
-'retrievedfrom'       => 'поѩто иꙁ ⁖ $1 ⁖',
-'youhavenewmessages'  => '$1 тєбѣ напьсанꙑ сѫтъ ($2)',
-'newmessageslink'     => 'нови напьсаниꙗ',
+'policy-url' => 'Project:Полїтїка',
+'portal' => 'обьщєниꙗ съвѣтъ',
+'portal-url' => 'Project:Обьщєниꙗ съвѣтъ',
+
+'pagetitle' => '$1 · {{SITENAME}}',
+'retrievedfrom' => 'поѩто иꙁ ⁖ $1 ⁖',
+'youhavenewmessages' => '$1 тєбѣ напьсанꙑ сѫтъ ($2)',
+'newmessageslink' => 'нови напьсаниꙗ',
 'newmessagesdifflink' => 'послѣдьнꙗ мѣна',
-'editsection'         => 'исправи',
-'editold'             => 'исправи',
-'viewsourceold'       => 'страницѧ источьнъ обраꙁъ',
-'editlink'            => 'исправи',
-'viewsourcelink'      => 'страницѧ источьнъ обраꙁъ',
-'editsectionhint'     => 'исправлѥниѥ чѧсти : $1',
-'toc'                 => 'каталогъ',
-'showtoc'             => 'виждь',
-'hidetoc'             => 'съкрꙑи',
-'viewdeleted'         => '$1 видєти хощєши ;',
-'red-link-title'      => '$1 (си страницѧ нѣстъ)',
+'editsection' => 'исправи',
+'editold' => 'исправи',
+'viewsourceold' => 'страницѧ источьнъ обраꙁъ',
+'editlink' => 'исправи',
+'viewsourcelink' => 'страницѧ источьнъ обраꙁъ',
+'editsectionhint' => 'исправлѥниѥ чѧсти : $1',
+'toc' => 'каталогъ',
+'showtoc' => 'виждь',
+'hidetoc' => 'съкрꙑи',
+'viewdeleted' => '$1 видєти хощєши ;',
+'red-link-title' => '$1 (си страницѧ нѣстъ)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'члѣнъ',
-'nstab-user'      => 'польꙃєватєл҄ь',
-'nstab-media'     => 'срѣдьства',
-'nstab-special'   => 'нарочьна',
-'nstab-project'   => 'съвѣтъ',
-'nstab-image'     => 'дѣло',
+'nstab-main' => 'члѣнъ',
+'nstab-user' => 'польꙃєватєл҄ь',
+'nstab-media' => 'срѣдьства',
+'nstab-special' => 'нарочьна',
+'nstab-project' => 'съвѣтъ',
+'nstab-image' => 'дѣло',
 'nstab-mediawiki' => 'напьсаниѥ',
-'nstab-template'  => 'обраꙁьць',
-'nstab-help'      => 'страница помощи',
-'nstab-category'  => 'катигорїꙗ',
+'nstab-template' => 'обраꙁьць',
+'nstab-help' => 'страница помощи',
+'nstab-category' => 'катигорїꙗ',
 
 # General errors
-'error'      => 'блаꙁна',
+'error' => 'блаꙁна',
 'viewsource' => 'страницѧ источьнъ обраꙁъ',
 
 # Login and logout pages
-'yourname'                => 'твоѥ имѧ',
-'yourpassword'            => 'таино слово напиши',
-'yourpasswordagain'       => 'опакꙑ таиноѥ слово напиши',
-'login'                   => 'въниди',
+'yourname' => 'твоѥ имѧ',
+'yourpassword' => 'таино слово напиши',
+'yourpasswordagain' => 'опакꙑ таиноѥ слово напиши',
+'login' => 'въниди',
 'nav-login-createaccount' => 'въниди / съꙁижди си мѣсто',
-'userlogin'               => 'въниди / съꙁижди си мѣсто',
-'userloginnocreate'       => 'въниди',
-'logout'                  => 'ис̾ходъ',
-'userlogout'              => 'ис̾ходъ',
-'nologin'                 => 'мѣсто ти нѣстъ ли ? $1',
-'nologinlink'             => 'съꙁижди си мѣсто',
-'createaccount'           => 'съꙁижди си мѣсто',
-'gotaccount'              => 'мѣсто ти ѥстъ ли? $1',
-'gotaccountlink'          => 'въниди',
-'createaccountreason'     => 'какъ съмꙑслъ :',
-'userexists'              => 'сѫщє польꙃєватєлꙗ имѧ пьса ⁙ ино иꙁобрѧщи',
-'loginerror'              => 'въхода блаꙁна',
-'accountcreated'          => 'мѣсто сътворєно ѥстъ',
-'loginlanguagelabel'      => 'ѩꙁꙑкъ : $1',
+'userlogin' => 'въниди / съꙁижди си мѣсто',
+'userloginnocreate' => 'въниди',
+'logout' => 'ис̾ходъ',
+'userlogout' => 'ис̾ходъ',
+'nologin' => 'мѣсто ти нѣстъ ли ? $1',
+'nologinlink' => 'съꙁижди си мѣсто',
+'createaccount' => 'съꙁижди си мѣсто',
+'gotaccount' => 'мѣсто ти ѥстъ ли? $1',
+'gotaccountlink' => 'въниди',
+'createaccountreason' => 'какъ съмꙑслъ :',
+'userexists' => 'сѫщє польꙃєватєлꙗ имѧ пьса ⁙ ино иꙁобрѧщи',
+'loginerror' => 'въхода блаꙁна',
+'accountcreated' => 'мѣсто сътворєно ѥстъ',
+'loginlanguagelabel' => 'ѩꙁꙑкъ : $1',
 
 # Change password dialog
-'resetpass'                 => 'таина словєсє иꙁмѣнѥниѥ',
-'oldpassword'               => 'старо таино слово :',
-'newpassword'               => 'ново таино слово :',
+'resetpass' => 'таина словєсє иꙁмѣнѥниѥ',
+'oldpassword' => 'старо таино слово :',
+'newpassword' => 'ново таино слово :',
 'resetpass-submit-loggedin' => 'таина словєсє иꙁмѣнѥниѥ',
 
 # Special:PasswordReset
 'passwordreset-username' => 'польꙃєватєлꙗ имѧ :',
 
 # Edit page toolbar
-'link_sample'    => 'съвѧꙁи имѧ',
-'link_tip'       => 'вънѫтрьнꙗ съвѧꙁь',
+'link_sample' => 'съвѧꙁи имѧ',
+'link_tip' => 'вънѫтрьнꙗ съвѧꙁь',
 'extlink_sample' => 'http://www.example.com съвѧꙁи имѧ',
-'extlink_tip'    => 'вънѣщьнꙗ съвѧꙁь (помьни о http://)',
-'media_tip'      => 'дѣла съвѧꙁь',
-'sig_tip'        => 'твои аѵтографъ и нꙑнѣшьна врѣмѧ и дьнь',
+'extlink_tip' => 'вънѣщьнꙗ съвѧꙁь (помьни о http://)',
+'media_tip' => 'дѣла съвѧꙁь',
+'sig_tip' => 'твои аѵтографъ и нꙑнѣшьна врѣмѧ и дьнь',
 
 # Edit pages
-'summary'                    => 'опьсаниѥ :',
-'minoredit'                  => 'малаꙗ мѣна',
-'watchthis'                  => 'си страницѧ блюдєниѥ',
-'savearticle'                => 'съхранѥниѥ',
-'showpreview'                => 'мѣнꙑ поꙁьрѣниѥ (бєꙁ съхранѥниꙗ)',
-'blockedtitle'               => 'польꙃєватєл҄ь ꙁаграждєнъ ѥстъ',
-'loginreqlink'               => 'въниди',
-'newarticle'                 => '(новъ)',
-'noarticletext'              => 'нꙑнѣ с̑ьдє ничєсожє нє напьсано ѥстъ ⁙
+'summary' => 'опьсаниѥ :',
+'minoredit' => 'малаꙗ мѣна',
+'watchthis' => 'си страницѧ блюдєниѥ',
+'savearticle' => 'съхранѥниѥ',
+'showpreview' => 'мѣнꙑ поꙁьрѣниѥ (бєꙁ съхранѥниꙗ)',
+'blockedtitle' => 'польꙃєватєл҄ь ꙁаграждєнъ ѥстъ',
+'loginreqlink' => 'въниди',
+'newarticle' => '(новъ)',
+'noarticletext' => 'нꙑнѣ с̑ьдє ничєсожє нє напьсано ѥстъ ⁙
 [[Special:Search/{{PAGENAME}}|си страницѧ имѧ искати]] дроугꙑ страницѧ ·
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} съвѧꙁанꙑ їсторїѩ видѣти] ·
 или [{{fullurl:{{FULLPAGENAME}}|action=edit}} ѭжє исправити]</span> можєши',
 'noarticletext-nopermission' => 'нꙑнѣ с̑ьдє ничєсожє нє напьсано ѥстъ ⁙
 [[Special:Search/{{PAGENAME}}|си страницѧ имѧ искати]] дроугꙑ страницѧ или
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} съвѧꙁанꙑ їсторїѩ видѣти]</span> можєши',
-'userpage-userdoesnotexist'  => 'польꙃєватєльска мѣста ⁖ $1 ⁖ нꙑнѣ нѣстъ ⁙
+'userpage-userdoesnotexist' => 'польꙃєватєльска мѣста ⁖ $1 ⁖ нꙑнѣ нѣстъ ⁙
 прѣдъ сътворѥниѥмь или исправлѥниѥмь си страницѧ помꙑсли жє ащє исто тъ дѣиство ноуждьно ли',
-'clearyourcache'             => 'НАРОЧИТО: По съхранѥнии можєши обити своѥго съмотрила съхранъ да видѣлъ би мѣнꙑ ⁙ Mozilla ли Firefox ли Safari ли жьмꙑи Shift а мꙑшиѭ жьми Reload или жьми Ctrl-Shift-R (Cmd-Shift-R вън Apple Mac)  ⁙ Konqueror ли жьми кромѣ Reload или F5 ⁙ Опєрꙑ польꙃєватєльмъ можєть бꙑти ноужда пльнѣ поничьжити ихъ съмотрила съхранъ въ Tools > Preferences ⁙ IE ли жьмꙑи Ctrl а мꙑшиѭ жьми Refresh или жьми Ctrl-F5',
-'note'                       => "'''НАРОЧИТО:'''",
-'editing'                    => 'исправлѥниѥ: $1',
-'editingsection'             => 'исправлѥниѥ ⁖ $1 ⁖ (чѧсть)',
-'editingcomment'             => 'исправлѥниѥ ⁖ $1 ⁖ (нова чѧсть)',
-'templatesused'              => 'сѥѩ страницѧ {{PLURAL:$1|сь обраꙁьць польꙃоуѥтъ сѧ ѥстъ|с҄и обраꙁьца польꙃоуѭтъ сѧ ѥстє|с҄и обраꙁьци польꙃоуѭтъ сѧ сѫтъ}} :',
-'template-protected'         => '(ꙁабранєно ѥстъ)',
-'template-semiprotected'     => '(чѧстьно ꙁабранѥно)',
+'clearyourcache' => "'''НАРОЧИТО''': По съхранѥнии можєши обити своѥго съмотрила съхранъ да видѣлъ би мѣнꙑ
+* '''Mozilla ли Firefox ли Safari''' ли жьмꙑи Shift а мꙑшиѭ жьми Reload или жьми Ctrl-Shift-R (⌘-R вън Apple Mac)
+* '''Google Chrome:''' ли жьмꙑи Ctrl-Shift-R (⌘-Shift-R въ Mac)
+* '''Internet Explorer''' ли жьмꙑи Ctrl а мꙑшиѭ жьми Refresh или жьми Ctrl-F5
+* '''Konqueror''' ли жьми кромѣ Reload или F5 
+* '''Опєрꙑ''' польꙃєватєльмъ можєть бꙑти ноужда пльнѣ поничьжити ихъ съмотрила съхранъ въ Tools → Preferences ⁙",
+'note' => "'''НАРОЧИТО:'''",
+'editing' => 'исправлѥниѥ: $1',
+'editingsection' => 'исправлѥниѥ ⁖ $1 ⁖ (чѧсть)',
+'editingcomment' => 'исправлѥниѥ ⁖ $1 ⁖ (нова чѧсть)',
+'templatesused' => 'сѥѩ страницѧ {{PLURAL:$1|сь обраꙁьць польꙃоуѥтъ сѧ ѥстъ|с҄и обраꙁьца польꙃоуѭтъ сѧ ѥстє|с҄и обраꙁьци польꙃоуѭтъ сѧ сѫтъ}} :',
+'template-protected' => '(ꙁабранєно ѥстъ)',
+'template-semiprotected' => '(чѧстьно ꙁабранѥно)',
 
 # History pages
-'viewpagelogs'           => 'си страницѧ їсторїѩ',
-'cur'                    => 'нꙑ҃н',
-'last'                   => 'пс҃лд',
-'page_first'             => 'прьва страница',
-'page_last'              => 'послѣдьнꙗ страница',
+'viewpagelogs' => 'си страницѧ їсторїѩ',
+'cur' => 'нꙑ҃н',
+'last' => 'пс҃лд',
+'page_first' => 'прьва страница',
+'page_last' => 'послѣдьнꙗ страница',
 'history-fieldset-title' => 'виждь мѣнъ їсторїѭ',
-'history-show-deleted'   => 'тъкъмо поничьжєнꙑ мѣнꙑ',
-'histfirst'              => 'прьвꙑ',
-'histlast'               => 'послѣдьнꙗ',
-'historysize'            => '{{PLURAL:$1|1 баитъ|$1 баита|$1 баитъ}}',
-'historyempty'           => '(поусто)',
+'history-show-deleted' => 'тъкъмо поничьжєнꙑ мѣнꙑ',
+'histfirst' => 'прьвꙑ',
+'histlast' => 'послѣдьнꙗ',
+'historysize' => '{{PLURAL:$1|1 баитъ|$1 баита|$1 баитъ}}',
+'historyempty' => '(поусто)',
 
 # Revision feed
-'history-feed-title'          => 'мѣнъ їсторїꙗ',
+'history-feed-title' => 'мѣнъ їсторїꙗ',
 'history-feed-item-nocomment' => '$1 при $2',
 
 # Revision deletion
-'rev-delundel'               => 'каꙁаниѥ / съкрꙑтиѥ',
-'rev-showdeleted'            => 'виждь',
+'rev-delundel' => 'каꙁаниѥ / съкрꙑтиѥ',
+'rev-showdeleted' => 'виждь',
 'revdelete-show-file-submit' => 'да',
-'revdelete-radio-set'        => 'да',
-'revdelete-radio-unset'      => 'нѣтъ',
-'revdelete-log'              => 'какъ съмꙑслъ :',
-'pagehist'                   => 'страницѧ їсторїꙗ',
-'deletedhist'                => 'поничьжєна їсторїꙗ',
-'revdelete-otherreason'      => 'инъ или допльнитєл҄ьнъ съмꙑслъ :',
-'revdelete-reasonotherlist'  => 'инъ съмꙑслъ',
+'revdelete-radio-set' => 'да',
+'revdelete-radio-unset' => 'нѣтъ',
+'revdelete-log' => 'какъ съмꙑслъ :',
+'pagehist' => 'страницѧ їсторїꙗ',
+'deletedhist' => 'поничьжєна їсторїꙗ',
+'revdelete-otherreason' => 'инъ или допльнитєл҄ьнъ съмꙑслъ :',
+'revdelete-reasonotherlist' => 'инъ съмꙑслъ',
 
 # History merging
 'mergehistory-reason' => 'какъ съмꙑслъ :',
 
 # Search results
-'searchresults'                  => 'исканиꙗ слѣдьствиѥ',
-'searchresults-title'            => 'исканиꙗ ⁖ $1 ⁖ слѣдьствиѥ',
-'viewprevnext'                   => 'виждь ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-exists'              => "'''страница имєньмь ⁖ [[:$1]] ⁖ ѥстъ створѥна ю'''",
-'searchmenu-new'                 => "'''страницѫ ⁖ [[:$1]] ⁖ сътворити можєши'''",
-'searchhelp-url'                 => 'Help:Каталогъ',
-'searchprofile-articles'         => 'члѣни',
-'searchprofile-project'          => 'опꙑтьствовании и помощи страницѧ',
-'searchprofile-images'           => 'дѣла',
-'searchprofile-everything'       => 'вьсѩ страницѧ',
+'searchresults' => 'исканиꙗ слѣдьствиѥ',
+'searchresults-title' => 'исканиꙗ ⁖ $1 ⁖ слѣдьствиѥ',
+'viewprevnext' => 'виждь ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''страница имєньмь ⁖ [[:$1]] ⁖ ѥстъ створѥна ю'''",
+'searchmenu-new' => "'''страницѫ ⁖ [[:$1]] ⁖ сътворити можєши'''",
+'searchhelp-url' => 'Help:Каталогъ',
+'searchprofile-articles' => 'члѣни',
+'searchprofile-project' => 'опꙑтьствовании и помощи страницѧ',
+'searchprofile-images' => 'дѣла',
+'searchprofile-everything' => 'вьсѩ страницѧ',
 'searchprofile-articles-tooltip' => 'ищи въ $1',
-'search-result-size'             => '$1 ({{PLURAL:$2|$2 слово|$2 слова|$2 словєсъ}})',
-'search-redirect'                => '(прѣнаправлєниѥ $1)',
-'search-section'                 => '(чѧсть $1)',
-'search-interwiki-caption'       => 'родьствьна опꙑтьствованиꙗ',
-'search-interwiki-more'          => '(вѧщє)',
-'searchall'                      => 'вьсꙗ',
-'powersearch'                    => 'ищи',
-'powersearch-redir'              => 'прѣнаправлѥниꙗ',
+'search-result-size' => '$1 ({{PLURAL:$2|$2 слово|$2 слова|$2 словєсъ}})',
+'search-redirect' => '(прѣнаправлєниѥ $1)',
+'search-section' => '(чѧсть $1)',
+'search-interwiki-caption' => 'родьствьна опꙑтьствованиꙗ',
+'search-interwiki-more' => '(вѧщє)',
+'searchall' => 'вьсꙗ',
+'powersearch' => 'ищи',
+'powersearch-redir' => 'прѣнаправлѥниꙗ',
 
 # Preferences page
-'preferences'               => 'строи',
-'mypreferences'             => 'мои строи',
-'changepassword'            => 'таина словєсє иꙁмѣнѥниѥ',
-'prefs-rc'                  => 'послѣдьнѩ мѣнꙑ',
-'prefs-watchlist'           => 'блюдєниꙗ',
-'prefs-resetpass'           => 'таина словєсє иꙁмѣнѥниѥ',
-'saveprefs'                 => 'съхранѥниѥ',
-'prefs-editing'             => 'исправлѥниѥ',
-'rows'                      => 'рѧдꙑ :',
-'searchresultshead'         => 'исканиѥ',
-'timezoneregion-africa'     => 'Афрїка',
-'timezoneregion-america'    => 'Амєрїка',
+'preferences' => 'строи',
+'mypreferences' => 'мои строи',
+'changepassword' => 'таина словєсє иꙁмѣнѥниѥ',
+'prefs-rc' => 'послѣдьнѩ мѣнꙑ',
+'prefs-watchlist' => 'блюдєниꙗ',
+'prefs-resetpass' => 'таина словєсє иꙁмѣнѥниѥ',
+'saveprefs' => 'съхранѥниѥ',
+'prefs-editing' => 'исправлѥниѥ',
+'rows' => 'рѧдꙑ :',
+'searchresultshead' => 'исканиѥ',
+'timezoneregion-africa' => 'Афрїка',
+'timezoneregion-america' => 'Амєрїка',
 'timezoneregion-antarctica' => 'Антарктїка',
-'timezoneregion-arctic'     => 'Арктїка',
-'timezoneregion-asia'       => 'Асїꙗ',
-'timezoneregion-atlantic'   => 'Атлантїчьскъ ѡкєанъ',
-'timezoneregion-australia'  => 'Аѵстралїꙗ',
-'timezoneregion-europe'     => 'Єѵрѡпа',
-'timezoneregion-indian'     => 'Їндїискъ ѡкєанъ',
-'timezoneregion-pacific'    => 'Тихꙑи ѡкєанъ',
-'prefs-searchoptions'       => 'исканиꙗ строи',
-'prefs-namespaces'          => 'имєнъ просторꙑ',
-'prefs-files'               => 'дѣла',
-'username'                  => 'польꙃєватєлꙗ имѧ :',
-'uid'                       => 'польꙃєватєлꙗ число :',
-'yourrealname'              => 'истиньно имѧ :',
-'yourlanguage'              => 'ѩꙁꙑкъ :',
-'yournick'                  => 'аѵтографъ :',
-'yourgender'                => 'полъ :',
-'gender-male'               => 'мѫжъ',
-'gender-female'             => 'жєна',
-'prefs-signature'           => 'аѵтографъ',
+'timezoneregion-arctic' => 'Арктїка',
+'timezoneregion-asia' => 'Асїꙗ',
+'timezoneregion-atlantic' => 'Атлантїчьскъ ѡкєанъ',
+'timezoneregion-australia' => 'Аѵстралїꙗ',
+'timezoneregion-europe' => 'Єѵрѡпа',
+'timezoneregion-indian' => 'Їндїискъ ѡкєанъ',
+'timezoneregion-pacific' => 'Тихꙑи ѡкєанъ',
+'prefs-searchoptions' => 'исканиꙗ строи',
+'prefs-namespaces' => 'имєнъ просторꙑ',
+'prefs-files' => 'дѣла',
+'username' => 'польꙃєватєлꙗ имѧ :',
+'uid' => 'польꙃєватєлꙗ число :',
+'yourrealname' => 'истиньно имѧ :',
+'yourlanguage' => 'ѩꙁꙑкъ :',
+'yournick' => 'аѵтографъ :',
+'yourgender' => 'полъ :',
+'gender-male' => 'мѫжъ',
+'gender-female' => 'жєна',
+'prefs-signature' => 'аѵтографъ',
 
 # User rights
 'userrights-reason' => 'какъ съмꙑслъ :',
 
 # Groups
-'group'            => 'чинъ :',
-'group-user'       => 'польꙃєватєлє',
-'group-bot'        => 'аѵтомати',
-'group-sysop'      => 'съмотритєлє',
+'group' => 'чинъ :',
+'group-user' => 'польꙃєватєлє',
+'group-bot' => 'аѵтомати',
+'group-sysop' => 'съмотритєлє',
 'group-bureaucrat' => 'чинодатєлє',
 
-'group-user-member'       => '{{GENDER:$1|польꙃєватєл҄ь|польꙃєватєл҄ьница}}',
-'group-bot-member'        => 'аѵтоматъ',
-'group-sysop-member'      => 'съмотритєл҄ь',
-'group-bureaucrat-member' => 'чинодатєл҄ь',
+'group-user-member' => '{{GENDER:$1|польꙃєватєл҄ь|польꙃєватєл҄ьница}}',
+'group-bot-member' => '{{GENDER:$1|аѵтоматъ}}',
+'group-sysop-member' => '{{GENDER:$1|съмотритєл҄ь}}',
+'group-bureaucrat-member' => '{{GENDER:$1|чинодатєл҄ь}}',
 
-'grouppage-user'       => '{{ns:project}}:Польꙃєватєлє',
-'grouppage-bot'        => '{{ns:project}}:Аѵтомати',
-'grouppage-sysop'      => '{{ns:project}}:Съмотритєлє',
+'grouppage-user' => '{{ns:project}}:Польꙃєватєлє',
+'grouppage-bot' => '{{ns:project}}:Аѵтомати',
+'grouppage-sysop' => '{{ns:project}}:Съмотритєлє',
 'grouppage-bureaucrat' => '{{ns:project}}:Чинодатєлє',
 
 # User rights log
@@ -447,76 +452,76 @@ $messages = array(
 'action-edit' => 'си страницѧ исправлєниѥ',
 
 # Recent changes
-'nchanges'                    => '$1 {{PLURAL:$1|мѣна|мѣнꙑ|мѣнъ}}',
-'recentchanges'               => 'послѣдьнѩ мѣнꙑ',
-'recentchanges-legend'        => 'послѣдьн҄ь мѣнъ строи',
-'recentchangestext'           => 'с҄ьдє послѣдьнѩ мѣнꙑ сѥѩ викиопꙑтьствованиꙗ видѣти можєши',
+'nchanges' => '$1 {{PLURAL:$1|мѣна|мѣнꙑ|мѣнъ}}',
+'recentchanges' => 'послѣдьнѩ мѣнꙑ',
+'recentchanges-legend' => 'послѣдьн҄ь мѣнъ строи',
+'recentchangestext' => 'с҄ьдє послѣдьнѩ мѣнꙑ сѥѩ викиопꙑтьствованиꙗ видѣти можєши',
 'recentchanges-label-newpage' => 'по сѥи мѣнꙑ нова страница сътворѥна ѥстъ',
-'recentchanges-label-minor'   => 'малаꙗ мѣна',
-'recentchanges-label-bot'     => 'сѭ мѣноу аѵтоматъ сътворихъ',
-'rcnote'                      => "нижѣ {{PLURAL:$1|'''1''' послѣдьнѭ мѣнѫ|'''$1''' послѣдьни мѣнꙑ|'''$1''' послѣдьнъ мѣнъ|'''$1''' послѣдьнъ мѣнъ}} ꙁа {{PLURAL:$2|дьнь|'''$2''' дьнꙗ|'''$2''' дьнъ|'''$2''' дьнъ}} · ꙗко нꙑнѣ $5 · $4 лѣта",
-'rcshowhideminor'             => '$1 малꙑ мѣнꙑ',
-'rcshowhidebots'              => '$1 аѵтоматъ',
-'rcshowhideliu'               => '$1 польꙃєватєлъ · ѩжє съꙁижьдє сѥ мѣсто · мѣнꙑ',
-'rcshowhideanons'             => '$1 анѡнѷмьнъ польꙃєватєлъ мѣнꙑ',
-'rcshowhidemine'              => '$1 моꙗ мѣнꙑ',
-'rclinks'                     => '$1 послѣдьн҄ь  мѣнъ · ѩжє $2 послѣдьни дьни створѥнꙑ сѫтъ · каꙁаниѥ<br />$3',
-'diff'                        => 'ра҃ꙁн',
-'hist'                        => 'їс҃т',
-'hide'                        => 'съкрꙑи',
-'show'                        => 'виждь',
-'minoreditletter'             => 'м҃л',
-'newpageletter'               => 'н҃в',
-'boteditletter'               => 'а҃ѵ',
+'recentchanges-label-minor' => 'малаꙗ мѣна',
+'recentchanges-label-bot' => 'сѭ мѣноу аѵтоматъ сътворихъ',
+'rcnote' => "нижѣ {{PLURAL:$1|'''1''' послѣдьнѭ мѣнѫ|'''$1''' послѣдьни мѣнꙑ|'''$1''' послѣдьнъ мѣнъ|'''$1''' послѣдьнъ мѣнъ}} ꙁа {{PLURAL:$2|дьнь|'''$2''' дьнꙗ|'''$2''' дьнъ|'''$2''' дьнъ}} · ꙗко нꙑнѣ $5 · $4 лѣта",
+'rcshowhideminor' => '$1 малꙑ мѣнꙑ',
+'rcshowhidebots' => '$1 аѵтоматъ',
+'rcshowhideliu' => '$1 польꙃєватєлъ · ѩжє съꙁижьдє сѥ мѣсто · мѣнꙑ',
+'rcshowhideanons' => '$1 анѡнѷмьнъ польꙃєватєлъ мѣнꙑ',
+'rcshowhidemine' => '$1 моꙗ мѣнꙑ',
+'rclinks' => '$1 послѣдьн҄ь  мѣнъ · ѩжє $2 послѣдьни дьни створѥнꙑ сѫтъ · каꙁаниѥ<br />$3',
+'diff' => 'ра҃ꙁн',
+'hist' => 'їс҃т',
+'hide' => 'съкрꙑи',
+'show' => 'виждь',
+'minoreditletter' => 'м҃л',
+'newpageletter' => 'н҃в',
+'boteditletter' => 'а҃ѵ',
 
 # Recent changes linked
-'recentchangeslinked'         => 'съвѧꙁанꙑ страницѧ',
-'recentchangeslinked-feed'    => 'съвѧꙁанꙑ страницѧ',
+'recentchangeslinked' => 'съвѧꙁанꙑ страницѧ',
+'recentchangeslinked-feed' => 'съвѧꙁанꙑ страницѧ',
 'recentchangeslinked-toolbox' => 'съвѧꙁанꙑ страницѧ',
-'recentchangeslinked-page'    => 'страницѧ имѧ :',
+'recentchangeslinked-page' => 'страницѧ имѧ :',
 
 # Upload
-'upload'              => 'положєниѥ дѣла',
-'uploadbtn'           => 'положєниѥ дѣла',
-'uploadlog'           => 'дѣлъ положєниꙗ їсторїꙗ',
-'uploadlogpage'       => 'дѣлъ положєниꙗ їсторїꙗ',
-'filename'            => 'дѣла имѧ',
-'filedesc'            => 'опьсаниѥ',
-'fileuploadsummary'   => 'опьсаниѥ:',
-'uploadedimage'       => '⁖ [[$1]] ⁖ положєнъ ѥстъ',
-'watchthisupload'     => 'си дѣла блюдєниѥ',
+'upload' => 'положєниѥ дѣла',
+'uploadbtn' => 'положєниѥ дѣла',
+'uploadlog' => 'дѣлъ положєниꙗ їсторїꙗ',
+'uploadlogpage' => 'дѣлъ положєниꙗ їсторїꙗ',
+'filename' => 'дѣла имѧ',
+'filedesc' => 'опьсаниѥ',
+'fileuploadsummary' => 'опьсаниѥ:',
+'uploadedimage' => '⁖ [[$1]] ⁖ положєнъ ѥстъ',
+'watchthisupload' => 'си дѣла блюдєниѥ',
 'upload-success-subj' => 'дѣло положєно ѥстъ',
 
-'license'        => 'прощєниѥ :',
+'license' => 'прощєниѥ :',
 'license-header' => 'прощєниѥ',
 
 # Special:ListFiles
-'imgfile'        => 'дѣло',
-'listfiles'      => 'дѣлъ каталогъ',
+'imgfile' => 'дѣло',
+'listfiles' => 'дѣлъ каталогъ',
 'listfiles_name' => 'и́мѧ',
 'listfiles_user' => 'польꙃєватєл҄ь',
 'listfiles_size' => 'мѣра',
 
 # File description page
-'file-anchor-link'   => 'дѣло',
-'filehist'           => 'дѣла їсторїꙗ',
+'file-anchor-link' => 'дѣло',
+'filehist' => 'дѣла їсторїꙗ',
 'filehist-deleteone' => 'поничьжєниѥ',
-'filehist-current'   => 'нꙑнѣщьн҄ь обраꙁъ',
-'filehist-datetime'  => 'дьнь / врѣмѧ',
-'filehist-user'      => 'польꙃєватєл҄ь',
-'filehist-filesize'  => 'дѣла мѣра',
-'filehist-comment'   => 'опьсаниѥ',
-'imagelinks'         => 'дѣла польꙃєваниѥ',
-'sharedupload'       => 'сѥ дѣло въ $1 съхранѥно ѥстъ дѣла · ѥгожє дроугꙑ опꙑтьствованиѩ польꙃєвати могѫтъ',
+'filehist-current' => 'нꙑнѣщьн҄ь обраꙁъ',
+'filehist-datetime' => 'дьнь / врѣмѧ',
+'filehist-user' => 'польꙃєватєл҄ь',
+'filehist-filesize' => 'дѣла мѣра',
+'filehist-comment' => 'опьсаниѥ',
+'imagelinks' => 'дѣла польꙃєваниѥ',
+'sharedupload' => 'сѥ дѣло въ $1 съхранѥно ѥстъ дѣла · ѥгожє дроугꙑ опꙑтьствованиѩ польꙃєвати могѫтъ',
 
 # File reversion
 'filerevert-comment' => 'какъ съмꙑслъ :',
 
 # File deletion
-'filedelete'         => 'поничьжєниѥ $1',
-'filedelete-legend'  => 'дѣла поничьжєниѥ',
+'filedelete' => 'поничьжєниѥ $1',
+'filedelete-legend' => 'дѣла поничьжєниѥ',
 'filedelete-comment' => 'какъ съмꙑслъ :',
-'filedelete-submit'  => 'поничьжєниѥ',
+'filedelete-submit' => 'поничьжєниѥ',
 
 # MIME search
 'mimetype' => 'MIME тѷпъ :',
@@ -532,57 +537,57 @@ $messages = array(
 'randomredirect' => 'прѣнаправлѥниє въ нєꙁаапѫ',
 
 # Statistics
-'statistics'              => 'статїстїка',
+'statistics' => 'статїстїка',
 'statistics-header-pages' => 'страницѧ статїстїка',
 'statistics-header-edits' => 'мѣнъ статїстїка',
 'statistics-header-users' => 'польꙃєватєлъ статїстїка',
-'statistics-articles'     => 'истиньнꙑ члѣни',
-'statistics-pages'        => 'страницѧ',
-'statistics-files'        => 'положєнꙑ дѣла',
+'statistics-articles' => 'истиньнꙑ члѣни',
+'statistics-pages' => 'страницѧ',
+'statistics-files' => 'положєнꙑ дѣла',
 
-'disambiguations'     => 'страницѧ ижє съвѧꙁи съ мъногосъмꙑслиꙗ имѫтъ',
+'disambiguations' => 'страницѧ ижє съвѧꙁи съ мъногосъмꙑслиꙗ имѫтъ',
 'disambiguationspage' => 'Template:мъногосъмꙑслиѥ',
 
-'brokenredirects-edit'   => 'исправи',
+'brokenredirects-edit' => 'исправи',
 'brokenredirects-delete' => 'поничьжєниѥ',
 
 # Miscellaneous special pages
-'nbytes'            => '$1 {{PLURAL:$1|баитъ|баита|баитъ}}',
-'nlinks'            => '$1 {{PLURAL:$1|съвѧꙁь|съвѧꙁи|съвѧꙁии}}',
-'nmembers'          => '$1 {{PLURAL:$1|члѣнъ|члѣна|члѣни|члѣнъ}}',
-'shortpages'        => 'кратъкꙑ страницѧ',
-'listusers'         => 'польꙃєватєлъ каталогъ',
-'usercreated'       => '{{GENDER:$3|сътворилъ|сътворила}} мѣсто $1 въ $2',
-'newpages'          => 'нови члѣни',
+'nbytes' => '$1 {{PLURAL:$1|баитъ|баита|баитъ}}',
+'nlinks' => '$1 {{PLURAL:$1|съвѧꙁь|съвѧꙁи|съвѧꙁии}}',
+'nmembers' => '$1 {{PLURAL:$1|члѣнъ|члѣна|члѣни|члѣнъ}}',
+'shortpages' => 'кратъкꙑ страницѧ',
+'listusers' => 'польꙃєватєлъ каталогъ',
+'usercreated' => '{{GENDER:$3|сътворилъ|сътворила}} мѣсто $1 въ $2',
+'newpages' => 'нови члѣни',
 'newpages-username' => 'польꙃєватєлꙗ имѧ :',
-'move'              => 'прѣимєнованиѥ',
-'movethispage'      => 'си страницѧ прѣимєнованиѥ',
+'move' => 'прѣимєнованиѥ',
+'movethispage' => 'си страницѧ прѣимєнованиѥ',
 
 # Book sources
 'booksources-go' => 'прѣиди',
 
 # Special:Log
-'specialloguserlabel'  => 'польꙃєватєл҄ь:',
+'specialloguserlabel' => 'польꙃєватєл҄ь:',
 'speciallogtitlelabel' => 'страницѧ имѧ :',
-'log'                  => 'їсторїѩ',
-'all-logs-page'        => 'вьсѩ обьщѧ їсторїѩ',
+'log' => 'їсторїѩ',
+'all-logs-page' => 'вьсѩ обьщѧ їсторїѩ',
 
 # Special:AllPages
-'allpages'       => 'вьсѩ страницѧ',
+'allpages' => 'вьсѩ страницѧ',
 'alphaindexline' => 'отъ $1 до $2',
-'allpagesfrom'   => 'страницѧ видѣти хощѫ съ начѧльнами боукъвами :',
-'allarticles'    => 'вьсѩ страницѧ',
+'allpagesfrom' => 'страницѧ видѣти хощѫ съ начѧльнами боукъвами :',
+'allarticles' => 'вьсѩ страницѧ',
 'allpagessubmit' => 'прѣиди',
 
 # Special:Categories
 'categories' => 'катигорїѩ',
 
 # Special:DeletedContributions
-'deletedcontributions'       => 'поничьжєнꙑ добродѣꙗниꙗ',
+'deletedcontributions' => 'поничьжєнꙑ добродѣꙗниꙗ',
 'deletedcontributions-title' => 'поничьжєнꙑ добродѣꙗниꙗ',
 
 # Special:LinkSearch
-'linksearch'    => 'вънѣщьн҄ь съвѧꙁь исканиѥ',
+'linksearch' => 'вънѣщьн҄ь съвѧꙁь исканиѥ',
 'linksearch-ok' => 'ищи',
 
 # Special:ListUsers
@@ -595,141 +600,147 @@ $messages = array(
 'emailuser' => 'посъли єпїстолѫ',
 
 # Watchlist
-'watchlist'        => 'моꙗ блюдєниꙗ',
-'mywatchlist'      => 'моꙗ блюдєниꙗ',
-'addedwatchtext'   => "страница ⁖ [[:$1]] ⁖ нꙑнѣ подъ твоимь [[Special:Watchlist|блюдєниѥмь]] ѥстъ ⁙
+'watchlist' => 'моꙗ блюдєниꙗ',
+'mywatchlist' => 'моꙗ блюдєниꙗ',
+'addedwatchtext' => "страница ⁖ [[:$1]] ⁖ нꙑнѣ подъ твоимь [[Special:Watchlist|блюдєниѥмь]] ѥстъ ⁙
 всꙗ ѥѩ и ѥѩжє бєсѣдꙑ мѣнꙑ страницѧ ⁖ [[Special:Watchlist|моꙗ блюдєниꙗ]] ⁖ покаꙁанꙑ сѫтъ и  [[Special:RecentChanges|послѣдьнъ мѣнъ]] каталоꙃѣ '''чрьнꙑимъ''' сѧ авлꙗѭтъ",
 'removedwatchtext' => 'страница ⁖ [[:$1]] ⁖ нꙑнѣ твоѥго [[Special:Watchlist|блюдєниꙗ]] иꙁнєсєна ѥстъ',
-'watch'            => 'блюдєниѥ',
-'watchthispage'    => 'си страницѧ блюдєниѥ',
-'unwatch'          => 'остави блюдєниѥ',
+'watch' => 'блюдєниѥ',
+'watchthispage' => 'си страницѧ блюдєниѥ',
+'unwatch' => 'остави блюдєниѥ',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'блюдєниѥ ...',
+'watching' => 'блюдєниѥ ...',
 'unwatching' => 'оставьлєниѥ блюдєниꙗ ...',
 
 'created' => 'сътворѥнъ ѥстъ',
 
 # Delete
-'deletepage'      => 'поничьжєниѥ',
-'excontent'       => "вънѫтри бѣ: '$1'",
+'deletepage' => 'поничьжєниѥ',
+'excontent' => "вънѫтри бѣ: '$1'",
 'excontentauthor' => "вънѫтри бѣ : '$1' (и послѣдьн҄ии дѣтєл҄ь бѣ '[[Special:Contributions/$2|$2]]')",
-'delete-legend'   => 'поничьжєниѥ',
-'actioncomplete'  => 'дѣиство сътворєно ѥстъ',
-'deletedtext'     => 'страница ⁖ $1 ⁖ поничьжєна ѥстъ ⁙
+'delete-legend' => 'поничьжєниѥ',
+'actioncomplete' => 'дѣиство сътворєно ѥстъ',
+'deletedtext' => 'страница ⁖ $1 ⁖ поничьжєна ѥстъ ⁙
 виждь ⁖ $2 ⁖ послѣдьнъ поничьжєниѩ дѣлꙗ',
-'dellogpage'      => 'поничьжєниꙗ їсторїꙗ',
-'deletionlog'     => 'поничьжєниꙗ їсторїꙗ',
-'deletecomment'   => 'какъ съмꙑслъ :',
+'dellogpage' => 'поничьжєниꙗ їсторїꙗ',
+'deletionlog' => 'поничьжєниꙗ їсторїꙗ',
+'deletecomment' => 'какъ съмꙑслъ :',
 
 # Protect
-'protectlogpage'         => 'ꙁабранѥниꙗ їсторїꙗ',
-'protectedarticle'       => '⁖ [[$1]] ⁖ ꙁабранѥна ѥстъ',
-'prot_1movedto2'         => '⁖ [[$1]] ⁖ нарєчєнъ ⁖ [[$2]] ⁖ ѥстъ',
-'protectcomment'         => 'какъ съмꙑслъ :',
-'protect-level-sysop'    => 'толико съмотритєлє',
-'protect-expiry-options' => '2 часа:2 hours,1 дьнь:1 day,3 дьни:3 days,1 сєдмица:1 week,2 сєдмици:2 weeks,1 мѣсѧць:1 month,3 мѣсѧць:3 months,6 мѣсѧць:6 months,1 лѣто:1 year,вѣчьно:infinite',
+'protectlogpage' => 'ꙁабранѥниꙗ їсторїꙗ',
+'protectedarticle' => '⁖ [[$1]] ⁖ ꙁабранѥна ѥстъ',
+'prot_1movedto2' => '⁖ [[$1]] ⁖ нарєчєнъ ⁖ [[$2]] ⁖ ѥстъ',
+'protectcomment' => 'какъ съмꙑслъ :',
+'protect-level-sysop' => 'толико съмотритєлє',
+'protect-expiry-options' => '1 часъ:1 hour,1 дьнь:1 day,1 сєдмица:1 week,2 сєдмици:2 weeks,1 мѣсѧць:1 month,3 мѣсѧць:3 months,6 мѣсѧць:6 months,1 лѣто:1 year,вѣчьно:infinite',
+'pagesize' => '(баитъ)',
 
 # Restrictions (nouns)
-'restriction-edit'   => 'исправи',
-'restriction-move'   => 'прѣимєнованиѥ',
+'restriction-edit' => 'исправи',
+'restriction-move' => 'прѣимєнованиѥ',
 'restriction-upload' => 'положєниѥ',
 
 # Undelete
-'undeletecomment'        => 'какъ съмꙑслъ :',
+'undeletecomment' => 'какъ съмꙑслъ :',
 'undelete-search-submit' => 'ищи',
 
 # Namespace form on various pages
-'namespace'      => 'имєнъ просторъ:',
+'namespace' => 'имєнъ просторъ:',
 'blanknamespace' => '(главьно)',
 
 # Contributions
-'contributions'       => 'польꙃєватєлꙗ добродѣꙗниꙗ',
+'contributions' => 'польꙃєватєлꙗ добродѣꙗниꙗ',
 'contributions-title' => 'польꙃєватєлꙗ ⁖ $1 ⁖ добродѣꙗниꙗ',
-'mycontris'           => 'моꙗ добродѣꙗниꙗ',
-'contribsub2'         => 'польꙃєватєлꙗ имѧ ⁖ $1 ⁖ ѥстъ ($2)',
-'uctop'               => '(послѣдьнꙗ мѣна)',
+'mycontris' => 'моꙗ добродѣꙗниꙗ',
+'contribsub2' => 'польꙃєватєлꙗ имѧ ⁖ $1 ⁖ ѥстъ ($2)',
+'uctop' => '(послѣдьнꙗ мѣна)',
 
 'sp-contributions-blocklog' => 'ꙁаграждєниꙗ їсторїꙗ',
-'sp-contributions-deleted'  => 'поничьжєнꙑ добродѣꙗниꙗ',
-'sp-contributions-uploads'  => 'положєнꙑ дѣла',
-'sp-contributions-logs'     => 'їсторїѩ',
-'sp-contributions-talk'     => 'бєсѣда',
+'sp-contributions-deleted' => 'поничьжєнꙑ добродѣꙗниꙗ',
+'sp-contributions-uploads' => 'положєнꙑ дѣла',
+'sp-contributions-logs' => 'їсторїѩ',
+'sp-contributions-talk' => 'бєсѣда',
 'sp-contributions-username' => 'IP число или польꙃєватєлꙗ имѧ :',
-'sp-contributions-submit'   => 'ищи',
+'sp-contributions-submit' => 'ищи',
 
 # What links here
-'whatlinkshere'            => 'дос̑ьдєщьнѩ съвѧꙁи',
-'whatlinkshere-title'      => 'страницѧ ижє съ ⁖ $1 ⁖ съвѧꙁи имѫтъ',
-'whatlinkshere-page'       => 'страница :',
-'isredirect'               => 'прѣнаправлѥниѥ',
-'istemplate'               => 'внѫтри страницѧ',
-'isimage'                  => 'дѣла съвѧꙁь',
-'whatlinkshere-links'      => '← съвѧꙁи',
+'whatlinkshere' => 'дос̑ьдєщьнѩ съвѧꙁи',
+'whatlinkshere-title' => 'страницѧ ижє съ ⁖ $1 ⁖ съвѧꙁи имѫтъ',
+'whatlinkshere-page' => 'страница :',
+'isredirect' => 'прѣнаправлѥниѥ',
+'istemplate' => 'внѫтри страницѧ',
+'isimage' => 'дѣла съвѧꙁь',
+'whatlinkshere-links' => '← съвѧꙁи',
 'whatlinkshere-hideredirs' => '$1 прѣнаправлѥниꙗ',
-'whatlinkshere-hidelinks'  => '$1 съвѧꙁи',
+'whatlinkshere-hidelinks' => '$1 съвѧꙁи',
 
 # Block/unblock
-'blockip'            => 'ꙁагради польꙃєватєл҄ь',
+'blockip' => 'ꙁагради польꙃєватєл҄ь',
 'ipadressorusername' => 'IP число или польꙃєватєлꙗ имѧ :',
-'ipbreason'          => 'какъ съмꙑслъ :',
-'ipboptions'         => '2 часа:2 hours,1 дьнь:1 day,3 дьни:3 days,1 сєдмица:1 week,2 сєдмици:2 weeks,1 мѣсѧць:1 month,3 мѣсѧць:3 months,6 мѣсѧць:6 months,1 лѣто:1 year,вѣчьно:infinite',
-'ipblocklist'        => 'ꙁаграждєнꙑ польꙃєватєлє',
-'blocklist-reason'   => 'какъ съмꙑслъ',
+'ipbreason' => 'какъ съмꙑслъ :',
+'ipboptions' => '2 часа:2 hours,1 дьнь:1 day,3 дьни:3 days,1 сєдмица:1 week,2 сєдмици:2 weeks,1 мѣсѧць:1 month,3 мѣсѧць:3 months,6 мѣсѧць:6 months,1 лѣто:1 year,вѣчьно:infinite',
+'ipblocklist' => 'ꙁаграждєнꙑ польꙃєватєлє',
+'blocklist-reason' => 'какъ съмꙑслъ',
 'ipblocklist-submit' => 'исканиѥ',
-'infiniteblock'      => 'вѣчьно',
-'blocklink'          => 'ꙁагради',
-'contribslink'       => 'добродѣꙗниꙗ',
-'blocklogpage'       => 'ꙁаграждєниꙗ їсторїꙗ',
+'infiniteblock' => 'вѣчьно',
+'blocklink' => 'ꙁагради',
+'contribslink' => 'добродѣꙗниꙗ',
+'blocklogpage' => 'ꙁаграждєниꙗ їсторїꙗ',
 
 # Move page
-'move-page'               => 'прѣимєнованиѥ ⁖ $1 ⁖',
-'move-page-legend'        => 'страницѧ прѣимєнованиѥ',
-'movearticle'             => 'страница :',
-'newtitle'                => 'ново имѧ :',
-'move-watch'              => 'си страницѧ блюдєниѥ',
-'movepagebtn'             => 'прѣимєнованиѥ',
-'pagemovedsub'            => 'прѣимєнованиѥ сътворѥно ѥстъ',
-'movepage-moved'          => "'''⁖ $1 ⁖ нарєчєнъ ⁖ $2⁖ ѥстъ'''",
+'move-page' => 'прѣимєнованиѥ ⁖ $1 ⁖',
+'move-page-legend' => 'страницѧ прѣимєнованиѥ',
+'movearticle' => 'страница :',
+'newtitle' => 'ново имѧ :',
+'move-watch' => 'си страницѧ блюдєниѥ',
+'movepagebtn' => 'прѣимєнованиѥ',
+'pagemovedsub' => 'прѣимєнованиѥ сътворѥно ѥстъ',
+'movepage-moved' => "'''⁖ $1 ⁖ нарєчєнъ ⁖ $2⁖ ѥстъ'''",
 'movepage-moved-redirect' => 'прѣнаправлѥниѥ сътворѥно бѣ',
-'movedto'                 => 'прѣимєновано въ',
-'movetalk'                => 'си страницѧ бєсѣдꙑ прѣимєнованиѥ',
-'movelogpage'             => 'прѣимєнованиꙗ їсторїꙗ',
-'movereason'              => 'какъ съмꙑслъ :',
-'move-leave-redirect'     => 'прѣнаправлѥниꙗ сътворѥниѥ',
+'movedto' => 'прѣимєновано въ',
+'movetalk' => 'си страницѧ бєсѣдꙑ прѣимєнованиѥ',
+'movelogpage' => 'прѣимєнованиꙗ їсторїꙗ',
+'movereason' => 'какъ съмꙑслъ :',
+'move-leave-redirect' => 'прѣнаправлѥниꙗ сътворѥниѥ',
 
 # Namespace 8 related
-'allmessages'     => 'сѷстимьнꙑ напьсаниꙗ',
+'allmessages' => 'сѷстимьнꙑ напьсаниꙗ',
 'allmessagesname' => 'имѧ',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'            => 'твоꙗ польꙃєватєл҄ьска страница',
-'tooltip-pt-mytalk'              => 'твоꙗ бєсѣдꙑ страница',
-'tooltip-pt-preferences'         => 'твои строи',
-'tooltip-pt-mycontris'           => 'твоѩ добродѣꙗнии каталогъ',
-'tooltip-pt-logout'              => 'ис̾ходъ',
-'tooltip-ca-talk'                => 'си страницѧ бєсѣда',
-'tooltip-ca-viewsource'          => 'си страница ꙁабранєна ѥстъ ⁙
+'tooltip-pt-userpage' => 'твоꙗ польꙃєватєл҄ьска страница',
+'tooltip-pt-mytalk' => 'твоꙗ бєсѣдꙑ страница',
+'tooltip-pt-preferences' => 'твои строи',
+'tooltip-pt-mycontris' => 'твоѩ добродѣꙗнии каталогъ',
+'tooltip-pt-logout' => 'ис̾ходъ',
+'tooltip-ca-talk' => 'си страницѧ бєсѣда',
+'tooltip-ca-viewsource' => 'си страница ꙁабранєна ѥстъ ⁙
 ѥѩ источьнъ обраꙁъ видєти можєши',
-'tooltip-ca-protect'             => 'си страницѧ ꙁабранєниѥ',
-'tooltip-ca-delete'              => 'си страницѧ поничьжєниѥ',
-'tooltip-ca-move'                => 'си страницѧ прѣимєнованиѥ',
-'tooltip-ca-watch'               => 'си страницѧ блюдєниѥ',
-'tooltip-search'                 => 'ищи {{{grammar:genitive|{{SITENAME}}}}} страницѧ',
-'tooltip-p-logo'                 => 'главьна страница',
-'tooltip-n-mainpage'             => 'виждь главьноу страницѫ',
+'tooltip-ca-protect' => 'си страницѧ ꙁабранєниѥ',
+'tooltip-ca-delete' => 'си страницѧ поничьжєниѥ',
+'tooltip-ca-move' => 'си страницѧ прѣимєнованиѥ',
+'tooltip-ca-watch' => 'си страницѧ блюдєниѥ',
+'tooltip-search' => 'ищи {{{grammar:genitive|{{SITENAME}}}}} страницѧ',
+'tooltip-p-logo' => 'главьна страница',
+'tooltip-n-mainpage' => 'виждь главьноу страницѫ',
 'tooltip-n-mainpage-description' => 'виждь главьноу страницѫ',
-'tooltip-n-recentchanges'        => 'послѣдьн҄ь мѣнъ каталогъ',
-'tooltip-t-contributions'        => 'виждь польꙃєватєлꙗ добродѣꙗнии каталогъ',
-'tooltip-t-upload'               => 'положєниѥ дѣлъ',
-'tooltip-t-specialpages'         => 'вьсѣѩ нарочьнъ страницѧ каталогъ',
-'tooltip-t-print'                => 'сѥѩ страницѧ пєчатьнъ обраꙁъ',
-'tooltip-ca-nstab-special'       => 'си нарочьна страница ѥстъ · ѥѩжє иꙁмѣнꙗти нє можєши',
-'tooltip-watch'                  => 'си страницѧ блюдєниѥ',
+'tooltip-n-recentchanges' => 'послѣдьн҄ь мѣнъ каталогъ',
+'tooltip-t-contributions' => 'виждь польꙃєватєлꙗ добродѣꙗнии каталогъ',
+'tooltip-t-upload' => 'положєниѥ дѣлъ',
+'tooltip-t-specialpages' => 'вьсѣѩ нарочьнъ страницѧ каталогъ',
+'tooltip-t-print' => 'сѥѩ страницѧ пєчатьнъ обраꙁъ',
+'tooltip-ca-nstab-special' => 'си нарочьна страница ѥстъ · ѥѩжє иꙁмѣнꙗти нє можєши',
+'tooltip-watch' => 'си страницѧ блюдєниѥ',
+
+# Info page
+'pageinfo-header-watchlist' => 'блюдєниꙗ',
+'pageinfo-subjectpage' => 'страница',
+'pageinfo-talkpage' => 'бєсѣда',
 
 # Media information
 'file-info-size' => '$1 × $2 п҃ѯ · дѣла мѣра : $3 · MIME тѷпъ : $4',
-'svg-long-desc'  => 'дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
+'svg-long-desc' => 'дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
 'show-big-image' => 'пльнъ вида обраꙁъ',
 
 # Special:NewFiles
@@ -741,7 +752,7 @@ $messages = array(
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'вьсꙗ',
 'namespacesall' => 'вьсꙗ',
-'monthsall'     => 'вьсѩ',
+'monthsall' => 'вьсѩ',
 
 'unit-pixel' => 'п҃ѯ',
 
@@ -755,13 +766,16 @@ $messages = array(
 'autosumm-new' => 'нова страница ⁖ $1 ⁖ сътворєна  ѥстъ',
 
 # Size units
-'size-bytes'     => '$1 Б҃',
+'size-bytes' => '$1 Б҃',
 'size-kilobytes' => '$1 Х҃Б',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|бєсѣда]])',
+
 # Special:Version
-'version'                  => 'MediaWiki обраꙁъ',
-'version-version'          => '(обраꙁъ $1)',
-'version-license'          => 'прощєниѥ',
+'version' => 'MediaWiki обраꙁъ',
+'version-version' => '(обраꙁъ $1)',
+'version-license' => 'прощєниѥ',
 'version-software-version' => 'обраꙁъ',
 
 # Special:FilePath
@@ -776,10 +790,16 @@ $messages = array(
 # Special:Tags
 'tags-edit' => 'исправи',
 
+# Database error messages
+'dberr-header' => 'Вики тєхнїчьнꙑ отѧжєниꙗ имѣтъ',
+
 # New logging system
-'logentry-delete-delete'        => '$1 поничьжихъ страницѫ ⁖ $3 ⁖',
-'logentry-move-move'            => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖',
+'logentry-delete-delete' => '$1 поничьжихъ страницѫ ⁖ $3 ⁖',
+'logentry-move-move' => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖',
 'logentry-move-move-noredirect' => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ бєꙁ прѣнаправлєниꙗ сътворѥниꙗ',
-'logentry-newusers-create'      => '$1 сътворихъ польꙃєватєльско мѣсто',
+'logentry-newusers-create' => '$1 сътворихъ польꙃєватєльско мѣсто',
+
+# API errors
+'api-error-unknownerror' => 'нєвѣдома блаꙁна : ⁖ $1 ⁖',
 
 );
index a8ecad3..68a8d1e 100644 (file)
@@ -187,6 +187,7 @@ $messages = array(
 'vector-view-edit' => 'Тӳрлет',
 'vector-view-history' => 'Кун-çул',
 'vector-view-view' => 'Вула',
+'vector-view-viewsource' => 'пуçламăш текста пăх',
 
 'errorpagetitle' => 'Йăнăш',
 'returnto' => '$1 страницăна таврăн.',
@@ -210,7 +211,7 @@ $messages = array(
 'deletethispage' => 'Хурат ăна',
 'undelete_short' => '$1 тӳрлетӳсене каялла тавăр',
 'protect' => 'хӳтĕле',
-'protect_change' => 'Ñ\85Ó³Ñ\82Ä\95лÄ\95ве Ñ\83лÄ\83Ñ\88Ñ\82аÑ\80',
+'protect_change' => 'улăштар',
 'protectthispage' => 'Хӳтĕле',
 'unprotect' => 'Хӳтĕлеве пăрахăçла',
 'unprotectthispage' => 'Хӳтĕлеве пăрахăçла',
@@ -587,6 +588,7 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
 'searchhelp-url' => 'Help:Пулăшу',
 'search-result-size' => '$1 ({{PLURAL:$2|1 сăмах|$2 сăмах}})',
 'showingresults' => 'Аяларах эсир <b>#$2</b> пуçласа кăтартнă <b>$1</b> йĕркене куратăр.',
+'showingresultsheader' => "{{PLURAL:$5|Результат '''$1'''  '''$3''' хушшинчен|Результатсем'''$1 - $2''' '''$3''' хушшинчен}}  '''$4''' валли",
 'powersearch' => 'Анлă шырав',
 'powersearch-legend' => 'Анлă шырав',
 
@@ -751,9 +753,13 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
 'file-anchor-link' => 'Файл',
 'filehist' => 'Файл историйĕ',
 'filehist-current' => 'хальхи',
+'filehist-datetime' => 'Дата/Вăхăт',
+'filehist-thumb' => 'Миниатюра',
+'filehist-thumbtext' => '$1 версийĕн миниатюра ӳкерчĕкĕ',
 'filehist-user' => 'Хутшăнакан',
+'filehist-dimensions' => 'Пысăкăш',
 'filehist-comment' => 'Асăрхав',
-'imagelinks' => 'Файл çине каçасем',
+'imagelinks' => 'Файла усă курни',
 'linkstoimage' => 'Çак страницăсем ку файл çине кăтартаççĕ:',
 'nolinkstoimage' => 'Ку файл çине кăтартакан страницăсем çук.',
 'uploadnewversion-linktext' => 'Ку файлăн çĕнĕ версине кĕрт',
@@ -963,6 +969,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'viewdeletedpage' => 'Кăларса пăрахнă страницăсене пăх',
 'undeleterevisions' => 'Архивра пурĕ $1 верси',
 'undeletebtn' => 'Каялла тавăр!',
+'undeleteviewlink' => 'пăх',
 'undeletereset' => 'Тасат',
 'undeletedrevisions' => '$1 кăларса пăрахнă тӳрлетӳсене каялла тавăрнă',
 'undelete-search-box' => 'Кăларса пăрахнă страницăсен хушшинчи шырав',
@@ -1066,12 +1073,14 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'import-logentry-upload' => '«[[$1]]» — файлтан импортла',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ð\9fолÑ\8cзоваÑ\82елÑ\8c страници',
-'tooltip-pt-mytalk' => 'Ð\9cан канашлу страници',
+'tooltip-pt-userpage' => 'СиÑ\80Ä\95н Ñ\85Ñ\83Ñ\82Ñ\88Ä\83накан страници',
+'tooltip-pt-mytalk' => 'СиÑ\80Ä\95н канашлу страници',
 'tooltip-pt-preferences' => 'Сирĕн ĕнерлевсем',
+'tooltip-pt-watchlist' => 'Эсир пăхакан страницисем',
+'tooltip-pt-logout' => 'Сайтран тух',
 'tooltip-ca-talk' => 'Статьяна сӳтсе явасси',
 'tooltip-ca-edit' => 'Эсир ку страницӑна тӳрлетме пултаратӑр. Тархасшӑн ҫырса хӑваричен страницӑ мӗнле пулассине пӑхӑр.',
-'tooltip-ca-addsection' => 'Кӗске ӑнлантару хушма пултаратӑр.',
+'tooltip-ca-addsection' => 'Çĕнĕ пай ту',
 'tooltip-ca-viewsource' => 'Ку страницӑна эсир улӑштарма пултараймастӑр. Ӑна мӗнле ҫырнине кӑна пӑхма пултаратӑр.',
 'tooltip-ca-protect' => 'Улӑшратусенчен сыхласси',
 'tooltip-ca-delete' => 'Страницӑна кӑларса пӑрахмалли',
@@ -1080,8 +1089,13 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'tooltip-ca-unwatch' => 'Ку страницӑ хыҫҫӑн урӑх сӑнамалла мар',
 'tooltip-search' => 'Шырав',
 'tooltip-p-logo' => 'Тӗп страницӑ',
+'tooltip-feed-atom' => 'Ку страницăн Atom куçару',
+'tooltip-ca-nstab-image' => 'Файлăн страници',
+'tooltip-ca-nstab-template' => 'Шаблонăн страници',
+'tooltip-ca-nstab-category' => 'Категори страницине уç',
 'tooltip-save' => 'Тӳрлетӳсене астуса хăвармалла',
 'tooltip-watch' => 'Çак страницăна пăхса тăмаллисем шутне хуш',
+'tooltip-summary' => 'Кĕскĕн ăнлантарса парăр',
 
 # Attribution
 'anonymous' => '{{GRAMMAR:genitive|{{SITENAME}}}} анонимлă хутшăнакансем',
@@ -1118,6 +1132,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'ilsubmit' => 'Шырамалла',
 'bydate' => 'дата тăрăх',
 
+# Metadata
+'metadata' => 'Метаданнăйсем:',
+
 # EXIF tags
 'exif-exifversion' => 'Exif версийĕ',
 'exif-flashpixversion' => 'Ĕçлеме пултаракан FlashPix версийĕ',
index 95a6c43..df4190e 100644 (file)
@@ -776,6 +776,7 @@ Cofiwch bod y tudalennau .css a .js yn defnyddio llythrennau bach, e.e. {{ns:use
 'updated' => '(Diweddariad)',
 'note' => "'''Dalier sylw:'''",
 'previewnote' => "'''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto!",
+'continue-editing' => 'Parhau i olygu',
 'previewconflict' => "Mae'r rhagolwg hwn yn dangos y testun yn yr ardal golygu uchaf, fel ag y byddai'n ymddangos petaech yn rhoi'r dudalen ar gadw.",
 'session_fail_preview' => "'''Ymddiheurwn! Methwyd prosesu eich golygiad gan fod rhan o ddata'r sesiwn wedi'i golli. Ceisiwch eto.
 Os digwydd yr un peth eto, ceisiwch [[Special:UserLogout|allgofnodi]] ac yna mewngofnodi eto.'''",
@@ -869,6 +870,10 @@ Cafodd yr argiau hyn eu hepgor.",
 'parser-template-loop-warning' => 'Daethpwyd o hyd i ddolen yn y nodyn: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Wedi mynd dros ben y terfyn ar ddyfnder dychweliad nodiadau ($1)',
 'language-converter-depth-warning' => "Wedi mynd tu hwnt i'r terfyn dyfnder ($1) ar y cyfnewidydd iaith.",
+'node-count-exceeded-category' => 'Tudalennau lle mae nifer y nodau yn ormod',
+'node-count-exceeded-warning' => 'Mae nifer y nodau yn y dudalen yn ormod',
+'expansion-depth-exceeded-category' => "Tudalennau â dyfnder ehangu tu hwnt i'r terfyn",
+'expansion-depth-exceeded-warning' => "Mae dyfnder ehangu'r dudalen y tu hwnt i'r terfyn",
 
 # "Undo" feature
 'undo-success' => "Gellir dadwneud y golygiad. Byddwch gystal â gwirio'r gymhariaeth isod i sicrhau mai dyma sydd arnoch eisiau gwneud, ac yna rhowch y newidiadau ar gadw i gwblhau'r gwaith o ddadwneud y golygiad.",
@@ -1945,6 +1950,11 @@ Sylwer bod llythrennau mawr neu fach o bwys i'r chwiliad.",
 'allpages-bad-ns' => 'Nid oes gan {{SITENAME}} barth o\'r enw "$1".',
 'allpages-hide-redirects' => 'Cuddio tudalennau ailgyfeirio',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Rydych yn edrych ar fersiwn o'r dudalen a roddwyd ar gadw mewn celc hyd at $1 yn ôl.",
+'cachedspecial-viewing-cached-ts' => "Rydych yn edrych ar fersiwn o'r dudalen a roddwyd ar gadw mewn celc. Gall fod yn wahanol i'r fersiwn cyfoes.",
+'cachedspecial-refresh-now' => 'Gweld y diwygiad diweddaraf.',
+
 # Special:Categories
 'categories' => 'Categorïau',
 'categoriespagetext' => "Mae'r {{PLURAL:$1|categori|categori|categorïau|categorïau|categorïau|categorïau}} isod yn cynnwys tudalennau neu ffeiliau amlgyfrwng.
@@ -3494,6 +3504,8 @@ Dylech fod wedi derbyn [{{SERVER}}{{SCRIPTPATH}}/COPYING gopi o GNU General Publ
 'version-software' => 'Meddalwedd gosodedig',
 'version-software-product' => 'Cynnyrch',
 'version-software-version' => 'Fersiwn',
+'version-entrypoints' => 'URLs y mannau cyflwyno',
+'version-entrypoints-header-entrypoint' => 'Man cyflwyno',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
@@ -3690,6 +3702,7 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'duration-weeks' => '$1 {{PLURAL:$1|wythnos}}',
 'duration-years' => '$1 {{PLURAL:$1|mlynedd|mlynedd|flynedd|mlynedd|mlynedd|mlynedd}}',
 'duration-decades' => '$1 {{PLURAL:$1|degawd|degawd|ddegawd|degawd|degawd|degawd}}',
-'duration-centuries' => '$1 {{PLURAL:$1|canrif|canrif|ganrif|chanrif|chanrif|canrif}}',
+'duration-centuries' => '$1 {{PLURAL:$1|canmlwydd|ganmlwydd|ganmlwydd|canmlwydd|chanmlwydd|canmlwydd}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milflwydd|filflwydd|filflwydd|milflwydd|milflwydd|milflwydd}}',
 
 );
index a0b544a..44eb57f 100644 (file)
@@ -1141,6 +1141,10 @@ Sie darf nicht mehr als $2 {{PLURAL:$2|Aufruf|Aufrufe}} haben, es {{PLURAL:$1|is
 'parser-template-loop-warning' => 'Vorlagenschleife entdeckt: [[$1]]',
 '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',
+'node-count-exceeded-warning' => 'Die Seite hat die Knotenpunktanzahl überschritten.',
+'expansion-depth-exceeded-category' => 'Seiten, die die Expansionstiefe überschritten haben',
+'expansion-depth-exceeded-warning' => 'Die Seite hat die Expansionstiefe überschritten.',
 
 # "Undo" feature
 'undo-success' => 'Die Bearbeitung kann rückgängig gemacht werden.
@@ -1174,7 +1178,7 @@ Grund der Sperre: ''$2''",
 * ({{int:cur}}) = Unterschied zur aktuellen Version, ({{int:last}}) = Unterschied zur vorherigen Version
 * Uhrzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Adresse des Bearbeiters, {{int:minoreditletter}} = Kleine Änderung',
 'history-fieldset-title' => 'In der Versionsgeschichte suchen',
-'history-show-deleted' => 'nur gelöschte Versionen',
+'history-show-deleted' => 'Nur gelöschte Versionen zeigen',
 'histfirst' => 'Älteste',
 'histlast' => 'Neueste',
 'historysize' => '({{PLURAL:$1|1 Byte|$1 Bytes}})',
index 3f59250..533b388 100644 (file)
@@ -167,7 +167,7 @@ $messages = array(
 'qbpageoptions' => 'Ena pele',
 'qbpageinfo' => 'Gıre',
 'qbmyoptions' => 'Pelê mı',
-'qbspecialpages' => 'Pelê Mêniye',
+'qbspecialpages' => 'Peley xısusi',
 'faq' => 'PZP (Persê ke zehf persiyenê)',
 'faqpage' => 'Project: PZP',
 
@@ -200,7 +200,7 @@ $messages = array(
 'history_short' => 'Tarix',
 'updatedmarker' => 'cıkewtena mına peyêne ra dıme biyo rocane',
 'printableversion' => 'Asayışê çapkerdışi',
-'permalink' => 'Gıreyo jûqere',
+'permalink' => 'Gıreyo daimi',
 'print' => 'Çap ke',
 'view' => 'Bıvêne',
 'edit' => 'Bıvurne',
@@ -219,7 +219,7 @@ $messages = array(
 'newpage' => 'Pela newiye',
 'talkpage' => 'Ena pele sero werêne',
 'talkpagelinktext' => 'Werênayış',
-'specialpage' => 'Pela xase',
+'specialpage' => 'Pela xısusi',
 'personaltools' => 'Hacetê şexsi',
 'postcomment' => 'Qısımo newe',
 'articlepage' => 'Pela zerreki bıvêne',
@@ -299,7 +299,7 @@ $1',
 'showtoc' => 'bımocne',
 'hidetoc' => 'bınımne',
 'collapsible-collapse' => 'Kılmever ke',
-'collapsible-expand' => 'Hera',
+'collapsible-expand' => 'Hera ke',
 'thisisdeleted' => 'Bıvêne ya zi $1 peyser bia?',
 'viewdeleted' => '$1 bıvêne?',
 'restorelink' => '{{PLURAL:$1|yew vurnayışo esterıte|$1 vurnayışê esterıtey}}',
@@ -319,7 +319,7 @@ $1',
 'nstab-main' => 'Pele',
 'nstab-user' => 'Pela Karberi',
 'nstab-media' => 'Pela Medya',
-'nstab-special' => 'Pela xase',
+'nstab-special' => 'Pela xısusi',
 'nstab-project' => 'Pela Procey',
 'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Mesac',
@@ -396,12 +396,12 @@ Perse: $2',
 'protectedpagetext' => 'No pel qey nêvuriyayiş hao (nao) pawyeno.',
 'viewsourcetext' => 'To şikinay çımey na pele bıvêne u kopya kerê:',
 'protectedinterface' => 'No pel qey software nuştey hezır keno u ın semed ra şuxulyayişê no pel qedexe biyo.',
-'editinginterface' => "'''DİQET:''' Şıma pelê software vurneni.[//translatewiki.net/wiki/Main_Page?setlang=tr translatewiki.net] bıxebıtne, proceyê MediaWiki bigere diqet.",
+'editinginterface' => "'''DİQET:''' Şıma pelê software vurneni.[//translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net] bıxebıtne, proceyê MediaWiki bigere diqet.",
 'sqlhidden' => '(SQL pers kerdışê nımıte)',
 'cascadeprotected' => 'No pel de vurnayiş qedexe biyo, çunke şıma tuşa "kademeyın" aqtif kerdo u no {{PLURAL:$1|pelo|pelo}} pawıteyo de xebıtyeno:
 $2',
 'namespaceprotected' => "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
-'ns-specialprotected' => 'Pelê mêniye nênê vurnayış.',
+'ns-specialprotected' => 'Peley xısusi nênê vurnayış.',
 'titleprotected' => 'Eno [[User:$1|$1]] zerreyê ena peli nişeno vuriye.
 Sebeb: "\'\'$2\'\'".',
 
@@ -646,7 +646,9 @@ Kerem ke, tı ke wazenay na pele bafernê/bıvurnê, qontrol ke.',
 'userpage-userdoesnotexist-view' => 'Hesabê karberi "$1" qeyd nêbiyo.',
 'blocked-notice-logextract' => 'No karber/na karbere emanet blokekerdeyo/blokekediya.
 Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
-'clearyourcache' => "'''Not:''' Bahde sazkerdışi, gani hafızayê cı gerayoğ pak bıbo: '''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi ''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');, '''IE:''' ''Ctrl-F5'', '''Konqueror:''' tena tuşê pelaya newi ra bar kere cı sernê.",
+'clearyourcache' => "'''Not:''' Bahde sazkerdışi, gani hafızayê cı gerayoğ pak bıbo.
+*'''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi ''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');,
+*'''IE:''' ''Ctrl-F5'', '''Konqueror:''' tena tuşê pelaya newi ra bar kere cı sernê.",
 'usercssyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
 'userjsyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
 'usercsspreview' => "'''şıma tena verqaydê dosyayê CSS vineni.''' '''Dosyayê Karberi CSS hema qayd nebiyo!'''",
@@ -1103,7 +1105,7 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena.',
 'prefs-help-email-required' => 'E-mail adrese mecburiya.',
 'prefs-info' => 'Enformasyonê temelî',
-'prefs-i18n' => 'Beynelbinel kerdişî',
+'prefs-i18n' => 'Şaryayış kerdış',
 'prefs-signature' => 'İmza',
 'prefs-dateformat' => 'Formatê tarixi',
 'prefs-timeoffset' => 'Wext offset',
@@ -2084,7 +2086,7 @@ $1',
 'blanknamespace' => '(Ser)',
 
 # Contributions
-'contributions' => 'İştiraqê karberi',
+'contributions' => 'İştirakê karberi',
 'contributions-title' => '$1 de iştırakê karberi',
 'mycontris' => 'İştırakê mı',
 'contribsub2' => 'Semedê $1 ($2)',
@@ -2381,7 +2383,7 @@ ma vaci: qey pelê "[[{{MediaWiki:Mainpage}}]]i " [[{{#Special:Export}}/{{MediaW
 'export-pagelinks' => 'behsê xorıniya pelê pêrabesteyani:',
 
 # Namespace 8 related
-'allmessages' => 'Mesajanê sistemi',
+'allmessages' => 'Mesacê sistemi',
 'allmessagesname' => 'Name',
 'allmessagesdefault' => 'nuşteyo orjinal',
 'allmessagescurrent' => 'nuşte yo ke şuxuliyeno',
@@ -2649,11 +2651,11 @@ Yew rêze de gırêyo sıfteyın gani gırêyo de dosya xırabıne bo.
 Na rêze de her gırêyo bin zey istisna vêniyeno, yanê pelê ke dosya beno ke sero rêzbiyaye asena.',
 
 # Metadata
-'metadata' => 'Metadata',
+'metadata' => 'Melumato serên',
 'metadata-help' => 'Ena dosya dı zafyer informasyoni esto. Belki ena dosya yew kamareyo dijital ya zi skaner ra vıraziyo.
 Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.',
-'metadata-expand' => 'Extended detayan bımoc',
-'metadata-collapse' => 'extended details bınım',
+'metadata-expand' => 'Detayan bımocne',
+'metadata-collapse' => 'melumati bınımne',
 'metadata-fields' => 'Resımê meydanê metadataê ke na pele de benê lista, pela resımmocnaene de ke tabloê metadata gına waro, gureniyenê.
 Ê bini zey sayekerdoğan nımiyenê.
 * make
@@ -3129,7 +3131,7 @@ Ma rica keno konfirme bike ke ti raştî wazeno eno pel bivirazo.",
 'confirm-unwatch-top' => 'Ena pele lista xoya seyirkerdışi ra bıvece?',
 
 # Multipage image navigation
-'imgmultipageprev' => 'peleyê verin',
+'imgmultipageprev' => '← peleyê verin',
 'imgmultipagenext' => 'pelo serîn →',
 'imgmultigo' => 'Şı!',
 'imgmultigoto' => 'Şi pel $1',
@@ -3244,7 +3246,7 @@ Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqed
 'fileduplicatesearch-noresults' => 'Ebe namey "$1" ra dosya nêdiyayê.',
 
 # Special:SpecialPages
-'specialpages' => 'Pelê mêniye',
+'specialpages' => 'Peley xısusi',
 'specialpages-note' => '----
 * Xısusi pelaya normal
 * <span class="mw-specialpagerestricted">Xısusi peleyê keı rê ray nê deyaya.</span>
@@ -3320,8 +3322,8 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'htmlform-selectorother-other' => 'Bin',
 
 # New logging system
-'logentry-delete-delete' => "$1'i Pelaya $3'i besternê",
-'logentry-delete-restore' => "$1'i pelaya $3'i peyd grot",
+'logentry-delete-delete' => "Karber $1' pelay $3' besternê",
+'logentry-delete-restore' => "Karber $1' pelay $3' peyser grot",
 'logentry-suppress-delete' => '$1  $3 rê pıloxneyê',
 'revdelete-content-hid' => 'nusno nımte',
 'revdelete-summary-hid' => 'Vurnayışi nımtey niyê',
@@ -3331,7 +3333,7 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'revdelete-uname-unhid' => 'Namey karberi ne nımteyo',
 'revdelete-restricted' => 'verger (vergırewtış) ê ke qey xızmkaran biye',
 'revdelete-unrestricted' => 'verger (ver gırewtış) ê ke qey xızmkaran diyê wera (wedariyê)',
-'logentry-move-move' => "$1'i pelaya $3'i berd $4",
+'logentry-move-move' => "Karber $1' pelay $3' berd $4",
 'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u berd $4",
 'logentry-newusers-newusers' => '$1 deye namey karberi vıraziya',
 'logentry-newusers-create' => '$1 deye namey karberi vıraziya',
@@ -3359,4 +3361,14 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'api-error-unknown-warning' => "$1'dı ikazo xırab:",
 'api-error-unknownerror' => "$1'dı jew xeta vıciye",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|saniye|saniyeyan}}',
+'duration-minutes' => '$1 {{PLURAL:$1|dakika|dakikayan}} vernî de',
+'duration-hours' => '($1 {{PLURAL:$1|seet|seetan}})',
+'duration-days' => '($1 {{PLURAL:$1|roc|rocan}})',
+'duration-weeks' => '$1 {{PLURAL: $1|hefte|heftey}}',
+'duration-years' => '$1 {{PLURAL:$1|serre|serran}} vernî de',
+'duration-centuries' => '$1 {{PLURAL:$1|seserre|seserri}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenyum|milenyumi}}',
+
 );
index b9e10e6..547036c 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Dbc334
  * @author Derbeth
  * @author Dunak
  * @author Dundak
@@ -895,6 +896,10 @@ Njesmějo daś wěcej nježli $2 {{PLURAL:$2|wołanja|wołanjowu|wołanjow|woła
 'parser-template-loop-warning' => 'Pśedłogowa šlejfa namakana: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limit rekursijneje dłymi pśedłogi pśekšocony ($1)',
 'language-converter-depth-warning' => 'Limit dłymokosći rěcnego konwertera pśekšocony ($1)',
+'node-count-exceeded-category' => 'Boki, źož licba sukow jo pśekšocona',
+'node-count-exceeded-warning' => 'Bok jo licbu sukow pśekšocył',
+'expansion-depth-exceeded-category' => 'Boki, źož ekspansiska dłymokosć jo pśekšocona',
+'expansion-depth-exceeded-warning' => 'Bok jo ekspansisku dłymokosć pśekšocył',
 
 # "Undo" feature
 'undo-success' => 'Wobźěłanje móžo se wótpóraś. Pšosym pśeglěduj dołojcne pśirownowanje aby se wěsty był, až to wót wěrnosći coš, a pón składuj změny, aby se wobźěłanje doskóńcnje wótpórało.',
@@ -1163,7 +1168,7 @@ Zaruc, až historija wersijow nastawka jo njepśetergnjona.',
 'prefs-skin' => 'Šat',
 'skin-preview' => 'Pśeglěd',
 'datedefault' => 'Standard',
-'prefs-beta' => 'Betafunkcije',
+'prefs-beta' => 'Preizkusne funkcije',
 'prefs-datetime' => 'Datum a cas',
 'prefs-labs' => 'Laborowe funkcije',
 'prefs-personal' => 'Wužywarski profil',
@@ -1705,7 +1710,7 @@ Za optimalnu wěstotu img_auth.php jo znjemóžnjony.',
 'upload-curl-error28-text' => 'Bok pśedłujko njejo wótegronił. Kontrolěruj, lic jo bok online, pócakaj wokognuśe a wopytaj pón hyšći raz. Móžo byś zmysłapołne, w drugem casu hyšći raz proběrowaś.',
 
 'license' => 'Licenca:',
-'license-header' => 'Licencowanje',
+'license-header' => 'Licencěrowanje',
 'nolicense' => 'Nic njejo wuzwólone.',
 'license-nopreview' => '(Pśeglěd njejo móžny.)',
 'upload_source_url' => ' (płaśeca, zjawnje pśistupna URL)',
@@ -3035,7 +3040,7 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
 'exif-gpsdestdistance' => 'Distanca k celowemu městnu',
 'exif-gpsprocessingmethod' => 'Mě metody pśeźěłanja GPS',
 'exif-gpsareainformation' => 'Mě wobcerka GPS',
-'exif-gpsdatestamp' => 'Datum GPS',
+'exif-gpsdatestamp' => 'GPS-datum',
 'exif-gpsdifferential' => 'Diferencialna korektura GPS',
 'exif-jpegfilecomment' => 'Komentar JPEG-dataje',
 'exif-keywords' => 'Klucowe słowa',
index 86c5252..9c1a376 100644 (file)
@@ -28,6 +28,7 @@
  * @author MF-Warburg
  * @author Malafaya
  * @author Omnipaedista
+ * @author Protnet
  * @author Reedy
  * @author Remember the dot
  * @author Sinopeus
@@ -385,8 +386,8 @@ $messages = array(
 'tog-showjumplinks' => 'Ενεργοποίησε τους συνδέσμους προσβασιμότητας του τύπου "μετάβαση σε"',
 'tog-uselivepreview' => 'Χρησιμοποίησε άμεση προεπισκόπηση (JavaScript) (Πειραματικό)',
 'tog-forceeditsummary' => 'Ειδοποίησέ με όταν εισάγω μια κενή σύνοψη επεξεργασίας',
-'tog-watchlisthideown' => 'Απόκρυψε τις επεξεργασίες μου απο τη λίστα παρακολούθησης',
-'tog-watchlisthidebots' => 'Απόκρυψε τις επεξεργασίες των bots από τη λίστα παρακολούθησης',
+'tog-watchlisthideown' => 'Απόκρυψε τις επεξεργασίες μου από τη λίστα παρακολούθησης',
+'tog-watchlisthidebots' => 'Απόκρυψε τις επεξεργασίες των bot από τη λίστα παρακολούθησης',
 'tog-watchlisthideminor' => 'Απόκρυψε τις μικρής σημασίας επεξεργασίες από τη λίστα παρακολούθησης',
 'tog-watchlisthideliu' => 'Απόκρυψη επεξεργασιών συνδεδεμένων χρηστών από τη λίστα παρακολούθησης',
 'tog-watchlisthideanons' => 'Απόκρυψη επεξεργασιών ανωνύμων χρηστών από τη λίστα παρακολούθησης',
@@ -732,6 +733,9 @@ $2',
 'ns-specialprotected' => 'Σελίδες στον τομέα {{ns:special}} δεν γίνεται να επεξεργαστούν.',
 'titleprotected' => "Αυτός ο τίτλος έχει προστατευθεί από την δημιουργία από τον [[User:$1|$1]].
 Ο λόγος που δίνεται είναι ''$2''.",
+'filereadonlyerror' => 'Δεν είναι δυνατή η τροποποίηση του αρχείου " $1 " επειδή το αποθετήριο αρχείων " $2 " είναι σε κατάσταση λειτουργίας μόνο για ανάγνωση.
+
+Ο διαχειριστής που το κλείδωσε προσφέρει αυτή την αιτιολόγηση: " $3 ".',
 
 # Virus scanner
 'virus-badscanner' => "Λάθος ρύθμιση: άγνωστος ανιχνευτής ιών: ''$1''",
@@ -816,6 +820,7 @@ $2',
 'emailconfirmlink' => 'Επαληθεύστε την ηλεκτρονική σας διεύθυνση',
 'invalidemailaddress' => 'Η ηλεκτρονική διεύθυνση δεν μπορεί να γίνει δεκτή γιατί ενδεχομένως δεν έχει έγκυρη μορφή. Παρακαλούμε συμπληρώστε μια σωστά διαμορφωμένη διεύθυνση ή αφήστε το πεδίο κενό.',
 'cannotchangeemail' => "Οι διευθύνσεις ηλεκτρονικού ταχυδρομείου του λογαριασμού δεν μπορούν να αλλάξουν σ' αυτό το wiki.",
+'emaildisabled' => 'Αυτός ο ιστότοπος  δεν μπορεί να στείλει μηνύματα ηλεκτρονικού ταχυδρομείου.',
 'accountcreated' => 'Ο λογαριασμός δημιουργήθηκε',
 'accountcreatedtext' => 'Ο λογαριασμός χρήστη για τον/την $1 έχει δημιουργηθεί.',
 'createaccount-title' => 'Δημιουργία λογαριασμού για {{SITENAME}}',
@@ -1000,7 +1005,9 @@ $2
 'userinvalidcssjstitle' => "'''Προσοχή:''' Δεν υπάρχει skin με τίτλο \"\$1\". Θυμηθείτε οι προσαρμοσμένες σελίδες .css και .js χρησιμοποιούν έναν τίτλο με μικρά γράμματα, π.χ. {{ns:user}}:Foo/vector.css σε αντίθεση με το {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Ενημερώθηκε)',
 'note' => "'''Προσοχή: '''",
-'previewnote' => "'''Σας υπενθυμίζουμε ότι βλέπετε μόνον την προεπισκόπηση -δεν έχετε ακόμα αποθηκεύσει τις αλλαγές σας!'''",
+'previewnote' => "'''Να θυμάστε ότι αυτή είναι μόνο μια προεπισκόπηση.'''
+Οι αλλαγές σας δεν έχουν ακόμη αποθηκευτεί!",
+'continue-editing' => 'Συνέχεια επεξεργασίας',
 'previewconflict' => 'Αυτή η προεπισκόπηση απεικονίζει το κείμενο στην επάνω περιοχή επεξεργασίας κειμένου, όπως θα εμφανιστεί εάν επιλέξετε να το αποθηκεύσετε.',
 'session_fail_preview' => "'''Συγγνώμη! Δεν μπορούσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.
 Παρακαλώ προσπαθήστε ξανά. Αν δεν δουλεύει ξανά, δοκιμάστε να αποσυνδεθείτε και να συνδεθείτε πάλι.'''",
@@ -1013,6 +1020,7 @@ $2
 Αυτό μερικές φορές συμβαίνει όταν χρησιμοποιείται ένας ανώνυμος διακομιστής μεσολάβησης διαθέσιμος μέσω του παγκόσμιου ιστού με σφάλματα.'''",
 'edit_form_incomplete' => "'''Ορισμένα τμήματα της φόρμας επεξεργασίας δεν έφθασαν στο διακομιστή. Ελέγξτε ότι οι αλλαγές σας είναι άθικτες και προσπαθήστε ξανά.'''",
 'editing' => 'Επεξεργασία $1',
+'creating' => 'Δημιουργία: $1',
 'editingsection' => 'Επεξεργασία $1 (τμήμα)',
 'editingcomment' => 'Επεξεργασία $1 (νέο τμήμα)',
 'editconflict' => 'Σύγκρουση επεξεργασίας: $1',
@@ -1078,6 +1086,7 @@ $2
 'edit-no-change' => 'Η επεξεργασία σας αγνοήθηκε, επειδή δεν έγινε καμία αλλαγή στο κείμενο.',
 'edit-already-exists' => 'Δεν ήταν εφικτό να δημιουργηθεί η νέα σελίδα.
 Υπάρχει ήδη.',
+'defaultmessagetext' => 'Προεπιλεγμένο κείμενο μηνύματος',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Προειδοποίηση: Αυτή η σελίδα περιέχει πάρα πολύ ακριβό αναλυτή λειτουργικών κλήσεων.
@@ -1234,7 +1243,7 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Κατάλογος διαγραφών',
-'suppressionlogtext' => 'Παρακάτω βρίσκεται μία λίστα με τις διαγραφές και τις φραγές σχετικές με περιεχόμενο που έχει κρυφθεί από τους διαχειριστές.
+'suppressionlogtext' => 'Παρακάτω βρίσκεται μία λίστα με τις διαγραφές και τις φραγές σχετικό  με περιεχόμενο που έχει αποκρυβεί από τους διαχειριστές.
 Δείτε την [[Special:BlockList|λίστα φραγών IP]] για τις τρέχουσες λειτουργικές απαγορεύσεις και φραγές.',
 
 # History merging
@@ -1653,6 +1662,7 @@ $1",
 'newsectionsummary' => '/* $1 */ νέα ενότητα',
 'rc-enhanced-expand' => 'Εμφάνιση λεπτομερειών (απαιτείται JavaScript)',
 'rc-enhanced-hide' => 'Απόκρυψη λεπτομερειών',
+'rc-old-title' => 'αρχικά δημιουργήθηκε ως " $1 "',
 
 # Recent changes linked
 'recentchangeslinked' => 'Σχετικές αλλαγές',
@@ -1807,6 +1817,7 @@ $1',
 'upload-too-many-redirects' => 'Το URL περιείχε πάρα πολλές ανακατευθύνσεις',
 'upload-unknown-size' => 'Άγνωστο μέγεθος',
 'upload-http-error' => 'Εμφανίστηκε κάποιο σφάλμα HTTP: $1',
+'upload-copy-upload-invalid-domain' => 'Δεν υπάρχουν διαθέσιμα ανεβάσματα αντιγράφων από αυτό τον τομέα.',
 
 # File backend
 'backend-fail-stream' => 'Αδύνατη η μετάδοση του αρχείου $1.',
@@ -1934,6 +1945,10 @@ $1',
 Παρακαλούμε δείτε τη [$2 σελίδα περιγραφής του αρχείου] για περισσότερες πληροφορίες.',
 'sharedupload-desc-here' => 'Το αρχείο είναι από το $1 και ενδέχεται να χρησιμοποιείται από άλλα εγχειρήματα.
 Η περιγραφή στη [$2 σελίδα περιγραφής αρχείου] εμφανίζεται παρακάτω.',
+'sharedupload-desc-edit' => 'Αυτό το αρχείο είναι από  $1  και μπορεί να χρησιμοποιείται από άλλα εγχειρήματα.
+Ίσως θέλετε να επεξεργαστείτε την περιγραφή του στην   [$2  σελίδα περιγραφής αρχείου] εκεί.',
+'sharedupload-desc-create' => 'Αυτό το αρχείο είναι από $1 και μπορεί να χρησιμοποιείται από άλλα εγχειρήματα.
+Ίσως θέλετε να επεξεργαστείτε την περιγραφή του στην [$2 σελίδα περιγραφής αρχείου] εκεί.',
 'filepage-nofile' => 'Κανένα αρχείο με αυτό το όνομα δεν υπάρχει',
 'filepage-nofile-link' => 'Δεν υπάρχει τέτοιο αρχείο, αλλἀ μπορείτε να [$1 το επιφορτώσετε].',
 'uploadnewversion-linktext' => 'Φορτώστε μια νέα έκδοση αυτού του αρχείου',
@@ -2065,6 +2080,7 @@ $1',
 'wantedpages-badtitle' => 'Μη εγκυρός τίτλος στο σύνολο αποτελέσματος: $1',
 'wantedfiles' => 'Επιθυμητά αρχεία',
 'wantedfiletext-cat' => 'Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Αρχεία από εξωτερικά αποθετήρια ενδέχεται να παρατίθενται παρότι υπάρχουν. Κάθε τέτοιες λανθασμένες αναφορές θα <del>διαγραμμίζονται</del>. Επιπλέον, σελίδες που ενσωματώνουν αρχεία που δεν υπάρχουν παρατίθενται στο [[:$1]].',
+'wantedfiletext-nocat' => 'Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Πέρα από τα υπάρχοντα ενδέχεται να έχουν καταχωριστεί και αρχεία από εξωτερικές πηγές λογισμικού. Τέτοιες ψευδο-υπαρκτές καταχωρίσεις θα εμφανίζονται <del>διαγραμμισμένες</del>.',
 'wantedtemplates' => 'Επιθυμητά πρότυπα',
 'mostlinked' => 'Οι σελίδες με τις περισσότερες αναφορές',
 'mostlinkedcategories' => 'Περισσότερο χρησιμοποιούμενες κατηγορίες',
@@ -2073,6 +2089,7 @@ $1',
 'mostimages' => 'Περισσότερο χρησιμοποιούμενα αρχεία',
 'mostrevisions' => 'Άρθρα με τις περισσότερες αναθεωρήσεις',
 'prefixindex' => 'Όλες οι σελίδες με πρόθεμα',
+'prefixindex-namespace' => 'Όλες οι σελίδες με πρόθεμα (περιοχής  $1)',
 'shortpages' => 'Σύντομες σελίδες',
 'longpages' => 'Εκτενείς σελίδες',
 'deadendpages' => 'Αδιέξοδες σελίδες',
@@ -2110,6 +2127,7 @@ $1',
 # Book sources
 'booksources' => 'Πηγές βιβλίων',
 'booksources-search-legend' => 'Αναζήτηση για πηγές βιβλίων',
+'booksources-isbn' => 'ISBN:',
 'booksources-go' => 'Πήγαινε',
 'booksources-text' => 'Παρακάτω είναι μια λίστα συνδέσμων σε άλλους ιστοτόπους οι οποίοι πωλούν νέα και μεταχειρισμένα βιβλία, και μπορεί επίσης να έχουν περισσότερες πληροφορίες για βιβλία για τα οποία ψάχνετε:',
 'booksources-invalid-isbn' => 'Το δοσμένο ISBN δεν φαίνεται να είναι έγκυρο· ελέγξτε για λάθη κατά την αντιγραφή από την αρχική πηγή.',
@@ -2139,6 +2157,12 @@ $1',
 'allpagesprefix' => 'Προβολή των σελίδων με πρόθεμα:',
 'allpagesbadtitle' => 'Ο δοσμένος τίτλος σελίδας ήταν άκυρος ή είχε ένα διαγλωσσικό ή δια-wiki πρόθεμα. Μπορεί να περιέχει έναν ή περισσότερους χαρακτήρες οι οποίοι δεν μπορούν να χρησιμοποιοθούν σε τίτλους.',
 'allpages-bad-ns' => 'Το {{SITENAME}} δεν έχει τον τομέα "$1".',
+'allpages-hide-redirects' => 'Απόκρυψη ανακατευθύνσεων',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Βλέπετε μια προσωρινά αποθηκευμένη έκδοση αυτής της σελίδας, που μπορεί να είναι μέχρι και $1 παλιά.',
+'cachedspecial-viewing-cached-ts' => 'Βλέπετε μια προσωρινά αποθηκευμένη έκδοση αυτής της σελίδας, που μπορεί να μην είναι εντελώς πραγματική.',
+'cachedspecial-refresh-now' => 'Προβολή τελευταίας.',
 
 # Special:Categories
 'categories' => 'Κατηγορίες',
@@ -2159,7 +2183,9 @@ $1',
 'linksearch-pat' => 'Μοτίβο αναζήτησης:',
 'linksearch-ns' => 'Περιοχή:',
 'linksearch-ok' => 'Αναζήτηση',
-'linksearch-text' => '',
+'linksearch-text' => 'Χαρακτήρες όπως "*.wikipedia.org" μπορούν να χρησιμοποιηθούν. 
+Χρειάζεται τουλάχιστον ένα domain ανώτατου επιπέδου, για παράδειγμα "*.org".<br />
+Υποστηριζόμενα πρωτόκολλα: <tt> $1 </tt> (μην προσθέτετε οποιαδήποτε από αυτές στην αναζήτησή σας).',
 'linksearch-line' => 'Η $1 συνδεδεμένη από την $2',
 'linksearch-error' => 'Λέξεις-μπαλαντέρ μπορεί να εμφανιστούν μόνο στην αρχή τού ονόματος ιστοτόπου (hostname).',
 
@@ -2380,6 +2406,7 @@ $UNWATCHURL
 'protect-title-notallowed' => 'Εμφάνιση επιπέδου προστασίας για την "$1"',
 'prot_1movedto2' => 'Η [[$1]] μετακινήθηκε στη θέση [[$2]]',
 'protect-badnamespace-title' => 'Μη-προστατευόμενη ομάδα σελίδων',
+'protect-badnamespace-text' => 'Οι  σελίδες σε αυτόν τον ονοματοχώρο δεν μπορούν να κλειδωθούν.',
 'protect-legend' => 'Επιβεβαίωση κλειδώματος',
 'protectcomment' => 'Αιτία:',
 'protectexpiry' => 'Λήξη',
@@ -2577,8 +2604,8 @@ $1',
 'ipb-confirm' => 'Επιβεβαίωση φραγής',
 'badipaddress' => 'Άκυρη διεύθυνση IP.',
 'blockipsuccesssub' => 'Η φραγή ολοκληρώθηκε επιτυχώς.',
-'blockipsuccesstext' => 'Η διεύθυνση [[Special:Contributions/$1|$1]] έχει υποστεί φραγή.<br />
\94είÏ\84ε Ï\84η [[Special:BlockList|λίÏ\83Ï\84α Î´Î¹ÎµÏ\85θÏ\8dνÏ\83εÏ\89ν IP Ï\80οÏ\85 Î­Ï\87οÏ\85ν Ï\85Ï\80οÏ\83Ï\84εί Ï\86Ï\81αγή]] Î³Î¹Î± Î½Î± Ï\84ο ÎµÏ\80ιβεβαιÏ\8eÏ\83εÏ\84ε.',
+'blockipsuccesstext' => '{{GENDER:$1|Ο|Η}} [[Special:Contributions/$1|$1]] έχει υποστεί φραγή.<br />
\94είÏ\84ε Ï\84ον [[Special:BlockList|καÏ\84άλογο Ï\86Ï\81αγÏ\8eν]] Î³Î¹Î± Î½Î± ÎµÏ\80οÏ\80Ï\84εÏ\8dÏ\83εÏ\84ε Ï\84ιÏ\82 Ï\86Ï\81αγέÏ\82.',
 'ipb-blockingself' => 'Είστε έτοιμος να επιβάλετε φραγή στον ευατό σας! Είστε σίγουροι ότι θέλετε να το κάνετε αυτό;',
 'ipb-confirmhideuser' => 'Είστε {{GENDER:|έτοιμος|έτοιμη}} να μπλοκάρετε ένα χρήστη με ενεργοποιημένη την "απόκρυψη χρήστη" . Αυτό θα καταστείλει το όνομα του χρήστη σε όλες τις λίστες και τις καταχωρήσεις ημερολογίου. Είστε {{GENDER:|σίγουρος|σίγουρη}} ότι θέλετε να το κάνετε αυτό;',
 'ipb-edit-dropdown' => 'Επεξεργασία λόγων φραγής',
@@ -2631,8 +2658,8 @@ $1',
 'blocklogentry' => 'O/H [[$1]] φράχθηκε με χρόνο λήξης $2 $3',
 'reblock-logentry' => 'άλλαξε τις ρυθμίσεις φραγής για τον/την [[$1]] με χρόνο λήξης $2 $3',
 'blocklogtext' => 'Αυτό είναι ένα αρχείο καταγραφής των ενεργειών φραγής και κατάργησης φραγής χρηστών.
-Δεν συμπεριλαμβάνονται οι διευθύνσεις IP που υπέστησαν αυτόματα φραγή.
-Δείτε τον [[Special:BlockList|κατάλογο φραγμένων διευθύνσεων IP]] για τη λίστα των τρεχόντων ενεργών αποκλεισμών και φραγών.',
+Δεν συμπεριλαμβάνονται οι διευθύνσεις IP που υπέστησαν φραγή αυτόματα.
+Δείτε τον [[Special:BlockList|κατάλογο φραγών]] για τη λίστα των τρεχόντων ενεργών αποκλεισμών και φραγών.',
 'unblocklogentry' => 'Άρση φραγής του "$1"',
 'block-log-flags-anononly' => 'μόνο ανώνυμοι χρήστες',
 'block-log-flags-nocreate' => 'δημιουργία λογαριασμού απενεργοποιημένη',
@@ -2879,7 +2906,15 @@ $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} από $2',
 
 # JavaScriptTest
+'javascripttest' => 'Δοκιμή JavaScript',
 'javascripttest-disabled' => 'Αυτή η λειτουργία έχει απενεργοποιηθεί.',
+'javascripttest-title' => 'Εκτελούνται  $1  δοκιμές',
+'javascripttest-pagetext-noframework' => 'Αυτή η σελίδα είναι δεσμευμένη για την εκτέλεση δοκιμών σε JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Άγνωστο πλαίσιο δοκιμών " $1 ".',
+'javascripttest-pagetext-frameworks' => 'Παρακαλώ επιλέξτε ένα από τα ακόλουθα πλαίσια δοκιμών: $1',
+'javascripttest-pagetext-skins' => 'Επιλέξτε ένα skin για να εκτελέσετε δοκιμές με αυτό:',
+'javascripttest-qunit-intro' => 'Ανατρέξτε στην ενότητα [ $1 τεκμηρίωση δοκιμών] στο mediawiki.org.',
+'javascripttest-qunit-heading' => 'Σουίτα δοκιμών JavaScript QUnit του MediaWiki',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Η σελίδα χρήστη σας',
@@ -2941,6 +2976,7 @@ $1',
 'tooltip-diff' => 'Προβολή των αλλαγών που κάνατε στο κείμενο.',
 'tooltip-compareselectedversions' => 'Εμφάνιση των διαφορών ανάμεσα στις δύο αναθεωρήσεις της σελίδας που έχετε επιλέξει.',
 'tooltip-watch' => 'Προσθήκη της σελίδας στη λίστα παρακολούθησης',
+'tooltip-watchlistedit-normal-submit' => 'Μετακίνηση τίτλων',
 'tooltip-watchlistedit-raw-submit' => 'Ενημέρωση λίστας παρακολούθησης',
 'tooltip-recreate' => 'Ξαναδημιούργησε τη σελίδα παρόλο που έχει διαγραφεί',
 'tooltip-upload' => 'Έναρξη φόρτωσης',
@@ -3661,6 +3697,9 @@ $5
 'watchlisttools-edit' => 'Δείτε και επεξεργαστείτε τη λίστα παρακολούθησης',
 'watchlisttools-raw' => 'Επεξεργαστείτε την πρωτογενή λίστα παρακολούθησης',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|συζήτηση]])',
+
 # Core parser functions
 'unknown_extension_tag' => 'Άγνωστη ετικέτα επέκτασης "$1"',
 'duplicate-defaultsort' => 'Προσοχή: Το προκαθορισμένο κλειδί ταξινόμησης "$2" υπερκαλύπτει το προηγούμενο "$1".',
@@ -3683,16 +3722,17 @@ $5
 'version-hook-subscribedby' => 'Υπογεγραμμένο από',
 'version-version' => '(Έκδοση $1)',
 'version-license' => 'Άδεια χρήσης',
-'version-poweredby-credits' => "Αυτό το βίκι τροφοδοτείται από '''[//www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
+'version-poweredby-credits' => "Αυτό το βίκι λειτουργεί χάρις στο '''[//www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
 'version-poweredby-others' => 'άλλοι',
-'version-license-info' => "To Το MediaWiki είναι ελεύθερο λογισμικό. Μπορείτε να το αναδιανέμετε ή / και να το τροποποιήσετε υπό τους όρους της GNU General Public License όπως αυτή εκδόθηκε από το Free Software Foundation.Είτε η δεύτερη έκδοση της άδειας, είτε (κατ' επιλογή σας) οποιδήποτε επόμενη έκδοση.
-Το MediaWiki διανέμεται με την ελπίδα ότι θα είναι χρήσιμο, αλλά ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ.Ούτε καν την σιωπηρή εγγύση της  ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή της ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΕΝΑ PARTICULAR ΣΚΟΠΟ.Όπως δείτε την GNU General Public License για περισσότερες λεπτομέρειες.
+'version-license-info' => "Το MediaWiki είναι ελεύθερο λογισμικό. Μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό τους όρους της άδειας GNU General Public License όπως αυτή εκδόθηκε από το Free Software Foundation· είτε της δεύτερης έκδοσης της άδειας, είτε (κατ' επιλογή σας) οποιασδήποτε επόμενης έκδοσης.
 
- Θα πρέπει να έχετε λάβει [((SERVER)) ((SCRIPTPATH)) / COPYING ένα αντίγραφο της GNU General Public License] μαζί με αυτό το πρόγραμμα.Αν όχι, γράψτε προς το Free Software Foundation, Inc, 51 Franklin Street, πέμπτο όροφο , Boston, MA 02110-1301, USA ή [//www.gnu.org/licenses/old-licenses/gpl-2.0.html διαβάστε το online].",
+Το MediaWiki διανέμεται με την ελπίδα ότι θα είναι χρήσιμο, αλλά ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ· ούτε καν την σιωπηρή εγγύηση ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΕΝΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ. Βλ. GNU General Public License για περισσότερες λεπτομέρειες.
+
+Θα πρέπει να έχετε λάβει [{{SERVER}}{{SCRIPTPATH}}/COPYING ένα αντίγραφο της GNU General Public License] μαζί με αυτό το πρόγραμμα· αν όχι, στείλτε ένα γράμμα στο Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ή [//www.gnu.org/licenses/old-licenses/gpl-2.0.html διαβάστε το διαδικτυακά].",
 'version-software' => 'Εγκατεστημένο λογισμικό',
 'version-software-product' => 'Προϊόν',
 'version-software-version' => 'Έκδοση',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Διαδρομή αρχείου',
@@ -3797,16 +3837,30 @@ $5
 # New logging system
 'logentry-delete-delete' => 'Ο/η $1 διέγραψε τη σελίδα $3',
 'logentry-delete-restore' => 'Ο/η $1 αποκατέστησε τη σελίδα $3',
+'logentry-delete-event' => '$1 άλλαξε την ορατότητα σε  {{PLURAL:$5|ένα γεγονός καταγραφής|$5 log events}} στο  $3: $4',
 'revdelete-content-hid' => 'το περιεχόμενο αποκρύφθηκε',
 'revdelete-summary-hid' => 'Η σύνοψη επεξεργασίας αποκρύφθηκε',
 'revdelete-uname-hid' => 'Το όνομα χρήστη αποκρύφθηκε',
+'revdelete-content-unhid' => 'το περιεχόμενο έπαψε να είναι κρυφό',
+'revdelete-summary-unhid' => 'η σύνοψη επεξεργασίας έπαψε να είναι κρυφή',
+'revdelete-uname-unhid' => 'το όνομα χρήστη έπαψε να είναι κρυφό',
 'revdelete-restricted' => 'εφάρμοσε περιορισμούς στους sysops',
 'revdelete-unrestricted' => 'αφαίρεσε περιορισμούς στους sysops',
-'logentry-newusers-create' => '$1 δημιούργησε έναν λογαριασμό χρήστη',
+'logentry-move-move' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4',
+'logentry-move-move-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 χωρίς να αφήσει ανακατεύθυνση',
+'logentry-move-move_redir' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 πάνω από την ανανακατεύθυνση',
+'logentry-move-move_redir-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από ανακατεύθυνση χωρίς να αφήσει ανακατεύθυνση',
+'logentry-patrol-patrol' => '{{GENDER:$1|Ο|Η}} $1 σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
+'logentry-patrol-patrol-auto' => '{{GENDER:$1|Ο|Η}} $1 αυτόματα σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
+'logentry-newusers-newusers' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε έναν λογαριασμό χρήστη',
+'logentry-newusers-create' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε έναν λογαριασμό χρήστη',
+'logentry-newusers-create2' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε τον λογαριασμό χρήστη $3',
 'logentry-newusers-autocreate' => 'Ο λογαριασμός $1 δημιουργήθηκε αυτόματα',
 'newuserlog-byemail' => 'ο κωδικός έχει σταλεί μέσω ηλεκτρονικού μηνύματος',
 
 # Feedback
+'feedback-bugornote' => 'Εάν είστε έτοιμοι να περιγράψετε ένα τεχνικό πρόβλημα λεπτομερώς παρακαλώ [ $1  κάντε μια αναφορά σφάλματος].
+Διαφορετικά, μπορείτε να χρησιμοποιήσετε την παρακάτω απλή φόρμα. Το σχόλιό σας θα προστεθεί στη σελίδα "[ $3  $2 ]", μαζί με το όνομα χρήστη σας και ποιο πρόγραμμα περιήγησης χρησιμοποιείτε.',
 'feedback-subject' => 'Θέμα:',
 'feedback-message' => 'Μήνυμα:',
 'feedback-cancel' => 'Ακύρωση',
@@ -3817,6 +3871,8 @@ $5
 'feedback-error3' => 'Σφάλμα: Καμία απάντηση από το API',
 'feedback-thanks' => 'Ευχαριστούμε! Τα σχόλιά σας έχουν καταχωρηθεί στη σελίδα "[$2 $1]".',
 'feedback-close' => 'Ολοκληρώθηκε',
+'feedback-bugcheck' => 'Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [ $1  γνωστά σφάλματα].',
+'feedback-bugnew' => 'Έλεγξα. Αναφέρετε ένα νέο σφάλμα',
 
 # API errors
 'api-error-badaccess-groups' => 'Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.',
@@ -3856,4 +3912,15 @@ $5
 'api-error-uploaddisabled' => 'Η επιφόρτωση είναι απενεργοποιημένη σε αυτό το wiki.',
 'api-error-verification-error' => 'Αυτό το αρχείο μπορεί να είναι κατεστραμμένο, ή να έχει λανθασμένη επέκταση.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}}',
+'duration-minutes' => '$1 {{PLURAL:$1|λεπτό|λεπτά}}',
+'duration-hours' => '$1 {{PLURAL:$1|ώρα|ώρες}}',
+'duration-days' => '$1 {{PLURAL:$1|μέρα|μέρες}}',
+'duration-weeks' => '$1 {{PLURAL:$1|εβδομάδα|εβδομάδες}}',
+'duration-years' => '$1 {{PLURAL:$1|χρόνο|χρόνια}}',
+'duration-decades' => '$1 {{PLURAL:$1|δεκαετία|δεκαετίες}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Αιώνα|αιώνες}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Χιλιετία|Χιλιετίες}}',
+
 );
index bb08078..c3af5bf 100644 (file)
@@ -1039,6 +1039,8 @@ The reason given is "\'\'$2\'\'".',
 'filereadonlyerror'    => 'Unable to modify the file "$1" because the file repository "$2" is in read-only mode.
 
 The administrator who locked it offered this explanation: "$3".',
+'invalidtitle-knownnamespace'   => 'Invalid title with namespace "$2" and text "$3"',
+'invalidtitle-unknownnamespace' => 'Invalid title with unknown namespace number $1 and text "$2"',
 
 # Virus scanner
 'virus-badscanner'     => "Bad configuration: Unknown virus scanner: ''$1''",
@@ -2347,6 +2349,7 @@ For optimal security, img_auth.php is disabled.',
 'http-curl-error'       => 'Error fetching URL: $1',
 'http-host-unreachable' => 'Could not reach URL.',
 'http-bad-status'       => 'There was a problem during the HTTP request: $1 $2',
+'http-truncated-body'   => 'The request body was only partially received.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6'       => 'Could not reach URL',
index 8921eb2..60195a6 100644 (file)
@@ -534,9 +534,9 @@ $messages = array(
 'jumpto' => 'Iri al:',
 'jumptonavigation' => 'navigado',
 'jumptosearch' => 'serĉi',
-'view-pool-error' => 'Bedaŭrinde la serviloj estas tro uzata ĉi-momente.
+'view-pool-error' => 'Bedaŭrinde la serviloj estas tro uzataj ĉi-momente.
 Tro da uzantoj provas vidi ĉi tiun paĝon.
-Bonvolu atendi iom antaŭ vi provas atingi ĝin denove.
+Bonvolu atendi iom antaŭ provi atingi ĝin denove.
 
 $1',
 'pool-timeout' => 'Tempolimo atingis atendante ŝlosadon',
@@ -989,7 +989,8 @@ La lasta protokolero estas jene montrata por via referenco:',
 Rememoru ke individuaj .css-aj kaj .js-aj paĝoj uzas minusklan titolon, ekz. {{ns:user}}:Foo/vector.css kontraŭe al {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Ŝanĝo registrita)',
 'note' => "'''Noto:'''",
-'previewnote' => "'''Memoru, ke ĉi tio estas nur antaŭrigardo kaj ankoraŭ ne konservita!'''",
+'previewnote' => "'''Memoru, ke ĉi tio estas nur antaŭrigardo.''' 
+Viaj ŝanĝoj ne ankoraŭ estas konservitaj!",
 'previewconflict' => 'La jena antaŭrigardo montras la tekston el la supra tekstujo,
 kiel ĝi aperos se vi elektos konservi la paĝon.',
 'session_fail_preview' => "'''Ni ne povas procezi vian redakton pro perdo de seancaj datenoj.
@@ -1006,6 +1007,7 @@ La redakto estis malpermesita por preventi koruptado de la teksto de la paĝo.
 Ĉi tiel malofte okazas kiam vi uzas fuŝan TTT-an anoniman prokurilon.'''",
 'edit_form_incomplete' => "'''Kelkaj partoj de la redaktada formo ne atingis la servilon; rekontrolu ke via redakto estas ĝusta kaj reprovu.'''",
 'editing' => 'Redaktado de $1',
+'creating' => 'Kreado de $1',
 'editingsection' => 'Redaktante $1 (sekcion)',
 'editingcomment' => 'Redaktante $1 (nova sekcio)',
 'editconflict' => 'Redakta konflikto: $1',
index 9fceb11..a4bdfdc 100644 (file)
@@ -1121,6 +1121,10 @@ Ese o esos parámetros han sido omitidos.',
 'parser-template-loop-warning' => 'Detectado bucle de plantilla: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Se ha excedido el límite de recursión de plantillas ($1)',
 'language-converter-depth-warning' => 'El límite de profundidad del convertidor de idioma ha excedido ($1)',
+'node-count-exceeded-category' => 'Páginas donde se supera el número de nodos',
+'node-count-exceeded-warning' => 'Página que ha superado el número de nodos',
+'expansion-depth-exceeded-category' => 'Páginas donde se supera la profundidad de expansión',
+'expansion-depth-exceeded-warning' => 'Página que ha superado la profundidad de expansión',
 
 # "Undo" feature
 'undo-success' => 'La edición puede deshacerse. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así deshacer la edición.',
index e27db56..80ed167 100644 (file)
@@ -3336,11 +3336,11 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-flash-return-0' => 'ei ole välgu peegeldumist tuvastavat funktsiooni',
 'exif-flash-return-2' => 'välgu peegeldust ei tuvastatud',
 'exif-flash-return-3' => 'tuvastati välgu peegeldus',
-'exif-flash-mode-1' => 'sund välk',
+'exif-flash-mode-1' => 'sundvälk',
 'exif-flash-mode-2' => 'välk keelatud',
 'exif-flash-mode-3' => 'automaatne töörežiim',
 'exif-flash-function-1' => 'Välgu funktsiooni ei ole',
-'exif-flash-redeye-1' => 'Punasilmsust vähendav reziim',
+'exif-flash-redeye-1' => 'punasilmsust vähendav režiim',
 
 'exif-focalplaneresolutionunit-2' => 'toll',
 
@@ -3431,6 +3431,9 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-gpsdirection-t' => 'Tegelik suund',
 'exif-gpsdirection-m' => 'Magneetiline suund',
 
+'exif-ycbcrpositioning-1' => 'Keskele asetatud',
+'exif-ycbcrpositioning-2' => 'Kõrvuti asetatud',
+
 'exif-dc-contributor' => 'Asjaosalised',
 'exif-dc-coverage' => 'Teabevahendi ruumiline või ajaline ulatus',
 'exif-dc-date' => 'Kuupäevad',
index 0f84990..3e8154d 100644 (file)
@@ -453,10 +453,10 @@ $messages = array(
 'tog-previewontop' => 'پیش‌نمایش قبل از جعبهٔ ویرایش نمایش یابد',
 'tog-previewonfirst' => 'پیش‌نمایش هنگام اولین ویرایش نمایش یابد',
 'tog-nocache' => 'حافظهٔ نهانی مرورگر از کار انداخته شود',
-'tog-enotifwatchlistpages' => 'اگر صفحه‌ای از فهرست پی‌گیری‌هایم ویرایش شد به من نامه الکترونیکی فرستاده شود',
-'tog-enotifusertalkpages' => 'هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من نامه الکترونیکی فرستاده شود',
-'tog-enotifminoredits' => 'برای تغییرات جزئی در صفحه‌ها هم به من نامه الکترونیکی فرستاده شود',
-'tog-enotifrevealaddr' => 'نشانی پست الکترونیکی من را در نامه‌های اطلاع‌رسانی نمایش یابد',
+'tog-enotifwatchlistpages' => 'اگر صفحه‌ای از فهرست پی‌گیری‌هایم ویرایش شد برای من نامه‌ای فرستاده شود',
+'tog-enotifusertalkpages' => 'هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من نامه‌ای فرستاده شود',
+'tog-enotifminoredits' => 'برای تغییرات جزئی در صفحه‌ها هم به من نامه‌ای فرستاده شود',
+'tog-enotifrevealaddr' => 'نشانی رایانامهٔ من را در نامه‌های اطلاع‌رسانی نمایش یابد',
 'tog-shownumberswatching' => 'شمار کاربران پی‌گیری‌کننده نمایش یابد',
 'tog-oldsig' => 'امضای کنونی:',
 'tog-fancysig' => 'امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)',
@@ -472,7 +472,7 @@ $messages = array(
 'tog-watchlisthideanons' => 'ویرایش‌های کاربران ناشناس در فهرست پی‌گیری‌های من پنهان شود',
 'tog-watchlisthidepatrolled' => 'ویرایش‌های گشت‌خورده در فهرست پی‌گیری‌ها پنهان شود',
 'tog-nolangconversion' => 'تبدیل گویش‌ها غیرفعال شود',
-'tog-ccmeonemails' => 'رونوشتی از نامه‌های الکترونیکی که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود',
+'tog-ccmeonemails' => 'رونوشتی از نامه‌ای که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود',
 'tog-diffonly' => 'محتوای صفحه، زیر تفاوت نمایش داده نشود',
 'tog-showhiddencats' => 'رده‌های پنهان نمایش داده شود',
 'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرفعال شود',
@@ -863,7 +863,7 @@ $2',
 'gotaccount' => "حساب کاربری دارید؟ '''$1'''.",
 'gotaccountlink' => 'وارد شوید',
 'userlogin-resetlink' => 'جزئیات ورود را فراموش کرده‌اید؟',
-'createaccountmail' => 'با پست الکترونیکی',
+'createaccountmail' => 'با رایانامه',
 'createaccountreason' => 'دلیل:',
 'badretype' => 'گذرواژه‌هایی که وارد کرده‌اید یکسان نیستند.',
 'userexists' => 'نام کاربری‌ای که وارد کردید قبلاً استفاده شده‌است.
@@ -896,7 +896,7 @@ $2',
 'passwordtooshort' => 'گذرواژه باید دست‌کم {{PLURAL:$1|$1 حرف|$1 حرف}} داشته باشد.',
 'password-name-match' => 'گذرواژهٔ شما باید با نام کاربری شما تفاوت داشته باشد.',
 'password-login-forbidden' => 'استفاده از این نام کاربری و گذرواژه ممنوع است.',
-'mailmypassword' => 'گذرواژهٔ جدید با پست الکترونیکی فرستاده شود',
+'mailmypassword' => 'گذرواژهٔ جدید با رایانامه فرستاده شود',
 'passwordremindertitle' => 'یادآور گذرواژهٔ {{SITENAME}}',
 'passwordremindertext' => 'یک نفر (احتمالاً خود شما، با نشانی آی‌پی $1) گذرواژهٔ جدیدی برای حساب کاربری‌ شما در {{SITENAME}} درخواست کرده‌است ($4). 
 یک گذرواژهٔ موقت برای کاربر «$2» ساخته شده و برابر با «$3» قرار داده شده‌است.
@@ -904,31 +904,31 @@ $2',
 گذرواژهٔ موقت شما ظرف {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.
 
 اگر کس دیگری این درخواست را کرده‌است یا اینکه شما گذرواژهٔ پیشین خود را به یاد آورده‌اید و دیگر تمایلی به تغییر آن ندارید، می‌توانید این پیغام را نادیده بگیرید و همان گذرواژهٔ پیشین را به کار برید.',
-'noemail' => 'هیچ نشانی پست الکترونیکی‌ای برای کاربر «$1» ثبت نشده‌است.',
-'noemailcreate' => 'باید یک نشانی پست الکترونیک معتبر وارد کنید',
-'passwordsent' => 'گذرÙ\88اÚ\98Ù\87â\80\8cاÛ\8c Ø¬Ø¯Û\8cد Ø¨Ù\87 Ù\86شاÙ\86Û\8c Ø§Ù\84کترÙ\88Ù\86Û\8cÚ©Û\8c ثبت‌شده برای «$1» فرستاده شد.
+'noemail' => 'هیچ نشانی رایانامه‌ای برای کاربر «$1» ثبت نشده‌است.',
+'noemailcreate' => 'باید یک نشانی رایانامه معتبر وارد کنید',
+'passwordsent' => 'گذرÙ\88اÚ\98Ù\87â\80\8cاÛ\8c Ø¬Ø¯Û\8cد Ø¨Ù\87 Ù\86شاÙ\86Û\8c Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87 ثبت‌شده برای «$1» فرستاده شد.
 لطفاً پس از دریافت آن دوباره به سامانه وارد شوید.',
 'blocked-mailpassword' => 'نشانی آی‌پی شما از ویرایش بازداشته شده‌است و از این رو به منظور جلوگیری از سوءاستفاده اجازهٔ بهره‌گیری از قابلیت بازیابی گذرواژه را ندارد.',
-'eauthentsent' => 'یک نامهٔ الکترونیکی برای تأیید نشانی پست الکترونیکی به نشانی موردنظر ارسال شد.
+'eauthentsent' => 'یک نامه برای تأیید نشانی رایانامه به نشانی موردنظر ارسال شد.
 قبل از اینکه نامهٔ دیگری قابل ارسال به این نشانی باشد، باید دستورهایی که در آن نامه آمده است را جهت تأیید این مساله که این نشانی متعلق به شماست، اجرا کنید.',
 'throttled-mailpassword' => 'یک یادآور گذرواژه در $1 {{PLURAL:$1|ساعت|ساعت}} گذشته برای شما فرستاده شده‌است.
 برای جلوگیری از سوءاستفاده هر  $1 ساعت تنها یک یادآوری فرستاده می‌شود.',
-'mailerror' => 'خطا در فرستادن پست الکترونیکی: $1',
+'mailerror' => 'خطا در فرستادن رایانامه: $1',
 'acct_creation_throttle_hit' => 'بازدیدکنندگان این ویکی که از نشانی آی‌پی شما استفاده می‌کنند در روز گذشته {{PLURAL:$1|یک حساب کاربری|$1 حساب کاربری}} ساخته‌اند، که بیشترین تعداد مجاز در آن بازهٔ زمانی است.
 به همین خاطر، بازدیدکنندگانی که از این نشانی آی‌پی استفاده می‌کنند نمی‌توانند در حال حاضر حساب جدیدی بسازند.',
-'emailauthenticated' => 'نشانی پست الکترونیکی شما در $2 ساعت $3 تصدیق شد.',
-'emailnotauthenticated' => 'نشانی پست الکترونیکی شما هنوز تصدیق نشده‌است.
-برای هیچ‌یک از ویژگی‌های زیر نامهٔ الکترونیکی ارسال نخواهد شد.',
-'noemailprefs' => 'برای راه‌اندازی این قابلیت‌ها یک نشانی پست الکترونیکی مشخص کنید.',
-'emailconfirmlink' => 'تأیید نشانی پست الکترونیکی',
-'invalidemailaddress' => 'نشانی واردشدهٔ پست الکترونیک قابل‌قبول نیست، چرا که دارای ساختار نامعتبری است.
+'emailauthenticated' => 'نشانی رایانامه شما در $2 ساعت $3 تصدیق شد.',
+'emailnotauthenticated' => 'نشانی رایانامه شما هنوز تصدیق نشده‌است.
+برای هیچ‌یک از ویژگی‌های زیر رایانامه ارسال نخواهد شد.',
+'noemailprefs' => 'برای راه‌اندازی این قابلیت‌ها یک نشانی رایانامه مشخص کنید.',
+'emailconfirmlink' => 'تأیید نشانی رایانامه',
+'invalidemailaddress' => 'نشانی واردشدهٔ رایانامه قابل‌قبول نیست، چرا که دارای ساختار نامعتبری است.
 لطفاً نشانی‌ای با ساختار صحیح وارد کنید و یا بخش مربوط را خالی بگذارید.',
-'cannotchangeemail' => 'نشانی‌های پست الکترونیکی حساب کاربری در این ویکی قابل تغییر نیست.',
+'cannotchangeemail' => 'نشانی‌های رایانامهٔ حساب کاربری در این ویکی قابل تغییر نیست.',
 'emaildisabled' => 'این وب‌گاه قادر به ارسال رایانامه نیست.',
 'accountcreated' => 'حساب کاربری ایجاد شد',
 'accountcreatedtext' => 'حساب کاربری $1 ایجاد شده‌است.',
 'createaccount-title' => 'ایجاد حساب کاربری در {{SITENAME}}',
-'createaccount-text' => 'یک نفر برای پست الکترونیک شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کرده‌است ($4)، که گذرواژهٔ آن چنین است: $3
+'createaccount-text' => 'یک نفر برای رایانامه شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کرده‌است ($4)، که گذرواژهٔ آن چنین است: $3
 شما باید به سامانه وارد شوید تا گذرواژهٔ خود را تغییر بدهید.
 
 اگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.',
@@ -941,7 +941,7 @@ $2',
 
 # E-mail sending
 'php-mail-error-unknown' => 'خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی',
-'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس پست الکترونیک.',
+'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس رایانامه.',
 
 # Change password dialog
 'resetpass' => 'تغییر گذرواژه',
@@ -971,9 +971,9 @@ $2',
 'passwordreset-pretext' => '{{PLURAL:$1||یکی از قطعه‌های داده را در زیر وارد کنید}}',
 'passwordreset-username' => 'نام کاربری:',
 'passwordreset-domain' => 'دامنه:',
-'passwordreset-capture' => 'پست الکترونیکی نهایی نشان داده شود؟',
-'passwordreset-capture-help' => 'اگر این گزینه را علامت بزنید پست الکترونیکی (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.',
-'passwordreset-email' => 'نشانی پست الکترونیک:',
+'passwordreset-capture' => 'رایانامهٔ نهایی نشان داده شود؟',
+'passwordreset-capture-help' => 'اگر این گزینه را علامت بزنید رایانامهٔ (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.',
+'passwordreset-email' => 'نشانی رایانامه:',
 'passwordreset-emailtitle' => 'جزئیات حساب در {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'شخصی (احتمالاً شما، با نشانی آی‌پی $1) درخواست یادآوری جزئیات حساب کاربریتان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این رایانشانی مرتبط هستند:
 
@@ -991,18 +991,18 @@ $2
 'passwordreset-emailelement' => 'نام کاربری: $1
 گذرواژهٔ موقت: $2',
 'passwordreset-emailsent' => 'یک نامهٔ یادآور فرستاده شده است.',
-'passwordreset-emailsent-capture' => 'پست الکترونیکی یادآور فرستاده شد، که به شرح زیر است.',
-'passwordreset-emailerror-capture' => 'پست الکترونیکی یادآور همانطور که در زیر مشاهده‌ می‌فرمایید ایجاد شد ولی ارسال آن به کاربر موفقیت‌آمیز نبود: $1',
+'passwordreset-emailsent-capture' => 'رایانامهٔ یادآور فرستاده شد، که به شرح زیر است.',
+'passwordreset-emailerror-capture' => 'رایانامهٔ یادآور همانطور که در زیر مشاهده‌ می‌فرمایید ایجاد شد ولی ارسال آن به کاربر موفقیت‌آمیز نبود: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'تغÛ\8cÛ\8cر Ø¢Ø¯Ø±Ø³ Ù¾Ø³Øª Ø§Ù\84کترÙ\88Ù\86Û\8cÚ©',
+'changeemail' => 'تغÛ\8cÛ\8cر Ø¢Ø¯Ø±Ø³ Ù¾Ø³Øª Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87',
 'changeemail-header' => 'تغییر آدرس ایمیل حساب کاربری',
-'changeemail-text' => 'این فرم را تکمیل کنید تا آدرس پست الکترونیکی‌تان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.',
+'changeemail-text' => 'این فرم را تکمیل کنید تا آدرس رایانامه‌تان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.',
 'changeemail-no-info' => 'برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.',
-'changeemail-oldemail' => 'نشانی پست الکترونیکی کنونی:',
-'changeemail-newemail' => 'نشانی پست الکترونیکی جدید:',
+'changeemail-oldemail' => 'نشانی رایانامهٔ کنونی:',
+'changeemail-newemail' => 'نشانی رایانامهٔ جدید:',
 'changeemail-none' => '(هیچ)',
-'changeemail-submit' => 'تغییر پست الکترونیکی',
+'changeemail-submit' => 'تغییر رایانامه',
 'changeemail-cancel' => 'انصراف',
 
 # Edit page toolbar
@@ -1056,7 +1056,7 @@ $2
 * کاربری که قطع دسترسی‌اش مد نظر بوده‌است: $7
 
 شما می‌توانید با $1 یا  [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.
-توجه کنید که شما نمی‌توانید از ویژگی «فرستادن پست الکترونیکی به این کاربر» استفاده کنید مگر آنکه نشانی پست الکترونیکی معتبری در [[Special:Preferences|ترجیحات کاربری]]‌تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
+توجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]]‌تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
 نشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.
 لطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
 'autoblockedtext' => "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.
@@ -1070,13 +1070,13 @@ $2
 
 شما می‌توانید با $1 یا یکی دیگر از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرید، تا پیرامون این قطع دسترسی صحبت کنید.
 
-توجه کنید که برای ارسال پست الکترونیکی در ویکی، باید پست الکترونیکی خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
+توجه کنید که برای ارسال رایانامه در ویکی، باید رایانامهٔ خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
 
 نشانی آی‌پی فعلی شما $3 است و شمارهٔ قطع دسترسی $5 است.
 لطفاً این شماره را در هر درخواستی که در این باره مطرح می‌کنید ذکر کنید.",
 'blockednoreason' => 'دلیلی مشخص نشده‌است',
 'whitelistedittext' => 'برای ویرایش مقاله‌ها باید $1.',
-'confirmedittext' => 'شما باید، پیش از ویرایش صفحه‌ها، نشانی پست الکترونیکی خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
+'confirmedittext' => 'شما باید، پیش از ویرایش صفحه‌ها، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
 'nosuchsectiontitle' => 'چنین بخشی پیدا نشد',
 'nosuchsectiontext' => 'شما تلاش کرده‌اید یک بخش در صفحه را ویرایش کنید که وجود ندارد.
 ممکن است در مدتی که شما صفحه را مشاهده می‌کردید این بخش جا به جا یا حذف شده باشد.',
@@ -1514,9 +1514,9 @@ $1",
 'prefs-watchlist-token' => 'رمز فهرست پی‌گیری:',
 'prefs-misc' => 'تنظیمات متفرقه',
 'prefs-resetpass' => 'تغییر گذرواژه',
-'prefs-changeemail' => 'تغییر پست الکترونیکی',
-'prefs-setemail' => 'تغیین آدرس پست الکترونیکی',
-'prefs-email' => 'گزینه‌های پست الکترونیک',
+'prefs-changeemail' => 'تغییر رایانامه',
+'prefs-setemail' => 'تغیین آدرس رایانامه',
+'prefs-email' => 'گزینه‌های رایانامه',
 'prefs-rendering' => 'نمایش صفحه',
 'saveprefs' => 'ذخیره',
 'resetprefs' => 'صفرکردن ترجیحات',
@@ -1554,7 +1554,7 @@ $1",
 'timezoneregion-europe' => 'اروپا',
 'timezoneregion-indian' => 'اقیانوس هند',
 'timezoneregion-pacific' => 'اقیانوس آرام',
-'allowemail' => 'امکان دریافت پست الکترونیکی از دیگر کاربران',
+'allowemail' => 'امکان دریافت رایانامه از دیگر کاربران',
 'prefs-searchoptions' => 'گزینه‌های جستجو',
 'prefs-namespaces' => 'فضاهای نام',
 'defaultns' => 'در غیر این صورت جستجو در این فضاهای نام:',
@@ -1565,9 +1565,9 @@ $1",
 'prefs-common-css-js' => 'سی‌اس‌اس/جاوااسکریپت مشترک برای تمام پوسته‌ها:',
 'prefs-reset-intro' => 'شما می‌توانید از این صفحه برای بازگرداندن تنظیمات خود به پیش‌فرض تارنما استفاده کنید.
 این کار بازگشت‌ناپذیر است.',
-'prefs-emailconfirm-label' => 'تأیید پست الکترونیکی:',
+'prefs-emailconfirm-label' => 'تأیید رایانامه:',
 'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
-'youremail' => 'پست الکترونیکی:',
+'youremail' => 'رایانامه:',
 'username' => 'نام کاربری:',
 'uid' => 'شمارهٔ کاربری:',
 'prefs-memberingroups' => 'عضو این {{PLURAL:$1|گروه|گروه‌ها}}:',
@@ -1588,13 +1588,13 @@ $1",
 'gender-female' => 'زن',
 'prefs-help-gender' => 'اختیاری: برای خطاب‌شدن با جنسیت درست توسط نرم‌افزار به کار می‌رود.
 این اطلاعات عمومی خواهد بود.',
-'email' => 'پست الکترونیکی',
+'email' => 'رایانامه',
 'prefs-help-realname' => 'نام واقعی اختیاری است
 اگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.',
-'prefs-help-email' => 'نشانی پست الکترونیکی اختیاری‌است، اما فرستادن گذرواژه‌ای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن می‌کند.',
-'prefs-help-email-others' => 'شما همچنین می‌توانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربری‌تان به شما پست الکترونیکی بفرستند.
-نشانی پست الکترونیکی شما زمانی که دیگران با شما تماس بگیرند فاش نمی‌شود.',
-'prefs-help-email-required' => 'نشانی پست الکترونیکی الزامی‌است.',
+'prefs-help-email' => 'نشانی رایانامه اختیاری‌است، اما فرستادن گذرواژه‌ای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن می‌کند.',
+'prefs-help-email-others' => 'شما همچنین می‌توانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربری‌تان به شما رایانامه بفرستند.
+نشانی رایانامه شما زمانی که دیگران با شما تماس بگیرند فاش نمی‌شود.',
+'prefs-help-email-required' => 'نشانی رایانامه الزامی‌است.',
 'prefs-info' => 'اطلاعات اولیه',
 'prefs-i18n' => 'بین‌المللی‌سازی',
 'prefs-signature' => 'امضا',
@@ -1611,8 +1611,8 @@ $1",
 'prefs-diffs' => 'تفاوت‌ها',
 
 # User preference: e-mail validation using jQuery
-'email-address-validity-valid' => 'نشانی پست الکترونیکی معتبر به نظر می رسد',
-'email-address-validity-invalid' => 'نشانی پست الکترونیکی معتبر وارد کنید',
+'email-address-validity-valid' => 'نشانی رایانامه معتبر به نظر می رسد',
+'email-address-validity-invalid' => 'نشانی رایانامهٔ معتبر وارد کنید',
 
 # User rights
 'userrights' => 'مدیریت اختیارات کاربر',
@@ -1693,7 +1693,7 @@ $1",
 'right-suppressrevision' => 'بازبینی و احیای ویرایش‌هایی که از مدیران پنهان شده‌اند',
 'right-suppressionlog' => 'مشاهدهٔ سیاهه‌های خصوصی',
 'right-block' => 'قطع دسترسی ویرایشی دیگر کاربران',
-'right-blockemail' => 'قطع دسترسی دیگر کاربران برای ارسال پست الکترونیکی',
+'right-blockemail' => 'قطع دسترسی دیگر کاربران برای ارسال رایانامه',
 'right-hideuser' => 'قطع دسترسی کاربر و پنهان کردن آن از دید عموم',
 'right-ipblock-exempt' => 'تاثیر نپذیرفتن از قطع دسترسی‌های آی‌پی، خودکار یا فاصله‌ای',
 'right-proxyunbannable' => 'تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسی‌ها',
@@ -1718,7 +1718,7 @@ $1",
 'right-userrights-interwiki' => 'ویرایش اختیارات کاربرهای ویکی‌های دیگر',
 'right-siteadmin' => 'قفل کردن و باز کردن پایگاه داده',
 'right-override-export-depth' => 'برون‌بری صفحه‌ها شامل صفحه‌های پیوند شده تا عمق ۵',
-'right-sendemail' => 'ارسال نامه الکترونیکی به دیگر کاربران',
+'right-sendemail' => 'ارسال رایانامه به دیگر کاربران',
 'right-passwordreset' => 'مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه',
 
 # User rights log
@@ -2383,24 +2383,24 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 
 # E-mail user
 'mailnologin' => 'نشانی‌ای از فرستنده موجود نیست',
-'mailnologintext' => 'برای فرستادن پست الکترونیکی به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی پست الکترونیکی معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
+'mailnologintext' => 'برای فرستادن رایانامه به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی رایانامهٔ معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
 'emailuser' => 'فرستادن نامه به این کاربر',
-'emailpage' => 'پست الکترونیکی به کاربر',
-'emailpagetext' => 'شما می‌توانید از فرم زیر برای ارسال یک نامه الکترونیکی به این کاربر استفاده کنید.
-نشانی پست الکترونیکی‌ای که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی فرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.',
-'usermailererror' => 'پست الکترونیکی دچار خطا شد:',
-'defemailsubject' => 'پست الکترونیکی {{SITENAME}} از طرف کاربر «$1»',
-'usermaildisabled' => 'پست الکترونیکی کاربر غیرقعال است',
-'usermaildisabledtext' => 'شما در این ویکی نمی‌توانید به دیگر کاربران پست الکترونیکی بفرستید',
-'noemailtitle' => 'نشانی پست الکترونیکی موجود نیست',
-'noemailtext' => 'این کاربر نشانی پست الکترونیکی معتبری مشخص نکرده است،',
-'nowikiemailtitle' => 'اجازهٔ ارسال نامهٔ الکترونیکی داده نشده‌است',
-'nowikiemailtext' => 'این کاربر انتخاب کرده که از دیگر کاربران نامهٔ الکترونیکی دریافت نکند.',
+'emailpage' => 'رایانامه به کاربر',
+'emailpagetext' => 'شما می‌توانید از فرم زیر برای ارسال یک رایانامه به این کاربر استفاده کنید.
+نشانی رایانامه‌ای که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی فرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.',
+'usermailererror' => 'رایانامه دچار خطا شد:',
+'defemailsubject' => 'رایانامه {{SITENAME}} از طرف کاربر «$1»',
+'usermaildisabled' => 'رایانامهٔ کاربر غیرقعال است',
+'usermaildisabledtext' => 'شما در این ویکی نمی‌توانید به دیگر کاربران رایانامه بفرستید',
+'noemailtitle' => 'نشانی رایانامه موجود نیست',
+'noemailtext' => 'این کاربر نشانی رایانامهٔ معتبری مشخص نکرده است،',
+'nowikiemailtitle' => 'اجازهٔ ارسال رایانامه داده نشده‌است',
+'nowikiemailtext' => 'این کاربر انتخاب کرده که از دیگر کاربران رایانامه دریافت نکند.',
 'emailnotarget' => 'نام کاربری ناموجود یا نامعتبر برای گیرنده.',
 'emailtarget' => 'نام کاربری دریافت‌کننده را وارد کنید',
 'emailusername' => 'نام کاربری:',
 'emailusernamesubmit' => 'ارسال',
-'email-legend' => 'ارسال نامه الکترونیکی به یک کاربر دیگر {{SITENAME}}',
+'email-legend' => 'ارسال یک نامه به کاربر دیگر {{SITENAME}}',
 'emailfrom' => 'از:',
 'emailto' => 'به:',
 'emailsubject' => 'عنوان:',
@@ -2408,9 +2408,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'emailsend' => 'بفرست',
 'emailccme' => 'رونوشت پیغام را برایم بفرست.',
 'emailccsubject' => 'رونوشت پیغام شما به $1: $2',
-'emailsent' => 'پست الکترونیکی فرستاده شد',
-'emailsenttext' => 'پیغام پست الکترونیکی شما فرستاده شد.',
-'emailuserfooter' => 'این نامهٔ الکترونیکی با استفاده از ویژگی «پست الکترونیکی به کاربر» {{SITENAME}} توسط $1 به $2 فرستاده شد.',
+'emailsent' => 'رایانامه فرستاده شد',
+'emailsenttext' => 'پیغام رایانامه شما فرستاده شد.',
+'emailuserfooter' => 'این رایانامه با استفاده از ویژگی «فرستادن نامه به این کاربر» {{SITENAME}} توسط $1 به $2 فرستاده شد.',
 
 # User Messenger
 'usermessage-summary' => 'گذاشتن پیغام سامانه.',
@@ -2437,7 +2437,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'notvisiblerev' => 'آخرین نسخه توسط کاربری دیگر حذف شده‌است',
 'watchnochange' => 'هیچ یک از موارد در حال پی‌گیری شما در دورهٔ زمانی نمایش‌یافته ویرایش نشده است.',
 'watchlist-details' => 'بدون احتساب صفحه‌های بحث، {{PLURAL:$1|$1 صفحه|$1 صفحه}} در فهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارد|دارند}}.',
-'wlheader-enotif' => '*اطلاع‌رسانی از طریق پست الکترونیکی امکان‌پذیر است.',
+'wlheader-enotif' => '*اطلاع‌رسانی از طریق رایانامه امکان‌پذیر است.',
 'wlheader-showupdated' => "*صفحه‌هایی که پس از آخرین سرزدنتان به آنها تغییر کرده‌اند '''پررنگ''' نشان داده شده‌اند.",
 'watchmethod-recent' => 'بررسی ویرایش‌های اخیر برای صفحه‌های مورد پی‌گیری',
 'watchmethod-list' => 'بررسی صفحه‌های مورد پی‌گیری برای ویرایش‌های اخیر',
@@ -2452,7 +2452,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'unwatching' => 'توقف پی‌گیری...',
 'watcherrortext' => 'ایرادی در هنگام عوض کردن تنظیمات فهرست پیگیرتان برای «$1» رخ داد.',
 
-'enotif_mailer' => 'پست الکترونیکی اطلاع‌رسانی {{SITENAME}}',
+'enotif_mailer' => 'رایانامهٔ اطلاع‌رسانی {{SITENAME}}',
 'enotif_reset' => 'علامت‌گذاری همهٔ صفحه‌ها به عنوان بازدید شده',
 'enotif_newpagetext' => 'این یک صفحهٔ تازه‌است.',
 'enotif_impersonal_salutation' => 'کاربر {{SITENAME}}',
@@ -2748,7 +2748,7 @@ $1',
 **نام کاربری نامناسب',
 'ipb-hardblock' => 'جلوگیری از ویرایش کردن کاربران ثبت نام کرده از طریق این نشانی آی‌پی',
 'ipbcreateaccount' => 'جلوگیری از ایجاد حساب',
-'ipbemailban' => 'جلوگیری از ارسال پست الکترونیکی',
+'ipbemailban' => 'جلوگیری از ارسال رایانامه',
 'ipbenableautoblock' => 'بستن  خودکار آخرین نشانی آی‌پی استفاده شده توسط کاربر و نشانی‌های دیگری که از آن‌ها برای ویرایش تلاش می‌کند',
 'ipbsubmit' => 'این کاربر بسته شود',
 'ipbother' => 'زمانی دیگر',
@@ -2798,7 +2798,7 @@ $1',
 'anononlyblock' => 'فقط کاربران گمنام',
 'noautoblockblock' => 'بستن خودکار غیرفعال است',
 'createaccountblock' => 'امکان ایجاد حساب مسدود است',
-'emailblock' => 'پست الکترونیکی مسدود شد',
+'emailblock' => 'رایانامه مسدود شد',
 'blocklist-nousertalk' => 'نمی تواند صفحهٔ بحث خود را ویرایش کند',
 'ipblocklist-empty' => 'فهرست بسته‌شدن‌ها خالی‌است.',
 'ipblocklist-no-results' => 'دسترسی حساب کاربری یا نشانی آی‌پی مورد نظر قطع نیست.',
@@ -2806,7 +2806,7 @@ $1',
 'unblocklink' => 'باز شود',
 'change-blocklink' => 'تغییر قطع دسترسی',
 'contribslink' => 'مشارکت‌ها',
-'emaillink' => 'ارسال پست الکترونیکی',
+'emaillink' => 'ارسال رایانامه',
 'autoblocker' => 'به طور خودکار بسته شد چون آی‌پی شما به تازگی توسط کاربر «[[User:$1|$1]]» استفاده شده‌است.
 دلیل قطع دسترسی $1 چنین است: «$2»',
 'blocklogpage' => 'سیاههٔ بسته‌شدن‌ها',
@@ -2823,7 +2823,7 @@ $1',
 'block-log-flags-anononly' => 'فقط کاربران گمنام',
 'block-log-flags-nocreate' => 'قابلیت ایجاد حساب غیرفعال شد',
 'block-log-flags-noautoblock' => 'قطع دسترسی خودکار غیرفعال شد',
-'block-log-flags-noemail' => 'پست الکترونیکی مسدود شد',
+'block-log-flags-noemail' => 'رایانامه مسدود شد',
 'block-log-flags-nousertalk' => 'صفحهٔ بحث خود را نمی‌تواند ویرایش کند',
 'block-log-flags-angry-autoblock' => 'قطع دسترسی خودکار پیشرفته فعال شد',
 'block-log-flags-hiddenname' => 'نام کاربری پنهان',
@@ -3129,7 +3129,7 @@ $1',
 'tooltip-feed-rss' => 'خبرنامه آراس‌اس برای این صفحه',
 'tooltip-feed-atom' => 'خبرنامهٔ اتم برای این صفحه',
 'tooltip-t-contributions' => 'فهرست مشارکت‌های این کاربر',
-'tooltip-t-emailuser' => 'فرستادن پست الکترونیکی به این کاربر',
+'tooltip-t-emailuser' => 'فرستادن رایانامه به این کاربر',
 'tooltip-t-upload' => 'بارگذاری تصاویر و پرونده‌های دیگر',
 'tooltip-t-specialpages' => 'فهرستی از همهٔ صفحه‌های ویژه',
 'tooltip-t-print' => 'نسخهٔ قابل چاپ این صفحه',
@@ -3714,63 +3714,63 @@ $1',
 'limitall' => 'همه',
 
 # E-mail address confirmation
-'confirmemail' => 'تأیید نشانی پست الکترونیکی',
-'confirmemail_noemail' => 'شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی پست الکترونیکی معتبری وارد نکرده‌اید.',
-'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار پست الکترونیکی خود، پیش از استفاده از خدمات پست الکترونیکی در اینجا می‌کند. دکمهٔ زیرین را فعال کنید تا نامهٔ تأییدی به نشانی پست الکترونیکی شما فرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود که حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی پست الکترونیکی شما مسجل شود.',
-'confirmemail_pending' => 'یک کد تأییدی پیشتر برای شما به صورت الکترونیکی فرستاده شده‌است. اگر همین اواخر حساب خود را باز کرده‌اید شاید بد نباشد که پیش از درخواست یک کد جدید چند دقیقه درنگ کنید تا شاید نامهٔ قبلی برسد.',
+'confirmemail' => 'تأیید نشانی رایانامه',
+'confirmemail_noemail' => 'شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی رایانامه معتبری وارد نکرده‌اید.',
+'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار رایانامه خود، پیش از استفاده از خدمات رایانامه در اینجا می‌کند. دکمهٔ زیرین را فعال کنید تا نامهٔ تأییدی به نشانی رایانامهٔ شما فرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود که حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی رایانامهٔ شما تایید شود.',
+'confirmemail_pending' => 'یک کد تأییدی پیشتر برای شما به صورت نامه فرستاده شده‌است. اگر همین اواخر حساب خود را باز کرده‌اید شاید بد نباشد که پیش از درخواست یک کد جدید چند دقیقه درنگ کنید تا شاید نامهٔ قبلی برسد.',
 'confirmemail_send' => 'پُست‌کردن یک کد تأیید',
-'confirmemail_sent' => 'نامهٔ الکترونیکی تأییدی فرستاده شد.',
-'confirmemail_oncreate' => 'یک کد تأییدی به نشانی پست الکترونیکی شما فرستاده شد.
-برای واردشدن به سامانه نیازی به این کد نیست، ولی برای راه‌اندازی امکانات وابسته به پست الکترونیکی در این ویکی به آن نیاز خواهید داشت.',
-'confirmemail_sendfailed' => 'فرستادن پست الکترونیکی تأییدی ممکن نشد.
-نشانی پست الکترونیکی را از نظر وجود نویسه‌های نامعتبر بررسی کنید.
+'confirmemail_sent' => 'یک نامهٔ تأییدی فرستاده شد.',
+'confirmemail_oncreate' => 'یک کد تأییدی به نشانی رایانامهٔ شما فرستاده شد.
+برای واردشدن به سامانه نیازی به این کد نیست، ولی برای راه‌اندازی امکانات وابسته به رایانامه در این ویکی به آن نیاز خواهید داشت.',
+'confirmemail_sendfailed' => 'فرستادن رایانامهٔ تأییدی ممکن نشد.
+نشانی رایانامه را از نظر وجود نویسه‌های نامعتبر بررسی کنید.
 
-پاسخ سامانه ارسال پست الکترونیکی: $1',
+پاسخ سامانه ارسال رایانامه: $1',
 'confirmemail_invalid' => 'کد تأیید نامعتبر است. ممکن است که منقضی شده باشد.',
-'confirmemail_needlogin' => 'برای تأیید نشانی پست الکترونیکی‌تان نیاز به $1 دارید.',
-'confirmemail_success' => 'نشانی پست الکترونیکی شما تأیید شده‌است.
+'confirmemail_needlogin' => 'برای تأیید نشانی رایانامه‌تان نیاز به $1 دارید.',
+'confirmemail_success' => 'نشانی رایانامهٔ شما تأیید شده‌است.
 
-اینک می‌توانید [[Special:UserLogin|به سامانه وارد شوید]] و از ویکی لذت ببرید.',
-'confirmemail_loggedin' => 'نشانی پست الکترونیکی شما تأیید شد.',
+هم‌اینک می‌توانید [[Special:UserLogin|به سامانه وارد شوید]] و از ویکی لذت ببرید.',
+'confirmemail_loggedin' => 'نشانی رایانامهٔ شما تأیید شد.',
 'confirmemail_error' => 'هنگام ذخیرهٔ تأیید شما به مشکلی برخورده شد.',
-'confirmemail_subject' => 'تأیید نشانی پست الکترونیکی شما {{SITENAME}}',
-'confirmemail_body' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 حساب کاربری‌ای با نام «$2» و این نشانی پست الکترونیکی در {{SITENAME}} ایجاد کرده‌است.
+'confirmemail_subject' => 'تأیید نشانی رایانامهٔ شما {{SITENAME}}',
+'confirmemail_body' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 حساب کاربری‌ای با نام «$2» و این نشانی رایانامه در {{SITENAME}} ایجاد کرده‌است.
 
-برای تأیید این که این حساب واقعاً متعلق به شماست و نیز برای فعال‌سازی امکانات پست الکترونیک {{SITENAME}} پیوند زیر را در مرورگر اینترنت خود باز کنید:
+برای تأیید این که این حساب واقعاً متعلق به شماست و نیز برای فعال‌سازی امکانات رایانامه {{SITENAME}} پیوند زیر را در مرورگر اینترنت خود باز کنید:
 
 $3
 
 اگر شما این حساب کاربری را ثبت *نکرده‌اید*، لطفاً پیوند زیر را
-دنبال کنید تا تأیید نشانی پست الکترونیکی لغو شود:
+دنبال کنید تا تأیید نشانی رایانامه لغو شود:
 
 $5
 
 این کدِ تأیید در تاریخ $4 منقضی خواهد شد.
 </div>',
-'confirmemail_body_changed' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 نشانی پست الکترونیکی حساب «$2» در {{SITENAME}} را تغییر داده‌است.
+'confirmemail_body_changed' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 نشانی رایانامه حساب «$2» در {{SITENAME}} را تغییر داده‌است.
 
-برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی پست الکترونیک در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
+برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی رایانامه در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
 
 $3
 
-اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر پست الکترونیکی را لغو کنید:
+اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر رایانامه را لغو کنید:
 
 $5
 
 این تأییدیه در $4 منقضی می‌گردد.',
-'confirmemail_body_set' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 نشانی پست الکترونیکی حساب «$2» در {{SITENAME}} را به این نشانی تغییر داده‌است.
+'confirmemail_body_set' => 'یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 نشانی رایانامه حساب «$2» در {{SITENAME}} را به این نشانی تغییر داده‌است.
 
-برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی پست الکترونیک در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
+برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی رایانامه در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
 
 $3
 
-اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر پست الکترونیکی را لغو کنید:
+اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر رایانامه را لغو کنید:
 
 $5
 
 این تأییدیه در $4 منقضی می‌گردد.',
-'confirmemail_invalidated' => 'تأیید نشانی پست الکترونیکی لغو شد',
-'invalidateemail' => 'لغو کردن تأیید نشانی پست الکترونیکی',
+'confirmemail_invalidated' => 'تأیید نشانی رایانامه لغو شد',
+'invalidateemail' => 'لغو کردن تأیید نشانی رایانامه',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[تراگنجانش بین‌ویکیانه فعال نیست]',
@@ -3960,6 +3960,9 @@ $5
 'version-software' => 'نسخهٔ نصب‌شده',
 'version-software-product' => 'محصول',
 'version-software-version' => 'نسخه',
+'version-entrypoints' => 'نشانی اینترنتی محل ورود',
+'version-entrypoints-header-entrypoint' => 'نقطه ورود',
+'version-entrypoints-header-url' => 'نشانی اینترنتی',
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسیر مقاله]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسیر اسکریپت]',
 
@@ -4093,7 +4096,7 @@ $5
 'logentry-newusers-create' => '$1 یک حساب کاربری ایجاد کرد',
 'logentry-newusers-create2' => '$1 یک حساب کاربری ایجاد کرد $3',
 'logentry-newusers-autocreate' => 'حساب $1  به شکل خودکار ساخته شد',
-'newuserlog-byemail' => 'گذرواژه با پست الکترونیکی ارسال شد',
+'newuserlog-byemail' => 'گذرواژه بوسیله رایانامه ارسال شد',
 
 # Feedback
 'feedback-bugornote' => 'اگر آماده‌اید تا مشکلی فنی را با جزئیاتش شرح دهید لطفاً [$1 یک ایراد گزارش دهید]. در غیر این صورت می‌توانید از فرم سادهٔ زیر استفاده کنید. نظر شما به همراه نام کاربری و مرورگرتان به صفحهٔ «[$2 $3]» افزوده خواهد شد.',
index aba7318..2a8c554 100644 (file)
@@ -2225,7 +2225,7 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
 'watchnochange' => 'Valittuna ajanjaksona yhtäkään tarkkailemistasi sivuista ei muokattu.',
 'watchlist-details' => 'Tarkkailulistalla on {{PLURAL:$1|$1 sivu|$1 sivua}} keskustelusivuja mukaan laskematta.',
 'wlheader-enotif' => '* Sähköposti-ilmoitukset ovat käytössä.',
-'wlheader-showupdated' => "* Sivut, joita on muokattu viimeisen käyntisi jälkeen on '''lihavoitu'''.",
+'wlheader-showupdated' => "* Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
 'watchmethod-recent' => 'tarkistetaan tuoreimpia muutoksia tarkkailluille sivuille',
 'watchmethod-list' => 'tarkistetaan tarkkailtujen sivujen tuoreimmat muutokset',
 'watchlistcontains' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}.',
@@ -2240,7 +2240,7 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
 'watcherrortext' => 'Sivun ”$1” tarkkailulista-asetusten muutoksissa tapahtui virhe.',
 
 'enotif_mailer' => '{{GRAMMAR:genitive|{{SITENAME}}}} sivu on muuttunut -ilmoitus',
-'enotif_reset' => 'Merkitse kaikki sivut katsotuiksi',
+'enotif_reset' => 'Merkitse kaikki sivut kerralla nähdyiksi',
 'enotif_newpagetext' => 'Tämä on uusi sivu.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-käyttäjä',
 'changed' => 'muuttanut sivua',
index e9d6334..2119cec 100644 (file)
@@ -1122,6 +1122,10 @@ Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maint
 'parser-template-loop-warning' => 'Modèle en boucle détecté : [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limite de profondeur des appels 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 où nombre de nœuds est dépassé',
+'node-count-exceeded-warning' => 'Page dépassant le nombre de nœuds',
+'expansion-depth-exceeded-category' => "Pages où la profondeur d'expansion est dépassée",
+'expansion-depth-exceeded-warning' => "Page dépassant la profondeur d'expansion",
 
 # "Undo" feature
 'undo-success' => 'Cette modification va être défaite. Veuillez vérifier les modifications ci-dessous, puis publier si c’est bien ce que vous voulez faire.',
@@ -1329,7 +1333,7 @@ Assurez-vous que cette opération conservera la continuité de l’historique de
 'searchhelp-url' => 'Help:Accueil',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rechercher les pages commençant par ce préfixe]]',
 'searchprofile-articles' => 'Pages de contenu',
-'searchprofile-project' => 'Pages d’aide et du projet',
+'searchprofile-project' => 'Pages d’aide et de projet',
 'searchprofile-images' => 'Multimédia',
 'searchprofile-everything' => 'Tout',
 'searchprofile-advanced' => 'Recherche avancée',
index 6a184c9..106df85 100644 (file)
@@ -1013,6 +1013,10 @@ Estes argumentos foron omitidos.",
 'parser-template-loop-warning' => 'Detectouse un modelo en bucle: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Excedeuse o límite da profundidade do recurso do modelo ($1)',
 'language-converter-depth-warning' => 'Excedeuse o límite de profundidade do convertedor de lingua ($1)',
+'node-count-exceeded-category' => 'Páxinas nas que se supera o número de nodos',
+'node-count-exceeded-warning' => 'Páxina que supera o número de nodos',
+'expansion-depth-exceeded-category' => 'Páxinas nas que se supera a profundidade de expansión',
+'expansion-depth-exceeded-warning' => 'Páxina que supera a profundidade de expansión',
 
 # "Undo" feature
 'undo-success' => 'A edición pódese desfacer.
@@ -1927,7 +1931,7 @@ Poida que queira editar a descrición da [$2 páxina de descrición do ficheiro]
 'filedelete-otherreason' => 'Outro motivo:',
 'filedelete-reason-otherlist' => 'Outro motivo',
 'filedelete-reason-dropdown' => '*Motivos frecuentes para borrar
-** Violación dos dereitos de autor
+** Violación dos dereitos de autoría
 ** Ficheiro duplicado',
 'filedelete-edit-reasonlist' => 'Editar os motivos de borrado',
 'filedelete-maintenance' => 'Os borrados e restauracións de ficheiros están desactivados temporalmente durante o mantemento.',
@@ -2315,8 +2319,8 @@ No $2 pode ver unha lista cos borrados máis recentes.',
 'deleteotherreason' => 'Outro motivo:',
 'deletereasonotherlist' => 'Outro motivo',
 'deletereason-dropdown' => '*Motivos frecuentes para borrar
-** Solicitado polo autor
-** Violación dos dereitos de autor
+** Solicitado pola persoa que o creou
+** Violación dos dereitos de autoría
 ** Vandalismo',
 'delete-edit-reasonlist' => 'Editar os motivos de borrado',
 'delete-toobig' => 'Esta páxina conta cun historial longo, de máis {{PLURAL:$1|dunha revisión|de $1 revisións}}.
@@ -3724,6 +3728,8 @@ Debería recibir [{{SERVER}}{{SCRIPTPATH}}/COPYING unha copia da licenza públic
 'version-entrypoints' => 'Enderezos URL de punto de entrada',
 'version-entrypoints-header-entrypoint' => 'Punto de entrada',
 'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta do artigo]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta da escritura]',
 
 # Special:FilePath
 'filepath' => 'Ruta do ficheiro',
index 9ce0b51..e501b7a 100644 (file)
@@ -1135,6 +1135,10 @@ $2
 'parser-template-loop-warning' => 'נמצאה תבנית הקוראת לעצמה: [[$1]]',
 'parser-template-recursion-depth-warning' => 'עומק התבניות המוכללות זו בזו עבר את המגבלה ($1)',
 'language-converter-depth-warning' => 'עומק ממיר השפה עבר את המגבלה ($1)',
+'node-count-exceeded-category' => 'דפים שבהם מספר הצמתים גדול מדי',
+'node-count-exceeded-warning' => 'מספר הצמתים בדף גדול מדי',
+'expansion-depth-exceeded-category' => 'דפים שבהם עומק ההרחבה גדול מדי',
+'expansion-depth-exceeded-warning' => 'עומק ההרחבה בדף גדול מדי',
 
 # "Undo" feature
 'undo-success' => 'ניתן לבטל את העריכה. אנא בִדקו את השוואת הגרסאות למטה כדי לוודא שזה מה שאתם רוצים לעשות, ואז שמרו את השינויים למטה כדי לבצע את ביטול העריכה.',
index 5c2db62..f8b288b 100644 (file)
@@ -783,6 +783,7 @@ $2
 ऐसा तब भी हो सकता है यदि आप कोई खराब वेब-आधारित अनामक प्रौक्सी प्रयोग कर रहे हों।",
 'edit_form_incomplete' => "'''सम्पादन फ़ॉर्म के कुछ भाग सर्वर तक नहीं पहुँच पाए; जाँच लें कि आपके द्वारा किये बदलाव अक्षुण्ण हैं, और सहेजने का पुनः यत्न करें।'''",
 'editing' => '$1 सम्पादन',
+'creating' => '$1 बनाएँ',
 'editingsection' => '$1 सम्पादन (अनुभाग)',
 'editingcomment' => '$1 सम्पादन (नया अनुभाग)',
 'editconflict' => 'संपादन अंतर्विरोध: $1',
@@ -852,9 +853,9 @@ $2
 यह पहले से मौजूद है।',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => "'''à¤\9aà¥\87तावनà¥\80:''' à¤\87स à¤ªà¥\83षà¥\8dठ à¤ªà¤° à¤¬à¤¹à¥\81त à¤\85धिà¤\95 à¤¸à¤\82à¤\96à¥\8dया à¤®à¥\87à¤\82 à¤\95à¥\80मतà¥\80 à¤ªà¤¾à¤°à¥\8dसर à¥\9eंक्शनों का प्रयोग किया गया है।
+'expensive-parserfunction-warning' => "'''à¤\9aà¥\87तावनà¥\80:''' à¤\87स à¤ªà¥\83षà¥\8dठ à¤ªà¤° à¤¬à¤¹à¥\81त à¤\85धिà¤\95 à¤¸à¤\82à¤\96à¥\8dया à¤®à¥\87à¤\82 à¤\95à¥\80मतà¥\80 à¤ªà¤¾à¤°à¥\8dसर à¤«à¤¼ंक्शनों का प्रयोग किया गया है।
 
-इनका प्रयोग $2 से कम बार होना चाहिये, इस समय प्रयोग $1 बार है।",
+इनका प्रयोग $2 से कम बार होना चाहिये, इस समय प्रयोग $1 बार {{PLURAL:$2|है|हैं}}।",
 'expensive-parserfunction-category' => 'कीमती पार्सर फ़ंक्शनों का अत्यधिक प्रयोग कर रहे पृष्ठ',
 'post-expand-template-inclusion-warning' => "'''चेतावनी:''' साँचे जुड़ने की सीमा पार हो चुकी है।
 कुछ साँचे नहीं जुड़ेंगे।",
@@ -1009,7 +1010,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'छुपाने की लॉग',
-'suppressionlogtext' => 'नीचे प्रबंधकों से छुपाये गए ब्लॉक और हटाये गये पृष्ठों की सूची है। मौजूदा ब्लॉक एवं बैन देखने के लिये [[Special:BlockList|आइ॰पी ब्लॉक सूची]] देखें।',
+'suppressionlogtext' => 'नीचे प्रबंधकों से छुपाये गए ब्लॉक और हटाये गये पृष्ठों की सूची है।
+मौजूदा ब्लॉक एवं बैन देखने के लिये [[Special:BlockList|ब्लॉक सूची]] देखें।',
 
 # History merging
 'mergehistory' => 'पृष्ठ के इतिहास एकत्रित करें',
@@ -1864,7 +1866,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'nbytes' => '$1 {{PLURAL:$1|बाइट|बाइट}}',
 'ncategories' => '{{PLURAL:$1|एक श्रेणी|$1 श्रेणियाँ}}',
 'nlinks' => '$1 {{PLURAL:$1|कड़ी|कड़ियाँ}}',
-'nmembers' => '{{PLURAL:$1|एक सदस्य|$1 सदस्य}}',
+'nmembers' => '$1 {{PLURAL:$1|सदस्य}}',
 'nrevisions' => '$1 {{PLURAL:$1|अवतरण}}',
 'nviews' => '{{PLURAL:$1|एक|$1}} बार देखा गया है',
 'nimagelinks' => '$1 {{PLURAL:$1|पृष्ठ|पृष्ठों}} पर प्रयुक्त',
@@ -2071,10 +2073,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'watchnologin' => 'लॉग इन नहीं किया है',
 'watchnologintext' => 'ध्यानसूची में बदलाव के लिये [[Special:UserLogin|लॉग इन]] करना आवश्यक है।',
 'addwatch' => 'ध्यानसूची में जोड़ें',
-'addedwatchtext' => 'आपकी [[Special:Watchlist|ध्यानसूची]] में "<nowiki>$1</nowiki>" का समावेश कर दिया गया है।
-भविष्य में इस पृष्ठ तथा इस पृष्ठ की वार्ता में होने वाले बदलाव आपकी ध्यानसूची में दिखेंगे तथा [[Special:RecentChanges|हाल में हुए बदलावों की सूची]] में यह पृष्ठ बोल्ड दिखेगा ताकि आप आसानी से इसका ध्यान रख सकें।
+'addedwatchtext' => 'आपकी [[Special:Watchlist|ध्यानसूची]] में "[[:$1]]" पृष्ठ का समावेश कर दिया गया है।
+भविष्य में इस पृष्ठ तथा इसके वार्ता पृष्ठ में होने वाले बदलाव आपकी ध्यानसूची में दिखेंगे तथा [[Special:RecentChanges|हाल में हुए बदलावों की सूची]] में यह पृष्ठ बोल्ड दिखेगा ताकि आप आसानी से इसका ध्यान रख सकें।
 
-<p>अगर आपको इस पृष्ठ को अपनी ध्यानसूची से निकालना हो तो "ध्यान हटायें" पर क्लिक करें।',
+अगर आपको इस पृष्ठ को अपनी ध्यानसूची से निकालना हो तो "ध्यान हटायें" पर क्लिक करें।',
 'removewatch' => 'ध्यानसूची से हटाएँ',
 'removedwatchtext' => '"[[:$1]]" नामक पृष्ठ को आपकी [[Special:Watchlist|ध्यानसूची]] से हटा दिया गया है।',
 'watch' => 'ध्यान रखें',
@@ -2330,7 +2332,7 @@ $1',
 
 # Contributions
 'contributions' => 'सदस्य योगदान',
-'contributions-title' => '$1 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¯à¥\8bà¤\97दान',
+'contributions-title' => '$1 के योगदान',
 'mycontris' => 'मेरा योगदान',
 'contribsub2' => '$1 के लिये ($2)',
 'nocontribs' => 'इन कसौटियों से मिलनेवाले बदलाव मिले नहीं।',
@@ -2364,7 +2366,7 @@ $1',
 'nolinkshere-ns' => "चुने हुए नामस्थानसे '''[[:$1]]''' को जुडने वाले पृष्ठ नहीं हैं।",
 'isredirect' => 'पुनर्निर्देशन पृष्ठ',
 'istemplate' => 'मिलाईयें',
-'isimage' => 'सà¤\82à¤\9aिà¤\95ा à¤\95ि à¤\95ड़à¥\80',
+'isimage' => 'फ़ाà¤\87ल à¤ªà¥\8dरयà¥\8bà¤\97',
 'whatlinkshere-prev' => '{{PLURAL:$1|पिछला|पिछले $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|अगला|अगले $1}}',
 'whatlinkshere-links' => '← कड़ियाँ',
@@ -2634,6 +2636,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 पृष्ठों को निर्यात करने के लिए, नीचे विषय वस्तु संदूक में शीर्षक प्रवेश करें, एक शीर्षक प्रति पंक्ति, और चुने कि आप वर्त्तमान अवतरण के साथ पुराने अवतरण भी चाहते हैं कि नहीं, या पिछले संपादन के बारे में जानकारी के साथ केवल वर्त्तमान अवतरण चाहते हैं।
 
 बाद वाली स्थिति के लिए आप एक सम्पर्क भी प्रयोग कर सकते हैं, उदाहरण के लिए, "[[{{MediaWiki:Mainpage}}]]" पृष्ठ के लिए [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।',
+'exportall' => 'सभी पृष्ठ निर्यात करें',
 'exportcuronly' => 'पूरा इतिहास नहीं चाहियें, सिर्फ अभी का अवतरण अंतर्भूत करें',
 'exportnohistory' => "----
 '''सूचना:''' इस फॉर्म का इस्तेमाल कर पृष्ठका पूरा इतिहास निर्यात करना परफॉर्मेन्स के चलते रोक दिया गया हैं।",
@@ -3557,6 +3560,7 @@ $5
 'version-software' => 'इन्स्टॉल की हुई प्रणाली',
 'version-software-product' => 'प्रोडक्ट',
 'version-software-version' => 'अवतरण',
+'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
 # Special:FilePath
 'filepath' => 'सञ्चिका पथ',
@@ -3687,7 +3691,7 @@ $5
 'logentry-newusers-newusers' => '$1 created उपयोगकर्ता के खाता',
 'logentry-newusers-create' => '$1 created उपयोगकर्ता के खाता',
 'logentry-newusers-create2' => '$1 created a user account $3',
-'logentry-newusers-autocreate' => 'à¤\96ातà¥\87 $1 à¤¥à¤¾ created à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87',
+'logentry-newusers-autocreate' => 'à¤\96ातà¥\87 $1 à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤¬à¤¨à¤¾à¤¯à¤¾ à¤\97या',
 'newuserlog-byemail' => 'कूटशब्द इ-मेल द्वारा भेजा गया हैं',
 
 # Feedback
@@ -3744,4 +3748,15 @@ $5
 'api-error-uploaddisabled' => 'इस विकि पर अपलोड अक्षम है.',
 'api-error-verification-error' => 'यह फ़ाइल दूषित हो सकती है, या गलत एक्सटेंशन है।',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|सॅकेंड}}',
+'duration-minutes' => '$1 {{PLURAL:$1|मिनट}}',
+'duration-hours' => '$1 {{PLURAL:$1|घंटा|घंटे}}',
+'duration-days' => '$1 {{PLURAL:$1|दिन}}',
+'duration-weeks' => '$1 {{PLURAL:$1|सप्ताह}}',
+'duration-years' => '$1 {{PLURAL:$1|वर्ष}}',
+'duration-decades' => '$1 {{PLURAL:$1|दशक}}',
+'duration-centuries' => '$1 {{PLURAL:$1|शताब्दी}}',
+'duration-millennia' => '$1 {{PLURAL:$1|सहस्राब्दी}}',
+
 );
index bb41921..291dcc5 100644 (file)
@@ -779,7 +779,7 @@ Zbog toga posjetitelji s ove IP adrese trenutačno ne mogu otvoriti nove suradni
 'emailauthenticated' => 'Vaša e-mail adresa je ovjerena $2 u $3.',
 'emailnotauthenticated' => 'Vaša e-mail adresa još nije ovjerena.
 Ne možemo poslati e-mail ni u jednoj od sljedećih naredbi.',
-'noemailprefs' => 'Nije navedena e-mail adresa, stoga sljedeće naredbe neće raditi.',
+'noemailprefs' => 'Nije navedena adresa elektroničke pošte, stoga sljedeće naredbe ne će raditi.',
 'emailconfirmlink' => 'Potvrdite svoju e-mail adresu',
 'invalidemailaddress' => 'Ne mogu prihvatiti e-mail adresu jer nije valjano oblikovana.
 Molim unesite ispravno oblikovanu adresu ili ostavite polje praznim.',
@@ -2621,13 +2621,13 @@ mijenjanje postavki, uređivanje popisa praćenja i druge stvari koje zahtijevaj
 # Move page
 'move-page' => 'Premjesti $1',
 'move-page-legend' => 'Premjesti stranicu',
-'movepagetext' => "Korištenjem ovog obrasca ćete preimenovati stranicu i premjestiti sve stare izmjene na novo ime.
+'movepagetext' => "Uporabom ovog obrasca ćete preimenovati stranicu i premjestiti sve stare izmjene na novo ime.
 Stari će se naslov pretvoriti u stranicu koja automatski preusmjerava na novi naslov.
-Možete odabrati automatsko ažuriranje preusmjeravanja na originalni naslov.
+Možete odabrati automatsko ažuriranje preusmjeravanja na izvorni naslov.
 Ako se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].
 Dužni ste provjeriti da sve poveznice i dalje nastave voditi na prave stranice.
 
-Stranica se '''neće''' premjestiti ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena.
+Stranica se '''ne će''' premjestiti ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena.
 To znači: 1. ako pogriješite, možete opet preimenovati stranicu na stari naslov, 2. ne može se dogoditi da izbrišete neku postojeću stranicu.
 
 '''Upozorenje!'''
@@ -2637,21 +2637,21 @@ Stari će se naslov pretvoriti u stranicu koja automatski preusmjerava na novi n
 Budite sigurni da ste provjerili [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nevaljana preusmjeravanja]]. 
 Vi ste odgovorni za to da poveznice i dalje povezuju tamo gdje treba.
 
-Imajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena. 
-To znači da stranicu možete preimenovati u prethodno ime ukoliko ste pogriješili te ne možete pisati preko postojeće stranice. 
+Imajte na umu da stranica '''ne će''' biti premještena ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena. 
+To znači da stranicu možete preimenovati u prethodno ime ako ste pogriješili te ne možete pisati preko postojeće stranice. 
 
 '''Upozorenje!''' 
 Ovo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice; 
 budite sigurni da razumijete posljedice ove akcije prije nastavka.",
-'movepagetalktext' => "Stranica za razgovor, ako postoji, automatski će se premjestiti zajedno sa stranicom koju premještate. '''Stranica za razgovor neće se premjestiti ako:'''
+'movepagetalktext' => "Stranica za razgovor, ako postoji, automatski će se premjestiti zajedno sa stranicom koju premještate. '''Stranica se za razgovor ne će premjestiti ako:'''
 *premještate stranicu iz jednog prostora u drugi,
 *pod novim imenom već postoji stranica za razgovor s nekim sadržajem, ili
 *maknete kvačicu u kućici na dnu ove stranice.
 
-U tim slučajevima ćete morati sami premjestiti ili iskopirati stranicu za razgovor,
+U tim ćete slučajevima morati sami premjestiti ili iskopirati stranicu za razgovor,
 ako to želite.",
 'movearticle' => 'Premjesti stranicu',
-'moveuserpage-warning' => "'''Upozorenje:''' Premještate suradničku stranicu. Imajte na umu da će stranica biti premještena, ali suradnik ''neće'' biti preimenovan.",
+'moveuserpage-warning' => "'''Upozorenje:''' Premještate suradničku stranicu. Imajte na umu da će stranica biti premještena, ali suradnik ''ne će'' biti preimenovan.",
 'movenologin' => 'Niste prijavljeni',
 'movenologintext' => 'Ako želite premjestiti stranicu morate biti [[Special:UserLogin|prijavljeni]].',
 'movenotallowed' => 'Nemate pravo premještanja stranica.',
index 8bc8040..312aa1e 100644 (file)
@@ -896,6 +896,10 @@ Dyrbjała mjenje hač $2 {{PLURAL:$2|wołanje|wołanjej|wołanja|wołanjow}} mě
 'parser-template-loop-warning' => 'Předłohowa sekla wotkryta: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limit za rekursijnu hłubokosć předłohi překročeny ($1)',
 'language-converter-depth-warning' => 'Limit hłubokosće rěčneho konwertera překročena ($1)',
+'node-count-exceeded-category' => 'Strony, hdźež ličba sukow je překročena',
+'node-count-exceeded-warning' => 'Strona je ličbu sukow překročiła',
+'expansion-depth-exceeded-category' => 'Strony, hdźež ekspansiska hłubokosć je překročena',
+'expansion-depth-exceeded-warning' => 'Strona je ekspansisku hłubokosć překročił',
 
 # "Undo" feature
 'undo-success' => 'Wersija je so wuspěšnje wotstroniła. Prošu přepruwuj deleka w přirunanskim napohledźe, hač twoja změna bu přewzata a klikń potom na „Składować”, zo by změnu składował.',
index f5ee6bd..51f94d7 100644 (file)
@@ -2135,6 +2135,7 @@ A napló típusának, a szerkesztő nevének (kis- és nagybetűérzékeny), vag
 'allpagesprefix' => 'Lapok listázása, amik ezzel az előtaggal kezdődnek:',
 'allpagesbadtitle' => 'A megadott lapnév nyelvközi vagy wikiközi előtagot tartalmazott, vagy érvénytelen volt. Talán olyan karakter van benne, amit nem lehet lapnevekben használni.',
 'allpages-bad-ns' => 'A(z) {{SITENAME}} webhelyen nincs "$1" névtér.',
+'allpages-hide-redirects' => 'Átirányítások elrejtése',
 
 # Special:Categories
 'categories' => 'Kategóriák',
index bd10818..398296a 100644 (file)
@@ -1036,6 +1036,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'difference' => '(Խմբագրումների միջև եղած տարբերությունները)',
 'lineno' => 'Տող  $1.',
 'compareselectedversions' => 'Համեմատել ընտրած տարբերակները',
+'showhideselectedversions' => 'Ցուցադրել/թաքցնել ընտրված խմբագրումները',
 'editundo' => 'հետ շրջել',
 'diff-multi' => '({{PLURAL:$1|$1 միջանկյալ տարբերակ|$1 միջանկյալ տարբերակ}} ցուցադրված չէ։)',
 
index a0ff026..79afc4a 100644 (file)
@@ -943,6 +943,10 @@ Iste parametros ha essite omittite.",
 'parser-template-loop-warning' => 'Recursion infinite detegite in patrono: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limite de recursion del patrono excedite ($1)',
 'language-converter-depth-warning' => 'Limite de profunditate del conversor de lingua excedite ($1)',
+'node-count-exceeded-category' => 'Paginas in que le numero de nodos excede le limite',
+'node-count-exceeded-warning' => 'Le numero de nodos in iste pagina excede le limite',
+'expansion-depth-exceeded-category' => 'Paginas in que le profunditate de expansion excede le limite',
+'expansion-depth-exceeded-warning' => 'Le profunditate de expansion in iste pagina excede le limite',
 
 # "Undo" feature
 'undo-success' => 'Le modification pote esser disfacite.
index a61bf30..de93a0d 100644 (file)
@@ -924,6 +924,7 @@ Ef þetta leysir ekki vandamálið, reyndu að [[Special:UserLogout|skrá þig 
 Þetta getur gerst þegar þú notar bilaðan vafra eða ónafngreinda vefsels þjónustu.",
 'edit_form_incomplete' => "'''Sumir hlutar breytingarinnar bárust ekki til vefþjónsins; athugaðu hvort breytingin þín er óbreytt og reyndu aftur.'''",
 'editing' => 'Breyti $1',
+'creating' => 'Skapa $1',
 'editingsection' => 'Breyti $1 (hluta)',
 'editingcomment' => 'Breyti $1 (nýr hluti)',
 'editconflict' => 'Breytingaárekstur: $1',
@@ -3313,7 +3314,7 @@ Póstþjónninn skilaði: $1',
 'confirmemail_success' => 'Netfang þitt hefur verið staðfest. Þú getur nú [[Special:UserLogin|skráð þig inn]] og vafrað um wiki-kerfið.',
 'confirmemail_loggedin' => 'Netfang þitt hefur verið staðfest.',
 'confirmemail_error' => 'Eitthvað fór úrskeiðis við vistun staðfestingarinnar.',
-'confirmemail_subject' => '{{SITENAME}} netfangs-staðfesting',
+'confirmemail_subject' => 'Staðfesting netfangs á {{SITENAME}}',
 'confirmemail_body' => 'Einhver, sennilega þú, með vistfangið $1 hefur skráð sig á {{SITENAME}} undir notandanafninu „$2“ og gefið upp þetta netfang.
 
 Til að staðfesta að það hafi verið þú sem skráðir þig undir þessu nafni, og til þess að virkja póstsendingar í gegnum {{SITENAME}}, skaltu opna þennan tengil í vafranum þínum:
index 8e00feb..21234f5 100644 (file)
@@ -1012,6 +1012,10 @@ Alcuni template non verranno inclusi.",
 'parser-template-loop-warning' => 'Rilevato loop del template: [[$1]]',
 'parser-template-recursion-depth-warning' => 'È stato raggiunto il limite di ricorsione nel template ($1)',
 'language-converter-depth-warning' => 'Limite di profondità del convertitore di lingua superato ($1)',
+'node-count-exceeded-category' => 'Pagine dove viene superato il numero di nodi',
+'node-count-exceeded-warning' => 'Questa pagina ha superato il numero di nodi',
+'expansion-depth-exceeded-category' => 'Pagine dove viene superata la profondità di espansione',
+'expansion-depth-exceeded-warning' => 'Questa pagina ha superato la profondità di espansione',
 
 # "Undo" feature
 'undo-success' => 'Questa modifica può essere annullata. Verificare il confronto presentato di seguito per accertarsi che il contenuto corrisponda a quanto desiderato e quindi salvare le modifiche per completare la procedura di annullamento.',
@@ -3645,6 +3649,9 @@ Questo programma deve essere distribuito assieme ad [{{SERVER}}{{SCRIPTPATH}}/CO
 'version-software' => 'Software installato',
 'version-software-product' => 'Prodotto',
 'version-software-version' => 'Versione',
+'version-entrypoints' => 'URL di accesso',
+'version-entrypoints-header-entrypoint' => 'Punti di accesso',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Percorso di un file',
index eeec5f1..24caf81 100644 (file)
@@ -1134,7 +1134,7 @@ IP アドレスは複数の利用者で共有されている場合がありま
 'sectioneditnotsupported-text' => 'このページでは節単位編集はサポートされません。',
 'permissionserrors' => '認証エラー',
 'permissionserrorstext' => 'あなたにはこの操作を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:',
-'permissionserrorstext-withaction' => 'あなたには$2を行う権限がありません。{{PLURAL:$1|理由}}は以下の通りです:',
+'permissionserrorstext-withaction' => 'あなたには「$2」を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:',
 'recreate-moveddeleted-warn' => "'''警告:以前削除されたページを再作成しようとしています。'''
 
 このページの編集を続行するのが適切かどうか確認してください。
@@ -1164,11 +1164,15 @@ IP アドレスは複数の利用者で共有されている場合がありま
 これらの値は省略されました。",
 'post-expand-template-argument-category' => '省略されたテンプレート引数を含むページ',
 'parser-template-loop-warning' => 'テンプレートのループが検出されました:[[$1]]',
-'parser-template-recursion-depth-warning' => 'テンプレートの再帰深さ($1)が上限値を超えました',
-'language-converter-depth-warning' => '言語変換機能が深度制限($1)を超えました',
+'parser-template-recursion-depth-warning' => 'テンプレートの再帰の深さ($1)が上限を超えました',
+'language-converter-depth-warning' => '言語変換機能の深さ($1)が制限を超えました',
+'node-count-exceeded-category' => 'ノード数が制限を超えたページ',
+'node-count-exceeded-warning' => 'ページがノード数の制限を超えました',
+'expansion-depth-exceeded-category' => '展開の深さ制限を超えたページ',
+'expansion-depth-exceeded-warning' => 'ページが展開の深さ制限を超えました',
 
 # "Undo" feature
-'undo-success' => 'ã\81\93ã\81®ç·¨é\9b\86ã\82\92å\8f\96ã\82\8aæ¶\88ã\81\99ã\81\93ã\81¨ã\81\8cã\81§ã\81\8dます。
+'undo-success' => 'ã\81\93ã\81®ç·¨é\9b\86ã\82\92å\8f\96ã\82\8aæ¶\88ã\81\9bます。
 下記の差分を確認し、本当に取り消すべきだと確認してから、変更を保存して取り消しを完了してください。',
 'undo-failure' => '中間の版での編集と競合したため、取り消せませんでした。',
 'undo-norev' => '取り消そうとした編集が存在しないか削除済みのため取り消せませんでした。',
@@ -1195,7 +1199,7 @@ $3が示した理由は ''$2'' です。",
 'last' => '前',
 'page_first' => '先頭',
 'page_last' => '末尾',
-'histlegend' => "差分の選択:比較したい版のラジオボタンを選択し、エンターキーを押すか、下部のボタンを押します。<br />
+'histlegend' => "差分の選択:比較したい版のラジオボタンを選択し、Enterキーを押すか、下部のボタンを押します。<br />
 凡例:'''({{int:cur}})'''=最新版との比較、'''({{int:last}})'''=直前の版との比較、'''{{int:minoreditletter}}'''=細部の編集",
 'history-fieldset-title' => '履歴の閲覧',
 'history-show-deleted' => '削除済みのみ',
@@ -1428,7 +1432,7 @@ $1",
 'qbsettings-fixedright' => '右端',
 'qbsettings-floatingleft' => 'ウィンドウの左上に固定',
 'qbsettings-floatingright' => 'ウィンドウの右上に固定',
-'qbsettings-directionality' => 'あなたの言語のスクリプトの方向に応じて固定',
+'qbsettings-directionality' => 'あなたの言語の文字体系の書字方向に応じて固定',
 
 # Preferences page
 'preferences' => '個人設定',
@@ -1446,7 +1450,7 @@ $1",
 'prefs-personal' => '利用者情報',
 'prefs-rc' => '最近の更新',
 'prefs-watchlist' => 'ウォッチリスト',
-'prefs-watchlist-days' => 'ウォッチリストの表示数:',
+'prefs-watchlist-days' => 'ウォッチリストの表示数:',
 'prefs-watchlist-days-max' => '最大 $1 {{PLURAL:$1|日間}}',
 'prefs-watchlist-edits' => '拡張ウォッチリストの表示件数:',
 'prefs-watchlist-edits-max' => '最大数:1000',
@@ -1600,38 +1604,38 @@ HTMLタグを見直してください。',
 # Rights
 'right-read' => 'ページを閲覧',
 'right-edit' => 'ページを編集',
-'right-createpage' => '(議論ページ以外の)ページを作成',
+'right-createpage' => 'ページ(議論ページ以外)を作成',
 'right-createtalk' => '議論ページを作成',
 'right-createaccount' => '新しい利用者アカウントを作成',
 'right-minoredit' => '細部の編集の印を付ける',
 'right-move' => 'ページの移動',
 'right-move-subpages' => '下位ページを含めてページを移動',
-'right-move-rootuserpages' => 'å\88©ç\94¨è\80\85ã\83\9aã\83¼ã\82¸æ\9c¬ä½\93ã\81®移動',
+'right-move-rootuserpages' => 'å\88©ç\94¨è\80\85ã\83\9aã\83¼ã\82¸æ\9c¬ä½\93ã\82\92移動',
 'right-movefile' => 'ファイルの移動',
 'right-suppressredirect' => 'ページの移動の際に元のページ名からのリダイレクトを作成しない',
-'right-upload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
-'right-reupload' => '存在するファイルの上書き',
-'right-reupload-own' => '自らがアップロードした存在するファイルの上書き',
+'right-upload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82\92アップロード',
+'right-reupload' => '既存のファイルに上書き',
+'right-reupload-own' => '自分がアップロードした既存のファイルに上書き',
 'right-reupload-shared' => '共有メディアリポジトリ上のファイルのローカルでの上書き',
-'right-upload_by_url' => 'URLã\81\8bã\82\89ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
+'right-upload_by_url' => 'URLã\81\8bã\82\89ã\83\95ã\82¡ã\82¤ã\83«ã\82\92アップロード',
 'right-purge' => '確認を省略してサイトのキャッシュを破棄',
 'right-autoconfirmed' => '半保護されたページを編集',
-'right-bot' => '自動処理として認識',
+'right-bot' => '自動処理と認識させる',
 'right-nominornewtalk' => '議論ページへ細部の編集をしたときに、新しいメッセージのお知らせを表示しない',
 'right-apihighlimits' => 'API要求でより高い制限値の使用',
 'right-writeapi' => '書き込みAPIの使用',
 'right-delete' => 'ページの削除',
-'right-bigdelete' => '大ã\81\8dã\81ªå±¥æ­´ã\81®ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81®削除',
+'right-bigdelete' => '大ã\81\8dã\81ªå±¥æ­´ã\81\8cã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\82\92削除',
 'right-deleterevision' => 'ページの特定の版の削除と復帰',
-'right-deletedhistory' => '関連する本文を除く、削除された履歴項目の閲覧',
-'right-deletedtext' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fæ\9c¬æ\96\87ã\81¨å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fç\89\88é\96\93ã\81®å·®å\88\86ã\81®閲覧',
-'right-browsearchive' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\81®検索',
+'right-deletedhistory' => '削除された履歴項目(関連する本文を除く)を閲覧',
+'right-deletedtext' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fæ\9c¬æ\96\87ã\81¨å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fç\89\88é\96\93ã\81®å·®å\88\86ã\82\92閲覧',
+'right-browsearchive' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\82\92検索',
 'right-undelete' => 'ページの復帰',
 'right-suppressrevision' => '管理者から隠された版の確認と復元',
-'right-suppressionlog' => 'é\9d\9eå\85¬é\96\8bè¨\98é\8c²ã\81®閲覧',
+'right-suppressionlog' => 'é\9d\9eå\85¬é\96\8bè¨\98é\8c²ã\82\92閲覧',
 'right-block' => '他の利用者の編集をブロック',
 'right-blockemail' => '利用者のメール送信をブロック',
-'right-hideuser' => 'å\88©ç\94¨è\80\85å\90\8dã\83\96ã\83­ã\83\83ã\82¯ã\81\97ã\80\81公開記録から隠す',
+'right-hideuser' => 'å\88©ç\94¨è\80\85å\90\8dã\82\92ã\83\96ã\83­ã\83\83ã\82¯ã\81\97ã\81¦公開記録から隠す',
 'right-ipblock-exempt' => 'IPブロック、自動ブロック、広域ブロックを回避',
 'right-proxyunbannable' => 'プロキシの自動ブロックを回避',
 'right-unblockself' => '自分自身に対するブロックを解除',
@@ -1645,18 +1649,18 @@ HTMLタグを見直してください。',
 'right-markbotedits' => '巻き戻しをボットの編集として扱う',
 'right-noratelimit' => '速度制限を受けない',
 'right-import' => '他のウィキからのページ取り込み',
-'right-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\8bã\82\89ã\81®ã\83\9aã\83¼ã\82¸ã\81®取り込み',
+'right-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81«ã\82\88ã\82\8bã\83\9aã\83¼ã\82¸取り込み',
 'right-patrol' => '他人の編集を巡回済みにする',
 'right-autopatrol' => '自分の編集を自動的に巡回済みにする',
 'right-patrolmarks' => '最近の更新で巡回済み印を閲覧',
-'right-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\81®閲覧',
+'right-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\82\92閲覧',
 'right-mergehistory' => 'ページ履歴の統合',
 'right-userrights' => '全利用者権限を編集',
 'right-userrights-interwiki' => '他のウィキの利用者の利用者権限を編集',
 'right-siteadmin' => 'データベースのロックおよびロック解除',
 'right-override-export-depth' => 'リンク先ページを5階層まで含めて書き出す',
 'right-sendemail' => '他の利用者にメールを送信',
-'right-passwordreset' => 'パスワード再設定メールを閲覧する',
+'right-passwordreset' => 'パスワード再設定メールを閲覧',
 
 # User rights log
 'rightslog' => '利用者権限変更記録',
@@ -1676,7 +1680,7 @@ HTMLタグを見直してください。',
 'action-move-subpages' => 'このページと下位ページの移動',
 'action-move-rootuserpages' => '利用者ページ本体の移動',
 'action-movefile' => 'このファイルの移動',
-'action-upload' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
+'action-upload' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\82\92アップロード',
 'action-reupload' => 'この既存のファイルに上書き',
 'action-reupload-shared' => '共有リポジトリにあるこのファイルに上書き',
 'action-upload_by_url' => 'URLからこのファイルをアップロード',
@@ -1685,17 +1689,17 @@ HTMLタグを見直してください。',
 'action-deleterevision' => 'この版を削除',
 'action-deletedhistory' => 'このページの削除履歴を表示',
 'action-browsearchive' => '削除されたページの検索',
-'action-undelete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®復帰',
+'action-undelete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92復帰',
 'action-suppressrevision' => '隠された版の確認と復元',
 'action-suppressionlog' => 'この非公開記録の表示',
 'action-block' => 'この利用者の編集をブロック',
 'action-protect' => 'このページの保護レベルを変更',
 'action-rollback' => '特定ページを最後に編集した利用者の編集を即時巻き戻し',
 'action-import' => 'このページを他のウィキから取り込む',
-'action-importupload' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\8bã\82\89取り込む',
+'action-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«取り込む',
 'action-patrol' => '他の利用者の編集を巡回済みにする',
 'action-autopatrol' => '自身の編集を巡回済みにする',
-'action-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\81®表示',
+'action-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\82\92表示',
 'action-mergehistory' => 'このページの履歴を統合',
 'action-userrights' => '全利用者権限の変更',
 'action-userrights-interwiki' => '他のウィキ上の利用者の利用者権限変更',
@@ -2954,7 +2958,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'export-addnstext' => '名前空間からページを追加:',
 'export-addns' => '追加',
 'export-download' => 'ファイルとして保存',
-'export-templates' => 'ã\83\86ã\83³ã\83\97ã\83¬ã\83¼ã\83\88ã\82\82含める',
+'export-templates' => 'ã\83\86ã\83³ã\83\97ã\83¬ã\83¼ã\83\88ã\82\92含める',
 'export-pagelinks' => '以下の階層までのリンク先ページを含める:',
 
 # Namespace 8 related
@@ -3068,7 +3072,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'tooltip-pt-logout' => 'ログアウト',
 'tooltip-ca-talk' => '本文ページについての議論',
 'tooltip-ca-edit' => 'このページを編集できます。保存する前にプレビューボタンを使用してください。',
-'tooltip-ca-addsection' => '新しい節を開始する',
+'tooltip-ca-addsection' => '新しい節を開始',
 'tooltip-ca-viewsource' => 'このページは保護されています。
 ページのソースを閲覧できます。',
 'tooltip-ca-history' => 'このページの過去の版',
@@ -3110,7 +3114,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'tooltip-ca-nstab-template' => 'テンプレートを表示',
 'tooltip-ca-nstab-help' => 'ヘルプページを表示',
 'tooltip-ca-nstab-category' => 'カテゴリページを閲覧',
-'tooltip-minoredit' => 'ã\81\93ã\81®ç·¨é\9b\86ã\82\92ç´°é\83¨ã\81®å¤\89æ\9b´ã\81¨ã\83\9eã\83¼ã\82¯',
+'tooltip-minoredit' => 'ã\81\93ã\81®ç·¨é\9b\86ã\81«ç´°é\83¨ã\81®å¤\89æ\9b´ã\81®å\8d°ã\82\92ä»\98ã\81\91ã\82\8b',
 'tooltip-save' => '変更を保存',
 'tooltip-preview' => '変更をプレビューで確認できます。保存前に使用してください!',
 'tooltip-diff' => '文章への変更を表示',
@@ -3860,7 +3864,7 @@ $5
 'colon-separator' => ':',
 'pipe-separator' => '&#32;|&#32;',
 'word-separator' => '',
-'parentheses' => '($1)',
+'parentheses' => '($1)',
 
 # Multipage image navigation
 'imgmultipageprev' => '&larr;前ページ',
index 0a317eb..0eb091e 100644 (file)
@@ -852,7 +852,7 @@ $2
 'token_suffix_mismatch' => "'''თქვენი შესწორება გაუქმდა რადგანაც პროგრამა არასწორედ აღიქვამს პუნქტუაციის ნიშნებს რედაქტირების ფანჯარაში. შესწრება გაუქმდა სტატიის არ გაფუჭების მიზნით. შესაძლოა ეს გამოწვეულია გაფუჭებული ვებ პროქსის გამოყენებით.'''",
 'edit_form_incomplete' => "'''რედაქტირებების ნაწილმა სერვერამდე ვერ მიაღწია; გთხოვთ, შეამოწმეთ თქვენი რედაქტირებების სრულყოფილება და სცადეთ განმეორებით.'''",
 'editing' => 'რედაქტირება: $1',
-'creating' => 'იქმნება $1',
+'creating' => 'იქმნება: „$1“',
 'editingsection' => 'რედაქტირება - $1 (სექცია)',
 'editingcomment' => 'რედაქტირება: $1 (ახალი სექცია)',
 'editconflict' => 'რედაქტირების კონფლიქტი: $1',
index b07d4b6..18742c8 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author AlefZet
  * @author Alibek Kisybay
+ * @author Daniyar
  * @author GaiJin
  * @author Kaztrans
  * @author Urhixidur
@@ -369,35 +370,35 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'Тексерілген беттерді жаңа беттер тізімінде көрсетпеу',
 'tog-extendwatchlist' => 'Бақылау тізімді ұлғайту (барлық жарамды өзгерістерді көрсету)',
 'tog-usenewrc' => 'Кеңейтілген жуықтағы өзгерістер (JavaScript)',
-'tog-numberheadings' => 'Бас жолдарды өздіктік номірле',
-'tog-showtoolbar' => 'Өңдеу қуралдар жолағын көрсет (JavaScript)',
+'tog-numberheadings' => 'Бас жолдарды дағдылы нөмірле',
+'tog-showtoolbar' => 'Өңдеу құралдары жолағын көрсет (JavaScript)',
 'tog-editondblclick' => 'Қос шерту арқылы бетті өңдеу (JavaScript)',
 'tog-editsection' => 'Бөлімдерді [өңдеу] сілтемесімен өңдеуін қос',
 'tog-editsectiononrightclick' => 'Бөлім тақырыбын оң нұқумен өңдеуін қос (JavaScript)',
-'tog-showtoc' => 'Мазмұнын көрсет (3-тен арта бөлімі барыларға)',
-'tog-rememberpassword' => 'Ð\9aÑ\96Ñ\80генÑ\96мдÑ\96 Ð¾Ñ\81Ñ\8b ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82ерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
-'tog-watchcreations' => 'Ð\9cен Ð±Ð°Ñ\81Ñ\82аÒ\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
-'tog-watchdefault' => 'Ð\9cен Ó©Ò£Ð´ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
-'tog-watchmoves' => 'Ð\9cен Ð¶Ñ\8bлжÑ\8bÑ\82Ò\9bан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
-'tog-watchdeletion' => 'Ð\9cен Ð¶Ð¾Ð¹Ò\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
+'tog-showtoc' => 'Мазмұнын көрсет (3-тен арта бөлімі барларға)',
+'tog-rememberpassword' => 'ТÑ\96Ñ\80келгÑ\96мдÑ\96 Ð¾Ñ\81Ñ\8b Ð±Ñ\80аÑ\83зерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
+'tog-watchcreations' => 'Ð\9cен Ð±Ð°Ñ\81Ñ\82аÒ\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
+'tog-watchdefault' => 'Ð\9cен Ó©Ò£Ð´ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
+'tog-watchmoves' => 'Ð\9cен Ð¶Ñ\8bлжÑ\8bÑ\82Ò\9bан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
+'tog-watchdeletion' => 'Ð\9cен Ð¶Ð¾Ð¹Ò\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
 'tog-minordefault' => 'Әдепкіден барлық өңдемелерді шағын деп белгіле',
-'tog-previewontop' => 'Қарап шығу аумағы кірістіру орны алдында',
+'tog-previewontop' => 'Қарап шығу аумағын кірістіру орнының алдында',
 'tog-previewonfirst' => 'Бірінші өңдегенде қарап шығу',
 'tog-nocache' => 'Бет бүркемелеуін өшір',
-'tog-enotifwatchlistpages' => 'Ð\91аÒ\9bÑ\8bлаÑ\83Ñ\8bÒ£Ñ\8bздаÒ\93Ñ\8b Ð±ÐµÑ\82 Ó©Ð·Ð³ÐµÑ\80генде Ðµ-паштаға хабарлама жіберу',
+'tog-enotifwatchlistpages' => 'Ð\91аÒ\9bÑ\8bлаÑ\83Ñ\8bÒ£Ñ\8bздаÒ\93Ñ\8b Ð±ÐµÑ\82 Ó©Ð·Ð³ÐµÑ\80генде Ðµ-поштаға хабарлама жіберу',
 'tog-enotifusertalkpages' => 'Талқылауым өзгергенде маған хат жібер',
 'tog-enotifminoredits' => 'Шағын өңдеме туралы да маған хат жібер',
 'tog-enotifrevealaddr' => 'Е-поштамның мекенжайын ескерту хаттарда аш',
 'tog-shownumberswatching' => 'Бақылап тұрған қатысушылардың санын көрсет',
 'tog-oldsig' => 'Ағымдағы қолтаңбаңыз:',
-'tog-fancysig' => 'Қам қолтаңба (өздіктік сілтемесіз)',
+'tog-fancysig' => 'Қам қолтаңба (дағдылы сілтемесіз)',
 'tog-externaleditor' => 'Шеттік өңдеуішті әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
 'tog-externaldiff' => 'Шеттік айырмағышты әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
 'tog-showjumplinks' => '«Өтіп кету» қатынау сілтемелерін қос',
 'tog-uselivepreview' => 'Тура қарап шығуды қолдану (JavaScript) (Сынақтама)',
 'tog-forceeditsummary' => 'Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт',
-'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімнен жасыр',
-'tog-watchlisthidebots' => 'Бот өңдемелерін бақылау тізімнен жасыр',
+'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімінен жасыр',
+'tog-watchlisthidebots' => 'Бот өңдемелерін бақылау тізімінен жасыр',
 'tog-watchlisthideminor' => 'Шағын өңдемелерді бақылау тізімінде көрсетпеу',
 'tog-watchlisthideliu' => 'Бақылау тізіміндегі қатысушылардың өңдеулерін көрсетпеу',
 'tog-watchlisthideanons' => 'Бақылау тізіміндегі жасырын қатысушылардың өңдеулерін көрсетпеу',
@@ -416,7 +417,7 @@ $messages = array(
 # Font style option in Special:Preferences
 'editfont-style' => 'Өңдеу жолындағы қаріптің түрі',
 'editfont-default' => 'Негізгі браузер',
-'editfont-monospace' => 'Ð\9cоноенді қаріп',
+'editfont-monospace' => 'Ð\91Ñ\96Ñ\80енді қаріп',
 'editfont-sansserif' => 'Ноқатсыз қаріп',
 'editfont-serif' => 'Ноқатты қаріп',
 
@@ -499,7 +500,7 @@ $messages = array(
 'mypage' => 'Жеке бетім',
 'mytalk' => 'Талқылауым',
 'anontalk' => 'IP талқылауы',
-'navigation' => 'Ð\9dавигаÑ\86иÑ\8f',
+'navigation' => 'Ð\91аÒ\93Ñ\8bÑ\82Ñ\82аÑ\83',
 'and' => '&#32;және',
 
 # Cologne Blue skin
@@ -525,7 +526,7 @@ $messages = array(
 'vector-view-edit' => 'Өңдеу',
 'vector-view-history' => 'Тарихы',
 'vector-view-view' => 'Оқу',
-'vector-view-viewsource' => 'Қайнар көзін қарау',
+'vector-view-viewsource' => 'Қайнарын қарау',
 'actions' => 'Әрекеттер',
 'namespaces' => 'Есім кеңістігі',
 'variants' => 'Нұсқалар',
@@ -535,7 +536,7 @@ $messages = array(
 'tagline' => '{{SITENAME}} жобасынан',
 'help' => 'Анықтама',
 'search' => 'Іздеу',
-'searchbutton' => 'Іздеу',
+'searchbutton' => 'Іздеу...',
 'go' => 'Өту',
 'searcharticle' => 'Өту',
 'history' => 'Бет тарихы',
@@ -564,7 +565,7 @@ $messages = array(
 'specialpage' => 'Арнайы бет',
 'personaltools' => 'Жеке құралдар',
 'postcomment' => 'Жаңа бөлім',
-'articlepage' => 'Мағлұмат бетін қарау',
+'articlepage' => 'Мәлімет бетін қарау',
 'talk' => 'Талқылау',
 'views' => 'Көрініс',
 'toolbox' => 'Құралдар',
@@ -583,22 +584,22 @@ $messages = array(
 'viewcount' => 'Бұл бет $1 рет қатыналған.',
 'protectedpage' => 'Қорғалған бет',
 'jumpto' => 'Мында өту:',
-'jumptonavigation' => 'шарлау',
+'jumptonavigation' => 'Бағыттау',
 'jumptosearch' => 'іздеу',
-'view-pool-error' => 'Кешіріңіз, қазір серверлер шектен тыс жүктеулі.
+'view-pool-error' => 'Кешіріңіз, қазір серверлер шектен тыс жүктелуде.
 Осы бетті қарауға өте көп сұраныс жасалды.
-Өтініш,  күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.
+Өтініш, күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.
 
 $1',
 'pool-timeout' => 'Бұғатталу уақытын күту мерзімі өтті',
-'pool-queuefull' => 'Сұранымдар жинақтауышы толы',
+'pool-queuefull' => 'Сұранымдар жинақтауышысы толық',
 'pool-errorunknown' => 'Белгісіз қате',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{SITENAME}} туралы',
 'aboutpage' => 'Project:Жоба туралы',
-'copyright' => 'Мағлұмат $1 шартымен жетімді.',
-'copyrightpage' => '{{ns:project}}:Авторлық құқықтар',
+'copyright' => 'Мәлімет $1 шартымен жетімді.',
+'copyrightpage' => '{{ns:project}}:Ауторлық құқықтар',
 'currentevents' => 'Ағымдағы оқиғалар',
 'currentevents-url' => 'Project:Ағымдағы оқиғалар',
 'disclaimers' => 'Жауапкершіліктен бас тарту',
@@ -615,31 +616,31 @@ $1',
 'privacypage' => 'Project:Жеке құпиясын сақтау',
 
 'badaccess' => 'Рұқсат беру қатесі',
-'badaccess-group0' => 'СұÑ\80аÑ\82Ñ\8bлÒ\93ан Ó\99Ñ\80екеÑ\82Ñ\96Ò£Ñ\96здÑ\96 Ð¶ÐµÐ³Ñ\83Ñ\96Ò£Ñ\96зге рұқсат етілмейді.',
+'badaccess-group0' => 'СұÑ\80аÑ\82Ñ\8bлÒ\93ан Ó\99Ñ\80екеÑ\82Ñ\96Ò£Ñ\96здÑ\96 Ð¾Ñ\80Ñ\8bндаÑ\83Ò\93а рұқсат етілмейді.',
 'badaccess-groups' => 'Аталған әрекетті тек {{PLURAL:$2|топтардың|топтың}} $1 қатысушылары ғана атқара алады.',
 
 'versionrequired' => 'MediaWiki $1 нұсқасы керек',
 'versionrequiredtext' => 'Бұл бетті қолдану үшін MediaWiki $1 нұсқасы керек. [[Special:Version|Жүйе нұсқасы бетін]] қараңыз.',
 
-'ok' => 'OK',
+'ok' => 'Жарайды',
 'pagetitle' => '$1 — {{SITENAME}}',
 'retrievedfrom' => '«$1» бетінен алынған',
 'youhavenewmessages' => 'Сізде $1 бар ($2).',
-'newmessageslink' => 'жаңа хабарлар',
-'newmessagesdifflink' => 'соңғы өзгерісіне',
-'youhavenewmessagesmulti' => '$1 дегенде жаңа хабарлар бар',
+'newmessageslink' => 'жаңа хабарламалар',
+'newmessagesdifflink' => 'соңғы өзгер',
+'youhavenewmessagesmulti' => '$1 дегенде жаңа хабарламалар бар',
 'editsection' => 'өңдеу',
 'editold' => 'өңдеу',
-'viewsourceold' => 'қайнар көзін қарау',
+'viewsourceold' => 'қайнарын қарау',
 'editlink' => 'өңдеу',
-'viewsourcelink' => 'қайнар көзін қарау',
-'editsectionhint' => 'Ð\9cÑ\8bна Ð±өлімді өңдеу: $1',
+'viewsourcelink' => 'қайнарын қарау',
+'editsectionhint' => 'Ð\91өлімді өңдеу: $1',
 'toc' => 'Мазмұны',
-'showtoc' => 'көрсет',
-'hidetoc' => 'жасыр',
+'showtoc' => 'көрсету',
+'hidetoc' => 'жасыру',
 'collapsible-collapse' => 'Түру',
 'collapsible-expand' => 'Жазу',
-'thisisdeleted' => '$1 қарайсыз ба, не қалпына келтіресіз бе?',
+'thisisdeleted' => '$1 қарайсыз ба, немесе қалпына келтіресіз бе?',
 'viewdeleted' => '$1 қарайсыз ба?',
 'restorelink' => 'Жойылған $1 өңдемені',
 'feedlinks' => 'Арна:',
@@ -656,21 +657,21 @@ $1',
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Мақала',
 'nstab-user' => 'Жеке бет',
-'nstab-media' => 'ТаÑ\81па беті',
+'nstab-media' => 'Ð\9cедиа беті',
 'nstab-special' => 'Арнайы бет',
 'nstab-project' => 'Жоба беті',
 'nstab-image' => 'Файл беті',
-'nstab-mediawiki' => 'Хабар',
+'nstab-mediawiki' => 'Хабарлама',
 'nstab-template' => 'Үлгі',
 'nstab-help' => 'Анықтама',
 'nstab-category' => 'Санат',
 
 # Main script and global functions
-'nosuchaction' => 'Мынадай еш әрекет жоқ',
+'nosuchaction' => 'Мұндай әрекет жоқ',
 'nosuchactiontext' => 'URL-дегі көрсетілген әрекет қате.
-Бәлкім, сіз URL теру барысында қате жібердіңіз немесе қате сілтеме бойынша өттіңіз.
+Бәлкім, Сіз URL теру барысында қате жібердіңіз немесе қате сілтеме бойынша өттіңіз.
 Бұл сондай-ақ {{SITENAME}} жобасында қателікті көрсетуі мүмкін.',
-'nosuchspecialpage' => 'Мынадай еш арнайы бет жоқ',
+'nosuchspecialpage' => 'Мұндай арнайы бет жоқ',
 'nospecialpagetext' => '<strong>Сіздің сұраған арнайы бетіңіз жоқ.</strong>
 
 Бар арнайы беттер тізімі: [[Special:SpecialPages|{{int:specialpages}}]].',
@@ -688,9 +689,9 @@ $1',
 «$1»
 мына «$2» функциясынан болды .
 Дерекқор "$3: $4" қатесін қайтарды.',
-'laggedslavemode' => 'Құлақтандыру: Бетте жуықтағы жаңалаулар болмауы мүмкін.',
+'laggedslavemode' => "'''Ескерту:''' Бетте жуықтағы жаңартулар болмауы мүмкін.",
 'readonly' => 'Дерекқоры құлыпталған',
-'enterlockreason' => 'Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз',
+'enterlockreason' => 'Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз.',
 'readonlytext' => 'Бұл дерекқор жаңадан жазу және басқа өзгерістер жасаудан ағымда құлыпталынған, мүмкін күнде-күн дерекқорды баптау үшін, бұны бітіргеннен соң қалыпты іске қайтарылады.
 
 Құлыптаған әкімші бұны былай түсіндіреді: $1',
@@ -699,13 +700,13 @@ $1',
 Бұл ескірген айырма сілтемесіне немесе жойылған бет тарихы сілтемесіне ергеннен бола береді.
 
 Егер бұл орынды болмаса, бағдарламалық жасақтамадағы қатеге тап болуыңыз мүмкін.
-Бұл туралы нақты URL жайына аңғартпа жасап, әкімшіге баянаттаңыз.',
+Бұл туралы нақты URL жайына аңғартпа жасап, [[Special:ListUsers/sysop|әкімшіге]] баяндаңыз.',
 'missingarticle-rev' => '(түзету нұсқасы: $1)',
-'missingarticle-diff' => '(Ð\90йÑ\80м.: $1, $2)',
-'readonly_lag' => 'Жетек дерекқор серверлер басқысымен қадамланғанда осы дерекқор өздіктік құлыпталынған',
+'missingarticle-diff' => '(Ð\90йÑ\8bÑ\80Ñ\8bм: $1, $2)',
+'readonly_lag' => 'Жетек дерекқор серверлер басқасымен қадамланғанда осы дерекқор өздіктік құлыпталынған',
 'internalerror' => 'Ішкі қате',
 'internalerror_info' => 'Ішкі қатесі: $1',
-'fileappenderrorread' => 'Толықтыру кезінде «$1» оқылмады',
+'fileappenderrorread' => 'Толықтыру кезінде «$1» оқылмады.',
 'fileappenderror' => '«$2» -ге  "$1" -ді қосу мүмкін болмады.',
 'filecopyerror' => '«$1» файлы «$2» файлына көшірілмеді.',
 'filerenameerror' => '«$1» файл атауы «$2» атауына өзгертілмеді.',
@@ -728,13 +729,13 @@ $1',
 'wrong_wfQuery_params' => 'wfQuery() функциясы үшін бұрыс бапталымдары бар<br />
 Жете: $1<br />
 Сұраным: $2',
-'viewsource' => 'Қайнар көзін қарау',
+'viewsource' => 'Қайнарын қарау',
 'viewsource-title' => '$1 бетінің бастапқы мәтінін қарау',
 'actionthrottled' => 'Әрекет бәсеңдетілді',
 'actionthrottledtext' => 'Спамға қарсы күрес есебінде, осы әрекетті қысқа уақытта тым көп рет орындауыңыз шектелінді, және бұл шектеу шамасынан асып кеткенсіз.
 Бірнеше минуттан қайта байқап көріңіз.',
 'protectedpagetext' => 'Өңдеуді қақпайлау үшін бұл бет құлыпталынған.',
-'viewsourcetext' => 'Бұл беттің қайнар көзін қарауыңызға және көшіріп алуыңызға болады:',
+'viewsourcetext' => 'Бұл беттің қайнарын қарауыңызға және көшіріп алуыңызға болады:',
 'viewyourtext' => 'Осы бет арқылы "өзіңіз жасаған өңдеулердің" бастапқы мәтінін көруге және көшіруге мүмкіндігіңіз болады.',
 'protectedinterface' => 'Бұл бет бағдарламалық жасақтаманың тілдесу мәтінін жетістіреді, сондықтан қиянатты қақпайлау үшін өзгертуі құлыпталған.',
 'editinginterface' => "'''Құлақтандыру:''' Бағдарламалық жасақтаманың тілдесу мәтінін жетістіретін бетін өңдеп жатырсыз.
@@ -749,6 +750,8 @@ $2',
 'ns-specialprotected' => '{{ns:special}} есім аясындағы беттер өңделінбейді',
 'titleprotected' => "Бұл тақырып аты бастаудан [[{{ns:user}}:$1|$1]] қорғады.
 Келтірілген себебі: ''$2''.",
+'filereadonlyerror' => "«$2» сақтамасы «тек қана оқу» тәртіптемесінде тұрғасын, «$1» файлын өзгерту мүмкін емес.
+Бұл тәртіптемені қондырған әкімші келесі түсіндірмені қалдырды: «''$3''»",
 
 # Virus scanner
 'virus-badscanner' => 'Баптау қателігі. Белгісіз вирус сканері: $1',
@@ -758,15 +761,15 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Жүйеден шықтыңыз.'''
 
-Жүйеге кірместен де {{SITENAME}} жобасын пайдалана аласыз; немесе баяғы не өзге қатысушы ретінде жүйеге [[Special:UserLogin|қайта кіруіңізге]] болады.
-Аңғартпа: Кейбір беттер шолғышыңыздың кешін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкін.",
+Жүйеге кірместен де {{SITENAME}} жобасын пайдалана аласыз, немесе баяғы не өзге қатысушы ретінде жүйеге [[Special:UserLogin|қайта кіруіңізге]] болады.
+Аңғартпа: Кейбір беттер шолғышыңыздың кэшін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкін.",
 'welcomecreation' => '== Қош келдіңіз, $1! ==
 Жаңа тіркелгіңіз жасалды.
 Өзіңіздің [[Special:Preferences|жеке баптауларыңызды]] өзгертуді ұмытпаңыз.',
-'yourname' => 'Қатысушы атыңыз:',
-'yourpassword' => 'Құпия сөзіңіз:',
+'yourname' => 'Қатысушы аты:',
+'yourpassword' => 'Құпия сөз:',
 'yourpasswordagain' => 'Құпия сөзді қайталаңыз:',
-'remembermypassword' => 'Ð\9cенÑ\96Ò£ ÐºÑ\96Ñ\80генÑ\96мдÑ\96 Ð±Ò±Ð» ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82ерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
+'remembermypassword' => 'ТÑ\96Ñ\80келгÑ\96мдÑ\96 Ð¾Ñ\81Ñ\8b Ð±Ñ\80аÑ\83зерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
 'securelogin-stick-https' => 'Кіргеннен кейін HTTPS бойынша байланысты жалғастыру',
 'yourdomainname' => 'Желі үйшігіңіз:',
 'externaldberror' => 'Осы арада не шеттік растау дерекқорында қате болды, немесе шеттік тіркелгіңізді жаңалау рұқсаты жоқ.',
@@ -778,18 +781,19 @@ $2',
 'logout' => 'Шығу',
 'userlogout' => 'Шығу',
 'notloggedin' => 'Кірмегенсіз',
-'nologin' => "Ð\90ккаÑ\83нÑ\82Ñ\8bÒ£Ñ\8bз бар ма? '''$1'''.",
+'nologin' => "ТÑ\96Ñ\80келгÑ\96Ò£Ñ\96з бар ма? '''$1'''.",
 'nologinlink' => 'Тіркеліңіз',
 'createaccount' => 'Жаңа тіркелгі',
 'gotaccount' => "Бұған дейін тіркеліп пе едіңіз бе? '''$1'''.",
 'gotaccountlink' => 'Кіріңіз',
 'userlogin-resetlink' => 'Қатысушы атын не құпия сөзді ұмыттыңыз ба?',
-'createaccountmail' => 'е-поштамен',
+'createaccountmail' => 'Ð\95-поштамен',
 'createaccountreason' => 'Себебі:',
-'badretype' => 'Енгізген құпия сөздеріңіз бір біріне сәйкес емес.',
+'badretype' => 'Енгізген құпия сөздеріңіз бір-біріне сәйкес емес.',
 'userexists' => 'Енгізген қатысушы атыңыз әлдеқашан пайдалануда.
 Өзге атауды таңдаңыз.',
 'loginerror' => 'Кіру қатесі',
+'createaccounterror' => 'Тіркелгіні жасау мүмкін емес: $1',
 'nocookiesnew' => 'Жаңа қатысушы тіркелгісі жасалды, бірақ кірмегенсіз.
 Қатысушы кіру үшін {{SITENAME}} торабында «cookie» файлдары қолданылады.
 Сізде «cookies» өшірілген.
@@ -797,27 +801,30 @@ $2',
 'nocookieslogin' => 'Қатысушы кіру үшін {{SITENAME}} торабында «cookies» деген қолданылады.
 Сізде «cookies» өшірілген.
 Соны қосыңыз да кіруді қайта байқап көріңіз.',
+'nocookiesfornew' => 'Оның қайнарын растай алмағандықтан қатысушының аккаунты тіркелмеді. «Cookies» қосылып тұрғанына көз жеткізіңіз, бетті қайта жаңартыңыз және тағы байқап көріңіз.',
 'noname' => 'Жарамды қатысушы атын енгізбедіңіз.',
 'loginsuccesstitle' => 'Кіруіңіз сәтті өтті',
 'loginsuccess' => "'''Сіз енді {{SITENAME}} жобасына «$1» ретінде кіріп отырсыз.'''",
-'nosuchuser' => 'Мында «$1» деп аталған қатысушы жоқ.
-Емлеңізді тексеріңіз, не жаңа тіркелгі жасаңыз.',
+'nosuchuser' => '«$1» деген қатысушы тіркелмеген.
+Емлеңізді тексеріңіз, немесе жаңа тіркелгі жасаңыз.',
 'nosuchusershort' => 'Мында «$1» деп аталған қатысушы жоқ.
 Емлеңізді тексеріңіз.',
 'nouserspecified' => 'Қатысушы атын келтіруіңіз жөн.',
+'login-userblocked' => 'Бұл қатысушы бұғатталған. Жүйеге кiру рұқсат етiлмеген.',
 'wrongpassword' => 'Бұрыс құпия сөз енгізілген. Қайта байқап көріңіз.',
 'wrongpasswordempty' => 'Құпия сөз бос болған. Қайта байқап көріңіз.',
-'passwordtooshort' => 'Құпия сөзіңіз жарамсыз не тым қысқа.
+'passwordtooshort' => 'Құпия сөзіңіз жарамсыз немесе тым қысқа.
 Бұнда ең кемінде $1 таңба болуы және де қатысушы атыңыздан өзге болуы жөн.',
+'password-name-match' => 'Енгізген құпия сөзіңіз қатысушы атынан өзгеше болуы қажет.',
+'password-login-forbidden' => 'Бұл қатысушы аты мен құпия сөзін пайдалануға тыйым салынған.',
 'mailmypassword' => 'Құпия сөзімді электронды поштама жібер',
 'passwordremindertitle' => '{{SITENAME}} үшін жаңа уақытша құпия сөз',
-'passwordremindertext' => 'Кейбіреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз)
-сізге {{SITENAME}} үшін жаңа құпия сөз жөнелетуін бізден сұраған ($4).
-«$2» қатысушының құпия сөзі «$3» болды енді.
-Қазір кіруіңіз және құпия сөзді өзгертуіңіз керек.
+'passwordremindertext' => 'Біреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз) {{SITENAME}} үшін жаңа құпия сөз жөнелету сұранымын жасаған ($4).
+Қатысушы «$2» үшін уақытша құпия сөз жасалды: «$3». Егер бұл Сіздің сұранымыңыз болса, жүйеге кіріп құпия сөзді өзгертуіңіз керек. Сіздің уақытша құпия сөзіңіз $5 дейін белсенді болады.
 
\95геÑ\80 Ð±Ò±Ð» Ñ\81Ò±Ñ\80анÑ\8bмдÑ\8b Ð±Ð°Ñ\81Ò\9bа Ð±Ñ\96Ñ\80еÑ\83 Ñ\96Ñ\81Ñ\82еÑ\81е, Ð½Ðµ Ò\9bұпиÑ\8f Ñ\81өздÑ\96 ÐµÑ\81ке Ñ\82Ò¯Ñ\81Ñ\96Ñ\80Ñ\81Ñ\96п ÐµÐ½Ð´Ñ\96 Ó©Ð·Ð³ÐµÑ\80Ñ\82кÑ\96Ò£Ñ\96з ÐºÐµÐ»Ð¼ÐµÑ\81е, ÐµÑ\81кÑ\96 Ò\9bұпиÑ\8f Ñ\81өз Ò\9bолданÑ\83Ñ\8bн Ð¶Ð°ғастырып осы хатқа аңғармауыңызға да болады.',
\95геÑ\80 Ð±Ò±Ð» Ñ\81Ò±Ñ\80анÑ\8bмдÑ\8b Ð¡Ñ\96з Ð¶Ð°Ñ\81амаÑ\81Ñ\8bÒ£Ñ\8bз, Ð½Ðµ Ò\9bұпиÑ\8f Ñ\81өздÑ\96 ÐµÑ\81ке Ñ\82Ò¯Ñ\81Ñ\96Ñ\80Ñ\96п ÐµÐ½Ð´Ñ\96 Ó©Ð·Ð³ÐµÑ\80Ñ\82кÑ\96Ò£Ñ\96з ÐºÐµÐ»Ð¼ÐµÑ\81е, ÐµÑ\81кÑ\96 Ò\9bұпиÑ\8f Ñ\81өздÑ\96 Ò\9bолданÑ\83дÑ\8b Ð¶Ð°Ð»ғастырып осы хатқа аңғармауыңызға да болады.',
 'noemail' => 'Осы арада «$1» қатысушының е-пошта мекенжайы жоқ.',
+'noemailcreate' => 'Сізге нақты электрондық пошта есімін көрсету керек.',
 'passwordsent' => 'Жаңа құпия сөз «$1» үшін тіркелген е-пошта мекенжайына жөнелтілді.
 Қабылдағаннан кейін кіргенде соны енгізіңіз.',
 'blocked-mailpassword' => 'IP мекенжайыңыздан өңдеу бұғатталған, сондықтан қиянатты қақпайлау үшін құпия сөзді қалпына келтіру жетесін қолдануына рұқсат етілмейді.',
@@ -826,15 +833,17 @@ $2',
 'throttled-mailpassword' => 'Соңғы {{PLURAL:$1|сағатта|$1 сағатта}} құпия сөз ескерту хаты алдақашан жөнелтілді.
 Қиянатты қақпайлау үшін, {{PLURAL:$1|сағат|$1 сағат}} сайын тек бір ғана құпия сөз ескерту хаты жөнелтіледі.',
 'mailerror' => 'Хат жөнелту қатесі: $1',
-'acct_creation_throttle_hit' => 'Ғафу етіңіз, сіз алдақашан $1 рет тіркелгі жасапсыз.
\9eнан Ð°Ñ\80Ñ\82Ñ\8bÒ\9b Ñ\96Ñ\81Ñ\82ей Ð°Ð»Ð¼Ð°Ð¹Ñ\81Ñ\8bз.',
+'acct_creation_throttle_hit' => 'Ғафу етіңіз, сіз алдақашан $1 рет тіркелгі жасапсыз. Онан артық жасай алмайсыз.
\9dÓ\99Ñ\82ижеÑ\81Ñ\96нде, Ð¾Ñ\81Ñ\8b IP-мекенжаймен ÐºÑ\96Ñ\80Ñ\83Ñ\88Ñ\96леÑ\80 Ð´Ó\99л Ò\9bазÑ\96Ñ\80гÑ\96 Ñ\83аÒ\9bÑ\8bÑ\82Ñ\82а Ð±Ñ\96Ñ\80неÑ\88е Ñ\82Ñ\96Ñ\80келгÑ\96 Ð¶Ð°Ñ\81ай Ð°Ð»Ð¼Ð°Ð¹Ð´Ñ\8b.',
 'emailauthenticated' => 'Е-пошта мекенжайыңыз расталған кезі: $3, $2.',
 'emailnotauthenticated' => 'Е-пошта мекенжайыңыз әлі расталған жоқ.
 Келесі әрбір мүмкіндіктер үшін еш хат жөнелтілмейді.',
 'noemailprefs' => 'Осы мүмкіндіктер істеуі үшін е-пошта мекенжайыңызды енгізіңіз.',
 'emailconfirmlink' => 'Е-пошта мекенжайыңызды құптаңыз',
-'invalidemailaddress' => 'Осы е-пошта мекенжайында жарамсыз пішім болған, қабыл етілмейді.
-Дұрыс пішімделген мекенжайды енгізіңіз, не аумақты бос қалдырыңыз.',
+'invalidemailaddress' => 'Бұл е-пошта есімі пішімге сәйкес келмегендіктен қабылданбайды.
+Дұрыс пішімделген е-пошта есімін енгізіңіз, немесе аумақты бос қалдырыңыз.',
+'cannotchangeemail' => 'Тіркелгінің е-поштасының мекен-жайы бұл уикиде өзгертілмейді.',
+'emaildisabled' => 'Бұл сайт е-поштаның хабарламасын жібере алмайды.',
 'accountcreated' => 'Жаңа тіркелгі жасалды',
 'accountcreatedtext' => '$1 үшін жаңа қатысушы тіркелгісі жасалды.',
 'createaccount-title' => '{{SITENAME}} үшін тіркелу',
@@ -842,7 +851,15 @@ $2',
 Жобаға кіріуіңіз және құпия сөзіңізді өзгертуіңіз тиісті.
 
 Егер бұл тіркелгі қателікпен жасалса, осы хабарға елемеуіңіз мүмкін.',
+'usernamehasherror' => 'Қатысушы есіміне тор белгі нышаны енгізілмейді.',
+'login-throttled' => 'Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз. Өтінемін, қайта кірмес бұрын кішкене күте тұрыңыз.',
+'login-abort-generic' => 'Жүйеге кіру үшін сәтсіз талпыныс жасадыңыз.',
 'loginlanguagelabel' => 'Тіл: $1',
+'suspicious-userlogout' => 'Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені, бұл жарамсыз браузер немесе кэштеуші проксидің сұранымына ұқсайды.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'Mail() PHP-функциясындағы белгісіз қате.',
+'user-mail-no-addy' => 'Е-пошта есімінсіз хабарлама жіберуге талпынды.',
 
 # Change password dialog
 'resetpass' => 'Тіркелгінің құпия сөзін өзгерту',
@@ -854,11 +871,42 @@ $2',
 'retypenew' => 'Жаңа құпия сөзіңізді қайталаңыз:',
 'resetpass_submit' => 'Құпия сөзді қойыңыз да кіріңіз',
 'resetpass_success' => 'Құпия сөзіңіз сәтті өзгертілді! Енді кіріңіз…',
-'resetpass_forbidden' => '{{SITENAME}} жобасында құпия сөздер өзгертілмейді',
+'resetpass_forbidden' => 'Құпия сөз өзгертілмейді',
+'resetpass-no-info' => 'Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.',
 'resetpass-submit-loggedin' => 'Құпия сөзді өзгерту',
+'resetpass-submit-cancel' => 'Болдырмау',
+'resetpass-wrong-oldpass' => 'Уақытша немесе ағымдағы құпия сөзіңіз дұрыс емес.
+Мүмкін Сіз құпия сөзді сәтті өзгерткенсіз, немесе жаңа уақытша құпия сөзге сұраным жасағансыз.',
+'resetpass-temp-password' => 'Уақытша құпия сөз:',
 
 # Special:PasswordReset
+'passwordreset' => 'Құпия сөзді қайтару',
+'passwordreset-text' => 'Сіздің тіркелгіңіздің баптаулары туралы хабарламаларды алу үшін мына пішінді толтырыңыз.',
+'passwordreset-legend' => 'Құпия сөзді қайтару',
+'passwordreset-disabled' => 'Бұл уикиде құпия сөзді қайтару ажыратылған.',
+'passwordreset-pretext' => '{{PLURAL:$1||Төменде көрсетілгендердің ішіндегі біреуін жазыңыз}}',
 'passwordreset-username' => 'Қатысушы аты:',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Келген хатты қарау керек пе?',
+'passwordreset-capture-help' => 'Егер Сіз берілген белгішені қондырсаңыз, қатысушыға жіберілетін уақытша құпия сөз жазылған хат көрсетіледі.',
+'passwordreset-email' => 'Е-поштаның мекен-жайы:',
+'passwordreset-emailtitle' => '{{SITENAME}} тіркелгісі туралы анықтама',
+'passwordreset-emailelement' => 'Қатысушы есімі: $1
+Уақытша құпия сөз: $2',
+'passwordreset-emailsent' => 'Электронды пошта арқылы ескертпе жөнелтілді.',
+'passwordreset-emailsent-capture' => 'Жөнелтілген ескертпе-хат төменде көрсетілген.',
+'passwordreset-emailerror-capture' => 'Жазылған ескертпе-хат төменде көрсетілген, оның жөнелтілмеу себебі: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Е-пошта мекен-жайын өзгерту',
+'changeemail-header' => 'Е-пошта мекен-жайының өзгертілуі',
+'changeemail-text' => 'Е-поштаның мекен-жайын өзгерту үшін мына пішінді толтырыңыз. Өзгертулерді растау үшін Сізге құпия сөзді енгізу керек.',
+'changeemail-no-info' => 'Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.',
+'changeemail-oldemail' => 'Е-поштаның ағымдағы мекен-жайы:',
+'changeemail-newemail' => 'Е-поштаның жаңа мекен жайы:',
+'changeemail-none' => '(ешкім)',
+'changeemail-submit' => 'Е-поштаны өзгерту',
+'changeemail-cancel' => 'Болдырмау',
 
 # Edit page toolbar
 'bold_sample' => 'Жуан мәтін',
@@ -867,7 +915,7 @@ $2',
 'italic_tip' => 'Қиғаш мәтін',
 'link_sample' => 'Сілтеме тақырыбының аты',
 'link_tip' => 'Ішкі сілтеме',
-'extlink_sample' => 'http://www.example.com сілтеме тақырыбын аты',
+'extlink_sample' => 'http://www.example.com сілтеме тақырыбының аты',
 'extlink_tip' => 'Шеттік сілтеме (алдынан http:// енгізуін ұмытпаңыз)',
 'headline_sample' => 'Бас жол мәтіні',
 'headline_tip' => '2-ші деңгейлі бас жол',
@@ -879,22 +927,23 @@ $2',
 'hr_tip' => 'Дерелей сызық (үнемді қолданыңыз)',
 
 # Edit pages
-'summary' => 'Түйіндемесі:',
+'summary' => 'Өзгертпе мазмұны:',
 'subject' => 'Тақырыбы/бас жолы:',
-'minoredit' => 'Ð\91ұл Ñ\88ағын өңдеме',
+'minoredit' => 'Шағын өңдеме',
 'watchthis' => 'Бетті бақылау',
-'savearticle' => 'Бетті сақта!',
+'savearticle' => 'Бетті сақтау',
 'preview' => 'Қарап шығу',
-'showpreview' => 'Қарап шық',
-'showlivepreview' => 'ТÑ\83Ñ\80а Ò\9bаÑ\80ап Ñ\88Ñ\8bÒ\9b',
+'showpreview' => 'Алдын ала қарау',
+'showlivepreview' => 'Ð\96Ñ\8bлдам Ò\9bаÑ\80аÑ\83',
 'showdiff' => 'Өзгерістерді көрсет',
-'anoneditwarning' => "'''Құлақтандыру:''' Сіз жүйеге кірмегенсіз.
-IP мекенжайыңыз бұл беттің түзету тарихында жазылып алынады.",
+'anoneditwarning' => "'''Ескертпе:''' Сіз жүйеге кірмегенсіз.
+IP-мекенжайыңыз бұл беттің түзету тарихында жазылып алынады.",
+'anonpreviewwarning' => '"Сіз жүйеге кірмегенсіз. IP-мекенжайыңыз бұл беттің түзету тарихында жазылып алынады."',
 'missingsummary' => "'''Ескертпе:''' Өңдеменің қысқаша мазмұндамасын енгізбепсіз.
 «Сақтау» түймесін тағы бассаңыз, өңденмеңіз мәндемесіз сақталады.",
 'missingcommenttext' => 'Мәндемеңізді төменде енгізіңіз.',
-'missingcommentheader' => "'''Ескертпе:''' Бұл мәндемеге тақырып/басжол жетістірмепсіз.
-Егер тағы да Сақтау түймесін нұқысаңыз, өңдемеңіз солсыз сақталады.",
+'missingcommentheader' => "'''Ескертпе:''' Өңдеменің қысқаша мазмұндамасын енгізбепсіз.
+«Сақтау» түймесін тағы бассаңыз, өңденмеңіз мәндемесіз сақталады.",
 'summary-preview' => 'Қысқаша мазмұндамасын қарап шығу:',
 'subject-preview' => 'Тақырыбын/бас жолын қарап шығу:',
 'blockedtitle' => 'Қатысушы бұғатталған',
@@ -910,26 +959,25 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 [[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын ұсынып және де оны пайдаланудан бұғатталмаған жағдайыңызда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.
 Ағымдық IP мекенжайыңыз: $3, және бұғатау нөмірі: $5.
 Сұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
-'autoblockedtext' => "$1 деген бұрын өзге қатысушы пайдаланған болғасын осы IP мекенжайыңыз өздіктік бұғатталған.
-Келтірілген себебі:
-
-:''$2''
+'autoblockedtext' => "'''Қатысушы атыңыз не IP-мекенжайыңыз бұғатталған.'''
 
-* Бұғаттау басталғаны: $8
-* Бұғаттау бітетіні: $6
-
-Осы бұғаттауды талқылау үшін $1 дегенмен, не басқа [[{{{{ns:mediawiki}}:grouppage-sysop}}|әкімшімен]] қатынасуыңызға болады.
+Осы бұғаттауды $1 істеген. Келтірілген себебі: ''$2''.
 
-Аңғартпа: [[{{#special:Preferences}}|Пайдаланушылық бапталымдарыңызды]] қолданып жарамды е-пошта мекенжайын енгізгенше дейін және бұны пайдалануы бұғатталмағанша дейін «Қатысушыға хат жазу» мүмкіндігін қолдана алмайсыз.
+* Бұғаттаудың басталғаны: $8
+* Бұғаттаудың бітетіні: $6
+* Бұғаттау нысанасы: $7
 
-Бұғатау нөміріңіз: $5.
-Бұл нөмірді әрбір сұранымыңыздарға кірістіріңіз.",
+Осы бұғаттауды талқылау үшін $1, не өзге [[{{MediaWiki:Grouppage-sysop}}|әкімшімен]] қатынасуыңызға болады.
+[[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын ұсынып және де оны пайдаланудан бұғатталмаған жағдайыңызда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.
+Ағымдық IP мекенжайыңыз: $3, және бұғатау нөмірі: $5.
+Сұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
 'blockednoreason' => 'еш себебі келтірілмеген',
 'whitelistedittext' => 'Беттерді өңдеу үшін $1 жөн.',
 'confirmedittext' => 'Беттерді өңдеу үшін алдын ала Е-пошта мекенжайыңызды құптауыңыз жөн.
 Е-пошта мекенжайыңызды [[{{#special:Preferences}}|пайдаланушылық бапталымдарыңыз]] арқылы қойыңыз да жарамдылығын тексеріп шығыңыз.',
-'nosuchsectiontitle' => 'Осындай еш бөлім жоқ',
-'nosuchsectiontext' => 'Жоқ бөлімді өңдеуді талап етіпсіз.',
+'nosuchsectiontitle' => 'Бұл бөлімді табу мүмкін емес',
+'nosuchsectiontext' => 'Сіз бұрын болмаған бөлімді өзгертпекшісіз.
+Мүмкін бұл бетті жылжытылған немесе жойылған.',
 'loginreqtitle' => 'Кіруіңіз керек',
 'loginreqlink' => 'кіру',
 'loginreqpagetext' => 'Басқа беттерді көру үшін сіз $1 болуыңыз жөн.',
@@ -947,8 +995,11 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 * <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Журналдардан бұл бетке қатысты сәйкес жазбаларды табу]</span>,
 * <span class=\"plainlinks\">'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Бұл бетті жаңадан бастау]'''</span>.",
 'userpage-userdoesnotexist' => '«<nowiki>$1</nowiki>» қатысушы тіркелгісі жазып алынбаған. Бұл бетті бастау/өңдеу талабыңызды тексеріп шығыңыз.',
-'clearyourcache' => "'''Аңғартпа:''' Сақтағаннан кейін, өзгерістерді көру үшін шолғыш бүркемесін орағыту ықтимал. '''Mozilla / Firefox / Safari:''' ''Қайта жүктеу'' батырмасын нұқығанда ''Shift'' тұтыңыз, не ''Ctrl-Shift-R'' басыңыз (Apple Mac — ''Cmd-Shift-R''); '''IE:''' ''Жаңарту'' батырмасын нұқығанда ''Ctrl'' тұтыңыз, не ''Ctrl-F5'' басыңыз; '''Konqueror:''': ''Жаңарту'' батырмасын жай нұқыңыз, не ''F5'' басыңыз; '''Opera''' пайданушылары ''Құралдар→Бапталымдар'' дегенге барып бүркемесін толық тазарту жөн.",
-'usercssyoucanpreview' => "'''Ақыл-кеңес:''' Жаңа CSS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
+'userpage-userdoesnotexist-view' => '«$1» қатысушы есімі тіркелмеген.',
+'blocked-notice-logextract' => 'Бұл қатысушы қазіргі уақытта  бұғатталған.
+Төменде бұғаттау журналындағы соңғы жазбалар көрсетілген.',
+'clearyourcache' => "'''Ескертпе:''' Сақтағаннан кейін, өзгерістерді көру үшін шолғыш бүркемесін орағыту ықтимал. '''Mozilla / Firefox / Safari:''' ''Қайта жүктеу'' батырмасын нұқығанда ''Shift'' тұтыңыз, не ''Ctrl-Shift-R'' басыңыз (Apple Mac — ''Cmd-Shift-R''); '''IE:''' ''Жаңарту'' батырмасын нұқығанда ''Ctrl'' тұтыңыз, не ''Ctrl-F5'' басыңыз; '''Konqueror:''': ''Жаңарту'' батырмасын жай нұқыңыз, не ''F5'' басыңыз; '''Opera''' пайданушылары ''Құралдар→Бапталымдар'' дегенге барып бүркемесін толық тазарту жөн.",
+'usercssyoucanpreview' => "'''Кеңес:''' Жаңа CSS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
 'userjsyoucanpreview' => "'''Ақыл-кеңес:''' Жаңа JS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
 'usercsspreview' => "'''Мынау CSS мәтінін тек қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
 'userjspreview' => "'''Мынау JavaScript қатысушы бағдарламасын тексеру/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
@@ -957,6 +1008,7 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 'updated' => '(Жаңартылған)',
 'note' => "'''Аңғартпа:'''",
 'previewnote' => "Бұл тек '''қарап шығу''' екенін ұмытпаңыз, өзгерістер әлі сақталған жоқ!",
+'continue-editing' => 'Өңдемені жалғастыру',
 'previewconflict' => 'Бұл қарап шығу беті жоғарғы кірістіру орнындағы мәтінді қамтиды да және сақталғандағы өңді көрсетпек.',
 'session_fail_preview' => "'''Ғафу етіңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.
 Қайта байқап көріңіз. Егер бұл әлі істелмесе, шығуды және қайта кіруді байқап көріңіз.'''",
@@ -969,9 +1021,10 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 Бет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.
 Бұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.'''",
 'editing' => 'Өңделуде: $1',
+'creating' => 'Бастау: $1',
 'editingsection' => 'Өңделуде: $1 (бөлімі)',
 'editingcomment' => 'Өңделуде: $1 (мәндемесі)',
-'editconflict' => 'Өңдеме қақтығысы: $1',
+'editconflict' => 'Өңдемелер қақтығысы: $1',
 'explainconflict' => "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.
 Жоғарғы кірістіру орнында беттің ағымдық мәтіні бар.
 Төменгі кірістіру орнында сіз өзгерткен мәтіні көрсетіледі.
@@ -995,28 +1048,34 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 Бұл сақтай алынбайды.'''",
 'readonlywarning' => "'''ҚҰЛАҚТАНДЫРУ: Дерекқор баптау үшін құлыпталған, сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.
 Кейін қолдану үшін мәтәнді қйып алып және қойып, мәтін файлына сақтауңызға болады.'''",
-'protectedpagewarning' => "'''ҚҰЛАҚТАНДЫРУ: Бұл бет қорғалған. Тек әкімші құқықтары бар қатысушылар өңдей алады.'''",
+'protectedpagewarning' => "'''Ескертпе: Бұл бет қорғалған. Тек әкімші құқықтары бар қатысушылар өңдей алады.'''",
 'semiprotectedpagewarning' => "'''Аңғартпа:''' Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.",
 'cascadeprotectedwarning' => "'''Құлақтандыру''': Бұл бет құлыпталған, енді тек әкімші құқықтары бар қатысушылар бұны өңдей алады.Бұның себебі: бұл бет «баулы қорғауы» бар келесі {{PLURAL:$1|беттің|беттердің}} кірікбеті:",
-'titleprotectedwarning' => "'''ҚҰЛАҚТАНДЫРУ:  Бұл бет құлыпталған, сондықтан тек бірқатар қатысушылар бұны бастай алады.'''",
+'titleprotectedwarning' => "'''Ескертпе: Бұл бет құлыпталған, сондықтан тек бірқатар қатысушылар бұны бастай алады.'''",
 'templatesused' => 'Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:',
-'templatesusedpreview' => 'Ð\91ұнÑ\8b Ò\9bаÑ\80ап Ñ\88Ñ\8bÒ\93Ñ\83Ò\93а Ò\9bолданÑ\8bлÒ\93ан Ò¯Ð»Ð³Ñ\96леÑ\80:',
-'templatesusedsection' => 'Бұл бөлімде қолданылған үлгілер:',
+'templatesusedpreview' => 'Ð\91ұл Ð±ÐµÑ\82Ñ\82е Ò\9bолданÑ\8bлÒ\93ан {{PLURAL:$1|үлгÑ\96|үлгÑ\96леÑ\80}}:',
+'templatesusedsection' => 'Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:',
 'template-protected' => '(қорғалған)',
 'template-semiprotected' => '(жартылай қорғалған)',
 'hiddencategories' => 'Бұл бет $1 жасырын санаттың мүшесі:',
 'nocreatetitle' => 'Бетті бастау шектелген',
 'nocreatetext' => '{{SITENAME}} жобасында жаңа бет бастауы шектелген.
 Кері қайтып бар бетті өңдеуіңізге болады, немесе [[Special:UserLogin|кіруіңізге не тіркелуіңізге]] болады.',
-'nocreate-loggedin' => '{{SITENAME}} жобасында жаңа бет бастау рұқсатыңыз жоқ.',
+'nocreate-loggedin' => 'Жаңа бет бастауға рұқсатыңыз жоқ.',
+'sectioneditnotsupported-title' => 'Бөлімдерді өңдеу қолданылмайды',
+'sectioneditnotsupported-text' => 'Бұл бетте бөлімдерді өңдеу қолданылмайды.',
 'permissionserrors' => 'Рұқсаттар қателері',
 'permissionserrorstext' => 'Бұны істеуге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:',
 'permissionserrorstext-withaction' => '$2 дегенге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:',
 'recreate-moveddeleted-warn' => "'''Назар аудар: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''
 
 Бұл бетті жаңадан бастаудың орынды екеніне көз жеткізіңіз.
-Төменде бұл бетке қатысты жою (және жылжыту) журналы көрсетілген:",
+Төменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:",
+'moveddeleted-notice' => 'Бұл бет жойылған.
+Төменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:',
 'log-fulllog' => 'Толық журналды қарау',
+'edit-hook-aborted' => 'Түзету ілмек арқылы болдырмады.
+Қосымша түсіндірмелер көрсетілмеген.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Құлақтандыру: Бұл бетте тым көп шығыс алатын құрылым талдатқыш жетелерінің қоңырау шалулары бар.
@@ -1090,6 +1149,7 @@ $3 келтірілген себебі: ''$2''",
 'revdelete-nooldid-title' => 'Нысана түзету жарамсыз',
 'revdelete-nooldid-text' => 'Бұл жетені орындау үшін нысана түзетуін/түзетулерін келтірілмепсіз,
 келтірілген түзету жоқ, не ағымдық түзетуді жасыру үшін әрекеттеніп көрдіңіз.',
+'revdelete-nologtype-title' => 'Журнал түрі көрсетілмеген',
 'revdelete-show-file-submit' => 'Иә',
 'revdelete-selected' => "'''[[:$1]] дегеннің бөлектенген {{PLURAL:$2|түзетуі|түзетулері}}:'''",
 'logdelete-selected' => "'''Бөлектенген {{PLURAL:$1|журнал оқиғасы|журнал оқиғалары}}:'''",
@@ -1420,10 +1480,15 @@ $3 келтірілген себебі: ''$2''",
 'action-read' => 'Осы бетті оқу',
 'action-edit' => 'осы бетті өңдеу',
 'action-delete' => 'Осы бетті жою',
+'action-mergehistory' => 'Бұл беттің өзгеріс тарихын қосу',
+'action-userrights' => 'Қатысушылардың барлық құқықтарын өзгерту',
+'action-userrights-interwiki' => 'Басқа уикилердегі қатысушылардың құқықтарын өзгерту',
+'action-siteadmin' => 'Дерекқорды бұғаттау немесе бұғаттан шығару',
+'action-sendemail' => 'электронды хаттарды жіберу',
 
 # Recent changes
 'nchanges' => '$1 өзгеріс',
-'recentchanges' => 'Ð\96Ñ\83Ñ\8bÒ\9bÑ\82ағы өзгерістер',
+'recentchanges' => 'Соңғы өзгерістер',
 'recentchanges-legend' => 'Жуықтағы өзгерістер баптаулары',
 'recentchangestext' => 'Бұл бетте осы уикидегі болған жуықтағы өзгерістер байқалады.',
 'recentchanges-feed-description' => 'Бұл арнаменен уикидегі ең соңғы өзгерістер қадағаланады.',
@@ -1441,19 +1506,21 @@ $3 келтірілген себебі: ''$2''",
 'rcshowhidepatr' => 'Зерттелген өңдемелерді $1',
 'rcshowhidemine' => 'Өңдемелерімді $1',
 'rclinks' => 'Соңғы $2 күнде болған, соңғы $1 өзгерісті көрсет<br />$3',
-'diff' => 'айырм.',
-'hist' => 'тар.',
-'hide' => 'жаÑ\81Ñ\8bÑ\80',
-'show' => 'көÑ\80Ñ\81еÑ\82',
+'diff' => 'айырым',
+'hist' => 'тарихы',
+'hide' => 'Ð\96аÑ\81Ñ\8bÑ\80Ñ\83',
+'show' => 'Ð\9aÓ©Ñ\80Ñ\81еÑ\82Ñ\83',
 'minoreditletter' => 'ш',
 'newpageletter' => 'Ж',
 'boteditletter' => 'б',
 'number_of_watching_users_pageview' => '[бақылаған $1 қатысушы]',
 'rc_categories' => 'Санаттарға шектеу ("|" белгісімен бөліктеңіз)',
-'rc_categories_any' => 'Қайсыбір',
+'rc_categories_any' => 'Кез келген',
+'rc-change-size-new' => 'Өңдеуден кейінгі көлемі: {{PLURAL:$1|байт|байттар}}',
 'newsectionsummary' => '/* $1 */ жаңа бөлім',
-'rc-enhanced-expand' => 'Толық ақпаратын көрсету (JavaScript-ті керек етеді)',
-'rc-enhanced-hide' => 'Толық ақпаратын жасыру',
+'rc-enhanced-expand' => 'Толық ақпаратты көрсету (JavaScript-ті керек етеді)',
+'rc-enhanced-hide' => 'Толық ақпаратты жасыру',
+'rc-old-title' => 'Бастапқы «$1» сияқты жасалған',
 
 # Recent changes linked
 'recentchangeslinked' => 'Қатысты өзгерістер',
@@ -2097,7 +2164,7 @@ $1',
 'sp-contributions-talk' => 'талқылауы',
 'sp-contributions-userrights' => 'Қатысушы құқықтарын реттеу',
 'sp-contributions-search' => 'Үлес үшін іздеу',
-'sp-contributions-username' => 'IP мекенжайы не қатысушы аты:',
+'sp-contributions-username' => 'IP мекенжайы немесе қатысушы аты:',
 'sp-contributions-submit' => 'Ізде',
 
 # What links here
@@ -2125,7 +2192,7 @@ $1',
 'blockiptext' => 'Төмендегі пішін қатысушының жазу рұқсатын белгілі IP мекенжайымен не атымен бұғаттау үшін қолданылады.
 Бұны тек бұзақылықты қақпайлау үшін және де [[{{{{ns:mediawiki}}:Policy-url}}|ережелер]] бойынша атқаруыңыз жөн.
 Төменде тиісті себебін толтырып көрсетіңіз (мысалы, дәйекке бұзақылықпен өзгерткен беттерді келтіріп).',
-'ipadressorusername' => 'IP мекенжайы не қатысушы аты:',
+'ipadressorusername' => 'IP мекенжайы немесе қатысушы аты:',
 'ipbexpiry' => 'Мерзімі бітпек:',
 'ipbreason' => 'Себебі:',
 'ipbreasonotherlist' => 'Басқа себеп',
@@ -2140,14 +2207,15 @@ $1',
 'ipbcreateaccount' => 'Тіркелуді қақпайлау',
 'ipbemailban' => 'Қатысушы е-поштамен хат жөнелтуін қақпайлау',
 'ipbenableautoblock' => 'Бұл қатысушы соңғы қолданған IP мекенжайын, және кейін өңдеуге байқап көрген әр IP мекенжайларын өзбұғаттауы',
-'ipbsubmit' => 'Қатысушыны бұғатта',
+'ipbsubmit' => 'Қатысушыны бұғаттау',
 'ipbother' => 'Басқа мерзімі:',
 'ipboptions' => '2 сағат:2 hours,1 күн:1 day,3 күн:3 days,1 апта:1 week,2 апта:2 weeks,1 ай:1 month,3 ай:3 months,6 ай:6 months,1 жыл:1 year,мәнгі:infinite',
 'ipbotheroption' => 'басқа',
 'ipbotherreason' => 'Басқа/қосымша себеп:',
 'ipbhidename' => 'Қатысушы атын бұғаттау журналыннан, белсенді бұғаттау тізімінен, қатысушы тізімінен жасыру',
 'ipbwatchuser' => 'Бұл қатысушының жеке және талқылау беттерін бақылау',
-'badipaddress' => 'Жарамсыз IP мекенжайы',
+'ipb-confirm' => 'Бұғаттауды растау',
+'badipaddress' => 'IP мекенжайы қате жазылған.',
 'blockipsuccesssub' => 'Бұғаттау сәтті өтті',
 'blockipsuccesstext' => '[[{{#special:Contributions}}/$1|$1]] деген бұғатталған.<br />
 Бұғаттарды шолып шығу үшін [[{{#special:Ipblocklist}}|IP бұғаттау тізімін]] қараңыз.',
@@ -2213,8 +2281,8 @@ $1 бұғаттауы үшін келтірілген себебі: «$2».',
 Осы мақсатыңызды, және баптау біткенде дерекқорды ашатыңызды құптаңыз.',
 'unlockdbtext' => 'Дерекқодын ашылуы барлық қатысушылардың бет өңдеу, баптауын қалау, бақылау тізімін, тағы басқа дерекқорды өзгертетін мүмкіндіктерін қалпына келтіреді.
 Осы мақсатыңызды құптаңыз.',
-'lockconfirm' => 'Ð\98Ó\99, Ð´ÐµÑ\80екÒ\9bоÑ\80 Ò\9bұлÑ\8bпÑ\82аÑ\83Ñ\8bн Ð½Ð°Ò\9bÑ\82Ñ\8b тілеймін.',
-'unlockconfirm' => 'Ð\98Ó\99, Ð´ÐµÑ\80екÒ\9bоÑ\80 Ò\9bұлÑ\8bпÑ\82амаÑ\83Ñ\8bн Ð½Ð°Ò\9bÑ\82Ñ\8b Ñ\82Ñ\96леймÑ\96н.',
+'lockconfirm' => 'Ð\98Ó\99, Ð¼ÐµÐ½ Ñ\88Ñ\8bнÑ\8bменде Ð´ÐµÑ\80екÒ\9bоÑ\80дÑ\8bÒ£ Ò\9bұлÑ\8bпÑ\82алÑ\83Ñ\8bн тілеймін.',
+'unlockconfirm' => 'Ð\98Ó\99, Ð¼ÐµÐ½ Ñ\88Ñ\8bнÑ\8bменде Ð´ÐµÑ\80екÒ\9bоÑ\80дÑ\8bÒ£ Ò\9bұлÑ\8bпÑ\82алÑ\83Ñ\8bн Ó©Ñ\88Ñ\96Ñ\80гÑ\96м ÐºÐµÐ»ÐµÐ´Ñ\96.',
 'lockbtn' => 'Дерекқорды құлыпта',
 'unlockbtn' => 'Дерекқорды құлыптама',
 'locknoconfirm' => 'Құптау көзіне құсбелгі салмағансыз.',
@@ -2258,12 +2326,12 @@ $1 бұғаттауы үшін келтірілген себебі: «$2».',
 
 Ал мақаланың атауын өзгертем деп мағлұматын қолмен көшіруге болмайды, себебі беттің түзету тарихын өшіреді.",
 'movearticle' => 'Ағымдағы бет атауы:',
-'movenologin' => 'Ð\96үйеге кірмегенсіз',
+'movenologin' => 'СÑ\96з Ð¶үйеге кірмегенсіз',
 'movenologintext' => 'Бетті жылжыту үшін тіркелген болуыңыз және [[{{#special:UserLogin}}|кіруіңіз]] жөн.',
 'movenotallowed' => '{{SITENAME}} жобасында беттерді жылжыту руқсатыңыз жоқ.',
 'newtitle' => 'Жаңа бет атауы:',
 'move-watch' => 'Бұл бетті бақылау',
-'movepagebtn' => 'Бетті жылжыт',
+'movepagebtn' => 'Бетті жылжыту',
 'pagemovedsub' => 'Жылжыту сәтті аяқталды',
 'movepage-moved' => '\'\'\'"$1" беті "$2" бетіне жылжытылды\'\'\'',
 'articleexists' => 'Осылай аталған бет алдақашан бар, не таңдаған атауыңыз жарамды емес.
@@ -2321,6 +2389,12 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'allmessagestext' => 'Мында {{ns:mediawiki}} есім аясында жетімді жүйе хабар тізімі беріледі.
 Егер әмбебап MediaWiki жерсіндіруге үлес қосқыңыз келсе [//www.mediawiki.org/wiki/Localisation MediaWiki жерсіндіру бетіне] және [//translatewiki.net translatewiki.net жобасына] барып шығыңыз.',
 'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages''' өшірілген себебінен '''{{#special:AllMessages}}''' беті қолданылмайды.",
+'allmessages-filter-legend' => 'Фильтр',
+'allmessages-filter-unmodified' => 'Өзгертілмегендер',
+'allmessages-filter-all' => 'Барлығы',
+'allmessages-filter-modified' => 'Өзгертілгендер',
+'allmessages-language' => 'Тілі:',
+'allmessages-filter-submit' => 'Өту',
 
 # Thumbnails
 'thumbnail-more' => 'Үлкейту',
index d0a6f9b..72f3662 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Albamhandae
+ * @author Altostratus
  * @author Chanhee
  * @author Chulki Lee
  * @author Cwt96
@@ -953,6 +954,7 @@ $1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 
 'updated' => '(바뀜)',
 'note' => "'''주의:'''",
 'previewnote' => "'''이 화면은 미리 보기입니다'''. 편집한 내용은 아직 저장되지 않았습니다!",
+'continue-editing' => '계속 편집하기',
 'previewconflict' => '이 미리 보기는 저장할 때의 모습, 즉 위쪽 편집창의 문서를 반영합니다.',
 'session_fail_preview' => "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.
 다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인해 보십시오.'''",
@@ -1043,6 +1045,10 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'parser-template-loop-warning' => '재귀적인 틀이 발견되었습니다: [[$1]]',
 'parser-template-recursion-depth-warning' => '틀 반복 횟수 제한을 초과함($1)',
 'language-converter-depth-warning' => '언어 변환기 실행 제한 초과($1)',
+'node-count-exceeded-category' => '페이지가 노드 횟수를 초과하였습니다.',
+'node-count-exceeded-warning' => '페이지가 노드 수를 초과하였습니다.',
+'expansion-depth-exceeded-category' => '페이지가 확장 깊이를 초과하였습니다.',
+'expansion-depth-exceeded-warning' => '페이지가 확장 깊이를 초과하였습니다',
 
 # "Undo" feature
 'undo-success' => '이 편집을 되돌리려면 아래의 변경되는 사항을 확인한 후 저장해주세요.',
@@ -2128,6 +2134,11 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'allpages-bad-ns' => '{{SITENAME}}에서는 ‘$1’ 이름공간을 사용하지 않습니다.',
 'allpages-hide-redirects' => '넘겨주기 숨기기',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => '지금 이 문서의 캐시된 버전을 보고 있습니다. 이 버전은 최대 $1만큼 지난 버전일 가능성이 있습니다.',
+'cachedspecial-viewing-cached-ts' => '현재 이 페이지는 캐시 처리된 버전으로 현재 문서 상태를 반영하지 않을 수도 있습니다.',
+'cachedspecial-refresh-now' => '최신 버전 보기.',
+
 # Special:Categories
 'categories' => '분류',
 'categoriespagetext' => '{{PLURAL:$1}}문서나 자료를 담고 있는 분류 목록입니다.
@@ -2561,7 +2572,8 @@ $1',
 'ipb-confirm' => '차단 확인',
 'badipaddress' => '잘못된 IP 주소',
 'blockipsuccesssub' => '차단 완료',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] 사용자가 차단되었습니다. 차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] 사용자가 차단되었습니다.<br />
+차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.',
 'ipb-blockingself' => '자기 자신을 차단하려고 합니다. 정말로 실행할까요?',
 'ipb-confirmhideuser' => '당신은 사용자를 차단하면서 "계정 숨기기" 설정을 선택했습니다. 이로써 모든 기록에서 이 사용자의 계정 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?',
 'ipb-edit-dropdown' => '차단 이유 목록 편집하기',
@@ -2612,7 +2624,9 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'blocklog-showsuppresslog' => '이 사용자는 과거에 차단된 적이 있으며, 그 기록이 숨겨져 있습니다. 해당 사용자의 차단 기록은 다음과 같습니다.',
 'blocklogentry' => '[[$1]] 사용자를 $2 차단함 $3',
 'reblock-logentry' => '[[$1]] 사용자의 차단 기간을 $2(으)로 변경 $3',
-'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다. 자동으로 차단된 IP 주소는 여기에 나오지 않습니다. [[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
+'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다.
+자동으로 차단된 IP 주소는 여기에 나오지 않습니다.
+[[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
 'unblocklogentry' => '$1을 차단 해제했습니다.',
 'block-log-flags-anononly' => 'IP만 막음',
 'block-log-flags-nocreate' => '계정 생성 막음',
@@ -3694,6 +3708,8 @@ $5
 'version-software' => '설치된 프로그램',
 'version-software-product' => '제품',
 'version-software-version' => '버전',
+'version-entrypoints' => 'URL 진입점',
+'version-entrypoints-header-entrypoint' => '진입점',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
index 1e757d4..a8c614a 100644 (file)
@@ -326,6 +326,8 @@ $1',
 'page-rss-feed' => '«$1» — RSS-лентасы',
 'page-atom-feed' => '«$1» — Atom-лентасы',
 'red-link-title' => '$1 (быллай бет джокъду)',
+'sort-descending' => 'Кем болуугъа кёре тиз',
+'sort-ascending' => 'Ёсюуге кёре тиз',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Статья',
@@ -392,6 +394,7 @@ $1',
 'badarticleerror' => 'Бу бетде этилирге болмайды быллай амал.',
 'cannotdelete' => '«$1» файлны неда бетни кетерирге болмайды.
 Башха къошулуучу кетерген болургъа боллукъду аны.',
+'cannotdelete-title' => '«$1» бетни кетерирге болмайды',
 'badtitle' => 'Джарамагъан ат',
 'badtitletext' => 'Сорулгъан бетни аты терсди, бошду, неда интервики аты терс джазылгъанды. Келишмеген (хайырланыргъа болмагъан) символла хайырланыргъада боллукъдула атында.',
 'perfcached' => 'Бу информация кэшден алыннганды, ахыр тюрлениулени кёргюзмезге боллукъду. Кэшде максимум {{PLURAL:$1|джазыу}} сакъланады.',
@@ -402,6 +405,7 @@ $1',
 Функция: $1<br />
 Соруу: $2',
 'viewsource' => 'Къарау',
+'viewsource-title' => '$1 бетни чыкъгъан текстине къарау',
 'actionthrottled' => 'Терклик чекленнгенди',
 'actionthrottledtext' => 'Спамгъа къаршчы кюрешиуню себебинден, аз заманны ичинде бу амал бла кёб кере хайырланыу тыйылыбды. Кечирек джангыдан кёрюгюз.',
 'protectedpagetext' => 'Бу бет тюрлендириуге джабылыбды.',
@@ -493,6 +497,7 @@ $2',
 'emailconfirmlink' => 'Электрон почта адресигизни бегитигиз.',
 'invalidemailaddress' => 'Электрон почта адресигизи къабыл этилинирге болмайды, форматха келишмегени ючюн.
 Тюз адрес джазыгъыз неда тизгинни бош къоюгъуз.',
+'emaildisabled' => 'Бу сайт, электрон потча бла билдириуле иймейди.',
 'accountcreated' => 'Тергеу джазыу (аккаунт) къуралды',
 'accountcreatedtext' => '$1 къошулуучугъа тергеу джазыу (аккаунт) къуралды.',
 'createaccount-title' => '{{SITENAME}}: тергеу джазыу (аккаунт) къурау',
@@ -526,8 +531,16 @@ $2',
 'resetpass-temp-password' => 'Болджаллы пароль:',
 
 # Special:PasswordReset
+'passwordreset' => 'Паролну атыу',
+'passwordreset-text' => 'Электрон джазма бла тергеу джазыуугъузну (аккаунтугъузну) параметрлерини юсюнден билдириу алыр ючюн бу форманы толтуругъуз.',
+'passwordreset-legend' => 'Паролну ий',
+'passwordreset-disabled' => 'Бу викиде паролла атыу амал джукъланыбды.',
+'passwordreset-pretext' => '{{PLURAL:$1||Тюбюрекде берилген билгиледен бирин джазыгъыз}}',
 'passwordreset-username' => 'Къошулуучуну аты:',
 'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Джазылгъан билдириуню эсебине къара?',
+'passwordreset-capture-help' => 'Бу белгини салсагъыз, къошулуучугъа ийилген болджаллы пароль бла билдириу сизге кёргюзюллюкдю.',
+'passwordreset-email' => 'Электрон почтаны адреси:',
 
 # Special:ChangeEmail
 'changeemail-no-info' => 'Бу бетни кёрюр ючюн сиз системагъа тергеу джазыуугъуз (аккаунтугъуз) бла кирирге керексиз.',
@@ -642,7 +655,8 @@ $2',
 'userinvalidcssjstitle' => "'''Эс бёлюгюз:''' «$1» атлы тема джокъду. Эсде тутугъуз, .css эм .js бетле атлары ажымсыз къуру гитче харифледен болургъа керекди, сёз ючюн: {{ns:user}}:Foo/vector.css, былай  {{ns:user}}:Foo/Vector.css тюйюл!",
 'updated' => '(Джангыртылды)',
 'note' => "'''Белги:'''",
-'previewnote' => "'''Бу къуру ал къарауду, текст алкъын сакъланмагъанды!'''",
+'previewnote' => "'''Бу къуру ал къарауду.'''
+Сиз этген тюрлениуле алкъын сакъланмагъандыла!",
 'previewconflict' => 'Бу ал къарау, башындагъы тюрлендириу терезеде текстни сакъланнганча кёргюзеди.',
 'session_fail_preview' => "'''Джарсыугъа, сессияны идентификаторуну тас этгени себебли, сервер сизни тюрлендириуюгюзни сакълаталмагъанды.
 Энтдада кёрюгюз.
@@ -655,6 +669,7 @@ $2',
 Себеби: браузеригиз редактор терезеде пунктуация белгилени терс кёргюзеди, аны ючюн статьяны тексти бузулургъа боллукъду.
 Бу халатлары болгъан аноним веб-проксилени хайырландырылгъанлары ючюн болургъа боллукъду'''",
 'editing' => '«$1» бетни тюрлендириу',
+'creating' => '«$1» бетни къурау',
 'editingsection' => '«$1» бетде бёлюмню тюрлендириу',
 'editingcomment' => '«$1» бетни тюрлендириу (джангы бёлюм)',
 'editconflict' => 'Тюрлендириу конфликт: $1',
@@ -678,7 +693,7 @@ $2',
 Башхала сизни текстлеригизни тюрлендиргенлерин излемей эсегиз, былайгъа салмагъыз.<br />
 Сиз дагъыда этген къошакъларыгъызны автору болгъаныгъызны неда информацияны чыкъгъан джери эркин джаяргъа эм тюрлендирирге къойгъанын аны бегитесиз (къарагъыз: $1).
 '''ЭРКИНЛИКСИЗ АВТОР ХАКЪ БЛА ДЖАКЪЛАННГАН МАТЕРИАЛЛА САЛМАГЪЫЗ БЫЛАЙГЪА!'''",
-'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни  {{PLURAL:$1|$1 килобайт|$1 килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|$2 килобайт|$2 килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
+'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни  {{PLURAL:$1|бир килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|бир килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
 'readonlywarning' => "'''Эс бёлюгюз: Билгилени базасы бусагъатда киритленибди. Ол себебден тюрлениулеригиз къошулаллыкъ тюлдю. Джазгъанларыгъызны башха бир файлда сакълаб, кечирек къошаргъа боллукъсуз'''
 
 Киритлеген администратор бу билдириуню къойгъанды: $1",
@@ -780,7 +795,7 @@ $3 джанындан берилген сылтау: ''$2''",
 Темасы аннга ушагъан бетлени табар ючюн [[Special:Search|викиде излеб]] кёрюгюз.',
 
 # Revision deletion
-'rev-deleted-comment' => '(комментарий кетерилгенди)',
+'rev-deleted-comment' => '(тюрлендириуню суратлауу кетерилгенди)',
 'rev-deleted-user' => '(къошулуучуну аты кетерилгенди)',
 'rev-deleted-event' => '(джазыу кетерилгенди)',
 'rev-deleted-user-contribs' => '[къошулуучуну аты неда IP-адреси кетерилгенди — тюрлендириу къошакъны бетинде кёргюзюлмейди]',
@@ -1694,7 +1709,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'listusers-editsonly' => 'Къуру тюрлендириу этген къошлуучуланы кёргюз',
 'listusers-creationsort' => 'Къуралгъан заманына кёре сафла',
 'usereditcount' => '$1 {{PLURAL:$1|тюрлендириу|тюрлендириу}}',
-'usercreated' => 'Къуралгъанды: $1 $2',
+'usercreated' => '$1 $2 заманда {{GENDER:$3|регистрацияны ётгенди}}',
 'newpages' => 'Джангы бетле',
 'newpages-username' => 'Къошулуучуну аты:',
 'ancientpages' => 'Ахыр тюрлендириуге кёре эм эски болгъан статьяла',
@@ -1720,8 +1735,8 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'booksources-invalid-isbn' => 'Берилген ISBN джараусуз кибик кёрюнеди; оригинал къайнакъдан кёчюрюлген заманда халатланы контроль этигиз.',
 
 # Special:Log
-'specialloguserlabel' => 'Ð\9aÑ\8aоÑ\88Ñ\83луучу:',
-'speciallogtitlelabel' => 'Ð\91аÑ\88лÑ\8bкÑ\8a:',
+'specialloguserlabel' => 'ТолÑ\82Ñ\83Ñ\80уучу:',
+'speciallogtitlelabel' => 'ЫÑ\88ан (баÑ\88лÑ\8bкÑ\8a Ð½ÐµÐ´Ð° ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83):',
 'log' => 'Журналла',
 'all-logs-page' => 'Бютеу ачыкъ журналла',
 'alllogstext' => '{{SITENAME}} ючюн бютеу бар болгъан журналланы бирлешген списогу.
@@ -1761,12 +1776,13 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'sp-deletedcontributions-contribs' => 'къошхан юлюш',
 
 # Special:LinkSearch
-'linksearch' => 'Тыш джибериуле',
+'linksearch' => 'Тыш джибериулени излеу',
 'linksearch-pat' => 'Излеуге шаблон:',
 'linksearch-ns' => 'Ат алам:',
 'linksearch-ok' => 'Таб',
-'linksearch-text' => '<code>*.wikipedia.org</code> кибик джокерле хайырландырыргъа боллукъду.<br />
-Дагъан болгъан протоколла: <tt>$1</tt>',
+'linksearch-text' => '<code>*.wikipedia.org</code> кибик символлла хайырландырыргъа боллукъдула.
+Эм азы бла огъары дараджаны домени керекди, юлгюге: <code>*.org</code><br />
+Дагъан болгъан протоколла: <tt>$1</tt> (быладан къайсысында излеуюгюзге къошмагъыз)',
 'linksearch-line' => '$1-ге  $2-ден джибериу берилгенди',
 'linksearch-error' => 'Джокерле къуру адреслени аллында хайырланыргъа боллукъдула.',
 
@@ -1818,13 +1834,16 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'emailpagetext' => 'Бу къошулуучуну почтасына письмо джиберир ючюн бу форманы толтурургъа боллукъсуз.
 Ызына адрес болуб, сиз [[Special:Preferences|джарашдырыуларыгъызда]] джазгъан адрес белгиленникди, ол себебден сизни письмогъузну аллыкъ сизге тюз джууаб берирге мадарлы боллукъду.',
 'usermailererror' => 'Халат ючюн элетктрон письмо ызына къайтды:',
-'defemailsubject' => '{{SITENAME}} письмо',
+'defemailsubject' => '{{SITENAME}} — $1 къошулуучудан билдириу',
 'usermaildisabled' => 'Къошулуучуну электрон почтасы джукъланыбды',
 'usermaildisabledtext' => 'Сиз бу викини башха къошулуучуларына электрон письмола джиберелмейсиз',
 'noemailtitle' => 'Электрон почтаны адреси джокъду',
 'noemailtext' => 'Бу къошулуучу керти электрон адресин бермегенди.',
 'nowikiemailtitle' => 'Электрон письмо джиберирге эркинлик джокъду',
 'nowikiemailtext' => 'Бу къошулуучу, башха къошулуучуладан электрон писмо алыргъа излемегенин билдиргенди.',
+'emailtarget' => 'Аллыкъ къошулуучуну атын джазыгъыз',
+'emailusername' => 'Къошулуучуну аты:',
+'emailusernamesubmit' => 'Джибер',
 'email-legend' => 'Башха {{SITENAME}} къошулуучугъа электрон письмо джибер',
 'emailfrom' => 'Кимден:',
 'emailto' => 'Кимге:',
@@ -1849,8 +1868,10 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'watchlistanontext' => 'Кёзюгюзде тургъан тизмегизни статьяланы кёрюр неда тюрлендирир ючюн $1.',
 'watchnologin' => 'Системагъа кирирге керекди.',
 'watchnologintext' => 'Кёзюгюзде тургъан тизмегизни тюрлендирир ючюн [[Special:UserLogin|системагъа кирирге керексиз]].',
+'addwatch' => 'Кёзде тургъан тизмеге къош',
 'addedwatchtext' => '«[[:$1]]» бет [[Special:Watchlist|кёзюгюзде тургъан тизмегизге]] къошулду.
 Бу бетни эмда муну бла байламлы сюзюу бетни тюрлениулери ол тизмеде белгиленникдиле, [[Special:RecentChanges|джангы тюрлениулени тизмесини]] бетинде уа къалын шрифт бла чертилинникдиле, кёрюрге тынчыракъ болурча.',
+'removewatch' => 'Кёзде тургъан тизмеден кетер',
 'removedwatchtext' => '«[[:$1]]» бет сизни [[Special:Watchlist|кёзюгюзде тургъан тизмегизден]] кетерилгенди.',
 'watch' => 'Кёзде тут',
 'watchthispage' => 'Бу бетни кёзде тут',
@@ -2170,6 +2191,7 @@ $1',
 'unblocked-id' => '$1 тыйылыу къоратылгъанды',
 'ipblocklist' => 'Блок этилиннген IP-адресле эм къошулуучуланы атлары',
 'ipblocklist-legend' => 'Тыйылгъан къошулуучуну аты',
+'blocklist-expiry' => 'Бошалыу датасы',
 'blocklist-reason' => 'Чурум',
 'ipblocklist-submit' => 'Таб',
 'ipblocklist-localblock' => 'Локал блокга салыу',
@@ -2451,8 +2473,8 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-pt-mytalk' => 'Сизни сюзюу бетигиз',
 'tooltip-pt-anontalk' => 'Бу IP-адресден этилген тюрлендириулени сюзюу бет',
 'tooltip-pt-preferences' => 'Джарашдырыуларыгъыз',
-'tooltip-pt-watchlist' => 'Ð\9cен ÐºÑ\91зÑ\8eмде тутхан бетлени тизмеси',
-'tooltip-pt-mycontris' => 'Сизни Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83леÑ\80игизни Ñ\81пиÑ\81огÑ\83',
+'tooltip-pt-watchlist' => 'Сиз ÐºÑ\91зÑ\8eгÑ\8eзде тутхан бетлени тизмеси',
+'tooltip-pt-mycontris' => 'Сизни Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83леÑ\80игизни Ñ\82измеÑ\81и',
 'tooltip-pt-login' => 'Былайда системада регистрация этерге боллукъду, алай а ол ажымсыз керекли тюйюлдю',
 'tooltip-pt-anonlogin' => 'Былайда сисетмагъа регистрация этерге боллукъду, алай а бу зорунлу тюлдю.',
 'tooltip-pt-logout' => 'Чыгъыу',
@@ -2505,6 +2527,8 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-diff' => 'Тюрлендириулеригизни кёрюгюз',
 'tooltip-compareselectedversions' => 'Бу бетни сайланнган эки версиясыны араларында башхалыкъларын кёр',
 'tooltip-watch' => 'Бу бетни кёзюгюзде тургъан тизмеге къош',
+'tooltip-watchlistedit-normal-submit' => 'Белгиленнген атланы кетер',
+'tooltip-watchlistedit-raw-submit' => 'Кёзде тургъан тизмени джангырт',
 'tooltip-recreate' => 'Кетерилгенина къарамай бетни ызына къайтар',
 'tooltip-upload' => 'Джюклеуню башла',
 'tooltip-rollback' => 'Бир басхан бла ахыр къошулуучуну тюрлендиргенин кетер',
@@ -2535,6 +2559,17 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'spam_reverting' => '$1 бла джибериую болмагъан ахыр версиягъа къайтылады',
 'spam_blanking' => 'Бютеу версияла $1 бетге джибериу тутадыла, ариуланадыла',
 
+# Info page
+'pageinfo-title' => '«$1» бетни юсюнден информация',
+'pageinfo-header-edits' => 'Тюрлендириуле',
+'pageinfo-header-watchlist' => 'Кёзде тургъан тизме',
+'pageinfo-header-views' => 'Къараула',
+'pageinfo-subjectpage' => 'Бет',
+'pageinfo-talkpage' => 'Сюзюу бет',
+'pageinfo-watchers' => 'Кёргенлени саны',
+'pageinfo-edits' => 'Тюрлендириулени саны',
+'pageinfo-authors' => 'Авторланы саны',
+
 # Skin names
 'skinname-standard' => 'Стандарт',
 'skinname-nostalgia' => 'Ностальгия',
@@ -2589,6 +2624,8 @@ $1',
 'file-nohires' => 'Мындан ары ачыкъланнган версиясы джокъду',
 'svg-long-desc' => 'SVG файл, шартлы $1 × $2 пиксель, файлны ёлчеми: $3',
 'show-big-image' => 'Толу ачыкълау',
+'show-big-image-preview' => 'Ал къарауда уллулугъу: $1.',
+'show-big-image-size' => '$1 × $2 пиксель',
 'file-info-gif-looped' => 'тогъайланнганды',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|фрейм|фрейм}}',
 'file-info-png-looped' => 'тогъайланнганды',
@@ -2607,6 +2644,13 @@ $1',
 'bydate' => 'Хронологиягъа кёре',
 'sp-newimages-showfrom' => '$1, $2 замандан башлаб джангы файлланы кёргюз',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 секунд|$1 секунд}}',
+'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
+'hours' => '{{PLURAL:$1|$1 сагъат|$1 сагъат}}',
+'days' => '{{PLURAL:$1|$1 кюн|$1 кюн}}',
+'ago' => '$1 алгъа',
+
 # Bad image list
 'bad_image_list' => 'Формат былай болургъа керекди:
 
@@ -2619,7 +2663,7 @@ $1',
 'metadata-help' => 'Файл, кёбюсюне цифралы камерала бла, неда сканерле бла къошулгъан, къошакъ билгилени тутаргъа болады. Файл къуралгъанындан сора тюрлендирилген эсе, бир-бир параметрлери бусагъатдагъы суратына келишмезге болур.',
 'metadata-expand' => 'Дагъыда билгиле кёргюз',
 'metadata-collapse' => 'Къошакъ билгилени джашыр',
-'metadata-fields' => 'Ð\91Ñ\83 Ñ\81пиÑ\81окда ÐºÐµÐ»Ñ\82иÑ\80илинген Ð¼ÐµÑ\82аданнÑ\8bйлени Ñ\82изгинлеÑ\80и, Ñ\81Ñ\83Ñ\80аÑ\82нÑ\8b Ð±ÐµÑ\82инде Ñ\82Ñ\8bнгÑ\8bлаÑ\83 Ð±Ð»Ð° ÐºÑ\91Ñ\80гÑ\8eзÑ\82Ñ\8eлÑ\8eнлÑ\8eкдÑ\8eле, ÐºÑ\8aалгÑ\8aанла джашырылыныб боллукъдула.
+'metadata-fields' => 'Ð\91Ñ\83 Ñ\82измеде ÐºÐµÐ»Ñ\82иÑ\80илген Ñ\81Ñ\83Ñ\80аÑ\82 Ð¼ÐµÑ\82абилгилеи Ñ\82изгинлеÑ\80и, Ñ\81Ñ\83Ñ\80аÑ\82нÑ\8b Ð±ÐµÑ\82инде ÐºÑ\91Ñ\80гÑ\8eзÑ\8eллÑ\8eкдÑ\8eле, ÐºÑ\8aалгÑ\8aанла Ñ\82Ñ\8bнгÑ\8bлаÑ\83 Ð±ла джашырылыныб боллукъдула.
 * make
 * model
 * datetimeoriginal
@@ -2748,24 +2792,56 @@ $1',
 'exif-gpsareainformation' => 'GPS тёгерекни аты',
 'exif-gpsdatestamp' => 'GPS заман',
 'exif-gpsdifferential' => 'GPS дифференциялы тюзетиу',
+'exif-jpegfilecomment' => 'JPEG-файлны белгиси',
+'exif-keywords' => 'Ачхыч сёзле',
+'exif-countrydest' => 'Суратланнган кърал',
+'exif-provinceorstatedest' => 'Суратланнган провинция, территория неда штат',
+'exif-citydest' => 'Суратланнган шахар',
+'exif-objectname' => 'Къысха аты',
+'exif-specialinstructions' => 'Энчи ангылатыула',
 'exif-headline' => 'Башлыкъ',
+'exif-credit' => 'Суратны берген',
+'exif-source' => 'Къайнакъ',
+'exif-editstatus' => 'Суратны редакцион статусу',
 'exif-urgency' => 'Бу сагъатха магъаналылыгъы',
+'exif-fixtureidentifier' => 'Колонканы аты',
+'exif-locationdest' => 'Суратланнган джер',
+'exif-objectcycle' => 'Бу сурат ючюн сутканы кёзюую',
+'exif-contact' => 'Контактлы информация',
 'exif-writer' => 'Текстни автору',
 'exif-languagecode' => 'Тил',
 'exif-iimversion' => 'IIM версиясы',
 'exif-iimcategory' => 'Категория',
+'exif-iimsupplementalcategory' => 'Къошакъ категорияла',
 'exif-datetimeexpires' => 'Бу датадан сора хайырланмагъыз:',
 'exif-datetimereleased' => 'Чыкъгъан датасы:',
 'exif-identifier' => 'Идентификатор',
 'exif-lens' => 'Хайырланнган объектив',
+'exif-serialnumber' => 'Камераны сериялы номери',
 'exif-cameraownername' => 'Камераны иеси',
 'exif-label' => 'Белги',
+'exif-datetimemetadata' => 'Метабилгилени ахыр тюрлениулерини датасы',
+'exif-nickname' => 'Суратны, формализмли болмагъан аты',
 'exif-rating' => 'Багъа (5-ден)',
+'exif-rightscertificate' => 'Хакъланы джюрютюу сертификат',
+'exif-copyrighted' => 'Автор хакъланы статусу:',
+'exif-copyrightowner' => 'Автор хакъланы иеси',
+'exif-usageterms' => 'Хайырланыуну шартлары',
+'exif-pngfilecomment' => 'PNG-файлны белгиси',
 'exif-disclaimer' => 'Джууаблылыкъны унамау',
+'exif-contentwarning' => 'Ичиндегисини юсюнден эсгертиу',
+'exif-giffilecomment' => 'GIF-файлны белгиси',
 'exif-intellectualgenre' => 'Объектни типи',
+'exif-subjectnewscode' => 'Теманы коду',
+'exif-scenecode' => 'IPTC сахнаны коду',
+'exif-event' => 'Суратланнган болуу',
+'exif-organisationinimage' => 'Суратланнган организация',
+'exif-personinimage' => 'Суратланнган адам',
 
 # EXIF attributes
 'exif-compression-1' => 'Къысдырылмагъан',
+'exif-compression-3' => 'CCITT Group 3, факс кодлау',
+'exif-compression-4' => 'CCITT Group 4, факс кодлау',
 
 'exif-copyrighted-true' => 'Автор хакъла бла джакъланыбды',
 'exif-copyrighted-false' => 'Джамагъат мюлк',
@@ -2905,6 +2981,10 @@ $1',
 'exif-gpslongitude-e' => 'Кюнчыгъыш узунлукъ',
 'exif-gpslongitude-w' => 'Кюнбатыш узунлукъ',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|метрге|метрге}} тенгизден мийик',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|метрге|метрге}} тенгизден алаша',
+
 'exif-gpsstatus-a' => 'Ёлчелеу бошалмагъанды',
 'exif-gpsstatus-v' => 'Ёлчелеу бошалгъанды',
 
@@ -2940,12 +3020,30 @@ $1',
 
 'exif-dc-contributor' => 'Автор нёгерле',
 'exif-dc-coverage' => 'Медианы кенгликле чеклери бла заман чеклери',
+'exif-dc-date' => 'Дата(ла)',
+'exif-dc-publisher' => 'Басмагъа чыгъаргъан',
+'exif-dc-relation' => 'Байламлы медиа',
+'exif-dc-rights' => 'Хакъла',
+'exif-dc-source' => 'Къайнакъ медиа',
+'exif-dc-type' => 'Медианы типи',
 
+'exif-rating-rejected' => 'Къабыл этилмеди',
+
+'exif-isospeedratings-overflow' => '65535-ден уллуду',
+
+'exif-iimcategory-ace' => 'Санат, культура эм кёз ачыу',
+'exif-iimcategory-clj' => 'Аманлыкъчылыкъ эм закон',
+'exif-iimcategory-dis' => 'Катастрофала эм аварияла',
+'exif-iimcategory-fin' => 'Экономика эм бизнес',
 'exif-iimcategory-edu' => 'Окъуу',
+'exif-iimcategory-evn' => 'Тёгерекдеги табийгъат',
 'exif-iimcategory-hth' => 'Саулукъ',
+'exif-iimcategory-hum' => 'Интересли хапарла',
 'exif-iimcategory-lab' => 'Урунуу',
+'exif-iimcategory-lif' => 'Джашау хал эм бош заман',
 'exif-iimcategory-pol' => 'Политика',
 'exif-iimcategory-rel' => 'Дин бла ийнам',
+'exif-iimcategory-sci' => 'Илму эм техника',
 'exif-iimcategory-soi' => 'Социал соруула',
 'exif-iimcategory-spo' => 'Спорт',
 'exif-iimcategory-war' => 'Къазауатла, конфликтле эмда къозгъалыула',
@@ -3035,6 +3133,10 @@ $5
 'confirm-purge-top' => 'Бу бетни кеши кетерилсинми?',
 'confirm-purge-bottom' => 'Бетни кеши кетерилгенден сора, андан сора келген версиясы кёргюзюллюкдю.',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'ОК',
+'confirm-unwatch-button' => 'ОК',
+
 # Separators for various lists, etc.
 'semicolon-separator' => ';&#32;',
 'percent' => '$1%',
@@ -3192,6 +3294,7 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'version-software' => 'Салыннган программа баджарыу',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версия',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Файлгъа джол',
@@ -3292,30 +3395,42 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'sqlite-no-fts' => '$1 толу текст излеуню хайырландыра билмеген',
 
 # New logging system
+'revdelete-content-hid' => 'ичиндегиси джашырылыбды',
 'revdelete-summary-hid' => 'тюрлендириуню ачыкълауу джашырылыбды',
+'revdelete-uname-hid' => 'къошулуучуну аты джашырылыбды',
+'revdelete-content-unhid' => 'ичиндегиси кёргюзюлдю',
 'revdelete-uname-unhid' => 'къошулуучуну аты ачылды',
 'revdelete-restricted' => 'администраторла ючюн этилген чеклениуле',
 'revdelete-unrestricted' => 'администратолра ючюн этилген чеклениуле къоратылгъандыла',
+'logentry-move-move' => '$1, $3 бетни атын $4 деб тюрлендирди',
 'logentry-patrol-patrol-auto' => '$1, $3 бетни $4 версиясын автомат халда тинтиб чыкъды',
 'newuserlog-byemail' => 'пароль электрон почта бла джиберилгенди',
 
 # Feedback
 'feedback-subject' => 'Тема:',
 'feedback-message' => 'Билдириу:',
+'feedback-cancel' => 'Ызына алыу',
 'feedback-submit' => 'Оюмунгу джибер',
+'feedback-error2' => 'Халат. Тюзетиу ётмеди',
+'feedback-close' => 'Тындырылды',
 
 # API errors
 'api-error-badtoken' => 'Ич халат: терс токен.',
+'api-error-duplicate-popup-title' => ' {{PLURAL:$1|Файлны|Файлны}} дубликаты',
 'api-error-empty-file' => 'Сиз ийген файлны ичи бошду.',
 'api-error-emptypage' => 'Ичи бош болгъан джангы бетле къураргъа болмайды.',
 'api-error-file-too-large' => 'Сиз ийген файл асыры уллуду.',
 'api-error-filename-tooshort' => 'Файлны аты асыры къысхады.',
 'api-error-filetype-banned' => 'Быллай типли файлла джасакъланыбдыла.',
+'api-error-filetype-missing' => 'Файлны кенгериую джокъду.',
 'api-error-hookaborted' => 'Сиз теджеген тюрлендириуню кенгертиуню сюзюучю джасакълагъанды.',
 'api-error-illegal-filename' => 'Джарамагъан файл ат.',
 'api-error-invalid-file-key' => 'Ич халат: болджаллы асыраучу джерде файл  табылмады.',
 'api-error-mustbeposted' => 'Ич халат: соруу, HTTP POST инструкцияны излейди.',
+'api-error-ok-but-empty' => 'Ич халат: сервер джууаб бермейди.',
+'api-error-unclassified' => 'Белгили болмагъан халат чыкъды',
 'api-error-unknown-code' => 'Билинмеген халат: «$1».',
+'api-error-unknown-error' => 'Ич халат: файлны джюклерге излеген сагъатда не эсе да терс болду.',
 'api-error-unknown-warning' => 'Билинмеген билдириу: $1',
 'api-error-unknownerror' => 'Билинмеген халат: «$1».',
 'api-error-uploaddisabled' => 'Бу викиде файлла джюклеу амал джукъланыбды',
index abc6288..90dba2f 100644 (file)
@@ -107,7 +107,7 @@ $messages = array(
 'tog-previewonfirst' => 'Li cem guherandinê hertim yekemîn pêşdîtinê nîşan bide',
 'tog-nocache' => 'Vegirtina rûpelan bisekinîne',
 'tog-enotifwatchlistpages' => 'Heke rûpeleke ez dişopînim hate guhertin ji min re E-nameyekê bişîne',
-'tog-enotifusertalkpages' => 'Dema rûpela min a Guftûgoyê hate guhertin e-nameyekê ji min re bişîne',
+'tog-enotifusertalkpages' => 'Dema rûpela min a Gotûbêjê hate guhertin e-nameyekê ji min re bişîne',
 'tog-enotifminoredits' => 'Ji bo guhertinên biçûk jî E-nameyekê ji min re bişîne',
 'tog-enotifrevealaddr' => 'Navnîşana e-nameya min di agahdariyên e-nameyan de nîşan bide',
 'tog-shownumberswatching' => 'Nîşan bide, çiqas bikarhêner dişopînin',
@@ -212,7 +212,7 @@ $messages = array(
 'moredotdotdot' => 'Bêhtir...',
 'mypage' => 'Rûpela min',
 'mytalk' => 'Rûpela gotûbêja min',
-'anontalk' => 'Guftûgo ji bo vê IPê',
+'anontalk' => "Gotûbêj ji bo vê IP'ê",
 'navigation' => 'Navîgasyon',
 'and' => '&#32;û',
 
@@ -271,13 +271,13 @@ $messages = array(
 'unprotect' => 'Parastinê rake',
 'unprotectthispage' => 'Parastina vê rûpelê rake',
 'newpage' => 'Rûpela nû',
-'talkpage' => 'Vê rûpelê guftûgo bike',
+'talkpage' => 'Vê rûpelê gotûbêj bike',
 'talkpagelinktext' => 'Nîqaş',
 'specialpage' => 'Rûpela taybet',
 'personaltools' => 'Amûrên kesane',
 'postcomment' => 'Beşeke nû',
 'articlepage' => 'Li rûpela naverokê binêre',
-'talk' => 'Guftûgo',
+'talk' => 'Gotûbêj',
 'views' => 'Dîtin',
 'toolbox' => 'Qutiya amûran',
 'userpage' => 'Li rûpela vê/vî bikarhênerê/î binêre',
@@ -287,7 +287,7 @@ $messages = array(
 'templatepage' => 'Rûpela şablonê bibîne',
 'viewhelppage' => 'Rûpela alîkariyê bibîne',
 'categorypage' => 'Li rûpela kategoriyê binêre',
-'viewtalkpage' => 'Li guftûgoyê binêre',
+'viewtalkpage' => 'Li gotûbêjê binêre',
 'otherlanguages' => 'Zimanên din',
 'redirectedfrom' => '(ji $1 hate beralîkirin)',
 'redirectpagesub' => 'Rûpelê beralî bike',
@@ -624,7 +624,7 @@ Zanibe ku tu nikarî e-nameya bişînî heta tu di [[Special:Preferences|tercih
 'newarticletext' => "Ev rûpel hîn tune. Eger tu bixwazî vê rûpelê çêkî, dest bi nivîsandinê bike û piştre qeyd bike. '''Wêrek be''', biceribîne!<br />
 Ji bo alîkariyê binêre: [[{{MediaWiki:Helppage}}|Alîkarî]].<br />
 Heke tu bi şaşîtî hatî, bizîvire rûpela berê.",
-'anontalkpagetext' => "----''Ev rûpela guftûgo ye ji bo bikarhênerên nediyarkirî ku hîn hesabekî xwe çênekirine an jî bikarnaînin. Ji ber vê yekê divê em wan bi navnîşana IP ya hejmarî nîşan bikin. Navnîşaneke IP dikare ji aliyê gelek kesan ve were bikaranîn. Heger tu bikarhênerekî nediyarkirî bî û bawerdikî ku nirxandinên bê peywend di der barê te de hatine kirin ji kerema xwe re [[Special:UserLogin|hesabekî xwe veke an jî têkeve]] da ku tu xwe ji tevlîheviyên bi bikarhênerên din re biparêzî.''",
+'anontalkpagetext' => "----''Ev rûpela gotûbêjê ye ji bo bikarhênerên nediyarkirî ku hîn hesabekî xwe çênekirine an jî bikarnaînin. Ji ber vê yekê divê em wan bi navnîşana IP ya hejmarî nîşan bikin. Navnîşaneke IP dikare ji aliyê gelek kesan ve were bikaranîn. Heger tu bikarhênerekî nediyarkirî bî û bawerdikî ku nirxandinên bê peywend di der barê te de hatine kirin ji kerema xwe re [[Special:UserLogin|hesabekî xwe veke an jî têkeve]] da ku tu xwe ji tevlîheviyên bi bikarhênerên din re biparêzî.''",
 'noarticletext' => 'Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].',
 'noarticletext-nopermission' => 'Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].
 Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].',
@@ -686,7 +686,7 @@ Ew berê heye.',
 # "Undo" feature
 'undo-success' => 'Ev guherandina kane were şondakirin. Xêra xwe ferqê piştî tomarkirinê bibîne û seke, ku tu ew versîyona dixwazê û tomarbike. Eger te şaşbûnekî kir, xêra xwe derkeve.',
 'undo-failure' => 'Ev guherandina nikane were şondakirin ji ber ku guherandinên piştî wê.',
-'undo-summary' => 'Guhertoya $1 ya [[Special:Contributions/$2|$2]] ([[User talk:$2|guftûgo]]) şûnde kir',
+'undo-summary' => 'Guhertoya $1 ya [[Special:Contributions/$2|$2]] ([[User talk:$2|gotûbêj]]) şûnde kir',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Hesab nikarîbû were çêkirin',
@@ -984,7 +984,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'action-read' => 'Vê rûpelê bixwîne',
 'action-edit' => 'vê rûpelê biguherîne',
 'action-createpage' => 'rûpelan çêke',
-'action-createtalk' => 'rûpelên guftûgoyan çêke',
+'action-createtalk' => 'rûpelên gotûbêjan çêke',
 'action-createaccount' => "vê account'ê bikarhênerê çêke",
 'action-minoredit' => 'vê weke guhertineke biçûk nîşan bide',
 'action-move' => 'vê rûpelê bigerîne',
@@ -1362,7 +1362,7 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 'watchnologintext' => 'Ji bo xeyrandinê lîsteya te ya şopandinê tu gireke xwe [[Special:UserLogin|qedy kiribe]].',
 'addwatch' => 'Tevlî lîsteya şopandinê bike',
 'addedwatchtext' => "Rûpela \"<nowiki>\$1</nowiki>\" çû ser [[Special:Watchlist|lîsteya te ya şopandinê]].
-Li dahatû de her guhartoyek li wê rûpelê û rûpela guftûgo ya wê were kirin li vir dêt nîşan dan,
+Li dahatû de her guhartoyek li wê rûpelê û rûpela gotûbêjê wê were kirin li vir dêt nîşan dan,
 
 Li rûpela [[Special:RecentChanges|Guherandinên dawî]] jî ji bo hasan dîtina wê, ew rûpel bi '''Nivîsa estûr''' dê nîşan dayîn.
 
@@ -1376,7 +1376,7 @@ Li rûpela [[Special:RecentChanges|Guherandinên dawî]] jî ji bo hasan dîtina
 'unwatchthispage' => 'Êdî neşopîne',
 'notanarticle' => 'Ne gotar e',
 'watchnochange' => 'Ne rûpelek, yê tu dişopînê, hate xeyrandin di vê wextê da, yê tu dixazê bibînê.',
-'watchlist-details' => '* {{PLURAL:$1|Rûpelek tê|$1 rûpel tên}} şopandin, rûpelên guftûgoyê netên jimartin.',
+'watchlist-details' => '* {{PLURAL:$1|Rûpelek tê|$1 rûpel tên}} şopandin, rûpelên gotûbêjê nayên jimartin.',
 'wlheader-enotif' => '* Agahdariya E-nameyê pêk tê.',
 'wlheader-showupdated' => "* Ew rûpel yê hatin xeyrandin jilkî te li wan sekir di '''nivîsa estûr''' tên pêşandin.",
 'watchlistcontains' => 'Di lîsteya şopandina te de {{PLURAL:$1|rûpelek heye|$1 rûpel hene}}.',
@@ -1452,9 +1452,9 @@ Naverroka berî betalkirinê ev bû:'$1'",
 'rollbacklink' => 'bizivirîne pêş',
 'cantrollback' => "Guharto naye vegerandin; bikarhêrê dawî, '''tenya''' nivîskarê wê rûpelê ye.",
 'alreadyrolled' => 'Guherandina dawiya [[$1]]
-bi [[User:$2|$2]] ([[User talk:$2|guftûgo]]) venizivre; keseke din wê rûpelê zivrandiye an guherandiye.
+bi [[User:$2|$2]] ([[User talk:$2|gotûbêj]]) venizivre; keseke din wê rûpelê zivrandiye an guherandiye.
 
-Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|guftûgo]]).',
+Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|gotûbêj]]).',
 'editcomment' => "Kurtenivîsê guherandinê ev bû: \"''\$1''\".",
 'revertpage' => 'Guherandina $2 hat betal kirin, vegerand guhartoya dawî ya $1',
 'rollback-success' => 'Guherandina $1 şondakir; dîsa guharte verzyona $2.',
@@ -1602,7 +1602,7 @@ Sedemekê binivîse!',
 'ipbotheroption' => 'yên din',
 'ipbotherreason' => 'Sedemekî din',
 'ipbhidename' => 'Navê bikarhêner / adresê IP ji "pirtûkê" astengkirinê, lîsteya astengkirinên nuh û lîsteya bikarhêneran veşêre',
-'ipbwatchuser' => 'Rûpelên bikarhêner û guftûgoyê bişopîne',
+'ipbwatchuser' => 'Rûpelên bikarhêner û gotûbêjê bişopîne',
 'ipb-confirm' => 'Astengkirinê piştrast bike',
 'badipaddress' => 'Bikarhêner bi vî navî tune',
 'blockipsuccesssub' => 'Astengkirin serkeftî bû',
@@ -1636,7 +1636,7 @@ Sedemekê binivîse!',
 'noautoblockblock' => 'astengkirina otomatîk hatîye temirandin',
 'createaccountblock' => 'çêkirina hesaban hate qedexekirin',
 'emailblock' => 'E-Mail hate girtin',
-'blocklist-nousertalk' => 'nikarê rûpela gûftugoya xwe biguherînê',
+'blocklist-nousertalk' => 'nikare rûpela gotûbêja xwe biguherîne',
 'ipblocklist-empty' => 'Lîsteya astengkirinê vala ye.',
 'ipblocklist-no-results' => "Ew IP'ya ya bikarhênera nehatîye astengkirin.",
 'blocklink' => 'asteng bike',
@@ -1653,7 +1653,7 @@ Sedemekê binivîse!',
 'block-log-flags-nocreate' => 'çêkirina hesaban hate qedexekirin',
 'block-log-flags-noautoblock' => 'astengkirina otomatik tune',
 'block-log-flags-noemail' => 'Şandina e-nameyan hatîye qedexekirin',
-'block-log-flags-nousertalk' => 'nikare guftûgoyê xwe biguherîne',
+'block-log-flags-nousertalk' => 'nikare gotûbêja xwe biguherîne',
 'block-log-flags-hiddenname' => 'navê bikarhêneriyê yê veşartî',
 'ipb_expiry_invalid' => 'Dem ne serrast e.',
 'ipb_already_blocked' => '"$1" berê hatîye astengkirin',
@@ -1702,7 +1702,7 @@ da bikarî navê wê rûpelê biguherînî.',
 'articleexists' => 'Rûpela bi vî navî heye, an navê ku te hilbijart derbas nabe. Navekî din hilbijêre.',
 'cantmove-titleprotected' => 'Tu nikanê vê rûpelê bervê vê cihê bigerînê ji ber ku sernava nuh tê parastin ji bo çêkirinê',
 'movedto' => 'bû',
-'movetalk' => "Rûpela '''guftûgo''' ya wê jî bigerîne, eger gengaz be.",
+'movetalk' => "Rûpela '''gotûbêj'''a wê jî bigerîne, eger gengaz be.",
 'movepage-page-exists' => 'Rûpela $1 berê heye û ew nikane otomatîk were jêbirin.',
 'movepage-page-moved' => 'Rûpela $1 çû cihê $2.',
 'movepage-page-unmoved' => 'Rûpela $1 nikanî çûba ciha $2.',
@@ -1759,12 +1759,12 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Rûpela min',
 'tooltip-pt-anonuserpage' => 'The user page for the ip you',
-'tooltip-pt-mytalk' => 'Rûpela guftûgo ya min',
+'tooltip-pt-mytalk' => 'Rûpela min a gotûbêjê',
 'tooltip-pt-preferences' => 'Tercîhên min',
 'tooltip-pt-watchlist' => 'The list of pages you',
 'tooltip-pt-mycontris' => 'Lîsteya beşdariyên min',
 'tooltip-pt-logout' => 'Derkeve (Log out)',
-'tooltip-ca-talk' => 'Guftûgo li ser rûpela naverokê',
+'tooltip-ca-talk' => 'Gotûbêj li ser rûpela naverokê',
 'tooltip-ca-edit' => 'Vê rûpelê biguherîne! Berê qeydkirinê bişkoka "Pêşdîtin',
 'tooltip-ca-addsection' => 'Beşekê zêde bike.',
 'tooltip-ca-viewsource' => 'Ev rûpela tê parastin. Tu dikarê bes li çavkanîyê sekê.',
@@ -2025,7 +2025,7 @@ Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
 'lag-warn-high' => 'Ji bo westinê sistêmê ew xeyrandin, yê piştî $1 sanîyan hatine çêkirin netên wêşendan.',
 
 # Watchlist editor
-'watchlistedit-numitems' => 'Di lîsteya te ya şopandinê de {{PLURAL:$1|gotarek heye.|$1 gotar hene.}} (ji xeynî rûpela guftûgoyan).',
+'watchlistedit-numitems' => 'Di lîsteya te ya şopandinê de {{PLURAL:$1|gotarek heye.|$1 gotar hene.}} (ji xeynî rûpela gotûbêjan).',
 'watchlistedit-noitems' => 'Di lîsteya te ya şopandinê  de gotar tune ne.',
 'watchlistedit-normal-title' => 'Lîsteya xwe ya şopandinê biguherîne',
 'watchlistedit-normal-legend' => 'Gotaran ji lîsteya min ya şopandinê rake',
index 7b13bfd..566cf78 100644 (file)
@@ -1652,6 +1652,7 @@ Wann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrat
 'backend-fail-closetemp' => 'Den temporäre Fichier konnt net zougemaach ginn.',
 'backend-fail-read' => 'De Fichier $1 konnt net geliest ginn.',
 'backend-fail-create' => 'De Fichier $1 konnt net ugeluecht ginn.',
+'backend-fail-maxsize' => 'De Fichier $1 konnt net generéiert gi well e méi grouss ass wéi {{PLURAL:$2|ee Byte|$2 Byten}}.',
 'backend-fail-readonly' => 'De Späicher-Backend "$1" kann elo nëmme geliest ginn (read-only). De Grond deen ugi gouf war: "$2"',
 
 # Lock manager
@@ -3532,6 +3533,8 @@ Dir misst eng [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun der GNU General Public
 'version-software' => 'Installéiert Software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Versioun',
+'version-entrypoints' => 'URLe vun Agangspunkten',
+'version-entrypoints-header-entrypoint' => 'Agangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
index 8a8c926..a9f58fb 100644 (file)
@@ -848,6 +848,7 @@ Prašome pamėginti vėl. Jei tai nepadeda, pamėginkite atsijungti ir prisijung
 'token_suffix_mismatch' => "'''Jūsų pakeitimas buvo atmestas, nes jūsų naršyklė iškraipė skyrybos ženklus keitimo žymėje. Keitimas buvo atmestas norint apsaugoti puslapio tekstą nuo sugadinimo. Taip kartais būna, kai jūs naudojate anoniminį tarpinio serverio paslaugą.'''",
 'edit_form_incomplete' => "'''Kai redaguoti formos dalys nepasiekė serverio; du kartus patikrinti, kad jūsų pakeitimai yra nesugadintos ir bandykite dar kartą.'''",
 'editing' => 'Taisomas $1',
+'creating' => 'Kuriama $1',
 'editingsection' => 'Taisomas $1 (skyrelis)',
 'editingcomment' => 'Taisomas $1 (komentaras)',
 'editconflict' => 'Išpręskite konfliktą: $1',
@@ -1071,7 +1072,7 @@ Prašome patikrinti sąrašus.',
 # Suppression log
 'suppressionlog' => 'Trynimo istorija',
 'suppressionlogtext' => 'Žemiau yra trynimų ir blokavimų sąrašas, įtraukiant turinį, paslėptą nuo administratorių.
-Žiūrėkite [[Special:BlockList|IP blokavimų sąrašą]], kad rastumėte dabar veikiančius draudimus ir blokavimus.',
+Žiūrėkite [[Special:BlockList|blokavimų sąrašą]], kad rastumėte dabar veikiančius draudimus ir blokavimus.',
 
 # History merging
 'mergehistory' => 'Sujungti puslapių istorijas',
@@ -2471,7 +2472,7 @@ Pateikiamas paskutinis blokavimo istorijos įrašas.',
 'reblock-logentry' => 'pakeisti [[$1]] blokavimo nustatymai, naujas blokavimo laikas – $2 $3',
 'blocklogtext' => 'Čia yra naudotojų blokavimo ir atblokavimo sąrašas.
 Automatiškai blokuoti IP adresai neišvardinti.
-Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:BlockList|IP blokavimų sąrašą]].',
+Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:BlockList|blokavimų sąrašą]].',
 'unblocklogentry' => 'atblokavo $1',
 'block-log-flags-anononly' => 'tik anoniminiai naudotojai',
 'block-log-flags-nocreate' => 'paskyrų kūrimas išjungtas',
index 583efb8..b0fb6c8 100644 (file)
@@ -134,7 +134,7 @@ $messages = array(
 'category-article-count' => "{{PLURAL:$2|He pawl hian hemi phêk chauh hi a nei. | Hê'ng phek {{PLURAL:$1||$1-te}} hi he pawlah hian a awm, avaia $2 zingah.}}",
 'category-article-count-limited' => '{{PLURAL: $1 |$1He|$1 Heng}} phekte hi hë pawl, i en mékah hian a awm.',
 'category-file-count' => '{{PLURAL:$2|He pawl hian hë taksa chauh hi a kengtel.|{{PLURAL:$1|He taksa $1 |Heng taksa $1-te}} hi he pawlah hian a awm, a vaia $2 zingah}}',
-'category-file-count-limited' => '{{PLURAL:$1|He taksa (file)|$1Heng taksate}} hi hemi pawl, i en mékah hian a awm.',
+'category-file-count-limited' => '{{PLURAL:$1|He taksa|$1Heng taksate}} hi hemi pawl, i en mékah hian a awm.',
 'listingcontinuesabbrev' => 'chhunz.',
 'index-category' => 'Phêk tarlante',
 'noindex-category' => 'Phêk tarlan lohte',
@@ -483,6 +483,7 @@ I thurûk i thlâk hlawhtling tawh a nih loh pawhin thurûk lailâwk i dil a ni
 'passwordreset' => 'Thurûk ziakţha rawh',
 'passwordreset-legend' => 'Thurûk ziakţha rawh',
 'passwordreset-username' => 'Hmangtu hming:',
+'passwordreset-domain' => 'Huamchin:',
 'passwordreset-email' => 'E-chenhmun:',
 'passwordreset-emailtitle' => '{{SITENAME}}-a siangchan chanchin kim',
 'passwordreset-emailelement' => 'Hmangtuhming: $1
@@ -571,6 +572,12 @@ I rawn atan a danbeh chhinchhiahna kan han tarlang a ni e:',
 'note' => "'''Hriat tùr:'''",
 'previewnote' => "'''Heihi endikna chauh a ni tih hrereng ang che.'''
 I tihdanglamna dahţhat a la ni lo!",
+'session_fail_preview_html' => "'''A pawi hlë mai! Ṭhutchhúng chanchin vawnna hloh avangin i siamṭhatna dahṭhat theih a ni lo.'''
+
+''{{SITENAME}}-in HTML hel a tihzalen avangin hë enlâwkna hi JavaScript beihna laka invèn fimkhur nan thup bo a ni.''
+
+'''Hei hi siamṭhat tumna dànzui pangngai a nih chuan khawngaihin dahṭhat tum nawn leh rawh.'''
+I la dahṭhat theih loh cheu chuan [[Special:UserLogout|chhuah phawt ]] a, luh nawn leh hmang tein han bei vêl chhin lä.",
 'editing' => '$1 i siam(ţha) mék',
 'editingsection' => '$1 (hlawm) i siam(ţha) mék',
 'editingcomment' => '$1 (hlawm thar) i siam(ţha) mék',
@@ -578,6 +585,8 @@ I tihdanglamna dahţhat a la ni lo!",
 'yourtext' => 'I thu tah hian:',
 'storedversion' => 'Ennawnna vawnţhat',
 'yourdiff' => 'Danglamnate',
+'protectedpagewarning' => "'''Vaukhanna: Hë phêk hi roreltute chauhvin an siamṭhat theihna tùrin vènhim a ni.'''
+I rawn atan ziaka chanchin dah hnuhnüng ber kan rawn chhawp chhuak e:",
 'semiprotectedpagewarning' => "'''Hriat tùr:''' He phêk hi hmangtu inziaklûtte chauhvin an tihdanglam theihna tùra vènhim a ni.
 I rawn tùrin siamm-danglamna chanchin ziaka kan dahţhat thar ber a hnuaiah khuan kan chhawp e:",
 'templatesused' => 'He phêka {{PLURAL:$1|siamsa hman|siamsa hmante}}',
@@ -961,9 +970,11 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 'boteditletter' => 'k',
 'rc-enhanced-expand' => 'Tilang kim rawh (JavaScript a ngai)',
 'rc-enhanced-hide' => 'Thup ţhenna',
+'rc-old-title' => 'Atìra "&1" tih hming pú-a siam.',
 
 # Recent changes linked
 'recentchangeslinked' => 'Tihdanglam anpuite',
+'recentchangeslinked-feed' => 'Tihdanglam anpuite',
 'recentchangeslinked-toolbox' => 'Tihdanglam anpuite',
 'recentchangeslinked-title' => '"$1" kaihhnawih tihdanglamnate',
 'recentchangeslinked-noresult' => 'I hun thlan chhungah hian a phek zawmpui tihdanglam pakhat mah a awm lo.',
@@ -982,6 +993,9 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 'upload_directory_missing' => 'Hlankai bawmpui ($1)  a awm lo va, Rangserverin a siam thei lo bawl.',
 'upload_directory_read_only' => 'Hlankai bawmpui ($1) hi Rangserver in a ziak thei lo.',
 'uploaderror' => 'Hlankai sual',
+'upload-recreate-warning' => "'''Vaukhànna: Hemi hming pu taksa hi sawn tawh emaw paih tawh a ni.'''
+
+I ràwnah paihna leh sawnna chhinchhiahna thuziak kan rawn chhawpchhuak e:",
 'upload-permitted' => 'Taksa phal chiho: $1.',
 'upload-preferred' => 'Taksa duh deuh bîk: $1.',
 'upload-prohibited' => 'Taksa khap: $1.',
@@ -1028,7 +1042,7 @@ A hming thlâk la bei ţha leh rawh.',
 'listfiles_count' => 'Chhuah',
 
 # File description page
-'file-anchor-link' => 'Taksa (file)',
+'file-anchor-link' => 'Taksa',
 'filehist' => 'A chanchin enna',
 'filehist-help' => 'A hunlaia a lan dan en tùrin a hun/ni-ah hmet rawh.',
 'filehist-deleteall' => 'a vaiin nuaibo rawh',
@@ -1118,6 +1132,7 @@ Phêk hminga hman awih loh hawrawp a hmang palh a ni mai thei bawk.',
 'sp-deletedcontributions-contribs' => 'kutthawhnate',
 
 # Special:LinkSearch
+'linksearch-ns' => 'Hminghmun:',
 'linksearch-ok' => 'Zawng rawh',
 'linksearch-line' => '$1 hi $2 aţanga thlunzawm a ni',
 
index 9acbc1b..df7ccd1 100644 (file)
@@ -1124,6 +1124,10 @@ $2
 'parser-template-loop-warning' => 'Пронајдена е јамка во шаблонот: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Ограничувањето на рекурзивната длабочина надмината во шаблонот ($1)',
 'language-converter-depth-warning' => 'Надмината е границата на длабочината  на јазичниот претворач ($1)',
+'node-count-exceeded-category' => 'Страници каде е надминат бројот на јазли',
+'node-count-exceeded-warning' => 'Страницата го надмина бројот на јазли',
+'expansion-depth-exceeded-category' => 'Страници каде е надмината длабочината на проширувањето',
+'expansion-depth-exceeded-warning' => 'Страницата ја надмина длабочината на проширувањето',
 
 # "Undo" feature
 'undo-success' => 'Уредувањето може да се откаже.
index 6a988b5..645ab3d 100644 (file)
@@ -682,7 +682,7 @@ $1',
 'badtitle' => 'അസാധുവായ തലക്കെട്ട്',
 'badtitletext' => 'താങ്കൾ ആവശ്യപ്പെട്ട തലക്കെട്ടുള്ള ഒരു താൾ നിലവിലില്ല. ഇതു തെറ്റായി അന്തർഭാഷാ/അന്തർവിക്കി കണ്ണി ചെയ്യപ്പെട്ടതു മൂലമോ, തലക്കെട്ടിൽ ഉപയോഗിക്കരുതാത്ത അക്ഷരരൂപങ്ങൾ ഉപയോഗിച്ചതു മൂലമോ സംഭവിച്ചതായിരിക്കാം.',
 'perfcached' => 'താഴെ കൊടുത്തിരിക്കുന്ന വിവരം ശേഖരിച്ചു വെച്ചിരിക്കുന്നതാണ്, അതുകൊണ്ട് ചിലപ്പോൾ പുതിയതായിരിക്കണമെന്നില്ല. പരമാവധി {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.',
-'perfcachedts' => 'താഴെയുള്ള വിവരങ്ങൾ ശേഖരിച്ച് വെച്ചവയിൽ പെടുന്നു, അവസാനം പുതുക്കിയത് $1-നു ആണ്‌. പരമാവധി {{PLURAL:$4|ഒരു ഫലം|$4 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്. സാധാരണ ഗതിയിൽ $4 ആയിരമായിരിക്കും.',
+'perfcachedts' => 'താഴെയുള്ള വിവരങ്ങൾ ശേഖരിച്ച് വെച്ചവയിൽ പെടുന്നു, അവസാനം പുതുക്കിയത് $1-നു ആണ്‌. പരമാവധി {{PLURAL:$4|ഒരു ഫലം|$4 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.',
 'querypage-no-updates' => 'ഈ താളിന്റെ പുതുക്കൽ തൽക്കാലം നടക്കുന്നില്ല. ഇവിടുള്ള വിവരങ്ങൾ ഏറ്റവും പുതിയതാവണമെന്നില്ല.',
 'wrong_wfQuery_params' => 'wfQuery()എന്നതിലേക്ക് തെറ്റായ പരാമീറ്ററുകൾ<br />
 നിർദ്ദേശം: $1<br />
@@ -1069,6 +1069,10 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'parser-template-loop-warning' => 'ഫലകക്കുരുക്ക് കണ്ടെത്തിയിരിക്കുന്നു: [[$1]]',
 'parser-template-recursion-depth-warning' => 'ഫലകത്തിന്റെ പുനരാവർത്തന ആഴത്തിന്റെ പരിധി കഴിഞ്ഞിരിക്കുന്നു ($1)',
 'language-converter-depth-warning' => 'ഭാഷ മാറ്റൽ ഉപകരണത്തിന്റെ ആഴത്തിന്റെ പരിധി കവിഞ്ഞിരിക്കുന്നു ($1)',
+'node-count-exceeded-category' => 'നോഡ്-എണ്ണം അധികരിച്ച താളുകൾ',
+'node-count-exceeded-warning' => 'താൾ നോഡ്-എണ്ണം അധികരിച്ചിരിക്കുന്നു',
+'expansion-depth-exceeded-category' => 'വികസന ആഴം അധികരിച്ച താളുകൾ',
+'expansion-depth-exceeded-warning' => 'താളിന്റെ വികസന ആഴം അധികരിച്ചിരിക്കുന്നു',
 
 # "Undo" feature
 'undo-success' => 'ഈ തിരുത്തൽ താങ്കൾക്ക് തിരസ്ക്കരിക്കാവുന്നതാണ്‌. താഴെ കൊടുത്തിരിക്കുന്ന പതിപ്പുകൾ തമ്മിലുള്ള താരതമ്യം ഒന്നുകൂടി പരിശോധിച്ച് ഈ പ്രവൃത്തി ചെയ്യണോ എന്ന് ഒന്നുകൂടി ഉറപ്പാക്കുക. ഉറപ്പാണെങ്കിൽ തിരുത്തൽ തിരസ്ക്കരിക്കുവാൻ താൾ സേവ് ചെയ്യുക.',
@@ -2003,7 +2007,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'statistics-users-active-desc' => 'കഴിഞ്ഞ {{PLURAL:$1|ദിവസം|$1 ദിവസങ്ങൾക്കുള്ളിൽ}} പ്രവർത്തിച്ചിട്ടുള്ള ഉപയോക്താക്കൾ',
 'statistics-mostpopular' => 'ഏറ്റവുമധികം സന്ദർശിക്കപ്പെട്ട താളുകൾ',
 
-'disambiguations' => 'വിവക്ഷിത താളുകളിലേയ്ക്ക് കണ്ണിചേർക്കുന്ന താളുകൾ',
+'disambiguations' => 'വിവà´\95àµ\8dà´·à´¿à´¤ à´¤à´¾à´³àµ\81à´\95ളിലàµ\87à´¯àµ\8dà´\95àµ\8dà´\95àµ\8d à´\95à´£àµ\8dണിà´\9aàµ\87ർതàµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95ൾ',
 'disambiguationspage' => 'Template:വിവക്ഷകൾ',
 'disambiguations-text' => 'താഴെ കൊടുത്തിരിക്കുന്ന താളുകൾ വിവക്ഷിതങ്ങൾ താളിലേക്കു കണ്ണി ചേർക്കപ്പെട്ടിരിക്കുന്നു. അതിനു പകരം അവ ലേഖനതാളുകളിലേക്കു കണ്ണി ചേക്കേണ്ടതാണ്‌. <br /> ഒരു താളിനെ വിവക്ഷിത താൾ ആയി പരിഗണിക്കണമെങ്കിൽ അതു  [[MediaWiki:Disambiguationspage]] എന്ന താളിൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ട ഒരു ഫലകം ഉപയോഗിക്കണം.',
 
index b3e341d..5cc70ef 100644 (file)
@@ -340,7 +340,7 @@ $messages = array(
 'tog-previewontop' => 'झलक संपादन खिडकीच्या आधी दाखवा',
 'tog-previewonfirst' => 'पहिल्या संपादनानंतर झलक दाखवा',
 'tog-nocache' => 'न्याहाळकाची पान सय (कॅशिंग) अक्षम (निकमी) करा',
-'tog-enotifwatchlistpages' => 'माà¤\9dà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80मधà¥\80ल (नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयात à¤\85सलà¥\87लà¥\80 à¤¸à¥\82à¤\9aà¥\80) à¤ªà¤¾à¤¨ à¤¬à¤¦à¤²à¤²à¥\8dयास à¤®à¤²à¤¾ à¤\88-मà¥\87ल à¤ªà¤¾à¤ à¤µà¤¾',
+'tog-enotifwatchlistpages' => 'माà¤\9dà¥\8dया à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¾à¤¹à¤¾à¤£à¥\8dयात à¤\85सलà¥\87लà¥\80 à¤¸à¥\82à¤\9aà¥\80मधà¥\8dयà¥\87 à¤\85सलà¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤®à¤§à¥\8dयà¥\87 à¤¬à¤¦à¤² à¤\9dालà¥\8dयास à¤®à¤²à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dर (à¤\88-मà¥\87ल) à¤ªà¤¾à¤ à¤µà¤¾.',
 'tog-enotifusertalkpages' => 'माझ्या चर्चा पानावर बदल झाल्यास मला विरोप (ई-मेल) पाठवा',
 'tog-enotifminoredits' => 'मला छोट्या बदलांकरीता सुद्धा विरोप पाठवा',
 'tog-enotifrevealaddr' => 'सूचना विरोपात माझा विरोपाचा (ई-मेल ) पत्ता दाखवा',
index 9035749..fed1422 100644 (file)
@@ -953,6 +953,10 @@ Argumen-argumen ini telah ditinggalkan.',
 'parser-template-loop-warning' => 'Gelung templat dikesan: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Had pengulangan templat dilebihi ($1)',
 'language-converter-depth-warning' => 'Had kedalaman penukar bahasa dilepasi ($1)',
+'node-count-exceeded-category' => 'Laman yang melebihi had kiraan nod',
+'node-count-exceeded-warning' => 'Laman terlebih kiraan nod',
+'expansion-depth-exceeded-category' => 'Laman yang melebihi had kedalaman peluasan',
+'expansion-depth-exceeded-warning' => 'Laman terlebih dalam peluasan',
 
 # "Undo" feature
 'undo-success' => 'Suntingan ini boleh dibatalkan. Sila semak perbandingan di bawah untuk mengesahkan bahawa anda betul-betul mahu melakukan tindakan ini, kemudian simpan perubahan tersebut.',
index 990892b..199d030 100644 (file)
@@ -480,7 +480,8 @@ Tu puodes [[Special:Search/{{PAGENAME}}|percurar pul títalo desta páigina]] no
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} percurar ls registros que téngan a ber],
 ó [{{fullurl:{{FULLPAGENAME}}|action=edit}} eiditar esta páigina]</span>.',
 'note' => "'''Abiso:'''",
-'previewnote' => "'''Esto ye solo ua amostra; las altaraçones inda nun fúrun grabadas!'''",
+'previewnote' => "'''Lhembra-te qu'esto ye solo ua amostra.'''
+Las altaraçones inda nun fúrun grabadas!",
 'editing' => 'A eiditar $1',
 'editingsection' => 'A eiditar $1 (cacho)',
 'yourtext' => 'L tou testo',
index af4bff8..6261670 100644 (file)
@@ -27,7 +27,7 @@ $messages = array(
 'tog-underline' => 'Liân-kiat oē té-sûn:',
 'tog-justify' => 'pâi-chê  tōaⁿ-lo̍h',
 'tog-hideminor' => 'Am chòe-kīn ê sió kái-piàn',
-'tog-hidepatrolled' => 'Am chòe-kīn sûn koè--ê  kái-piàn',
+'tog-hidepatrolled' => '最近改的,若巡過就掩掉',
 'tog-newpageshidepatrolled' => 'Sin-ia̍h ê chheng-toaⁿ am sûn koè--ê',
 'tog-extendwatchlist' => 'Tián-khui kàm-sī-toaⁿ khoàⁿ só͘-ū ê kái-piàn, m̄-chí sī choè-kīn--ê',
 'tog-usenewrc' => 'Ēng ka-kiông pán khoàⁿ chòe-kīn ê kái-piàn (su-iàu JavaScript)',
@@ -155,7 +155,7 @@ $messages = array(
 'article' => 'Loē-iông ia̍h',
 'newwindow' => '(ē khui sin thang-á hián-sī)',
 'cancel' => 'Chhú-siau',
-'moredotdotdot' => 'Iáu-ū',
+'moredotdotdot' => '猶有',
 'mypage' => 'Góa ê ia̍h',
 'mytalk' => 'Góa ê thó-lūn',
 'anontalk' => 'Chit ê IP ê thó-lūn-ia̍h',
@@ -359,7 +359,7 @@ Che it-poaⁿ sī in-ūi koè-sî ê cheng-chha ia̍h sī le̍k-sú liân-kiat 
 Nā m̄-sī hit chióng chêng-hêng, lí khó-lêng tú tio̍h nńg-thé ê chhò-ngō͘. Chhiáⁿ pò hō͘ chi̍t ūi [[Special:ListUsers/sysop|koán-lí-goân]], ūi liân-kiat hiâ khì lâu thong-ti .',
 'missingarticle-rev' => '(修訂本#: $1)',
 'missingarticle-diff' => '(精差:$1, $2)',
-'readonly_lag' => '資料庫已經自動鎖牢咧,從屬資料庫伺服器當咧更新綴到主伺服器',
+'readonly_lag' => '佇附屬資料庫伺服器對主伺服器來更新的時陣,資料庫就已經自動鎖牢咧。',
 'internalerror' => 'Loē-pō͘ ê chhò-ngō͘',
 'internalerror_info' => 'Loē-pō͘ ê chhò-ngō͘: $1',
 'fileappenderrorread' => 'Ka-ji̍p(append) ê sî bô-hoat-tō͘ thak "$1".',
@@ -689,6 +689,7 @@ Kháu-chō ê sin bi̍t-bé thang tī teng-ji̍p liáu tī ''[[Special:ChangePas
 'note' => "'''Chù-ì:'''",
 'previewnote' => "'''Thê-chhéⁿ lí, che chí-sī  hō͘ lí sian khoàⁿ chi̍t-ē.'''
 Lí kái--ê iáu-bōe pó-chûn--khí-lâi !",
+'continue-editing' => '繼續編輯',
 'previewconflict' => '這个先看覓會反應你文字編輯區的內容,顯示佇面頂。佇你保存了就會公開。',
 'session_fail_preview' => "'''Pháiⁿ-sè! Gún chiām-sî bô hoat-tō͘ chhú-lí lí ê pian-chi̍p (goân-in: \"phàng-kiàn sú-iōng kî-kan ê chu-liāu\"). Lô-hoân têng chhì khoàⁿ-māi. Ká-sú iû-goân bô-hāu, ē-sái teng-chhut koh-chài teng-ji̍p hoān-sè tō ē-tit kái-koat.'''",
 'session_fail_preview_html' => "'''歹勢!因為phàng見資料,阮無法度處理你的編輯。'''
index 43de418..805b327 100644 (file)
@@ -377,8 +377,8 @@ $messages = array(
 'tog-fancysig' => 'Als wikitekst behandelen (zonder automatische verwijzing)',
 'tog-externaleditor' => 'Standaard een externe tekstbewerker gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
 'tog-externaldiff' => 'Standaard een extern vergelijkingsprogramma gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
-'tog-showjumplinks' => '“ga naar”-toegankelijkheidsverwijzingen inschakelen',
-'tog-uselivepreview' => '“live voorvertoning” gebruiken (vereist JavaScript – experimenteel)',
+'tog-showjumplinks' => '"ga naar"-toegankelijkheidsverwijzingen inschakelen',
+'tog-uselivepreview' => '"live voorvertoning" gebruiken (vereist JavaScript – experimenteel)',
 'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
 'tog-watchlisthideown' => 'Eigen bewerkingen op mijn volglijst verbergen',
 'tog-watchlisthidebots' => 'Botbewerkingen op mijn volglijst verbergen',
@@ -458,9 +458,9 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorie|Categorieën}}',
-'category_header' => 'Pagina’s in categorie “$1”',
+'category_header' => 'Pagina’s in categorie "$1"',
 'subcategories' => 'Ondercategorieën',
-'category-media-header' => 'Media in categorie “$1”',
+'category-media-header' => 'Media in categorie "$1"',
 'category-empty' => "''Deze categorie bevat geen pagina’s of media.''",
 'hidden-categories' => 'Verborgen {{PLURAL:$1|categorie|categorieën}}',
 'hidden-category-category' => 'Verborgen categorieën',
@@ -631,8 +631,8 @@ Meer informatie is beschikbaar op de pagina [[Special:Version|softwareversie]].'
 'feed-unavailable' => 'Syndicatiefeeds zijn niet beschikbaar',
 'site-rss-feed' => '$1 RSS-feed',
 'site-atom-feed' => '$1 Atom-feed',
-'page-rss-feed' => '“$1” RSS-feed',
-'page-atom-feed' => '“$1” Atom-feed',
+'page-rss-feed' => '"$1" RSS-feed',
+'page-atom-feed' => '"$1" Atom-feed',
 'red-link-title' => '$1 (de pagina bestaat niet)',
 'sort-descending' => 'Aflopend sorteren',
 'sort-ascending' => 'Oplopend sorteren',
@@ -666,13 +666,13 @@ Een lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|{{in
 Mogelijk zit er een fout in de software.
 Het laatste verzoek aan de database was:
 <blockquote><tt>$1</tt></blockquote>
-vanuit de functie “<tt>$2</tt>”.
-De database gaf de volgende foutmelding “<tt>$3: $4</tt>”.',
+vanuit de functie "<tt>$2</tt>".
+De database gaf de volgende foutmelding "<tt>$3: $4</tt>".',
 'dberrortextcl' => 'Er is een syntaxisfout in het databaseverzoek opgetreden.
 Het laatste verzoek aan de database was:
-“$1”
-vanuit de functie “$2”.
-De database gaf de volgende foutmelding: “$3: $4”',
+"$1"
+vanuit de functie "$2".
+De database gaf de volgende foutmelding: "$3: $4"',
 'laggedslavemode' => "'''Waarschuwing:''' in deze pagina zijn recente wijzigingen mogelijk nog niet verwerkt.",
 'readonly' => 'Database geblokkeerd',
 'enterlockreason' => 'Geef een reden op voor de blokkade en geef op wanneer die waarschijnlijk wordt opgeheven',
@@ -695,7 +695,7 @@ Maak hiervan melding bij een [[Special:ListUsers/sysop|beheerder]] van {{SITENAM
 'filecopyerror' => 'Bestand "$1" kon niet naar "$2" gekopieerd worden.',
 'filerenameerror' => '"$1" kon niet hernoemd worden naar "$2".',
 'filedeleteerror' => 'Bestand "$1" kon niet verwijderd worden.',
-'directorycreateerror' => 'Map “$1” kon niet aangemaakt worden.',
+'directorycreateerror' => 'De map "$1" kon niet aangemaakt worden.',
 'filenotfound' => 'Bestand "$1" kon niet gevonden worden.',
 'fileexistserror' => 'Schrijven naar bestand "$1" onmogelijk: het bestand bestaat al.',
 'unexpected' => 'Onverwachte waarde: "$1"="$2".',
@@ -1150,6 +1150,10 @@ Deze parameters zijn weggelaten.',
 'parser-template-loop-warning' => 'Er is een kringloop in sjablonen geconstateerd: [[$1]]',
 'parser-template-recursion-depth-warning' => 'De recursiediepte voor sjablonen is overschreden ($1)',
 'language-converter-depth-warning' => 'De dieptelimiet voor de taalconvertor is overschreden ($1)',
+'node-count-exceeded-category' => "Pagina's waar het maximaal aantal nodes is overschreden",
+'node-count-exceeded-warning' => 'Op de pagina is het maximale aantal nodes overschreden',
+'expansion-depth-exceeded-category' => "Pagina's waar de expansiediepte is overschreden",
+'expansion-depth-exceeded-warning' => 'De pagina bevat te veel sjablonen',
 
 # "Undo" feature
 'undo-success' => 'Deze bewerking kan ongedaan gemaakt worden.
@@ -1794,7 +1798,7 @@ Aangewezen {{PLURAL:\$3|bestandstype is|bestandstypes zijn}} \$2.",
 'filetype-banned' => 'Het bestand dat u probeerde te uploaden was van een niet toegelaten bestandstype.',
 'verification-error' => 'De verificatie van het bestand dat u probeerde te uploaden is mislukt.',
 'hookaborted' => 'De wijziging die u probeerde te maken is afgebroken door een uitbreidingshook.',
-'illegal-filename' => 'Deze bestandsnaam is niet toegelaten.',
+'illegal-filename' => 'Deze bestandsnaam is niet toegestaan.',
 'overwrite' => 'Het overschrijven van een bestand bestand is niet toegestaan.',
 'unknown-error' => 'Er is een onbekende fout opgetreden.',
 'tmp-create-error' => 'Het was niet mogelijk een tijdelijk bestand aan te maken.',
@@ -3819,8 +3823,8 @@ Bevestig dat u de pagina opnieuw wilt aanmaken.',
 'livepreview-ready' => 'Bezig met laden… Klaar!',
 'livepreview-failed' => 'Live voorvertoning mislukt!
 Probeer de normale voorvertoning.',
-'livepreview-error' => 'Verbinden mislukt: $1 “$2”.
-Probeer normale voorvertoning.',
+'livepreview-error' => 'Verbinden mislukt: $1 "$2".
+Probeer normale voorvertoning te gebruiken.',
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => 'Wijzigingen in de afgelopen {{PLURAL:$1|seconde|$1 seconden}} worden misschien niet weergegeven in deze lijst.',
index 2e403e9..dbf76bd 100644 (file)
@@ -918,6 +918,7 @@ Det siste elementet i blokkeringsloggen er oppgjeve nedanfor:',
 'note' => "'''Merk:'''",
 'previewnote' => "'''Hugsa at dette berre er ei førehandsvising.'''
 Endringane dine er ikkje lagra enno!",
+'continue-editing' => 'Endra vidare',
 'previewconflict' => 'Dette er ei førehandsvising av teksten i endringsboksen over, slik han vil sjå ut om du lagrar han',
 'session_fail_preview' => "'''Orsak! Endringa di kunne ikkje lagrast. Ver venleg og prøv ein gong til. Dersom det framleis ikkje går, prøv å logge deg ut og inn att.'''",
 'session_fail_preview_html' => "'''Beklagar! Endringa di kunne ikkje lagrast.'''
@@ -1983,8 +1984,8 @@ Merk at andre internettsider kan ha direkte lenkjer til filer, og difor kan file
 # Special:AllPages
 'allpages' => 'Alle sider',
 'alphaindexline' => '$1 til $2',
-'nextpage' => 'Neste side ($1)',
-'prevpage' => 'Førre side ($1)',
+'nextpage' => 'Neste sida ($1)',
+'prevpage' => 'Førre sida ($1)',
 'allpagesfrom' => 'Vis sider frå:',
 'allpagesto' => 'Vis sider til og med:',
 'allarticles' => 'Alle sider',
@@ -3336,16 +3337,16 @@ Du må stadfeste at du verkeleg vil nyopprette denne sida.",
 'confirm-unwatch-top' => 'Fjern denne sida frå overvakingslista di?',
 
 # Multipage image navigation
-'imgmultipageprev' => '← førre side',
-'imgmultipagenext' => 'neste side →',
+'imgmultipageprev' => '← førre sida',
+'imgmultipagenext' => 'neste sida →',
 'imgmultigo' => 'Gå!',
 'imgmultigoto' => 'Gå til sida $1',
 
 # Table pager
 'ascending_abbrev' => 'stigande',
 'descending_abbrev' => 'synkande',
-'table_pager_next' => 'Neste side',
-'table_pager_prev' => 'Førre side',
+'table_pager_next' => 'Neste sida',
+'table_pager_prev' => 'Førre sida',
 'table_pager_first' => 'Fyrste side',
 'table_pager_last' => 'Siste side',
 'table_pager_limit' => 'Vis $1 element per side',
index ad8d236..7fc3eb5 100644 (file)
@@ -328,7 +328,7 @@ $messages = array(
 'january' => 'ଜାନୁଆରୀ',
 'february' => 'ଫେବୃଆରୀ',
 'march' => 'ମାର୍ଚ୍ଚ',
-'april' => 'à¬\8fପà­\8dରିଲ',
+'april' => 'à¬\85ପà­\8dରà­\87ଲ',
 'may_long' => 'ମେ',
 'june' => 'ଜୁନ',
 'july' => 'ଜୁଲାଇ',
@@ -340,7 +340,7 @@ $messages = array(
 'january-gen' => 'ଜାନୁଆରୀ',
 'february-gen' => 'ଫେବୃଆରୀ',
 'march-gen' => 'ମାର୍ଚ୍ଚ',
-'april-gen' => 'à¬\8fପà­\8dରିଲ',
+'april-gen' => 'à¬\85ପà­\8dରà­\87ଲ',
 'may-gen' => 'ମେ',
 'june-gen' => 'ଜୁନ',
 'july-gen' => 'ଜୁଲାଇ',
@@ -352,7 +352,7 @@ $messages = array(
 'jan' => 'ଜାନୁଆରୀ',
 'feb' => 'ଫେବୃଆରୀ',
 'mar' => 'ମାର୍ଚ୍ଚ',
-'apr' => 'à¬\8fପà­\8dରିଲ',
+'apr' => 'à¬\85ପà­\8dରà­\87ଲ',
 'may' => 'ମେ',
 'jun' => 'ଜୁନ',
 'jul' => 'ଜୁଲାଇ',
@@ -517,10 +517,10 @@ $1',
 'newmessageslink' => 'ନୂଆ ମେସେଜ',
 'newmessagesdifflink' => 'ଶେଷ ବଦଳ',
 'youhavenewmessagesmulti' => '$1 ତାରିଖରେ ନୂଆ ଚିଠିଟିଏ ଆସିଛି',
-'editsection' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
-'editold' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'editsection' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
+'editold' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
 'viewsourceold' => 'ମୂଳାଧାର ଦେଖିବେ',
-'editlink' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'editlink' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
 'viewsourcelink' => 'ମୂଳାଧାର ଦେଖିବେ',
 'editsectionhint' => '$1 ଭାଗଟିକୁ ବଦଳାଇବେ',
 'toc' => 'ଭିତର ଚିଜ',
@@ -2004,7 +2004,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
 
 'brokenredirects' => 'ଭଙ୍ଗା ପୁନପ୍ରେରଣ',
 'brokenredirectstext' => 'ତଳଲିଖିତ ପୁନପ୍ରେରଣ ସବୁ ସ୍ଥିତିହିନ ପୃଷ୍ଠାମାନଙ୍କୁ ପୁନପ୍ରେରିତ ହୋଇଥାଏ :',
-'brokenredirects-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'brokenredirects-edit' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
 'brokenredirects-delete' => 'ଲିଭାଇବେ',
 
 'withoutinterwiki' => 'ଭାଷାର ଲିଙ୍କ ନଥିବା ପୃଷ୍ଠାମାନ',
@@ -2404,7 +2404,7 @@ $2ଙ୍କ ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସ୍କର
 'pagesize' => '(ବାଇଟ)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'restriction-edit' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
 'restriction-move' => 'ଘୁଞ୍ଚାଇବେ',
 'restriction-create' => 'ଗଢ଼ନ୍ତୁ',
 'restriction-upload' => 'ଅପଲୋଡ଼ କରନ୍ତୁ',
@@ -3729,7 +3729,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'tags-display-header' => 'ବଦଳ ତାଲିକାରେ ଦେଖଣା',
 'tags-description-header' => 'ଅର୍ଥର ପୁରା ବିବରଣୀ',
 'tags-hitcount-header' => 'ଚିହ୍ନିତ ବଦଳ',
-'tags-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'tags-edit' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
 'tags-hitcount' => '$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବୁ}}',
 
 # Special:ComparePages
index 0575161..9dd0a47 100644 (file)
@@ -149,6 +149,7 @@ $messages = array(
 'category-subcat-count' => '{{ਕੁਲ   $2 ਸ਼੍ਰੇਣੀਆਂ ਵਿਚੌਂ , PLURAL:$2|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼ ਹੇਠ ਲਿਖੀ ਸ਼੍ਰੇਣੀ ਹੈ|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਨਿਮਿਨਲਿਖਿਤ {{PLURAL:$1|ਉਪ ਸ਼੍ਰੇਣੀ ਹੈ|$1ਉਪਸ਼੍ਰੇਣੀਆਂ ਹਨ}}  }}',
 'category-article-count' => '{{ ਕੁਲ $2 ਲੇਖਾਂ ਵਿਚੌਂ , PLURAL:$2| ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼  ਨਿਮਨਲਿਖਿਤ  {{PLURAL:$1|ਲੇਖ ਹੈ|$1 ਲੇਖ ਹਨ}}, }}',
 'listingcontinuesabbrev' => 'ਅਗੇ.',
+'noindex-category' => 'ਕ੍ਰਮਸੂਚੀ ਰਹਿਤ ਸਫ਼ੇ',
 
 'about' => 'ਇਸ ਬਾਰੇ',
 'article' => 'ਸਮੱਗਰੀ ਪੇਜ',
@@ -479,7 +480,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'yourtext' => 'ਤੁਹਾਡਾ ਟੈਕਸਟ',
 'storedversion' => 'ਸੰਭਾਲਿਆ ਵਰਜਨ',
 'yourdiff' => 'ਅੰਤਰ',
-'templatesused' => 'à¨\87ਸ à¨ªà©\87à¨\9c à¨\89ੱਤà©\87 à¨\9fà©\88ਪਲà©\87à¨\9f à¨µà¨°à¨¤à¨¿à¨\86 à¨\9cਾà¨\82ਦਾ à¨¹à©\88:',
+'templatesused' => 'à¨\87ਸ à¨¸à¨«à©\87 à¨¤à©\87 à¨ªà©\8dਰà©\8dਯà©\8bà¨\97ਿਤ {{PLURAL:$1|ਫਰਮਾ|ਫਰਮà©\87}}:',
 'templatesusedpreview' => "{{PLURAL:$1|ਟੈਪਲੇਟ|ਟੈਪਲੇਟ}} ਇਹ ਝਲਕ 'ਚ ਵਰਤੇ ਜਾਂਦੇ ਹਨ:",
 'templatesusedsection' => 'ਇਹ ਸ਼ੈਕਸ਼ਨ ਵਿੱਚ ਟੈਪਲੇਟ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ:',
 'template-protected' => '(ਸੁਰੱਖਿਅਤ)',
@@ -490,6 +491,8 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''ਖ਼ਬਰਦਾਰ: ਸੰਚੇ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ।ਕੁਝ ਸੰਚੇ ਛੁਟ ਜਾਣਗੇ।",
 'post-expand-template-inclusion-category' => 'ਉਹ ਪੰਨੇ ਜਿਥੇ ਸੰਚਿਆਂ ਦਾ ਅਕਾਰ ਨਿਣਮਿਤ ਹੱਦ ਤੌਂ ਵੱਧ ਹੈ।',
+'post-expand-template-argument-warning' => "'''ਖ਼ਬਰਦਾਰ'''ਇਸ ਸਫ਼ੇ ਤੇ ਕਿਸੇ ਫ਼ਰਮੇ ਵਿਚ ਘੱਟੋ ਘੱਟ ਇਕ ਸਁਘਟਕ ਐਸਾ ਹੈ ਜਿਸ ਦਾ ਵਿਸਤ੍ਰਿਤ ਰੂਪ ਬਹੁਤ ਵੱਡਾ ਹੈ।ਐਸੇ ਸਁਘਟਕਾਂ ਨੂਁ ਛੱਡ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
+'post-expand-template-argument-category' => 'ਐਸੇ ਸਫ਼ੇ ਜਿਨ੍ਹਾਂ ਵਿਚ ਫ਼ਰਮੇ ਦੇ ਸਁਘਟਕ ਛੁੱਟ ਗਏ ਹਨ ।',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'ਅਕਾਊਂਟ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
@@ -508,6 +511,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'last' => 'ਆਖਰੀ',
 'page_first' => 'ਪਹਿਲਾਂ',
 'page_last' => 'ਆਖਰੀ',
+'history-fieldset-title' => 'ਇਤਿਹਾਸ ਤੇ ਇਕ ਨਜ਼ਰ ਮਾਰੋ ।',
 'history-show-deleted' => 'ਕੇਵਲ ਮਿਟਾਏ ਗਏ',
 'histfirst' => 'ਸਭ ਤੋਂ ਪਹਿਲਾਂ',
 'histlast' => 'ਸਭ ਤੋਂ ਨਵਾਂ',
@@ -706,6 +710,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'recentchangeslinked-feed' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
 'recentchangeslinked-toolbox' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
 'recentchangeslinked-title' => '"$1" ਨਾਲ ਸੰਬੰਧਿਤ ਬਦਲਾਅ',
+'recentchangeslinked-noresult' => 'ਜੁੜੇ ਹੋਏ ਸਫਿਆਂ ਤੇ ,ਦਿੱਤੇ ਸਮੇਂ ਵਿਚ ਕੁਝ ਨਹੀਂ ਬਦਲਿਆ ।',
 'recentchangeslinked-summary' => 'ਇਹ ਸੂਚੀ ਊਨ੍ਹਾਂ ਪੰਨਿਆਂ ,ਜੋ ਇਕ ਖਾਸ ਪੰਨੇ ਨਾਲ ਸੰਬੰਧਿਤ ਹਨ, (ਯਾ ਕਿਸੇ ਖਾਸ ਸ਼੍ਰੇਣੀ ਦੇ ਮੈਂਬਰਾਂ) ਦੇ ਹਾਲ ਵਿਚ ਹੋਏ ਬਦਲਾਵਾਂ ਨੂੰ ਦਰਸ਼ਾਂਦੀ ਹੈ [[Special:Watchlist|ਤੁਹਾਡੀ ਦ੍ਰਿਸ਼ਟੀ ਗੋਚਰ ਸੂਚੀ]] ਵਿਚ ਮੌਜੂਦ ਪੰਨੇ ਮੋਟੇ ਅਖਰਾਂ ਵਿਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
 'recentchangeslinked-page' => 'ਸਫ਼ਾ ਨਾਂ:',
 'recentchangeslinked-to' => 'ਇਸ ਦੇ ਬਦਲੇ ਇਸ ਪੰਨੇ ਨਾਲ ਜੁੜੇ ਪੰਨਿਆਂ ਵਿਚ ਹੋਏ ਬਦਲਾਅ ਦਿਖਾਓ',
@@ -893,6 +898,7 @@ to upload files.',
 # Watchlist
 'watchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
 'mywatchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
+'watchlistfor2' => '$1 $2 ਲਈ',
 'watchnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
 'watch' => 'ਵਾਚ',
 'watchthispage' => 'ਇਹ ਪੇਜ ਵਾਚ ਕਰੋ',
@@ -976,6 +982,7 @@ to upload files.',
 
 'sp-contributions-newbies-sub' => 'ਨਵੇਂ ਅਕਾਊਂਟਾਂ ਲਈ',
 'sp-contributions-blocklog' => 'ਪਾਬੰਦੀ ਲਾਗ',
+'sp-contributions-uploads' => 'ਅਪਲੋਡ',
 'sp-contributions-logs' => 'ਲਾਗ',
 'sp-contributions-talk' => 'ਗੱਲਬਾਤ',
 'sp-contributions-search' => 'ਯੋਗਦਾਨ ਖੋਜੋ',
@@ -995,6 +1002,7 @@ to upload files.',
 'whatlinkshere-next' => '{{PLURAL:$1|ਅਗਲਾ|ਅਗਲੇ $1}}',
 'whatlinkshere-links' => '← ਲਿੰਕ',
 'whatlinkshere-hideredirs' => '$1 ਗੈਰਸਿਧਾ',
+'whatlinkshere-hidetrans' => '$1 ਇੱਥੇ ਕੀ ਕੀ ਜੁੜਦਾ ਹੈ।',
 'whatlinkshere-hidelinks' => '$1 ਲਿੰਕ',
 'whatlinkshere-hideimages' => '$1 ਸੰਬੰਧਿਤ ਚਿਤਰ',
 'whatlinkshere-filters' => 'ਫਿਲਟਰ',
@@ -1063,6 +1071,7 @@ to upload files.',
 # Thumbnails
 'thumbnail-more' => 'ਫੈਲਾਓ',
 'filemissing' => 'ਫਾਇਲ ਗੁੰਮ ਹੈ',
+'thumbnail_error' => 'ਅਁਗੂਠਾ ਝਲਕ ਬਨਾਉਣ ਵਿਚ ਗਲਤੀ ਹੋਈ ਹੈ : $1',
 
 # Special:Import
 'import' => 'ਪੇਜ ਇੰਪੋਰਟ ਕਰੋ',
index bac0984..41bb259 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Als-Holder
  * @author M-sch
+ * @author Manuae
  * @author SPS
  * @author Xqt
  */
@@ -19,380 +20,395 @@ $messages = array(
 # User preference toggles
 'tog-showtoolbar' => "Werkzaich zum Bearwaide zaische (dodezu braucht's JavaScript)",
 
-'underline-always'  => 'Immer',
-'underline-never'   => 'Garnet',
+'underline-always' => 'Immer',
+'underline-never' => 'Garnet',
 'underline-default' => 'Des nemme, was em Broweser gsaacht hoscht.',
 
 # Dates
-'january'       => 'Jänner',
-'february'      => 'Fewwer',
-'march'         => 'März',
-'april'         => 'Abril',
-'may_long'      => 'Mai',
-'june'          => 'Juni',
-'july'          => 'Juli',
-'august'        => 'Auguscht',
-'september'     => 'Sebdember',
-'october'       => 'Ogdower',
-'november'      => 'November',
-'december'      => 'Dezember',
-'january-gen'   => 'Jänner',
-'february-gen'  => 'Fewwer',
-'march-gen'     => 'März',
-'april-gen'     => 'Abril',
-'may-gen'       => 'Mai',
-'june-gen'      => 'Juni',
-'july-gen'      => 'Juli',
-'august-gen'    => 'Auguscht',
+'january' => 'Jänner',
+'february' => 'Fewwer',
+'march' => 'März',
+'april' => 'Abril',
+'may_long' => 'Mai',
+'june' => 'Juni',
+'july' => 'Juli',
+'august' => 'Auguscht',
+'september' => 'Sebdember',
+'october' => 'Ogdower',
+'november' => 'November',
+'december' => 'Dezember',
+'january-gen' => 'Jänner',
+'february-gen' => 'Fewwer',
+'march-gen' => 'März',
+'april-gen' => 'Abril',
+'may-gen' => 'Mai',
+'june-gen' => 'Juni',
+'july-gen' => 'Juli',
+'august-gen' => 'Auguscht',
 'september-gen' => 'Sebdember',
-'october-gen'   => 'Ogdower',
-'november-gen'  => 'November',
-'december-gen'  => 'Dezember',
-'jan'           => 'Jän',
-'feb'           => 'Few',
-'mar'           => 'Mär',
-'apr'           => 'Abr',
-'may'           => 'Mai',
-'jun'           => 'Jun',
-'jul'           => 'Jul',
-'aug'           => 'Aug',
-'sep'           => 'Seb',
-'oct'           => 'Ogd',
-'nov'           => 'Nov',
-'dec'           => 'Dez',
+'october-gen' => 'Ogdower',
+'november-gen' => 'November',
+'december-gen' => 'Dezember',
+'jan' => 'Jän',
+'feb' => 'Few',
+'mar' => 'Mär',
+'apr' => 'Abr',
+'may' => 'Mai',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Aug',
+'sep' => 'Seb',
+'oct' => 'Ogd',
+'nov' => 'Nov',
+'dec' => 'Dez',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Kadegorie|Kadegorie}}',
-'category_header'        => 'Saide in de Kadegorie „$1“',
-'subcategories'          => 'Unnerkadegorie',
-'category-media-header'  => 'Medie in de Kadegorie „$1“',
-'hidden-categories'      => '{{PLURAL:$1|Versteckelte Kadegorie|Versteckelte Kadegorie}}',
-'category-subcat-count'  => '{{PLURAL:$2|Die Kategorie hot die Unnerkategorie:|{{PLURAL:$1|Die Unnerkategori isch eni vun insgsamt $2 Unnerkategorie in derre Kategorie:|S werre $1 vun insgsamt $2 Unnerkategorie in derre Kategorie aagezeicht:}}}}',
+'pagecategories' => '{{PLURAL:$1|Kadegorie|Kadegorie}}',
+'category_header' => 'Saide in de Kadegorie „$1“',
+'subcategories' => 'Unnerkadegorie',
+'category-media-header' => 'Medie in de Kadegorie „$1“',
+'hidden-categories' => '{{PLURAL:$1|Versteckelte Kadegorie|Versteckelte Kadegorie}}',
+'category-subcat-count' => '{{PLURAL:$2|Die Kategorie hot die Unnerkategorie:|{{PLURAL:$1|Die Unnerkategori isch eni vun insgsamt $2 Unnerkategorie in derre Kategorie:|S werre $1 vun insgsamt $2 Unnerkategorie in derre Kategorie aagezeicht:}}}}',
 'category-article-count' => "{{PLURAL:$2|In derre Kadegorie hot's numme die Said.|Die {{PLURAL:$1|Said|$1 Saide}} gebbt's in derre Kadegorie, vun insgsamt $2.}}",
 'listingcontinuesabbrev' => '(Forts.)',
 
-'about'      => 'Iwwer',
-'newwindow'  => '(werd im e naie Fenschter uffgmacht)',
-'cancel'     => 'Abbreche',
-'mytalk'     => 'Gebabbel mit dir',
+'about' => 'Iwwer',
+'newwindow' => '(werd im e naie Fenschter uffgmacht)',
+'cancel' => 'Abbreche',
+'mytalk' => 'Gebabbel mit dir',
 'navigation' => 'Navigation',
 
 # Cologne Blue skin
-'qbfind'      => 'Finne',
-'qbedit'      => 'Bearwaide',
+'qbfind' => 'Finne',
+'qbedit' => 'Bearwaide',
 'qbmyoptions' => 'Mai Saide',
 
 # Vector skin
 'vector-action-move' => 'Verschiewe',
-'vector-view-edit'   => 'Bearwaide',
-
-'errorpagetitle'   => 'Fehler',
-'returnto'         => 'Zrick zu $1.',
-'tagline'          => 'Vun {{SITENAME}}',
-'help'             => 'Hilfe',
-'search'           => 'Suche',
-'searchbutton'     => 'Suche',
-'go'               => 'Adiggel',
-'searcharticle'    => 'Suche',
-'history'          => 'Gschicht vun de Said',
-'history_short'    => 'Versione',
+'vector-view-edit' => 'Bearwaide',
+
+'errorpagetitle' => 'Fehler',
+'returnto' => 'Zrick zu $1.',
+'tagline' => 'Vun {{SITENAME}}',
+'help' => 'Hilfe',
+'search' => 'Suche',
+'searchbutton' => 'Suche',
+'go' => 'Adiggel',
+'searcharticle' => 'Suche',
+'history' => 'Gschicht vun de Said',
+'history_short' => 'Versione',
 'printableversion' => 'Druck-Aasicht',
-'permalink'        => 'Permanentlink',
-'print'            => 'Ausdrugge',
-'edit'             => 'Bearwaide',
-'create'           => 'Aaleche',
-'editthispage'     => 'Die Said bearwaide',
-'delete'           => 'Lesche',
-'undelete_short'   => '{{PLURAL:$1|ä Ännerung|$1 Ännerunge}} widderherschdelle',
-'protect'          => 'schitze',
-'protect_change'   => 'ännere',
-'unprotect'        => 'Widder freigewwe',
-'newpage'          => 'Naie Said',
-'talkpage'         => 'Iwwer die Said dischbediere',
+'permalink' => 'Permanentlink',
+'print' => 'Ausdrugge',
+'edit' => 'Bearwaide',
+'create' => 'Aaleche',
+'editthispage' => 'Die Said bearwaide',
+'delete' => 'Lesche',
+'undelete_short' => '{{PLURAL:$1|ä Ännerung|$1 Ännerunge}} widderherschdelle',
+'protect' => 'schitze',
+'protect_change' => 'ännere',
+'unprotect' => 'Widder freigewwe',
+'newpage' => 'Naie Said',
+'talkpage' => 'Iwwer die Said dischbediere',
 'talkpagelinktext' => 'Dischbediere',
-'personaltools'    => 'Perseenliche Werkzeische',
-'talk'             => 'Dischbediere',
-'views'            => 'Wievielmol aageguckt',
-'toolbox'          => 'Werkzaich',
-'otherlanguages'   => 'In annere Sproche',
-'redirectedfrom'   => '(Wairrerglaidet vun $1)',
-'redirectpagesub'  => 'Wairerlaidungssaid',
-'lastmodifiedat'   => 'Die Said isch zum ledschde Mol gänneret woore am $1, am $2.',
-'viewcount'        => 'Die Seid isch bis jetzerd {{PLURAL:$1|$1|$1}} mol uffgerufe worre.',
-'jumpto'           => 'Spring zu:',
+'personaltools' => 'Perseenliche Werkzeische',
+'talk' => 'Dischbediere',
+'views' => 'Wievielmol aageguckt',
+'toolbox' => 'Werkzaich',
+'otherlanguages' => 'In annere Sproche',
+'redirectedfrom' => '(Wairrerglaidet vun $1)',
+'redirectpagesub' => 'Wairerlaidungssaid',
+'lastmodifiedat' => 'Die Said isch zum ledschde Mol gänneret woore am $1, am $2.',
+'viewcount' => 'Die Seid isch bis jetzerd {{PLURAL:$1|$1|$1}} mol uffgerufe worre.',
+'jumpto' => 'Spring zu:',
 'jumptonavigation' => 'Navigation',
-'jumptosearch'     => 'Suche',
+'jumptosearch' => 'Suche',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => 'Iwwer {{SITENAME}}',
-'aboutpage'            => 'Project:Iwwer',
-'copyright'            => 'Was do drin schdeht isch unner $1 verfiechbar.',
-'copyrightpage'        => '{{ns:project}}:Urhewerrecht',
-'currentevents'        => 'Was grad so bassiert isch',
-'disclaimers'          => 'Hafdungsausschluß',
-'disclaimerpage'       => 'Project:Impressum',
-'edithelp'             => 'Hilf fer s Bearwaide',
-'edithelppage'         => 'Help:Ännere',
-'helppage'             => 'Help:Inhalt',
-'mainpage'             => 'Hääptsaid',
+'aboutsite' => 'Iwwer {{SITENAME}}',
+'aboutpage' => 'Project:Iwwer',
+'copyright' => 'Was do drin schdeht isch unner $1 verfiechbar.',
+'copyrightpage' => '{{ns:project}}:Urhewerrecht',
+'currentevents' => 'Was grad so bassiert isch',
+'disclaimers' => 'Hafdungsausschluß',
+'disclaimerpage' => 'Project:Impressum',
+'edithelp' => 'Hilf fer s Bearwaide',
+'edithelppage' => 'Help:Ännere',
+'helppage' => 'Help:Inhalt',
+'mainpage' => 'Hääptsaid',
 'mainpage-description' => 'Startseid',
-'portal'               => '{{SITENAME}}-Pordal',
-'privacy'              => 'Dadeschutz',
-'privacypage'          => 'Project:Daadeschutz',
+'portal' => '{{SITENAME}}-Pordal',
+'privacy' => 'Dadeschutz',
+'privacypage' => 'Project:Daadeschutz',
 
 'badaccess' => 'Kää ausraichende Recht',
 
-'retrievedfrom'       => 'Vun "$1"',
-'youhavenewmessages'  => 'Du hoscht $1 ($2).',
-'newmessageslink'     => 'naie Nochrichte',
+'retrievedfrom' => 'Vun "$1"',
+'youhavenewmessages' => 'Du hoscht $1 ($2).',
+'newmessageslink' => 'naie Nochrichte',
 'newmessagesdifflink' => 'letschte Ännerung',
-'editsection'         => 'bearwaide',
-'editold'             => 'bearwaide',
-'editlink'            => 'bearwaide',
-'viewsourcelink'      => 'Quell aagucke',
-'editsectionhint'     => 'Abschnitt ännere: $1',
-'toc'                 => 'Inhald',
-'showtoc'             => 'zaiche',
-'hidetoc'             => 'versteggeln',
-'site-rss-feed'       => '$1 RSS Feed',
-'site-atom-feed'      => '$1 Atom Feed',
-'page-rss-feed'       => '"$1" RSS Feed',
-'page-atom-feed'      => '"$1" Atom Feed',
-'red-link-title'      => '$1 (Said gebbt s nid)',
+'editsection' => 'bearwaide',
+'editold' => 'bearwaide',
+'editlink' => 'bearwaide',
+'viewsourcelink' => 'Quell aagucke',
+'editsectionhint' => 'Abschnitt ännere: $1',
+'toc' => 'Inhald',
+'showtoc' => 'zaiche',
+'hidetoc' => 'versteggeln',
+'site-rss-feed' => '$1 RSS Feed',
+'site-atom-feed' => '$1 Atom Feed',
+'page-rss-feed' => '"$1" RSS Feed',
+'page-atom-feed' => '"$1" Atom Feed',
+'red-link-title' => '$1 (Said gebbt s nid)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Said',
-'nstab-user'      => 'Benutzersaid',
-'nstab-media'     => 'Media',
-'nstab-special'   => 'Spezialsaid',
-'nstab-project'   => 'Pordal',
-'nstab-image'     => 'Datei',
+'nstab-main' => 'Said',
+'nstab-user' => 'Benutzersaid',
+'nstab-media' => 'Media',
+'nstab-special' => 'Spezialsaid',
+'nstab-project' => 'Pordal',
+'nstab-image' => 'Datei',
 'nstab-mediawiki' => 'Mitdeelung',
-'nstab-template'  => 'Vorlaach',
-'nstab-help'      => 'Hilfe',
-'nstab-category'  => 'Kadegorie',
+'nstab-template' => 'Vorlaach',
+'nstab-help' => 'Hilfe',
+'nstab-category' => 'Kadegorie',
 
 # General errors
-'missing-article'    => 'De Text fer „$1“ $2 isch in de Datebank nit gfunne worre.
+'missing-article' => 'De Text fer „$1“ $2 isch in de Datebank nit gfunne worre.
 
 Normalerwais hääßt des, dass die Said glescht woore isch.
 
 Wenn s des nit isch, hoscht villaicht en Fehler in de Datebank gfunne.
 Bitte meld des an e [[Special:ListUsers/sysop|Adminischtrator]], un gebb d URL dezu aa.',
 'missingarticle-rev' => '(Versionsnummer#: $1)',
-'badtitletext'       => 'De Titel vun de aageforderte Said isch nid giltich, leer, odder e nid giltiche Link vun eme annere Wiki.
+'badtitletext' => 'De Titel vun de aageforderte Said isch nid giltich, leer, odder e nid giltiche Link vun eme annere Wiki.
 S kann sai, dass es ää odder meh Zaiche drin hot, wu im Titel vun de Said nid gebraucht werre därfe.',
-'viewsource'         => 'Quelltekschd betrachde',
+'viewsource' => 'Quelltekschd betrachde',
 
 # Login and logout pages
-'yourname'                => 'Benutzername:',
-'yourpassword'            => 'Passwort:',
-'remembermypassword'      => 'Mai Passwort uff dem Computer merke (hechschtens fer $1 {{PLURAL:$1|Dach|Dach}})',
-'login'                   => 'Omelde',
+'yourname' => 'Benutzername:',
+'yourpassword' => 'Passwort:',
+'remembermypassword' => 'Mai Passwort uff dem Computer merke (hechschtens fer $1 {{PLURAL:$1|Dach|Dach}})',
+'login' => 'Omelde',
 'nav-login-createaccount' => 'Aamelde / Benutzerkonto aaleche',
-'userlogin'               => 'Omelde / Benutzerkonto anleche',
-'logout'                  => 'Abmelde',
-'userlogout'              => 'Abmelde',
-'nologinlink'             => 'E Benutzerkonto aaleche',
-'mailmypassword'          => 'Nais Passwort per E-Mail schicke',
+'userlogin' => 'Omelde / Benutzerkonto anleche',
+'logout' => 'Abmelde',
+'userlogout' => 'Abmelde',
+'nologinlink' => 'E Benutzerkonto aaleche',
+'mailmypassword' => 'Nais Passwort per E-Mail schicke',
 
 # Edit page toolbar
-'bold_sample'     => 'Fette Schrift',
-'bold_tip'        => 'Fette Schrift',
-'italic_sample'   => 'Kursive Schrift',
-'italic_tip'      => 'Kursive Schrift',
-'link_sample'     => 'Stichwort',
-'link_tip'        => 'Interner Link',
-'extlink_sample'  => 'http://www.example.com Linktext',
-'extlink_tip'     => 'Externer Link (uff http:// Acht gewwe)',
+'bold_sample' => 'Fette Schrift',
+'bold_tip' => 'Fette Schrift',
+'italic_sample' => 'Kursive Schrift',
+'italic_tip' => 'Kursive Schrift',
+'link_sample' => 'Stichwort',
+'link_tip' => 'Interner Link',
+'extlink_sample' => 'http://www.example.com Linktext',
+'extlink_tip' => 'Externer Link (uff http:// Acht gewwe)',
 'headline_sample' => 'Abschnitts-Iwwerschrift',
-'headline_tip'    => 'Iwwerschrift Ewene 2',
-'nowiki_sample'   => 'Gebb do en Text ai, wu nit formatiert wird',
-'nowiki_tip'      => 'Wiki-Formatierunge ignoriere',
-'image_tip'       => 'Bildverwais',
-'media_tip'       => 'Dateilink',
-'sig_tip'         => 'Dai Unnerschrift mit ener Zaitaagab',
-'hr_tip'          => 'Horizontale Linie (sparsam verwenne)',
+'headline_tip' => 'Iwwerschrift Ewene 2',
+'nowiki_sample' => 'Gebb do en Text ai, wu nit formatiert wird',
+'nowiki_tip' => 'Wiki-Formatierunge ignoriere',
+'image_tip' => 'Bildverwais',
+'media_tip' => 'Dateilink',
+'sig_tip' => 'Dai Unnerschrift mit ener Zaitaagab',
+'hr_tip' => 'Horizontale Linie (sparsam verwenne)',
 
 # Edit pages
-'summary'                          => 'Zammefassung:',
-'subject'                          => 'Betreff:',
-'minoredit'                        => 'Des ischt e klänni Bearwaidung',
-'watchthis'                        => 'Die Said beowachde',
-'savearticle'                      => 'Said schbeichere',
-'preview'                          => 'Vorschau',
-'showpreview'                      => 'Vorschau zaische',
-'showlivepreview'                  => 'Live-Vorschau',
-'showdiff'                         => 'Ännerunge zaische',
-'anoneditwarning'                  => "'''Warnung:''' Du bischt nit aagemeldt. Dai IP-Adress werd in de Gschicht vun dem Artikel gspaichert.",
-'summary-preview'                  => 'Zammefassung:',
-'newarticle'                       => '(Nai)',
-'newarticletext'                   => "Du bisch eme Link nogange zu re Said, wu s no gar nit gebbt.
+'summary' => 'Zammefassung:',
+'subject' => 'Betreff:',
+'minoredit' => 'Des ischt e klänni Bearwaidung',
+'watchthis' => 'Die Said beowachde',
+'savearticle' => 'Said schbeichere',
+'preview' => 'Voaschau',
+'showpreview' => 'Vorschau zaische',
+'showlivepreview' => 'Live-Vorschau',
+'showdiff' => 'Ännerunge zaische',
+'anoneditwarning' => "'''Warnung:''' Du bischt nit aagemeldt. Dai IP-Adress werd in de Gschicht vun dem Artikel gspaichert.",
+'summary-preview' => 'Zammefassung:',
+'newarticle' => '(Nai)',
+'newarticletext' => "Du bisch eme Link nogange zu re Said, wu s no gar nit gebbt.
 Zum die Said aaleche, kannscht do in dem Käschtel unne aafange mid schraiwe (guck[[{{MediaWiki:Helppage}}|Hilfe]] fer meh Informatione).
 Wenn do nid hin hoscht welle, no druck in Daim Browser uff '''Zrick'''.",
-'noarticletext'                    => 'Uff derre Said gebbt\'s noch kää Text. Du kannscht uff annere Saide [[Special:Search/{{PAGENAME}}|den Aitrach suche]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de Logbuchaidrach suche, wu dezu ghert],
+'noarticletext' => 'Uff derre Said gebbt\'s noch kää Text. Du kannscht uff annere Saide [[Special:Search/{{PAGENAME}}|den Aitrach suche]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de Logbuchaidrach suche, wu dezu ghert],
 orrer [{{fullurl:{{FULLPAGENAME}}|action=edit}} die Said bearwaide]</span>.',
-'previewnote'                      => "'''Denk dran, dass des numme e Vorschau isch.'''
+'previewnote' => "'''Denk dran, dass des numme e Vorschau isch.'''
 Dai Ännerunge sinn no nid gspaichert worre!",
-'editing'                          => 'Am $1 bearwaide',
-'editingsection'                   => '$1 bearwaide (Abschnitt)',
-'copyrightwarning'                 => "Bitte gebb acht, dass alle Baidräch zu {{SITENAME}} unner $2 vereffentlicht werre (guck $1 fer mehr Details).
+'editing' => 'Am $1 bearwaide',
+'editingsection' => '$1 bearwaide (Abschnitt)',
+'yourtext' => 'Doin Tegschd',
+'yourdiff' => 'Unaschied',
+'copyrightwarning' => "Bitte gebb acht, dass alle Baidräch zu {{SITENAME}} unner $2 vereffentlicht werre (guck $1 fer mehr Details).
 Wenn du nit willhsct, dass deswu du gschriwwe hoscht, gänneret un kopiert werre kann, dann duu s do nit naischraiwe.<br />
 du gebbscht do au zu, dass Du des selwerscht gschriwwe hoscht orrer vun ere effentliche, fraie Quell ('''public domain''')orrer vun ere ähnliche fraie Quell her hoscht.
 '''SCHRAIB DO NIX NAI, WAS URHEWERRECHTKLICH GSCHITZT ISCH!'''",
-'templatesused'                    => '{{PLURAL:$1|Vorlach wu uff derre Said gebraucht werd|Vorlache wu uff derre Said gebraucht werre}}:',
-'templatesusedpreview'             => '{{PLURAL:$1|Vorlach wu in derre Vorschau gebraucht werd|Vorlache wu in derre Vorschau gebraucht werre}}:',
-'template-protected'               => '(gschitzt)',
-'template-semiprotected'           => '(halb-gschitzt)',
-'hiddencategories'                 => 'Die Said ghert zu {{PLURAL:$1|1 versteckelte Kategorie|$1 versteckelte Kategorie}}:',
+'templatesused' => '{{PLURAL:$1|Vorlach wu uff derre Said gebraucht werd|Vorlache wu uff derre Said gebraucht werre}}:',
+'templatesusedpreview' => '{{PLURAL:$1|Vorlach wu in derre Vorschau gebraucht werd|Vorlache wu in derre Vorschau gebraucht werre}}:',
+'template-protected' => '(gschitzt)',
+'template-semiprotected' => '(halb-gschitzt)',
+'hiddencategories' => 'Die Said ghert zu {{PLURAL:$1|1 versteckelte Kategorie|$1 versteckelte Kategorie}}:',
 'permissionserrorstext-withaction' => 'Du därfscht nid $2, aus {{PLURAL:$1|dem Grund|denne Grind}}:',
-'moveddeleted-notice'              => 'Die Said isch glescht worre.
+'moveddeleted-notice' => 'Die Said isch glescht worre.
 De Leschaidrach fer die Said isch do unne aagewwe als Quell.',
 
 # History pages
-'viewpagelogs'           => 'D Lochbiecher fer die Said aagucke',
-'currentrev-asof'        => 'Aktuelle Version vun $1',
-'revisionasof'           => 'Version vun $1',
-'previousrevision'       => '← Ältere Versione',
-'nextrevision'           => 'Naier Version →',
-'currentrevisionlink'    => 'Aktuell Version',
-'cur'                    => 'jetzert',
-'next'                   => 'Negschte',
-'last'                   => 'vorich',
-'histlegend'             => "Du kannscht zwää Versione auswähle un verglaiche.<br />
+'viewpagelogs' => 'D Lochbiecher fer die Said aagucke',
+'currentrev-asof' => 'Aktuelle Version vun $1',
+'revisionasof' => 'Version vun $1',
+'previousrevision' => '← Ältere Versione',
+'nextrevision' => 'Naier Version →',
+'currentrevisionlink' => 'Aktuell Version',
+'cur' => 'jetzert',
+'next' => 'Negschte',
+'last' => 'vorich',
+'histlegend' => "Du kannscht zwää Versione auswähle un verglaiche.<br />
 Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 '''({{int:last}})''' = Unnerschied zu de voriche Version, '''{{int:minoreditletter}}''' = klenni Ännerung.",
 'history-fieldset-title' => 'In de Versionsgschicht suche',
-'histfirst'              => 'Ältschte',
-'histlast'               => 'Naischte',
+'histfirst' => 'Ältschte',
+'histlast' => 'Naischte',
 
 # Revision deletion
-'rev-delundel'     => 'zaich/versteckel',
+'rev-delundel' => 'zaich/versteckel',
+'revdelete-show-file-submit' => 'Ja',
+'revdelete-radio-set' => 'Ja',
+'revdelete-radio-unset' => 'Nä',
 'revdelete-submit' => 'Uff die aussgewählt {{PLURAL:$1|Version|Versione}} owende',
-'revdel-restore'   => 'Sichtbarkeit ännere',
+'revdel-restore' => 'Sichtbarkeit ännere',
 
 # Merge log
 'revertmerge' => 'Zammefiehrung rickgängich mache',
 
 # Diffs
-'history-title'           => 'Versionsgschicht vun "$1"',
-'difference'              => '(Unnerschied zwische de Versione)',
-'lineno'                  => 'Zail $1:',
+'history-title' => 'Versionsgschicht vun "$1"',
+'difference' => '(Unnerschied zwische de Versione)',
+'lineno' => 'Zail $1:',
 'compareselectedversions' => 'Die Versione mitenonner vergleiche',
-'editundo'                => 'zerick',
+'editundo' => 'zerick',
 
 # Search results
-'searchresults'             => 'Ergebnis suche',
-'searchresults-title'       => 'Ergebnis suche fer "$1"',
-'searchresulttext'          => 'Fer mehr Informatione iwwer d Such in {{SITENAME}}, guck emol uff [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle'            => 'Du hoscht no \'\'\'[[:$1]]\'\'\' gesucht ([[Special:Prefixindex/$1|alle Saide wo mit "$1" aafange]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Saide wo uf "$1" verlinkt sin]])',
-'searchsubtitleinvalid'     => "Du hoscht '''$1''' gsucht",
-'notitlematches'            => 'Kää Saidetitel gfunne',
-'notextmatches'             => 'Kää Iwwerainstimmunge mit Inhalde',
-'prevn'                     => 'voriche {{PLURAL:$1|$1}}',
-'nextn'                     => 'negschte {{PLURAL:$1|$1}}',
-'viewprevnext'              => 'Gugg ($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size'        => '$1 ({{PLURAL:$2|1 Word|$2 Wärder}})',
-'search-redirect'           => '(Wairerlaitung $1)',
-'search-section'            => '(Abschnitt $1)',
-'search-suggest'            => 'Hoscht gemäänt: $1',
-'search-interwiki-caption'  => 'Schweschterprojekt',
-'search-interwiki-default'  => '$1 Ergebnis:',
-'search-interwiki-more'     => '(meh)',
-'search-mwsuggest-enabled'  => 'mid Vorschläch',
+'searchresults' => 'Ergebnis suche',
+'searchresults-title' => 'Ergebnis suche fer "$1"',
+'searchresulttext' => 'Fer mehr Informatione iwwer d Such in {{SITENAME}}, guck emol uff [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Du hoscht no \'\'\'[[:$1]]\'\'\' gesucht ([[Special:Prefixindex/$1|alle Saide wo mit "$1" aafange]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Saide wo uf "$1" verlinkt sin]])',
+'searchsubtitleinvalid' => "Du hoscht '''$1''' gsucht",
+'notitlematches' => 'Kää Saidetitel gfunne',
+'notextmatches' => 'Kää Iwwerainstimmunge mit Inhalde',
+'prevn' => 'voriche {{PLURAL:$1|$1}}',
+'nextn' => 'negschte {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Gugg ($1 {{int:pipe-separator}} $2) ($3)',
+'searchprofile-everything' => 'Alles',
+'search-result-size' => '$1 ({{PLURAL:$2|1 Word|$2 Wärder}})',
+'search-redirect' => '(Wairerlaitung $1)',
+'search-section' => '(Abschnitt $1)',
+'search-suggest' => 'Hoscht gemäänt: $1',
+'search-interwiki-caption' => 'Schweschterprojekt',
+'search-interwiki-default' => '$1 Ergebnis:',
+'search-interwiki-more' => '(meh)',
+'search-mwsuggest-enabled' => 'mid Vorschläch',
 'search-mwsuggest-disabled' => 'kää Vorschläch',
-'nonefound'                 => "'''Hiiwais:''' S werre standardmäßich numme e Dail Namensraim durchsucht. Setz ''all:'' vor Dai Suchbegriff zum alle Saide (mit Dischbediersaide, Voalaache usw.) durchsuche odder direkt de Name vum Namensraum, wu durchsucht werre sell.",
-'powersearch'               => 'Erwaiterte Such',
-'powersearch-legend'        => 'Erwaiterte Such',
-'powersearch-ns'            => 'In de Namensraim suche:',
-'powersearch-redir'         => 'Wairerlaitunge aazaiche',
-'powersearch-field'         => 'Suche noch',
-'powersearch-togglenone'    => 'Kään',
+'nonefound' => "'''Hiiwais:''' S werre standardmäßich numme e Dail Namensraim durchsucht. Setz ''all:'' vor Dai Suchbegriff zum alle Saide (mit Dischbediersaide, Voalaache usw.) durchsuche odder direkt de Name vum Namensraum, wu durchsucht werre sell.",
+'powersearch' => 'Erwaiterte Such',
+'powersearch-legend' => 'Erwaiterte Such',
+'powersearch-ns' => 'In de Namensraim suche:',
+'powersearch-redir' => 'Wairerlaitunge aazaiche',
+'powersearch-field' => 'Suche noch',
+'powersearch-togglenone' => 'Kään',
 
 # Quickbar
 'qbsettings-none' => 'Kään',
 
 # Preferences page
-'preferences'   => 'Optione',
+'preferences' => 'Optione',
 'mypreferences' => 'Mai Aistellunge',
-'saveprefs'     => 'Oischdellunge schbeichere',
-'resetprefs'    => 'Oischdellunge verwerfe',
+'saveprefs' => 'Oischdellunge schbeichere',
+'resetprefs' => 'Oischdellunge verwerfe',
 'guesstimezone' => 'Aus em Browser iwwernemme',
+'gender-unknown' => 'Ghoim gkalde',
 
 # Groups
-'group'            => 'Grubb:',
-'group-bot'        => 'Bots',
-'group-sysop'      => 'Adminischdradore',
+'group' => 'Grubb:',
+'group-bot' => 'Bots',
+'group-sysop' => 'Adminischdradore',
 'group-bureaucrat' => 'Birokrade',
-'group-all'        => '(alle)',
+'group-all' => '(alle)',
 
-'group-bot-member'        => 'Bot',
-'group-sysop-member'      => 'Adminischdrador',
+'group-bot-member' => 'Bot',
+'group-sysop-member' => 'Adminischdrador',
 'group-bureaucrat-member' => 'Birokrad',
 
 'grouppage-sysop' => '{{ns:project}}:Adminischtratore',
 
 # User rights log
-'rightslog'  => 'Benutzerrecht-Logbuch',
+'rightslog' => 'Benutzerrecht-Logbuch',
 'rightsnone' => '(-)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'die Said bearwaide',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|Ännerung|Ännerunge}}',
-'recentchanges'                  => 'Was zuletschd gemacht worre isch',
-'recentchanges-legend'           => 'Optione vun de Aazaich',
+'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerunge}}',
+'recentchanges' => 'Was zuletschd gemacht worre isch',
+'recentchanges-legend' => 'Optione vun de Aazaich',
 'recentchanges-feed-description' => 'Di letschte Ännerunge vun {{SITENAME}} in des Feed aigewwe.',
-'rcnote'                         => "Aagezaicht {{PLURAL:$1|werd '''1''' Ännerung|werre die letschte '''$1''' Ännerunge}} {{PLURAL:$2|vum letschte Dach|in de letschte '''$2''' Dache}} (Stand: $4, $5)",
-'rclistfrom'                     => 'Zeich die letschte Ännerunge ab $1',
-'rcshowhideminor'                => 'Klenne Ännerunge $1',
-'rcshowhidebots'                 => 'Bots $1',
-'rcshowhideliu'                  => 'Aagemeldte Benutzer $1',
-'rcshowhideanons'                => 'Nit aagemeldte Benutzer $1',
-'rcshowhidemine'                 => 'Mai Bearwaidunge $1',
-'rclinks'                        => 'Zeich die letschte $1 Ännerunge in de letschte $2 Dache<br />$3',
-'diff'                           => 'Unnerschied',
-'hist'                           => 'Gschicht',
-'hide'                           => 'versteggeln',
-'show'                           => 'zaiche',
-'minoreditletter'                => 'k',
-'newpageletter'                  => 'N',
-'boteditletter'                  => 'B',
-'rc-enhanced-expand'             => "Details zaische (dodezu braucht's JavaScript)",
-'rc-enhanced-hide'               => 'Details versteckeln',
+'rcnote' => "Aagezaicht {{PLURAL:$1|werd '''1''' Ännerung|werre die letschte '''$1''' Ännerunge}} {{PLURAL:$2|vum letschte Dach|in de letschte '''$2''' Dache}} (Stand: $4, $5)",
+'rclistfrom' => 'Zeich die letschte Ännerunge ab $1',
+'rcshowhideminor' => 'Klenne Ännerunge $1',
+'rcshowhidebots' => 'Bots $1',
+'rcshowhideliu' => 'Aagemeldte Benutzer $1',
+'rcshowhideanons' => 'Nit aagemeldte Benutzer $1',
+'rcshowhidemine' => 'Mai Bearwaidunge $1',
+'rclinks' => 'Zeich die letschte $1 Ännerunge in de letschte $2 Dache<br />$3',
+'diff' => 'Unnerschied',
+'hist' => 'Gschicht',
+'hide' => 'versteggeln',
+'show' => 'zaiche',
+'minoreditletter' => 'k',
+'newpageletter' => 'N',
+'boteditletter' => 'B',
+'rc-enhanced-expand' => "Details zaische (dodezu braucht's JavaScript)",
+'rc-enhanced-hide' => 'Details versteckeln',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Was on verlinkde Saide gemacht worre isch',
-'recentchangeslinked-feed'    => 'Was on verlinkde Seide gemacht worre isch',
+'recentchangeslinked' => 'Was on verlinkde Saide gemacht worre isch',
+'recentchangeslinked-feed' => 'Was on verlinkde Seide gemacht worre isch',
 'recentchangeslinked-toolbox' => 'Was on verlinkde Seide gemacht worre isch',
-'recentchangeslinked-title'   => 'Ännerunge an Saide, wu „$1“ druf verlinkt',
+'recentchangeslinked-title' => 'Ännerunge an Saide, wu „$1“ druf verlinkt',
 'recentchangeslinked-summary' => "Des isch e Lischt vun Ännerunge, wu erscht gmacht worre sin an Saide, die wu vun ere bstimmte Said verlinkt sin (odder die wu zu ere bstimmte Kadegorie ghere).
 Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
-'recentchangeslinked-page'    => 'Saide:',
-'recentchangeslinked-to'      => 'Zaisch Ännerunge uff Saide, wu do her verlinkt sinn',
+'recentchangeslinked-page' => 'Saide:',
+'recentchangeslinked-to' => 'Zaisch Ännerunge uff Saide, wu do her verlinkt sinn',
 
 # Upload
-'upload'        => 'Hochlade',
-'uploadbtn'     => 'Datei hochlade',
+'upload' => 'Hochlade',
+'uploadbtn' => 'Datei hochlade',
 'uploadlogpage' => 'Dateie-Logbuch',
-'savefile'      => 'Datei schbeichere',
+'savefile' => 'Datei schbeichere',
 'uploadedimage' => 'hot „[[$1]]“ hochglade',
 
+# Lock manager
+'lockmanager-notlocked' => '„$1“ hod ned uffgmachd were kenne, die isch ganed gschberd gwesd.',
+'lockmanager-fail-closelock' => 'Die gbscherd Dadai „$1“ hod ned gschlosse were kenne.',
+'lockmanager-fail-deletelock' => 'Die gbscherd Dadai „$1“ hod ned gleschd were kenne.',
+'lockmanager-fail-acquirelock' => '„$1“ komma ned schberre.',
+'lockmanager-fail-openlock' => 'Die gschberd Dadai „$1“ komma ned uffmache.',
+'lockmanager-fail-releaselock' => '„$1“ konn ned fraigewe werre.',
+
 # File description page
-'file-anchor-link'          => 'Datei',
-'filehist'                  => 'Dateigschicht',
-'filehist-help'             => 'Drick uff e Zaidpunkt zum aazääche, wie s dort ausgsähne hot.',
-'filehist-current'          => 'aktuell',
-'filehist-datetime'         => 'Zaidpunkt',
-'filehist-thumb'            => 'Vorschaubild',
-'filehist-thumbtext'        => 'Vorschaubild fer Version vum $1',
-'filehist-user'             => 'Benutzer',
-'filehist-dimensions'       => 'Moß',
-'filehist-comment'          => 'Kommentar',
-'imagelinks'                => 'Dateilinks',
-'linkstoimage'              => 'Die {{PLURAL:$1|Said verwaist|$1 Saire verwaise}} uff die Datei:',
-'sharedupload'              => 'Die Datei isch vun $1 un s kann sai, dass se ach vun annere Projekt gebraucht werd.',
+'file-anchor-link' => 'Datei',
+'filehist' => 'Dateigschicht',
+'filehist-help' => 'Drick uff e Zaidpunkt zum aazääche, wie s dort ausgsähne hot.',
+'filehist-current' => 'aktuell',
+'filehist-datetime' => 'Zaidpunkt',
+'filehist-thumb' => 'Vorschaubild',
+'filehist-thumbtext' => 'Vorschaubild fer Version vum $1',
+'filehist-user' => 'Benutzer',
+'filehist-dimensions' => 'Moß',
+'filehist-comment' => 'Kommentar',
+'imagelinks' => 'Dateilinks',
+'linkstoimage' => 'Die {{PLURAL:$1|Said verwaist|$1 Saire verwaise}} uff die Datei:',
+'sharedupload' => 'Die Datei isch vun $1 un s kann sai, dass se ach vun annere Projekt gebraucht werd.',
 'uploadnewversion-linktext' => 'E naiere Version vun derre Datei hochlade',
 
 # File deletion
@@ -404,36 +420,36 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 # Statistics
 'statistics' => 'Statischtike',
 
-'brokenredirects-edit'   => 'bearwaide',
+'brokenredirects-edit' => 'bearwaide',
 'brokenredirects-delete' => 'lesche',
 
 # Miscellaneous special pages
-'nbytes'        => '$1 {{PLURAL:$1|Byte|Bytes}}',
-'nmembers'      => '$1 {{PLURAL:$1|Mitglied|Mitglieder}}',
-'prefixindex'   => 'Alle Saide (mid Präfix)',
-'newpages'      => 'Naie Saide',
-'move'          => 'Verschiewe',
-'movethispage'  => 'Die Said verschiewe',
+'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'nmembers' => '$1 {{PLURAL:$1|Mitglied|Mitglieder}}',
+'prefixindex' => 'Alle Saide (mid Präfix)',
+'newpages' => 'Naie Saide',
+'move' => 'Verschiewe',
+'movethispage' => 'Die Said verschiewe',
 'pager-newer-n' => '{{PLURAL:$1|negschte 1|negschte $1}}',
 'pager-older-n' => '{{PLURAL:$1|vorich 1|voriche $1}}',
 
 # Book sources
-'booksources'               => 'Buchquelle',
+'booksources' => 'Buchquelle',
 'booksources-search-legend' => 'No Buchquelle suche',
-'booksources-go'            => 'Geh',
+'booksources-go' => 'Geh',
 
 # Special:Log
 'log' => 'Logbiecher',
 
 # Special:AllPages
-'allpages'       => 'Alle Saide',
+'allpages' => 'Alle Saide',
 'alphaindexline' => 'vun $1 bis $2',
-'prevpage'       => 'Voriche Said ($1)',
-'allpagesfrom'   => 'Saide aazaische wu aafange mid:',
-'allpagesto'     => 'Saide aazaische wu ufhere mid:',
-'allarticles'    => 'Alle Saide',
-'allpagesprev'   => 'Voriche',
-'allpagesnext'   => 'Negschte',
+'prevpage' => 'Voriche Said ($1)',
+'allpagesfrom' => 'Saide aazaische wu aafange mid:',
+'allpagesto' => 'Saide aazaische wu ufhere mid:',
+'allarticles' => 'Alle Saide',
+'allpagesprev' => 'Voriche',
+'allpagesnext' => 'Negschte',
 'allpagessubmit' => 'Zaische',
 
 # Special:LinkSearch
@@ -450,134 +466,135 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 'emailsend' => 'Abschigge',
 
 # Watchlist
-'watchlist'         => 'Beowachdungslischd',
-'mywatchlist'       => 'Mai Beowachdungslischd',
-'addedwatchtext'    => "Die Said \"[[:\$1]]\" isch zu Dainer [[Special:Watchlist|Beowachdungslischt]] zugefiecht worre.
+'watchlist' => 'Beowachdungslischd',
+'mywatchlist' => 'Mai Beowachdungslischd',
+'addedwatchtext' => "Die Said \"[[:\$1]]\" isch zu Dainer [[Special:Watchlist|Beowachdungslischt]] zugefiecht worre.
 Zukimftiche Ännerunge an derre Said un de Dischbediersaid, wu dezu ghert, werre doo aagezaicht, un d Said werd '''fett''' aagezaicht in de [[Special:RecentChanges|Letschte Ännerunge]] fer dass es ääfacher isch zum finne.",
-'removedwatchtext'  => 'D Said "[[:$1]]" isch aus [[Special:Watchlist|Dainer Beowachdungslischt]] rausgenumme worre.',
-'watch'             => 'Beowachde',
-'watchthispage'     => 'Die Said beowachde',
-'unwatch'           => 'Nimmi beowachde',
+'removedwatchtext' => 'D Said "[[:$1]]" isch aus [[Special:Watchlist|Dainer Beowachdungslischt]] rausgenumme worre.',
+'watch' => 'Beowachde',
+'watchthispage' => 'Die Said beowachde',
+'unwatch' => 'Nimmi beowachde',
 'watchlist-details' => 'S hot {{PLURAL:$1|$1 Said|$1 Saide}} uff Dainer Beowachdungslischt, Dischbediersaide zelle nid.',
-'wlshowlast'        => 'Die letschte $1 Stunne $2 Dache $3 zaiche',
+'wlshowlast' => 'Die letschte $1 Stunne $2 Dache $3 zaiche',
 'watchlist-options' => 'Optione vun de Beowachdungslischt',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Beowachde ...',
+'watching' => 'Beowachde ...',
 'unwatching' => 'Nimmi beowachde ...',
 
 'enotif_reset' => 'Alle Seide als bsuchd margiere',
 
 # Delete
-'deletepage'            => 'Said lesche',
-'confirm'               => 'Bestädiche',
-'delete-legend'         => 'Lesche',
-'confirmdeletetext'     => 'Du bisch debai e Said z lesche mid alle Versione.
+'deletepage' => 'Said lesche',
+'confirm' => 'Bestädiche',
+'delete-legend' => 'Lesche',
+'confirmdeletetext' => 'Du bisch debai e Said z lesche mid alle Versione.
 Bitte du bstätiche, dass Du des wllscht du, dass Du verstehsch, was des hääßt, un dass Du des machscht in Iwweraistimmung mit de [[{{MediaWiki:Policy-url}}|Richtline]].',
-'actioncomplete'        => 'Aktion fertich',
-'deletedtext'           => '"$1" isch gelescht worre.
+'actioncomplete' => 'Aktion fertich',
+'deletedtext' => '"$1" isch gelescht worre.
 Guck $2 fer e Lischt vun de letschte Leschunge.',
-'dellogpage'            => 'Leschlogbuch',
-'deletecomment'         => 'Grund:',
-'deleteotherreason'     => 'Annere/zusätzliche Grund:',
+'dellogpage' => 'Leschlogbuch',
+'deletecomment' => 'Grund:',
+'deleteotherreason' => 'Annere/zusätzliche Grund:',
 'deletereasonotherlist' => 'Annere Grund',
 
 # Rollback
 'rollbacklink' => 'Zericksetze',
 
 # Protect
-'protectlogpage'              => 'Saideschutz-Logbuch',
-'protectedarticle'            => 'hot "[[$1]]" gschitzt',
-'modifiedarticleprotection'   => 'hot de Schutzstatus vun "[[$1]]" gännert',
-'protectcomment'              => 'Grund:',
-'protectexpiry'               => 'Bis:',
-'protect_expiry_invalid'      => 'Zaidraum isch nid gildich.',
-'protect_expiry_old'          => 'Zaidraum licht in de Vergangehääd.',
-'protect-text'                => "Du kannscht de Schutzstatus vun de Said '''$1''' aagucke un ännere.",
-'protect-locked-access'       => "Dai Benutzerkonto hot ken Recht zum de Schutzstatus vun ener Said ze ännere.
+'protectlogpage' => 'Saideschutz-Logbuch',
+'protectedarticle' => 'hot "[[$1]]" gschitzt',
+'modifiedarticleprotection' => 'hot de Schutzstatus vun "[[$1]]" gännert',
+'protectcomment' => 'Grund:',
+'protectexpiry' => 'Bis:',
+'protect_expiry_invalid' => 'Zaidraum isch nid gildich.',
+'protect_expiry_old' => 'Zaidraum licht in de Vergangehääd.',
+'protect-text' => "Du kannscht de Schutzstatus vun de Said '''$1''' aagucke un ännere.",
+'protect-locked-access' => "Dai Benutzerkonto hot ken Recht zum de Schutzstatus vun ener Said ze ännere.
 Do hot s di aktuelle Aistellunge vun de Said '''$1''':",
-'protect-cascadeon'           => 'Die Said isch gschitzt, wail se {{PLURAL:$1|zu derre Said ghert|zu denne Saide ghert}}, wu e Kaskadesperrung gelt.
+'protect-cascadeon' => 'Die Said isch gschitzt, wail se {{PLURAL:$1|zu derre Said ghert|zu denne Saide ghert}}, wu e Kaskadesperrung gelt.
 Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uff d Kaskadesperrung.',
-'protect-default'             => 'Alle Benutzer erlääwe',
-'protect-fallback'            => '«$1»-Berechdichung nedich',
+'protect-default' => 'Alle Benutzer erlääwe',
+'protect-fallback' => '«$1»-Berechdichung nedich',
 'protect-level-autoconfirmed' => 'Naie un nid aagemeldte Benutzer sperre',
-'protect-level-sysop'         => 'Numme Adminischtratore',
-'protect-summary-cascade'     => 'Kaskade',
-'protect-expiring'            => 'bis $1 (UTC)',
-'protect-cascade'             => 'Kaskadesperrung – alle aigebunnene Vorlache sinn midgsperrt.',
-'protect-cantedit'            => 'Du kannscht de Schutzstatus vun derre Said nit ännere, wail Du nid d Berechdichung dezu hoscht.',
-'restriction-type'            => 'Berechdichung:',
-'restriction-level'           => 'Schutzewene:',
+'protect-level-sysop' => 'Numme Adminischtratore',
+'protect-summary-cascade' => 'Kaskade',
+'protect-expiring' => 'bis $1 (UTC)',
+'protect-cascade' => 'Kaskadesperrung – alle aigebunnene Vorlache sinn midgsperrt.',
+'protect-cantedit' => 'Du kannscht de Schutzstatus vun derre Said nit ännere, wail Du nid d Berechdichung dezu hoscht.',
+'restriction-type' => 'Berechdichung:',
+'restriction-level' => 'Schutzewene:',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Bearwaide',
 'restriction-move' => 'Verschiewe',
 
 # Undelete
-'undelete'      => 'Widderherschdelle',
-'undeletebtn'   => 'Widderherschdelle',
-'undeletelink'  => 'aagucke/wirrer herstelle',
+'undelete' => 'Widderherschdelle',
+'undeletebtn' => 'Widderherschdelle',
+'undeletelink' => 'aagucke/wirrer herstelle',
 'undeletereset' => 'Zuricksetze',
+'undelete-show-file-submit' => 'Ja',
 
 # Namespace form on various pages
-'namespace'      => 'Nomensraum',
-'invert'         => 'Auswahl umkehre',
+'namespace' => 'Nomensraum',
+'invert' => 'Auswahl umkehre',
 'blanknamespace' => '(Haaptsaid)',
 
 # Contributions
-'contributions'       => 'Was der gemacht hot',
+'contributions' => 'Was der gemacht hot',
 'contributions-title' => 'Benutzerbaidräch vun $1',
-'mycontris'           => 'Was isch gemacht hab',
-'contribsub2'         => 'Fer $1 ($2)',
-'uctop'               => '(aktuell)',
-'month'               => 'un Monet (un frieher):',
-'year'                => 'Ab em Johr (un frieher):',
+'mycontris' => 'Was isch gemacht hab',
+'contribsub2' => 'Fer $1 ($2)',
+'uctop' => '(aktuell)',
+'month' => 'un Monet (un frieher):',
+'year' => 'Ab em Johr (un frieher):',
 
-'sp-contributions-newbies'  => 'Zaich numme Baidräch vun naie Benutzerkonte',
+'sp-contributions-newbies' => 'Zaich numme Baidräch vun naie Benutzerkonte',
 'sp-contributions-blocklog' => 'Sperrlogbuch',
-'sp-contributions-talk'     => 'Dischbediere',
-'sp-contributions-search'   => 'No Baidräch suche',
+'sp-contributions-talk' => 'Dischbediere',
+'sp-contributions-search' => 'No Baidräch suche',
 'sp-contributions-username' => 'IP-Adress orrer Benutzername:',
-'sp-contributions-submit'   => 'Suche',
+'sp-contributions-submit' => 'Suche',
 
 # What links here
-'whatlinkshere'            => 'Was doher zeischt',
-'whatlinkshere-title'      => 'Saide wu uff "$1" verlinke',
-'whatlinkshere-page'       => 'Said:',
-'linkshere'                => "Die Saide verlinke zu '''[[:$1]]''':",
-'isredirect'               => 'Wairerlaitungsaid',
-'istemplate'               => 'Vorlacheaibindung',
-'isimage'                  => 'Bildlink',
-'whatlinkshere-prev'       => '{{PLURAL:$1|vorich|voriche $1}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|negscht|negschte $1}}',
-'whatlinkshere-links'      => '← Links',
+'whatlinkshere' => 'Was doher zeischt',
+'whatlinkshere-title' => 'Saide wu uff "$1" verlinke',
+'whatlinkshere-page' => 'Said:',
+'linkshere' => "Die Saide verlinke zu '''[[:$1]]''':",
+'isredirect' => 'Wairerlaitungsaid',
+'istemplate' => 'Vorlacheaibindung',
+'isimage' => 'Bildlink',
+'whatlinkshere-prev' => '{{PLURAL:$1|vorich|voriche $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|negscht|negschte $1}}',
+'whatlinkshere-links' => '← Links',
 'whatlinkshere-hideredirs' => '$1 Wairerlaitunge',
-'whatlinkshere-hidetrans'  => '$1 Vorlacheaibindunge',
-'whatlinkshere-hidelinks'  => '$1 Links',
-'whatlinkshere-filters'    => 'Filter',
+'whatlinkshere-hidetrans' => '$1 Vorlacheaibindunge',
+'whatlinkshere-hidelinks' => '$1 Links',
+'whatlinkshere-filters' => 'Filter',
 
 # Block/unblock
-'blockip'                  => 'Benutzer bloggiere',
-'ipbsubmit'                => 'Benutzer bloggiere',
-'ipboptions'               => '2 Stunne:2 hours,1 Dach:1 day,3 Dache:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Monet:1 month,3 Monet:3 months,6 Monet:6 months,1 Johr:1 year,Fer immer:infinite',
-'ipusubmit'                => 'Die Adreß freigewwe',
-'ipblocklist'              => 'Gsperrte IP-Adresse un Benutzername',
-'blocklink'                => 'sperre',
-'unblocklink'              => 'Sperr uffhewwe',
-'change-blocklink'         => 'Sperr ännere',
-'contribslink'             => 'Baidräch',
-'blocklogpage'             => 'Sperrlogbuch',
-'blocklogentry'            => 'hot [[$1]] gsperrt fer e Zaidraum vun $2 $3',
-'unblocklogentry'          => 'hot d Sperr vun $1 uffghowwe',
+'blockip' => 'Benutzer bloggiere',
+'ipbsubmit' => 'Benutzer bloggiere',
+'ipboptions' => '2 Stunne:2 hours,1 Dach:1 day,3 Dache:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Monet:1 month,3 Monet:3 months,6 Monet:6 months,1 Johr:1 year,Fer immer:infinite',
+'ipusubmit' => 'Die Adreß freigewwe',
+'ipblocklist' => 'Gsperrte IP-Adresse un Benutzername',
+'blocklink' => 'sperre',
+'unblocklink' => 'Sperr uffhewwe',
+'change-blocklink' => 'Sperr ännere',
+'contribslink' => 'Baidräch',
+'blocklogpage' => 'Sperrlogbuch',
+'blocklogentry' => 'hot [[$1]] gsperrt fer e Zaidraum vun $2 $3',
+'unblocklogentry' => 'hot d Sperr vun $1 uffghowwe',
 'block-log-flags-nocreate' => 'Aaleche vun Benutzerkonte isch gsperrt',
 
 # Developer tools
-'lockbtn'   => 'Dadebonk schberre',
+'lockbtn' => 'Dadebonk schberre',
 'unlockbtn' => 'Dadebonk freigewwe',
 
 # Move page
 'move-page-legend' => 'Said verschiewe',
-'movepagetext'     => "Mid dem Format kannscht ener Said e naie Name gewwe, debai werre alle alde Versione uff de nai Name verschowe.
+'movepagetext' => "Mid dem Format kannscht ener Said e naie Name gewwe, debai werre alle alde Versione uff de nai Name verschowe.
 Aus em Alde Name werd e Wairerlaidungssaid´zum naie Name.
 Wairerlaidungssaide, wu uff de ald Name umlaire, kannscht automatisch aktualisiere.
 Wenn De des nid willsch, no guck uff [[Special:DoubleRedirects|doppelte]] orrer [[Special:BrokenRedirects|kaputte Wairerlaidunge]].
@@ -595,25 +612,26 @@ bitte mach des numme, wenn Du die Folche vun derre Aktion kannsch abschätze.",
 * Du wählsch unne d Option, se nid z verschiewe.
 
 In denne Fäll misst mer d Dischbediersaid vun Hand kopiere.",
-'movearticle'      => 'Said verschiewe:',
-'newtitle'         => 'Zum naie Titel:',
-'move-watch'       => 'Die Said beowachde',
-'movepagebtn'      => 'Said verschiewe',
-'pagemovedsub'     => 'Verschiewung hot geklappt',
-'movepage-moved'   => '\'\'\'"$1" isch verschowe worre uff "$2"\'\'\'',
-'articleexists'    => 'E Said mid dem Name gebbt s schun, orrer de Name, wu du gewählt hoscht, isch nid gildich.
+'movearticle' => 'Said verschiewe:',
+'newtitle' => 'Zum naie Titel:',
+'move-watch' => 'Die Said beowachde',
+'movepagebtn' => 'Said verschiewe',
+'pagemovedsub' => 'Verschiewung hot geklappt',
+'movepage-moved' => '\'\'\'"$1" isch verschowe worre uff "$2"\'\'\'',
+'articleexists' => 'E Said mid dem Name gebbt s schun, orrer de Name, wu du gewählt hoscht, isch nid gildich.
 Bitte nemm e annere Name.',
-'talkexists'       => "'''Die Said selwerschd, isch verschowe worre, awwer d Dischbediersaid hot nid kenne verschowe werre, wail s schun enni gebbt mid dem Name.
+'talkexists' => "'''Die Said selwerschd, isch verschowe worre, awwer d Dischbediersaid hot nid kenne verschowe werre, wail s schun enni gebbt mid dem Name.
 Bitte duu se vun Hand zammefiehre.'''",
-'movedto'          => 'verschowe uff',
-'movetalk'         => 'Dischbediersaid, wu dezu ghert, verschiewe',
-'movelogpage'      => 'Verschiewungs-Logbuch',
-'movereason'       => 'Grund:',
-'revertmove'       => 'Zerick verschiewe',
-'delete_and_move'  => 'Lesche un Verschiewe',
+'movedto' => 'verschowe uff',
+'movetalk' => 'Dischbediersaid, wu dezu ghert, verschiewe',
+'movelogpage' => 'Verschiewungs-Logbuch',
+'movereason' => 'Grund:',
+'revertmove' => 'Zerick verschiewe',
+'delete_and_move' => 'Lesche un Verschiewe',
+'delete_and_move_confirm' => 'Ja, Said lesche',
 
 # Export
-'export'        => 'Saide exportiere',
+'export' => 'Saide exportiere',
 'export-submit' => 'Seide exbordiere',
 
 # Thumbnails
@@ -623,76 +641,76 @@ Bitte duu se vun Hand zammefiehre.'''",
 'import-interwiki-submit' => 'Impordiere',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Dai Benutzersaid',
-'tooltip-pt-mytalk'               => 'Dai Dischbedier-Said',
-'tooltip-pt-preferences'          => 'Dai Aistellunge',
-'tooltip-pt-watchlist'            => 'D Lischt vun Saide, die wu du beowachde dusch',
-'tooltip-pt-mycontris'            => 'Lischt vun Daine Baidräch',
-'tooltip-pt-login'                => 'Du kannscht Dich aamelde, awwer du muscht s nit',
-'tooltip-pt-logout'               => 'Abmelde',
-'tooltip-ca-talk'                 => 'Iwwer d Inhaltssaid dischbediere',
-'tooltip-ca-edit'                 => 'Du kannscht die Said bearwaide.
+'tooltip-pt-userpage' => 'Dai Benutzersaid',
+'tooltip-pt-mytalk' => 'Dai Dischbedier-Said',
+'tooltip-pt-preferences' => 'Dai Aistellunge',
+'tooltip-pt-watchlist' => 'D Lischt vun Saide, die wu du beowachde dusch',
+'tooltip-pt-mycontris' => 'Lischt vun Daine Baidräch',
+'tooltip-pt-login' => 'Du kannscht Dich aamelde, awwer du muscht s nit',
+'tooltip-pt-logout' => 'Abmelde',
+'tooltip-ca-talk' => 'Iwwer d Inhaltssaid dischbediere',
+'tooltip-ca-edit' => 'Du kannscht die Said bearwaide.
 Bitte brauch de Vorschau-Knopp vor em Schbaichere',
-'tooltip-ca-addsection'           => 'E naie Abschnitt aaleche',
-'tooltip-ca-viewsource'           => 'Die Said isch gschitzt.
+'tooltip-ca-addsection' => 'E naie Abschnitt aaleche',
+'tooltip-ca-viewsource' => 'Die Said isch gschitzt.
 Du kannscht awwer de Quelltext aagucke',
-'tooltip-ca-history'              => 'Ledschde Versione vun derre Said',
-'tooltip-ca-protect'              => 'Die Said schitze',
-'tooltip-ca-delete'               => 'Die Said lesche',
-'tooltip-ca-move'                 => 'Die Said verschiewe',
-'tooltip-ca-watch'                => 'Die Said zu Dainere Beowachdungslischt zufieche',
-'tooltip-ca-unwatch'              => 'Die Said aus Dainer Beowachdunschlischde rausnemme',
-'tooltip-search'                  => 'Durchsuch {{SITENAME}}',
-'tooltip-search-go'               => 'Geh zu ere Said mit genää dem Namme, wenn s se gebbt',
-'tooltip-search-fulltext'         => 'Such in de Said noch dem Text',
-'tooltip-p-logo'                  => 'Haubdsaid',
-'tooltip-n-mainpage'              => 'Uff d Hääptsaid geh',
-'tooltip-n-mainpage-description'  => 'Haubdsaid aagucke',
-'tooltip-n-portal'                => 'Iwwer s Projekt, was de duu kannscht, wo de ebbes finnscht',
-'tooltip-n-currentevents'         => 'hinnergundsinformatione finne iwwer naie Eraichnis',
-'tooltip-n-recentchanges'         => 'D Lischt vun de letschte Ännerunge in dem Wiki',
-'tooltip-n-randompage'            => 'E zufälliche Said lade',
-'tooltip-n-help'                  => 'De Ort zum rausfinne',
-'tooltip-t-whatlinkshere'         => 'Lischt vun alle Wikisaide, wo do her verlinkt sin',
-'tooltip-t-recentchangeslinked'   => 'Letschte Ännerunge in Saide, wu vun do verlinkt sin',
-'tooltip-feed-rss'                => 'RSS feed fer die Said',
-'tooltip-feed-atom'               => 'Atom feed fer die Said',
-'tooltip-t-contributions'         => 'Die letschte Baidräch vun däm Benutzer aagucke',
-'tooltip-t-emailuser'             => 'Dem Benutzer e E-Mail schicke',
-'tooltip-t-upload'                => 'Dateie nuflade',
-'tooltip-t-specialpages'          => 'Lischt vun alle Spezialsaide',
-'tooltip-t-print'                 => 'Druckversion vun derre Said',
-'tooltip-t-permalink'             => 'E dauerhafte Link zu derre Version vun de Said',
-'tooltip-ca-nstab-main'           => 'D Inhaldssaid aagucke',
-'tooltip-ca-nstab-user'           => 'D Benutzersaid aagucke',
-'tooltip-ca-nstab-special'        => 'Des isch e Spezialsaid, du kannscht d Said sälwerscht nit ännere',
-'tooltip-ca-nstab-project'        => 'D Projektsaid aagucke',
-'tooltip-ca-nstab-image'          => 'D Dateisaid aaugucke',
-'tooltip-ca-nstab-template'       => 'Vorlach aagucke',
-'tooltip-ca-nstab-category'       => 'D Kategoriesaid aagucke',
-'tooltip-minoredit'               => 'Des als klenne Ännerung markiere',
-'tooltip-save'                    => 'Dai Ännerunge spaichere',
-'tooltip-preview'                 => 'Guck Daine Ännerunge in de Vorschau aa, vor Du uff Spaichere driksch!',
-'tooltip-diff'                    => 'Guck, welle Ännerunge Du im Text gmacht hoscht',
+'tooltip-ca-history' => 'Ledschde Versione vun derre Said',
+'tooltip-ca-protect' => 'Die Said schitze',
+'tooltip-ca-delete' => 'Die Said lesche',
+'tooltip-ca-move' => 'Die Said verschiewe',
+'tooltip-ca-watch' => 'Die Said zu Dainere Beowachdungslischt zufieche',
+'tooltip-ca-unwatch' => 'Die Said aus Dainer Beowachdunschlischde rausnemme',
+'tooltip-search' => 'Durchsuch {{SITENAME}}',
+'tooltip-search-go' => 'Geh zu ere Said mit genää dem Namme, wenn s se gebbt',
+'tooltip-search-fulltext' => 'Such in de Said noch dem Text',
+'tooltip-p-logo' => 'Haubdsaid',
+'tooltip-n-mainpage' => 'Uff d Hääptsaid geh',
+'tooltip-n-mainpage-description' => 'Haubdsaid aagucke',
+'tooltip-n-portal' => 'Iwwer s Projekt, was de duu kannscht, wo de ebbes finnscht',
+'tooltip-n-currentevents' => 'hinnergundsinformatione finne iwwer naie Eraichnis',
+'tooltip-n-recentchanges' => 'D Lischt vun de letschte Ännerunge in dem Wiki',
+'tooltip-n-randompage' => 'E zufälliche Said lade',
+'tooltip-n-help' => 'De Ort zum rausfinne',
+'tooltip-t-whatlinkshere' => 'Lischt vun alle Wikisaide, wo do her verlinkt sin',
+'tooltip-t-recentchangeslinked' => 'Letschte Ännerunge in Saide, wu vun do verlinkt sin',
+'tooltip-feed-rss' => 'RSS feed fer die Said',
+'tooltip-feed-atom' => 'Atom feed fer die Said',
+'tooltip-t-contributions' => 'Die letschte Baidräch vun däm Benutzer aagucke',
+'tooltip-t-emailuser' => 'Dem Benutzer e E-Mail schicke',
+'tooltip-t-upload' => 'Dateie nuflade',
+'tooltip-t-specialpages' => 'Lischt vun alle Spezialsaide',
+'tooltip-t-print' => 'Druckversion vun derre Said',
+'tooltip-t-permalink' => 'E dauerhafte Link zu derre Version vun de Said',
+'tooltip-ca-nstab-main' => 'D Inhaldssaid aagucke',
+'tooltip-ca-nstab-user' => 'D Benutzersaid aagucke',
+'tooltip-ca-nstab-special' => 'Des isch e Spezialsaid, du kannscht d Said sälwerscht nit ännere',
+'tooltip-ca-nstab-project' => 'D Projektsaid aagucke',
+'tooltip-ca-nstab-image' => 'D Dateisaid aaugucke',
+'tooltip-ca-nstab-template' => 'Vorlach aagucke',
+'tooltip-ca-nstab-category' => 'D Kategoriesaid aagucke',
+'tooltip-minoredit' => 'Des als klenne Ännerung markiere',
+'tooltip-save' => 'Dai Ännerunge spaichere',
+'tooltip-preview' => 'Guck Daine Ännerunge in de Vorschau aa, vor Du uff Spaichere driksch!',
+'tooltip-diff' => 'Guck, welle Ännerunge Du im Text gmacht hoscht',
 'tooltip-compareselectedversions' => 'D Unnerschied zwische denne zwai ausgwehlte Versione aagucke',
-'tooltip-watch'                   => 'Die Said zu Dainer Beowachdunglischd zufieche',
-'tooltip-rollback'                => '„Zericksetze“ maxcht alle Bearwaidunge vum letschte Bearwaider rickgängich',
-'tooltip-undo'                    => '„Zerick“ macht numme die Ännerung rickgängich un zaicht d Vorschau aa.
+'tooltip-watch' => 'Die Said zu Dainer Beowachdunglischd zufieche',
+'tooltip-rollback' => '„Zericksetze“ maxcht alle Bearwaidunge vum letschte Bearwaider rickgängich',
+'tooltip-undo' => '„Zerick“ macht numme die Ännerung rickgängich un zaicht d Vorschau aa.
 Du kannscht e Grund in dr Zammfassung aagewwe',
 
 # Browsing diffs
 'previousdiff' => '← Ältere Bearwaidung',
-'nextdiff'     => 'Naiere Bearwaidung →',
+'nextdiff' => 'Naiere Bearwaidung →',
 
 # Media information
 'file-info-size' => '$1 × $2 Pixels, Dateigreß: $3, MIME-Type: $4',
-'file-nohires'   => 'Ke hechere Ufflesung verfiechbar.',
-'svg-long-desc'  => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
+'file-nohires' => 'Ke hechere Ufflesung verfiechbar.',
+'svg-long-desc' => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
 'show-big-image' => 'Gsamte Ergebnis',
 
 # Special:NewFiles
 'showhidebots' => '(Bots $1)',
-'ilsubmit'     => 'Such',
+'ilsubmit' => 'Such',
 
 # Bad image list
 'bad_image_list' => 'Format:
@@ -702,12 +720,12 @@ De erscht Link muss e Link zu ere unerwinschte Datei sai.
 Annere Links in der glaiche Zail werre als Ausnahme behannelt, d. h. Saide, wu d Datei drin vorkumme därft.',
 
 # Metadata
-'metadata'          => 'Metadata',
-'metadata-help'     => 'Die Datei hot waitere Informatione, wahrschainlich vun de Digitalkamera oder vum Scanner, mit dem wu sie gmacht worre sinn.
+'metadata' => 'Metadata',
+'metadata-help' => 'Die Datei hot waitere Informatione, wahrschainlich vun de Digitalkamera oder vum Scanner, mit dem wu sie gmacht worre sinn.
 Wenn die Datei verännert worre isch, dann kann s sai, dass die zusätzlich Information fer die verännert Datei nimmi richtich isch.',
-'metadata-expand'   => 'Erwaiterte Details aazaiche',
+'metadata-expand' => 'Erwaiterte Details aazaiche',
 'metadata-collapse' => 'Erwaiterte Details versteckeln',
-'metadata-fields'   => 'Die EXIF-Metadate werre in de Bild-Bschraiwung ach aagezeicht, wenn d Metadate-Tabelle versteckelt isch.
+'metadata-fields' => 'Die EXIF-Metadate werre in de Bild-Bschraiwung ach aagezeicht, wenn d Metadate-Tabelle versteckelt isch.
 Annere Metadate sinn standardmäßig versteckelt.
 * make
 * model
@@ -726,18 +744,18 @@ Annere Metadate sinn standardmäßig versteckelt.
 'exif-gaincontrol-0' => 'Kään',
 
 # External editor support
-'edit-externally'      => 'Die Datei bearwaide mit ener externe Aawendung',
+'edit-externally' => 'Die Datei bearwaide mit ener externe Aawendung',
 'edit-externally-help' => '(Guck uff [//www.mediawiki.org/wiki/Manual:External_editors Installationsaawisige] fer meh Informatione)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'alle',
 'namespacesall' => 'alle',
-'monthsall'     => 'alle',
+'monthsall' => 'alle',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Die wichdiche Ännerunge aagucke',
 'watchlisttools-edit' => 'D Beowachdunglischt aagucke un bearwaide',
-'watchlisttools-raw'  => 'ime große Textfeld bearwaide',
+'watchlisttools-raw' => 'ime große Textfeld bearwaide',
 
 # Special:SpecialPages
 'specialpages' => 'Spezialsaide',
@@ -745,4 +763,7 @@ Annere Metadate sinn standardmäßig versteckelt.
 # Special:Tags
 'tags-edit' => 'bearwaide',
 
+# Feedback
+'feedback-close' => 'Erledischd',
+
 );
index 4795295..e40e433 100644 (file)
@@ -2478,10 +2478,10 @@ për podèj tramudé na pàgina.",
 'movepage-moved-noredirect' => "La creassion ëd na ridiression a l'é stàita scancelà.",
 'articleexists' => "Na pàgina che as ciama parej a-i é già, ò pura ël nòm che a l'ha sërnù a va nen bin.<br />
 Che as sërna, për piasì, un nòm diferent për st'artìcol.",
-'cantmove-titleprotected' => "As peul pa fesse San Martin ambelelì, për via che col tìtol-lì a l'é stàit proibì e a peul pa ess-ie na pàgina ciamà parej",
+'cantmove-titleprotected' => "As peul pa fesse San Martin ambelelì, për via che col tìtol-lì a l'é stàit proibì e a peul pa ess-ie na pàgina ciamà parèj",
 'talkexists' => "La pàgina a l'é staita bin tramudà, ma a l'é pa podusse tramudé soa pàgina ëd discussion, përchè a-i në j'é già n'àutra ant la pàgina con ël tìtol neuv. Për piasì, che a modìfica a man ij contnù dle doe pàgine ëd discussion, an manera che as perdo nen dij pensé anteressant.",
 'movedto' => 'tramudà a',
-'movetalk' => "Podend, tramuda ëdcò la pàgina ëd discussion che a l'ha tacà.",
+'movetalk' => "Tramudé ëdcò la pàgina ëd discussion che a l'ha tacà",
 'move-subpages' => 'Tramuda le sotpàgine (fin a $1)',
 'move-talk-subpages' => 'Tramuda le sotpàgine ëd na pàgina ëd discussion (fin a $1)',
 'movepage-page-exists' => 'La pàgina $1 a esist già e a peul pa esse coatà automaticament.',
index bc7842b..30bff95 100644 (file)
@@ -2633,7 +2633,7 @@ $1',
 'tooltip-pt-preferences' => 'میریاں تانگاں',
 'tooltip-pt-watchlist' => 'او صفحے جنہاں وچ تبدیلیاں تسی ویکھ رہے او',
 'tooltip-pt-mycontris' => 'میرے کم',
-'tooltip-pt-login' => 'جÛ\8c ØµØ¯Ù\82Û\92 Ø§Ù\86در Ø¢Ø¤Ø\8c Ù¾Ø± Ø§Û\92 Ù\84ازÙ\85Û\8c Ù\86Û\81یں۔',
+'tooltip-pt-login' => 'اÛ\92 Ø¨Û\81تر Ø§Û\92 Ú©Û\81 Ù\84اگ Ø§Ù\86 Û\81Ù\88 Ø¬Ø§Ø¤Ø\8c Ù\84Û\8cÚ©Ù\86 Ù\81Û\8cر Ù\88Û\8c Ø§Û\92 Ù\84ازÙ\85Û\8c Ù\86ئیں۔',
 'tooltip-pt-anonlogin' => 'اے بہتر اے کہ لاگ ان ہو جاؤ، لیکن فیر وی اے لازمی نئیں۔',
 'tooltip-pt-logout' => 'باہر آؤ',
 'tooltip-ca-talk' => 'اس صفحے دے بار وچ گل بات',
@@ -3326,7 +3326,7 @@ $5
 'ascending_abbrev' => 'اے ایس سی',
 'descending_abbrev' => 'ڈی ایایس سی',
 'table_pager_next' => 'اگلا صفہ',
-'table_pager_prev' => 'پچھلا صفحہ',
+'table_pager_prev' => 'پچھلا صفہ',
 'table_pager_first' => 'پہلا صفہ',
 'table_pager_last' => 'آخری صفہ',
 'table_pager_limit' => '$1 وکھاؤ ہر صفے تے',
@@ -3390,7 +3390,7 @@ $5
 # Special:Version
 'version' => 'ورژن',
 'version-extensions' => 'انسٹالڈ کیتیاں گیاں ایکسٹنشن',
-'version-specialpages' => 'خاص صفحے',
+'version-specialpages' => 'خاص صفے',
 'version-parserhooks' => 'پارسر ہکز',
 'version-variables' => 'ویریایبلز',
 'version-antispam' => 'سپام بچاؤ',
index e103bf2..bd85da3 100644 (file)
@@ -750,7 +750,8 @@ $1',
 '''تر اوسه پورې دا نه دی خوندي شوی!'''",
 'updated' => '(تازه)',
 'note' => "'''يادونه:'''",
-'previewnote' => "'''دا يواځې مخليدنه ده، تاسې چې کوم بدلونونه ترسره کړي، لا تر اوسه پورې نه دي خوندي شوي!'''",
+'previewnote' => "'''هېر مو نه شي چې دا يواځې يوه مخليدنه ده.'''
+ستاسې لخوا ترسره شوي بدلونونه لا تر اوسه پورې نه دي خوندي شوي!!",
 'editing' => 'د $1 سمونه',
 'editingsection' => 'سمونه $1 (برخه)',
 'editingcomment' => 'د $1 سمون (نوې برخه)',
@@ -1279,7 +1280,10 @@ $1',
 'upload-http-error' => 'د HTTP يوه ستونزه رامېنځ ته شوې: $1',
 
 # File backend
+'backend-fail-delete' => 'د "$1" دوتنه ړنګه نه شوه.',
 'backend-fail-alreadyexists' => 'د $1 دوتنه له پخوا نه شته.',
+'backend-fail-read' => 'د "$1" دوتنه نه شي لوستل کېدای.',
+'backend-fail-create' => 'د "$1" دوتنه نه شي جوړېدای.',
 
 # ZipDirectoryReader
 'zip-wrong-format' => 'ځانګړې شوې دوتنه يوه ZIP دوتنه نه وه.',
@@ -1823,8 +1827,8 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'ipb-confirm' => 'د بنديز تاييد',
 'badipaddress' => 'ناسمه IP پته',
 'blockipsuccesssub' => 'بنديز په برياليتوب سره ولګېده',
-'blockipsuccesstext' => 'د [[Special:Contributions/$1|$1]] مخه نيول شوې.
-<br />د مخنيول شويو خلکو د کتنې لپاره، د [[Special:BlockList|مخنيول شويو IP لړليک]] وګورۍ.',
+'blockipsuccesstext' => 'په [[Special:Contributions/$1|$1]] بنديز لګېدلی.<br />
+د بنديزونو د څارلو لپاره [[Special:BlockList|بنديز لړليک]] وګورۍ.',
 'ipb-edit-dropdown' => 'د بنديز سببونه سمول',
 'ipb-unblock-addr' => 'له $1 بنديز ليرې کول',
 'ipb-unblock' => 'له يوه کارن-نوم يا IP پتې بنديز ليري کول',
@@ -1973,6 +1977,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 # Import log
 'importlogpage' => 'د واردولو يادښت',
 
+# JavaScriptTest
+'javascripttest' => 'د جاوا سکرېپټ آزمېښت',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'ستاسې کارن مخ',
 'tooltip-pt-mytalk' => 'ستاسې د خبرواترو مخ',
@@ -2030,6 +2037,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-diff' => 'دا هغه بدلونونه چې تاسې په متن کې ترسره کړي، ښکاره کوي. [alt-v]',
 'tooltip-compareselectedversions' => 'د همدې مخ د دوو ټاکل شويو بڼو تر مېنځ توپيرونه وګورۍ.',
 'tooltip-watch' => 'دا مخ ستاسې کتنلړ کې ورګډوي [alt-w]',
+'tooltip-upload' => 'د پورته کولو پيل',
 'tooltip-rollback' => 'په همدې مخ کې "په شابېول" د وروستني ونډوال سمون (سمونونه) په يوه کلېک په څټ ورګرځوي.',
 'tooltip-undo' => '"ناکړ" همدا سمون پر شا ګرځوي او د سمون کړکۍ د مخکتنې په بڼه پرانيزي.
 دا کړنه د لنډيز په برخه کې د سمونونو د سببونو د ورګډولو آسانتيا برابروي.',
@@ -2085,6 +2093,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'svg-long-desc' => 'SVG دوتنه، نومېنلي $1 × $2 پېکسل، د دوتنې کچه: $3',
 'show-big-image' => 'بشپړ بېلن نښې',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|چوکاټ|چوکاټونه}}',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|ځل|ځله}} وغږېده',
 'file-info-png-frames' => '$1 {{PLURAL:$1|چوکاټ|چوکاټونه}}',
 
 # Special:NewFiles
@@ -2145,6 +2154,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exif-model' => 'د کامرې ماډل',
 'exif-software' => 'کارېدلې ساوترۍ',
 'exif-artist' => 'ليکوال',
+'exif-copyright' => 'د رښتو خاوند',
 'exif-colorspace' => 'رنګ تشيال',
 'exif-pixelydimension' => 'د انځور سور',
 'exif-pixelxdimension' => 'د انځور جګوالی',
@@ -2174,20 +2184,27 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exif-objectname' => 'لنډ سرليک',
 'exif-headline' => 'سرليک',
 'exif-source' => 'سرچينه',
-'exif-contact' => 'د اړيکې مالومات',
+'exif-contact' => 'د اړيکو مالومات',
 'exif-writer' => 'ليکوال',
 'exif-languagecode' => 'ژبه',
 'exif-iimcategory' => 'وېشنيزه',
 'exif-datetimeexpires' => 'مه يې کاروۍ وروسته له',
+'exif-datetimereleased' => 'خپرېدلی په',
 'exif-identifier' => 'پېژندنه',
 'exif-lens' => 'کارېدلې لېنز',
 'exif-serialnumber' => 'د کامرې پرله پسې شمېره',
 'exif-cameraownername' => 'د کامرې خاوند',
 'exif-label' => 'نښکه',
+'exif-copyrighted' => 'د رښتو دريځ',
+'exif-copyrightowner' => 'د رښتو خاوند',
+'exif-usageterms' => 'د کارولو شرايط',
 'exif-pngfilecomment' => 'د PNG دوتنې تبصره',
 'exif-disclaimer' => 'ردادعاليک',
 'exif-giffilecomment' => 'د GIF دوتنې تبصره',
 
+'exif-copyrighted-true' => 'په رښتو سمبال',
+'exif-copyrighted-false' => 'ټولګړی شپول',
+
 'exif-unknowndate' => 'نامالومه نېټه',
 
 'exif-orientation-1' => 'نورمال',
@@ -2207,6 +2224,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exif-lightsource-1' => 'د ورځې رڼا',
 'exif-lightsource-4' => 'فلش',
 'exif-lightsource-9' => 'ښه هوا',
+'exif-lightsource-10' => 'ورېځ پوښلې هوا',
 'exif-lightsource-11' => 'سيوری',
 'exif-lightsource-255' => 'د رڼا بله سرچينه',
 
@@ -2403,6 +2421,9 @@ $5
 'iranian-calendar-m11' => 'سلواغه',
 'iranian-calendar-m12' => 'کب',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|خبرې اترې]])',
+
 # Special:Version
 'version' => 'بڼه',
 'version-extensions' => 'لګېدلي شاتاړي',
@@ -2517,6 +2538,7 @@ $5
 'feedback-close' => 'ترسره شو',
 
 # API errors
+'api-error-duplicate-popup-title' => 'غبرګونې {{PLURAL:$1|دوتنه|دوتنې}}.',
 'api-error-empty-file' => 'کومه دوتنه چې تاسې دلته سپارلې هغه تشه ده.',
 'api-error-file-too-large' => 'کومه دوتنه چې تاسې دلته سپارلې ډېره لويه ده.',
 'api-error-filename-tooshort' => 'د دوتنې نوم ډېر لنډ دی.',
@@ -2526,4 +2548,15 @@ $5
 'api-error-unknown-warning' => 'ناڅرګنده ګواښنه: "$1".',
 'api-error-unknownerror' => 'ناڅرګنده تېروتنه: "$1".',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|ثانيه|ثانيې}}',
+'duration-minutes' => '$1 {{PLURAL:$1|دقيقه|دقيقې}}',
+'duration-hours' => '$1 {{PLURAL:$1|ساعت|ساعتونه}}',
+'duration-days' => '$1 {{PLURAL:$1|ورځ|ورځې}}',
+'duration-weeks' => '$1 {{PLURAL:$1|اونۍ|اونۍ}}',
+'duration-years' => '$1 {{PLURAL:$1|کال|کالونه}}',
+'duration-decades' => '$1 {{PLURAL:$1|لسيزه|لسيزې}}',
+'duration-centuries' => '$1 {{PLURAL:$1|پېړۍ|پېړۍ}}',
+'duration-millennia' => '$1 {{PLURAL:$1|زرمه|زرمې}}',
+
 );
index 79e037e..736118c 100644 (file)
@@ -1093,6 +1093,10 @@ Estes argumentos foram omitidos.',
 'parser-template-loop-warning' => 'Ciclo de predefinições detectado: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Foi excedido o limite da profundidade de recursividade nas predefinições ($1)',
 'language-converter-depth-warning' => 'O limite de profundidade do conversor de línguas excedeu a ($1)',
+'node-count-exceeded-category' => 'Páginas em que o total de nós é excedido',
+'node-count-exceeded-warning' => 'A página excedeu o total de nós',
+'expansion-depth-exceeded-category' => 'Páginas em que a profundidade de expansão é excedida',
+'expansion-depth-exceeded-warning' => 'A página excedeu a profundidade de expansão',
 
 # "Undo" feature
 'undo-success' => 'É possível desfazer a edição.
@@ -1859,6 +1863,7 @@ Caso o problema persista, contacte um [[Special:ListUsers/sysop|administrador]].
 'backend-fail-connect' => 'Não foi possível estabelecer ligação com o servidor de armazenamento "$1".',
 'backend-fail-internal' => 'Ocorreu um erro desconhecido no servidor de armazenamento "$1".',
 'backend-fail-contenttype' => 'Não foi possível determinar o tipo de conteúdo do ficheiro para armazenar em " $1 ".',
+'backend-fail-batchsize' => 'Foi fornecido um bloco de $1 {{PLURAL:$1|operação|operações}} sobre ficheiros ao servidor backend de armazenamento; o limite é de $2 {{PLURAL:$2|operação|operações}}.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Não foi possível ligar à base de dados de registos no "backend" de armazenamento "$1".',
@@ -2117,6 +2122,8 @@ Agora redirecciona para [[$2]].',
 'wantedpages' => 'Páginas desejadas',
 'wantedpages-badtitle' => 'Título inválido no conjunto de resultados: $1',
 'wantedfiles' => 'Ficheiros desejados',
+'wantedfiletext-cat' => 'Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão <del>riscados</del>. Adicionalmente, páginas que incorporam ficheiros que não existem estão listadas em [[:$1]].',
+'wantedfiletext-nocat' => 'Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão <del>riscados</del>.',
 'wantedtemplates' => 'Predefinições desejadas',
 'mostlinked' => 'Páginas com mais afluentes',
 'mostlinkedcategories' => 'Categorias com mais membros',
@@ -2197,6 +2204,8 @@ Talvez contenha um ou mais caracteres que não podem ser usados nos títulos.',
 'allpages-hide-redirects' => 'Ocultar redirecionamentos',
 
 # SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Você está a visualizar uma versão desta página em cache que tem uma antiguidade máxima de $1.',
+'cachedspecial-viewing-cached-ts' => 'Você está a visualizar uma versão desta página em cache que pode não refletir totalmente a situação atual.',
 'cachedspecial-refresh-now' => 'Ver mais recente.',
 
 # Special:Categories
@@ -2959,6 +2968,7 @@ Não há um directório temporário.',
 'javascripttest-pagetext-frameworks' => 'Escolha, por favor, uma das seguintes estruturas de teste: $1',
 'javascripttest-pagetext-skins' => 'Escolher um tema para executar os testes com:',
 'javascripttest-qunit-intro' => 'Consulte a [ $1 documentação de testes] no mediawiki.org.',
+'javascripttest-qunit-heading' => 'Pacote de ferramentas de teste de JavaScript QUnit do MediaWiki',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'A sua página de utilizador',
index 2e2b996..d949c1d 100644 (file)
@@ -330,8 +330,8 @@ $messages = array(
 'tog-previewontop' => 'Mostrar previsão antes da caixa de edição',
 'tog-previewonfirst' => 'Mostrar previsão na primeira edição',
 'tog-nocache' => 'Desativar o cache de páginas do navegador',
-'tog-enotifwatchlistpages' => 'Enviar-me um email quando uma página da minha lista de páginas vigiadas for alterada',
-'tog-enotifusertalkpages' => 'Enviar-me um email quando a minha página de discussão for editada',
+'tog-enotifwatchlistpages' => 'Receber e-mail quando uma página da minha lista de páginas vigiadas for alterada',
+'tog-enotifusertalkpages' => 'Receber e-mail quando a minha página de discussão for editada',
 'tog-enotifminoredits' => 'Enviar-me um email também quando forem edições menores',
 'tog-enotifrevealaddr' => 'Revelar o meu endereço de email nas notificações',
 'tog-shownumberswatching' => 'Mostrar o número de usuários que estão vigiando',
@@ -349,7 +349,7 @@ $messages = array(
 'tog-watchlisthideanons' => 'Ocultar edições de usuários anônimos da lista de páginas vigiadas',
 'tog-watchlisthidepatrolled' => 'Esconder edições patrulhadas na lista de páginas vigiadas',
 'tog-nolangconversion' => 'Desabilitar conversão de variantes de idioma',
-'tog-ccmeonemails' => 'Enviar para mim cópias de e-mails que eu enviar a outros usuários',
+'tog-ccmeonemails' => 'Receber cópias de e-mails que eu enviar a outros usuários',
 'tog-diffonly' => 'Não mostrar o conteúdo da página ao comparar duas edições',
 'tog-showhiddencats' => 'Exibir categorias ocultas',
 'tog-noconvertlink' => 'Desabilitar conversão de títulos de links',
@@ -481,7 +481,7 @@ $messages = array(
 'tagline' => 'De {{SITENAME}}',
 'help' => 'Ajuda',
 'search' => 'Pesquisar',
-'searchbutton' => 'Pesquisa',
+'searchbutton' => 'Pesquisar',
 'go' => 'Ir',
 'searcharticle' => 'Ir',
 'history' => 'Histórico da página',
@@ -547,7 +547,7 @@ $1',
 'copyrightpage' => '{{ns:project}}:Direitos_de_autor',
 'currentevents' => 'Eventos atuais',
 'currentevents-url' => 'Project:Eventos atuais',
-'disclaimers' => 'Alerta de conteúdo',
+'disclaimers' => 'Exoneração de responsabilidade',
 'disclaimerpage' => 'Project:Aviso_geral',
 'edithelp' => 'Ajuda de edição',
 'edithelppage' => 'Help:Editar',
@@ -569,7 +569,7 @@ $1',
 Veja a [[Special:Version|página sobre a versão do sistema]].',
 
 'ok' => 'OK',
-'retrievedfrom' => 'Obtida de "$1"',
+'retrievedfrom' => 'Disponível em "$1"',
 'youhavenewmessages' => 'Você tem $1 ($2).',
 'newmessageslink' => 'novas mensagens',
 'newmessagesdifflink' => 'última alteração',
@@ -719,7 +719,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
 'yourdomainname' => 'Seu domínio:',
 'externaldberror' => 'Ocorreu ou um erro no banco de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.',
 'login' => 'Autenticar-se',
-'nav-login-createaccount' => 'Criar uma conta ou entrar',
+'nav-login-createaccount' => 'Entrar / criar conta',
 'loginprompt' => 'É necessário estar com cookies ativados para poder autenticar-se no wiki {{SITENAME}}.',
 'userlogin' => 'Criar uma conta ou entrar',
 'userloginnocreate' => 'Entrar',
@@ -748,7 +748,7 @@ Por favor ative-os, depois autentique-se com o seu novo nome de usuário e a sua
 Certifique-se de que tem os cookies ativados, recarregue esta página e tente novamente.',
 'noname' => 'Você não colocou um nome de usuário válido.',
 'loginsuccesstitle' => 'Login bem sucedido',
-'loginsuccess' => "'''Agora você está autenticado ao wiki {{SITENAME}} como \"\$1\"'''.",
+'loginsuccess' => "'''Agora você está {{GENDER:autenticado|autenticada}} ao wiki {{SITENAME}} como \"\$1\"'''.",
 'nosuchuser' => 'Não existe nenhum usuário com o nome "$1".
 Os nomes de usuário são sensíveis à capitalização.
 Verifique a ortografia, ou [[Special:UserLogin/signup|crie uma nova conta]].',
@@ -980,6 +980,7 @@ O registro de bloqueio mais recente é fornecido abaixo, para referência:',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Lembre-se de que isto é apenas uma previsão.'''
 Suas alterações ainda não foram salvas!",
+'continue-editing' => 'Continuar editando',
 'previewconflict' => 'Esta previsão reflete o texto que está na área de edição acima e como ele aparecerá se você escolher salvar.',
 'session_fail_preview' => "'''Pedimos desculpas, mas não foi possível processar a sua edição devido à perda de dados da sua sessão.
 Por favor tente novamente.
@@ -1262,7 +1263,7 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de mais de {{PLURAL:$2|um usuário|$2 usuário}} não {{PLURAL:$1|apresentada|apresentadas}})',
 
 # Search results
-'searchresults' => 'Resultados de pesquisa',
+'searchresults' => 'Resultados da pesquisa',
 'searchresults-title' => 'Resultados da pesquisa por "$1"',
 'searchresulttext' => 'Para mais informações de como pesquisar na {{SITENAME}}, consulte [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => 'Você pesquisou por \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|páginas iniciadas por "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|páginas que apontam para "$1"]])',
@@ -1400,7 +1401,7 @@ Eis um valor gerado aleatoriamente que você pode usar: $1",
 'timezoneregion-europe' => 'Europa',
 'timezoneregion-indian' => 'Oceano Índico',
 'timezoneregion-pacific' => 'Oceano Pacífico',
-'allowemail' => 'Permitir email de outros usuários',
+'allowemail' => 'Permitir que outros usuários me enviem e-mails',
 'prefs-searchoptions' => 'Opções de busca',
 'prefs-namespaces' => 'Espaços nominais',
 'defaultns' => 'Caso contrário pesquisar nestes espaços nominais:',
@@ -1959,6 +1960,10 @@ Uma [[Special:WhatLinksHere/$2|listagem completa]] está disponível.',
 Por favor veja a [$2 página de descrição do arquivo] para mais informações.',
 'sharedupload-desc-here' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
 A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
+'sharedupload-desc-edit' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
+Talvez você deseje editar a descrição na sua [$2 página de descrição de arquivo] por lá.',
+'sharedupload-desc-create' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
+Talvez você deseje editar a descrição na sua [$2 página de descrição de arquivo] por lá.',
 'filepage-nofile' => 'Não existe nenhum arquivo com esse nome.',
 'filepage-nofile-link' => 'Não existe nenhum arquivo com este nome, mas você pode [$1 carregá-lo].',
 'uploadnewversion-linktext' => 'Enviar uma nova versão deste arquivo',
@@ -2089,6 +2094,8 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'wantedpages' => 'Páginas pedidas',
 'wantedpages-badtitle' => 'Título inválido no conjunto de resultados: $1',
 'wantedfiles' => 'Arquivos pedidos',
+'wantedfiletext-cat' => 'Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>. As páginas que incluem arquivos inexistentes são listadas em [[:$1]].',
+'wantedfiletext-nocat' => 'Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>.',
 'wantedtemplates' => 'Predefinições pedidas',
 'mostlinked' => 'Páginas com mais afluentes',
 'mostlinkedcategories' => 'Categorias com mais membros',
@@ -2097,6 +2104,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'mostimages' => 'Imagens com mais afluentes',
 'mostrevisions' => 'Páginas de conteúdo com mais revisões',
 'prefixindex' => 'Todas as páginas com prefixo',
+'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)',
 'shortpages' => 'Páginas curtas',
 'longpages' => 'Páginas longas',
 'deadendpages' => 'Páginas sem saída',
@@ -2166,6 +2174,11 @@ Você pode diminuir a lista escolhendo um tipo de registro, um nome de usuário
 'allpages-bad-ns' => '{{SITENAME}} não possui o espaço nominal "$1".',
 'allpages-hide-redirects' => 'Ocultar redirecionamentos',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Você está visualizando uma versão de cache desta página que pode ser de $1 atrás.',
+'cachedspecial-viewing-cached-ts' => 'Você está visualizando uma versão de cache desta página que pode estar desatualizada.',
+'cachedspecial-refresh-now' => 'Ver a mais recente.',
+
 # Special:Categories
 'categories' => 'Categorias',
 'categoriespagetext' => '{{PLURAL:$1|A seguinte categoria contém|As seguintes contém}} páginas ou mídia.
@@ -2602,8 +2615,8 @@ Isto só deve ser feito para prevenir vandalismo, e de acordo com a [[{{MediaWik
 'ipb-confirm' => 'Confirmar bloqueio',
 'badipaddress' => 'Endereço de IP inválido',
 'blockipsuccesssub' => 'Bloqueio bem sucedido',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi bloqueado.<br />
-Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />
+Consulte a [[Special:BlockList|lista de bloqueios]].',
 'ipb-blockingself' => 'Você está prestes a bloquear-se a si próprio. Você tem a certeza de que pretende fazê-lo?',
 'ipb-confirmhideuser' => 'Você está prestes a bloquear um utilizador com "Ocultar nome de utilizador/IP" ativado. Isto irá suprimir o nome do usuário de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?',
 'ipb-edit-dropdown' => 'Editar motivos de bloqueio',
@@ -2657,7 +2670,7 @@ O registro de supressão é fornecido abaixo para referência:',
 'reblock-logentry' => 'modificou parâmetros de bloqueio de [[$1]] $3. O bloqueio expira em $2.',
 'blocklogtext' => 'Este é um registro de ações de bloqueio e desbloqueio.
 Endereços IP sujeitos a bloqueio automático não são listados.
-Consulte a [[Special:BlockList|lista de IPs bloqueados]] para obter a lista de bloqueios e banimentos atualmente válidos.',
+Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloqueios e banimentos em efeito neste momento.',
 'unblocklogentry' => 'desbloqueou $1',
 'block-log-flags-anononly' => 'apenas usuários anônimos',
 'block-log-flags-nocreate' => 'criação de contas desabilitada',
@@ -2843,6 +2856,8 @@ Acesse [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
 'thumbnail_error' => 'Erro ao criar miniatura: $1',
 'djvu_page_error' => 'página DjVu inacessível',
 'djvu_no_xml' => 'Não foi possível acessar o XML do arquivo DjVU',
+'thumbnail-temp-create' => 'Não foi possível criar o arquivo temporário de miniatura',
+'thumbnail-dest-create' => 'Não foi possível salvar a miniatura no destino',
 'thumbnail_invalid_params' => 'Parâmetros de miniatura inválidos',
 'thumbnail_dest_directory' => 'Não foi possível criar o diretório de destino',
 'thumbnail_image-type' => 'Tipo de imagem não suportado',
@@ -2889,6 +2904,9 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'import-invalid-interwiki' => 'Não é possível importar do wiki especificado.',
 'import-error-edit' => 'A página "$1" não foi importada porque você não tem permissão para editá-la.',
 'import-error-create' => 'A página "$1" não foi importada porque você não tem permissão para criá-la.',
+'import-error-interwiki' => 'A página "$1" não pôde ser importada pois seu nome está reservado para um link interwik.',
+'import-error-special' => 'A página "$1" não pôde ser importada porque ela pertence a um espaço nominal especial que não suporta páginas.',
+'import-error-invalid' => 'A página "$1" não pôde ser importada por seu nome ser inválido.',
 
 # Import log
 'importlogpage' => 'Registro de importações',
@@ -2900,7 +2918,13 @@ Salve o arquivo no seu computador e importe-o aqui.',
 
 # JavaScriptTest
 'javascripttest' => 'Teste de JavaScript',
+'javascripttest-disabled' => 'Essa função não foi habilitada neste wiki.',
+'javascripttest-title' => 'Executando testes para $1',
 'javascripttest-pagetext-noframework' => 'Esta página é exclusiva para testes de JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'A estrutura de testes "$1" é desconhecida.',
+'javascripttest-pagetext-frameworks' => 'Escolha uma das seguintes estruturas de teste: $1',
+'javascripttest-pagetext-skins' => 'Escolha o tema para executar os testes:',
+'javascripttest-qunit-intro' => 'Veja a [$1 documentação de testes] no mediawiki.org.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Sua página de usuário',
@@ -2914,7 +2938,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'tooltip-pt-anonlogin' => 'Você é encorajado a autenticar-se, apesar disso não ser obrigatório.',
 'tooltip-pt-logout' => 'Sair',
 'tooltip-ca-talk' => 'Discussão sobre o conteúdo da página',
-'tooltip-ca-edit' => 'Você pode editar esta página. Por favor, utilize o botão Mostrar Previsão antes de salvar.',
+'tooltip-ca-edit' => 'Você pode editar esta página. Use o botão "Mostrar previsão" antes de salvar.',
 'tooltip-ca-addsection' => 'Iniciar uma nova seção',
 'tooltip-ca-viewsource' => 'Esta página está protegida; você pode exibir seu código, no entanto.',
 'tooltip-ca-history' => 'Edições anteriores desta página.',
@@ -2927,22 +2951,22 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'tooltip-ca-unwatch' => 'Remover esta página da lista de páginas vigiadas',
 'tooltip-search' => 'Pesquisar em {{SITENAME}}',
 'tooltip-search-go' => 'Ir a uma página com este exato nome, caso exista',
-'tooltip-search-fulltext' => 'Procurar por páginas contendo este texto',
-'tooltip-p-logo' => 'Página principal',
-'tooltip-n-mainpage' => 'Visitar a página principal',
-'tooltip-n-mainpage-description' => 'Visitar a página principal',
-'tooltip-n-portal' => 'Sobre o projeto',
-'tooltip-n-currentevents' => 'Informação temática sobre eventos atuais',
-'tooltip-n-recentchanges' => 'Uma lista de mudanças recentes no wiki',
-'tooltip-n-randompage' => 'Abrir uma página aleatoriamente',
-'tooltip-n-help' => 'Um local reservado para auxílio.',
-'tooltip-t-whatlinkshere' => 'Lista de todas as páginas que ligam-se a esta',
-'tooltip-t-recentchangeslinked' => 'Mudanças recentes em páginas relacionadas a esta',
+'tooltip-search-fulltext' => 'Procurar páginas que contenham este texto',
+'tooltip-p-logo' => 'Acessar a página principal',
+'tooltip-n-mainpage' => 'Acessar a página principal',
+'tooltip-n-mainpage-description' => 'Acessar a página principal',
+'tooltip-n-portal' => 'Sobre o projeto, o que se pode fazer e onde achar as coisas',
+'tooltip-n-currentevents' => 'Encontre informações sobre acontecimentos atuais',
+'tooltip-n-recentchanges' => 'A lista de mudanças recentes desta wiki.',
+'tooltip-n-randompage' => 'Acessar uma página de forma aleatória',
+'tooltip-n-help' => 'Lugar específico para obter ajuda quanto ao ambiente.',
+'tooltip-t-whatlinkshere' => 'Lista de todas as páginas que possuem links para esta',
+'tooltip-t-recentchangeslinked' => 'Mudanças recentes nas páginas para as quais esta possui links',
 'tooltip-feed-rss' => 'Feed RSS desta página',
 'tooltip-feed-atom' => 'Feed Atom desta página',
 'tooltip-t-contributions' => 'Ver as contribuições deste usuário',
 'tooltip-t-emailuser' => 'Enviar um e-mail a este usuário',
-'tooltip-t-upload' => 'Carregar arquivos',
+'tooltip-t-upload' => 'Enviar arquivos',
 'tooltip-t-specialpages' => 'Lista de páginas especiais',
 'tooltip-t-print' => 'Versão para impressão desta página',
 'tooltip-t-permalink' => 'Link permanente para esta versão desta página',
@@ -3108,9 +3132,9 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
 # Bad image list
 'bad_image_list' => 'O formato é o seguinte:
 
-Só itens da lista (linhas começando com *) são considerados.
-A primeira ligação em uma linha deve ser uma ligação para um arquivo ruim.
-Qualquer ligação posterior na mesma linha são consideradas como exceções, ou seja, páginas nas quais o arquivo pode aparecer na linha.',
+Só são reconhecidos elementos na forma de lista (linhas começadas por *).
+O primeiro link em cada linha deve direcionar para o arquivo que se pretende bloquear.
+Quaisquer outros links nessa mesma linha são considerados exceções (ou seja, páginas onde o arquivo pode estar presente).',
 
 # Metadata
 'metadata' => 'Metadados',
@@ -3723,6 +3747,7 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'version-software' => 'Software instalado',
 'version-software-product' => 'Produto',
 'version-software-version' => 'Versão',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Diretório do arquivo',
@@ -3857,6 +3882,8 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'newuserlog-byemail' => 'senha enviada por correio-eletrônico',
 
 # Feedback
+'feedback-bugornote' => 'Se você está preparado para descrever detalhadamente um problema técnico, [$1 relate um bug].
+Caso contrário, você poderá usar o formulário simplificado a seguir. Seu comentário será adicionado à página "[$3 $2]", junto com o seu nome de usuário e o navegador que estiver usando neste momento.',
 'feedback-subject' => 'Assunto:',
 'feedback-message' => 'Mensagem:',
 'feedback-cancel' => 'Cancelar',
@@ -3865,7 +3892,10 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'feedback-error1' => 'Erro: O resultado da API não foi reconhecido',
 'feedback-error2' => 'Erro: A edição falhou',
 'feedback-error3' => 'Erro: A API não responde',
+'feedback-thanks' => 'Obrigado! O seu comentário foi adicionado à página "[ $2  $1 ]".',
 'feedback-close' => 'Feito',
+'feedback-bugcheck' => 'Perfeito! Apenas verifique se não é um dos [$1 bugs já conhecidos].',
+'feedback-bugnew' => 'Eu verifiquei. Relatar um bug novo',
 
 # API errors
 'api-error-badaccess-groups' => 'Você não tem permissão para enviar arquivos para este wiki.',
@@ -3905,4 +3935,15 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'api-error-uploaddisabled' => 'Este wiki está com o upload de arquivos desabilitado.',
 'api-error-verification-error' => 'Este arquivo pode estar corrompido ou ter a extensão errada.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|minutos}}',
+'duration-hours' => '$1 {{PLURAL:$1|hora|horas}}',
+'duration-days' => '$1 {{PLURAL:$1|dia|dias}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semana|semanas}}',
+'duration-years' => '$1 {{PLURAL:$1|ano|anos}}',
+'duration-decades' => '$1 {{PLURAL:$1|década|décadas}}',
+'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milênio|milênios}}',
+
 );
index bd7733e..42676c4 100644 (file)
@@ -98,6 +98,7 @@
  * @author Sborsody
  * @author Seb35
  * @author Sherbrooke
+ * @author Shirayuki
  * @author Shushruth
  * @author Siebrand
  * @author Singularity
@@ -682,6 +683,13 @@ $1 is a filename, I think.',
 'editinginterface' => "A message shown when editing pages in the namespace MediaWiki:. In the [http://translatewiki.net/wiki/Main_Page?setlang=en URL], '''change \"setlang=en\" to your own language code.'''",
 'ns-specialprotected' => 'Error message displayed when trying to edit a page in the Special namespace',
 'titleprotected' => 'Use $1 for GENDER.',
+'invalidtitle-knownnamespace' => 'Displayed when an invalid title was encountered (generally in a list), but the namespace number is known to exist.
+* $1 is the namespace number
+* $2 is the namespace name in content language or {{msg-mw|blanknamespace}} for the main namespace
+* $3 is the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
+'invalidtitle-unknownnamespace' => 'Displayed when an invalid title was encountered (generally in a list) and the namespace number is unknown.
+* $1 is the namespace number
+* $2 is the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
 
 # Login and logout pages
 'logouttext' => 'Log out message',
@@ -732,7 +740,9 @@ $1 is a filename, I think.',
 'nocookieslogin' => "This message is displayed when someone tried to login, but the browser doesn't accept cookies.",
 'nocookiesfornew' => "This message is displayed when the user tried to create a new account, but it failed the cross-site request forgery (CSRF) check. It could be blocking an attack, but most likely, the browser isn't  accepting cookies.",
 'nocookiesforlogin' => "{{optional}}
-This message is displayed when someone tried to login and the CSRF failed (most likely, the browser doesn't accept cookies). Defaults to nocookieslogin",
+This message is displayed when someone tried to login and the CSRF failed (most likely, the browser doesn't accept cookies).
+
+Defaults to '''nocookieslogin''' ({{int:nocookieslogin}})",
 'loginsuccesstitle' => 'The title of the page saying that you are logged in. The content of the page is the message "[[MediaWiki:Loginsuccess/{{SUBPAGENAME}}]]".',
 'loginsuccess' => 'The content of the page saying that you are logged in. The title of the page is "[[MediaWiki:Loginsuccesstitle/{{SUBPAGENAME}}|{{int:loginsuccesstitle}}]]". $1 is the name of the logged in user.
 
@@ -1020,6 +1030,16 @@ When templates are expanded, there is a size limit for the number of bytes yield
 'language-converter-depth-warning' => 'Error message shown when a page uses too deeply nested language conversion syntax
 
 * <tt>$1</tt> is the value of the depth limit',
+'node-count-exceeded-category' => 'This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.',
+'node-count-exceeded-warning' => 'Error message shown when a page exceeded the node-count limit of the preprocessor
+
+* <tt>$1</tt> is the value of the node-count limit
+* <tt>$2</tt> is the value of the max node-count limit',
+'expansion-depth-exceeded-category' => 'This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the [http://meta.wikimedia.org/wiki/Help:Expansion_depth expansion depth] of the preprocessor exceeds the limit.',
+'expansion-depth-exceeded-warning' => 'Error message shown when a page exceeded the [http://meta.wikimedia.org/wiki/Help:Expansion_depth expansion depth limit] of the preprocessor
+
+* <tt>$1</tt> is the value of the depth limit
+* <tt>$2</tt> is the value of the max depth limit',
 
 # "Undo" feature
 'undo-success' => 'Text on special page to confirm edit revert. You arrive on this page by clicking on the "undo" link on a revision history special page.
@@ -2003,6 +2023,7 @@ Siebrand think this has to do with allowing MediaWiki to fetch remote URLs, and
 
 If \'scheme\' is difficult to translate, then you could use \'prefix\' instead.',
 'http-bad-status' => '$1 is an HTTP error code (e.g. 404), $2 is the HTTP error message (e.g. File Not Found)',
+'http-truncated-body'   => 'Seems the connection closed prematurely. The HTTP response contained a Content-length greated than the received body.',
 
 'license' => 'This appears in the upload form for the license drop-down. The header in the file description page is now at {{msg-mw|License-header}}.',
 'nolicense' => '{{Identical|None selected}}',
@@ -4414,8 +4435,9 @@ This is being used in [[Special:Version]], preceeding the subversion revision nu
 'version-license-info' => '[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See //www.gnu.org/licenses/old-licenses/gpl-2.0-translations.html for available translations.',
 'version-software-product' => 'Shown in [[Special:Version]]',
 'version-software-version' => '{{Identical|Version}}',
-'version-entrypoints' => 'Header on [[Special:Version]] above a table that lists the URLs of various entry points in this MediaWiki installation.',
-'version-entrypoints-header-entrypoint' => 'Header for the first column in the entry points table on [[Special:Version]].',
+'version-entrypoints' => 'Header on [[Special:Version]] above a table that lists the URLs of various entry points in this MediaWiki installation. Entry points are the "places" where the wiki\'s content and information can be accessed in various ways, for instance the standard index.php which shows normal pages, histories etc.',
+'version-entrypoints-header-entrypoint' => 'Header for the first column in the entry points table on [[Special:Version]].
+See also {{msg-mw|Version-entrypoints}}',
 'version-entrypoints-header-url' => 'Header for the second column in the entry points table on [[Special:Version]].',
 'version-entrypoints-articlepath' => 'A short description of the article path entry point. Links to the mediawiki.org documentation page for $wgArticlePath.',
 'version-entrypoints-scriptpath' => 'A short description of the script path entry point. Links to the mediawiki.org documentation page for $wgScriptPath.',
index 8dab70f..988a978 100644 (file)
@@ -647,6 +647,9 @@ $2",
 'customjsprotected' => "Manam saqillasunkichu kay JavaScript p'anqata llamk'apuyta, huk ruraqpa kikin tiyachisqankunayuq kaptinmi.",
 'ns-specialprotected' => "{{ns:special}} suti k'itipi p'anqakunaqa manam llamk'apunallachu.",
 'titleprotected' => "Kay p'anqa sutitaqa [[User:$1|$1]] sutiyuq ruraq kamariymanta hark'arqanmi, kayraykum nispa: ''$2''.",
+'filereadonlyerror' => 'Manam atinichu "$1" sutiyuq willañiqita hukchayta, "$2" sutiyuq willañiqi churamuna ñawirillanapaq kachkaptinmi.
+
+Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Manam allintachu churapusqa: mana riqsisqa añaw maskaq: ''$1''",
@@ -729,6 +732,7 @@ Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.',
 'emailconfirmlink' => 'E-chaski imamaytaykita takyachiy',
 'invalidemailaddress' => "E-chaski imamaytaykiqa manam allinchu, manachá allinta qillqasqa. Ama hina kaspa, musuq allin sananchayuq imamaytaykita qillqamuy icha k'itichata ch'usaqchay.",
 'cannotchangeemail' => 'Ruraqpa rakiqunanpi e-chaski imamaytakunaqa kay wikipi manam hukchanallachu.',
+'emaildisabled' => 'Kay tiyayqa e-chaskita manam kachayta atinchu.',
 'accountcreated' => 'Rakiqunaqa kichasqañam',
 'accountcreatedtext' => '$1 sutiyuq ruraqpa rakiqunanqa kichasqañam.',
 'createaccount-title' => '{{SITENAME}}paq musuq rakiqunata kichariy',
@@ -913,7 +917,9 @@ Hark'ay hallch'api qhipaq hark'asqataqa kaypim rikunki willasunaykipaq:",
 'userinvalidcssjstitle' => "'''Paqtataq:''' Manam kanchu \"\$1\" qara. Yuyariy, kikinpa .css, .js p'anqankunaqa uchuy sanampa umalliyuqmi, ahinataq {{ns:user}}:Foo/vector.css manataq  {{ns:user}}:Foo/Vector.css nisqachu.",
 'updated' => '(Musuqchasqa)',
 'note' => "'''Musyay:'''",
-'previewnote' => "'''Yuyaykuy: Kayqa manaraq waqaychaspa qhawariymi!'''",
+'previewnote' => "'''Yuyaykuy: Kayqa qhawariyllam.'''
+Llamk'apusqaykiqa manaraqmi waqaychasqachu!",
+'continue-editing' => "Llamk'apuyta qatiykuy",
 'previewconflict' => "Rikuchkanki kay p'anqataqa, ima hinachus waqaychasqa kanqa.",
 'session_fail_preview' => "'''Achachaw! Llamk'apusqaykiqa manam waqaychasqachu, llamk'ana tiyaypa willankuna chinkaptinmi. Ama hina kaspa, musuqmanta ruraykachay. Mana atispaykiqa, [[Special:UserLogout|lluqsispa]] musuqmanta yaykuy.'''",
 'session_fail_preview_html' => "'''Achachaw! Llamk'apusqaykiqa manam waqaychasqachu, llamk'ana tiyaypa willankuna chinkaptinmi.'''
@@ -925,6 +931,7 @@ Hark'ay hallch'api qhipaq hark'asqataqa kaypim rikunki willasunaykipaq:",
 Kayqa maykunapi tukukun, mana allin wakichisqa proxy sirwiytam llamk'achiptiyki.'''",
 'edit_form_incomplete' => "'''Llamk'apuna hunt'ana p'anqamanta huk willasqakunaqa sirwiqman manam chayarqanchu; llamk'apusqaykikuna allinlla kachkaymanta iskaylla llanchispa musuqmanta ruraykachay.'''",
 'editing' => "Llamk'apuspa: $1",
+'creating' => 'Kamarispa: $1',
 'editingsection' => "Llamk'apuspa: $1 (raki)",
 'editingcomment' => "Llamk'apuspa: $1 (musuq raki)",
 'editconflict' => 'Ruray taripanakuy: $1',
@@ -985,6 +992,7 @@ Qullusqachá.",
 'edit-no-change' => "Manapuni hukchaptiykim, llamk'apusqayki manam hallch'asqachu.",
 'edit-already-exists' => "Manam atinichu musuq p'anqata kamariyta.
 Kachkañam.",
+'defaultmessagetext' => 'Ñawpaq qillqa',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Paqtataq: Kay p'anqaqa nisyu achka qullqipaq t'ikrana rurana qayayniyuqmi.
@@ -1000,6 +1008,10 @@ Chay niykunaqa manam chaninchasqachu.",
 'parser-template-loop-warning' => 'Muyurikuq pusapunam tarisqa: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Pusapunap muyurikuy saywanmi yallisqa ($1)',
 'language-converter-depth-warning' => "Rimay t'ikranap ukhu kayninpa saywanqa yallisqam ($1)",
+'node-count-exceeded-category' => "Watasqakunata nisyu yupayniyuq p'anqakuna",
+'node-count-exceeded-warning' => "P'anqaqa watasqakunata nisyu yupayniyuqmi",
+'expansion-depth-exceeded-category' => "Nisyu mast'ariy ukhu kaqniyuq p'anqakuna",
+'expansion-depth-exceeded-warning' => "P'anqaqa nisyu mast'ariy ukhu kaqniyuqmi",
 
 # "Undo" feature
 'undo-success' => 'Rurasqata kutichiyta atinkim. Manaraq kutichispaykiqa, kay qatiq wakichayta qhawariy rikunaykipaq chiqapta munasqaykichu manallachu, chaymantataq waqaychay kutichinapaq.',
@@ -1142,7 +1154,7 @@ Ama hina kaspa, hallch'akunapi qhaway.",
 
 # Suppression log
 'suppressionlog' => "Ñit'ipay hallch'asqa",
-'suppressionlogtext' => "Kay qatiq sutisuyupiqa ñaqha qullusqakunatam hark'asqakunatapas rikunki, kamachiqkunamanta pakasqa samiqniyuq. [[Special:BlockList|IP hark'ay sutisuyuta]] qhaway kunan hark'asqakunata rikunaykipaq.",
+'suppressionlogtext' => "Kay qatiq sutisuyupiqa ñaqha qullusqakunatam hark'asqakunatapas rikunki, kamachiqkunamanta pakasqa samiqniyuq. [[Special:BlockList|Hark'ay sutisuyuta]] qhaway kunan hark'asqakunata rikunaykipaq.",
 
 # History merging
 'mergehistory' => "P'anqa wiñay kawsaykunata huñuy",
@@ -1560,6 +1572,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'newsectionsummary' => 'Musuq raki: /* $1 */',
 'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy (JavaScript kananmi)',
 'rc-enhanced-hide' => 'Imaymanachakunata pakay',
+'rc-old-title' => 'ñawpaqta "$1" sutiwan kamarisqa',
 
 # Recent changes linked
 'recentchangeslinked' => "Hukchasqa t'inkimuq",
@@ -1710,6 +1723,7 @@ $1',
 'backend-fail-closetemp' => "Manam atinichu mit'alla willañiqita wichq'ayta.",
 'backend-fail-read' => 'Manam atinichu $1 sutiyuq willañiqita ñawiriyta.',
 'backend-fail-create' => 'Manam atinichu $1 sutiyuq willañiqita kamariyta.',
+'backend-fail-maxsize' => 'Manam atinichu $1 sutiyuq willañiqita kamariyta, {{PLURAL:$2|huk bytemanta|$2 bytemanta}} aswan hatun kaptinmi.',
 'backend-fail-readonly' => '"$1" sutiyuq willañiqi hallch\'ana sirwiqqa ñawirinallapaqmi kachkan, kayrayku: "$2"',
 'backend-fail-synced' => '"$1" sutiyuq willañiqiqa manam sinchichu kachkan ukhupi willañiqi hallch\'ana sirwiqkunapi',
 'backend-fail-connect' => 'Manam atinichu "$1" sutiyuq willañiqi hallch\'ana sirwiqwan t\'inkinakuyta.',
@@ -1717,6 +1731,10 @@ $1',
 'backend-fail-contenttype' => 'Manam atinichu "$1" nisqapi hallch\'ana willañiqip samiqninpa layanta yuqanchayta.',
 'backend-fail-batchsize' => "Willañiqi hallch'ana sirwiqmanqa $1 willañiqi {{PLURAL:$1|ruranayuq|ruranayuq}} tawqam qusqa; saywataq $2 {{PLURAL:$1|ruranam|ruranam}}.",
 
+# File journal errors
+'filejournal-fail-dbconnect' => "Manam atinichu \"\$1\" sutiyuq willañiqi hallch'ana sirwiqpaq p'unchawnintin hallch'awan t'inkiyta.",
+'filejournal-fail-dbquery' => 'Manam atinichu "$1" sutiyuq willañiqi hallch\'ana sirwiqpaq p\'unchawnintin hallch\'ata musuqchayta.',
+
 # Lock manager
 'lockmanager-notlocked' => 'Manam atinichu "$1" nisqata paskayta; manam hark\'asqachu.',
 'lockmanager-fail-closelock' => 'Manam atinichu "$1" nisqapaq hark\'ana willañiqita wichq\'ayta.',
@@ -1833,6 +1851,10 @@ Munaspaykiqa, [[Special:WhatLinksHere/$2|hunt'a sutisuyuta]] qhaway.",
 Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikunaykipaq.",
 'sharedupload-desc-here' => "Kay p'anqaqa $1 nisqamantam. Huk ruraykamaykunapipas llamk'achinapaq kanman.
 [$2 Willañiqi ch'uyanchana p'anqanpi] ch'uyanchaytaqa kay qatiqpim rikunki.",
+'sharedupload-desc-edit' => "Kay p'anqaqa $1 nisqamantam. Huk ruraykamaykunapipas llamk'achinapaq kanman.
+[$2 Willañiqi ch'uyanchana p'anqanpi] ch'uyanchayta llamk'apuytachá munaykiman.",
+'sharedupload-desc-create' => "Kay p'anqaqa $1 nisqamantam. Huk ruraykamaykunapipas llamk'achinapaq kanman.
+[$2 Willañiqi ch'uyanchana p'anqanpi] ch'uyanchayta llamk'apuytachá munaykiman.",
 'filepage-nofile' => 'Manam kanchu kay sutiyuq willañiqi.',
 'filepage-nofile-link' => 'Manam kanchu kay sutiyuq willañiqi, ichataq [$1 churkuytam] atinki.',
 'uploadnewversion-linktext' => 'Kay willañiqi ñaqha musuqchasqata churkuy',
@@ -2039,6 +2061,12 @@ Rikuyniykitaqa k'ullkuchaytam atinki hallch'a layata, ruraqpa sutinta (uchuy ich
 'allpagesprefix' => "Rikuchiy kay k'askaqwan qallariq p'anqakunata:",
 'allpagesbadtitle' => "Qusqa p'anqap sutinqa manam allinchu icha rimaypura, interwiki ñawpa k'askaqniyuq. P'anqa sutipaq mana saqillasqa sananchayuqchá.",
 'allpages-bad-ns' => '{{SITENAME}} tiyaypiqa "$1" suti k\'iti manam kanchu.',
+'allpages-hide-redirects' => 'Pusapunakunata pakay',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Kay p'anqapaq hallch'asqa musuqchasqatam rikuchkanki, $1 pachakamam ñaqha kanman.",
+'cachedspecial-viewing-cached-ts' => "Kay p'anqapaq hallch'asqa musuqchasqatam rikuchkanki, manachá kunallan musuqchasqachu kanman.",
+'cachedspecial-refresh-now' => 'Qhipaq kaqta qhaway.',
 
 # Special:Categories
 'categories' => 'Katiguriyakuna',
@@ -2466,7 +2494,7 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
 'ipb-confirm' => "Hark'ayta takyachiy",
 'badipaddress' => 'IP huchhaqa manam allinchu.',
 'blockipsuccesssub' => "Ruraqqa hark'asqañam",
-'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] huchhayuq tiyayqa hark'asqañam. <br />[[Special:BlockList|Hark'asqakunamanta p'anqata]] qhaway hark'akunata hukchanaykipaq.",
+'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] nisqaqa hark'asqam. <br />[[Special:BlockList|Hark'ay sutisuyuta]] qhaway hark'akunata hukchanaykipaq.",
 'ipb-blockingself' => "Kikiykitam hark'aykachachkanki!  Chiqapta kayta rurayta munankichu?",
 'ipb-confirmhideuser' => 'Ruraqta hark\'aykachachkanki, payman "Ruraqta pakay" nisqam.  Chaywanqa manam pipas chay ruraqpa sutinta ima sutisuyupipas hallch\'apipas rikunqachu.  Chiqapta kayta rurayta munankichu?',
 'ipb-edit-dropdown' => "Hark'aypa hamunta llamk'apuy",
@@ -2516,7 +2544,7 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
 'blocklog-showsuppresslog' => "Kay ruraqqa ñawpaqta hark'asqam pakasqapas. Ñit'ipay hallch'ataqa kaypim rikunki willasunaykipaq:",
 'blocklogentry' => "hark'an [[$1]]-ta kay pachakama: $2 $3",
 'reblock-logentry' => "hukchan [[$1]]-paq hark'ana allinchanakunata kay pachakama hark'aspa: $2 $3",
-'blocklogtext' => "Kayqa ruraqta hark'asqakunap qispichisqakunappas hallch'anmi. Kikinmanta hark'asqa tiyaykunataqa manam kaypi rikunkichu. [[Special:BlockList|Hark'asqakunamanta p'anqata]] qhaway kunan hark'asqakunata rikunaykipaq.",
+'blocklogtext' => "Kayqa ruraqta hark'asqakunap qispichisqakunappas hallch'anmi. Kikinmanta hark'asqa tiyaykunataqa manam kaypi rikunkichu. [[Special:BlockList|Hark'ay sutisuyuta]] qhaway kunan hark'asqakunata rikunaykipaq.",
 'unblocklogentry' => 'paskan "$1"-ta hark\'asqa kaymanta',
 'block-log-flags-anononly' => 'sutinnaqlla',
 'block-log-flags-nocreate' => 'rakiquna kichariyman ama nisqa',
@@ -2763,7 +2791,7 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript llanchiy',
-'javascripttest-disabled' => 'Kay ruranamanqa ama nisqam.',
+'javascripttest-disabled' => 'Kay ruranaqa kay wikipi manam atichisqachu.',
 'javascripttest-title' => '$1 llanchiykunam richkan',
 'javascripttest-pagetext-noframework' => "Kay p'anqaqa JavaScript llanchina purichinallapaqmi kachun.",
 'javascripttest-pagetext-unknownframework' => 'Mana riqsisqa "$1" nisqa llanchina inchu ruray',
@@ -3570,6 +3598,9 @@ MediaWikitaqa mast'ariyku runakunata yanapanapaqmi, ichataq MANAM FIYAKUYTA ATIY
 'version-software' => "Tiyachisqa llamp'u kaq",
 'version-software-product' => 'Ruruchisqa',
 'version-software-version' => 'Musuqchasqa',
+'version-entrypoints' => "Yaykuna t'uksi URL",
+'version-entrypoints-header-entrypoint' => "Yaykuna t'uksi",
+'version-entrypoints-header-url' => 'URL tiyay',
 
 # Special:FilePath
 'filepath' => 'Willañiqi ñan',
@@ -3757,4 +3788,15 @@ Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyni
 'api-error-uploaddisabled' => 'Kay wikipiqa manam churkuyta atinkichu.',
 'api-error-verification-error' => "Kay willañiqiqa waqllisqachá, icha pantasqa k'askaqniyuqchá.",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sikundu|sikundukuna}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minutu|minutukuna}}',
+'duration-hours' => '$1 {{PLURAL:$1|ura|urakuna}}',
+'duration-days' => "{{PLURAL:$1|p'unchaw|p'unchawkuna}}",
+'duration-weeks' => '{{PLURAL:$1|simana|simanakuna}}',
+'duration-years' => '{{PLURAL:$1|wata|watakuna}}',
+'duration-decades' => '{{PLURAL:$1|chunkawata|chunkawatakuna}}',
+'duration-centuries' => '{{PLURAL:$1|pachakwata|pachakwatakuna}}',
+'duration-millennia' => '{{PLURAL:$1|waranqawata|waranqawatakuna}}',
+
 );
index c1d4116..cf299df 100644 (file)
@@ -1078,6 +1078,8 @@ Acsete argumente au fost omise.',
 'parser-template-loop-warning' => 'Buclă de formate detectată: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limită de adâncime a recursiei depășită ($1)',
 'language-converter-depth-warning' => 'Limita adâncimii convertorului de limbă a fost depășită ($1)',
+'node-count-exceeded-category' => 'Pagini unde numărul de noduri este depășit',
+'node-count-exceeded-warning' => 'Pagina a depășit numărul de noduri',
 
 # "Undo" feature
 'undo-success' => 'Modificarea poate fi anulată. Verificați diferența de dedesupt și apoi salvați pentru a termina anularea modificării.',
index 46a196c..7faafe0 100644 (file)
@@ -726,6 +726,7 @@ Arrecuerdete ca jndr'à le file personalizzete .css e .js s'ause scrivere le tit
 'note' => "'''Vide Bbuene:'''",
 'previewnote' => "'''Arrecuerdete queste è sole 'n'andeprime.'''
 le cangiaminde non g'onne state angore reggistrate!",
+'continue-editing' => "Condinue 'u cangiamende",
 'previewconflict' => "Sta andeprime fece vedè 'u teste ca ste jndr'à 'u teste de l'area de sus cumme avène fore ce tu decide cu reggistre.",
 'session_fail_preview' => "'''Ne dispiace! Non ge putime processà 'u cangiamende tue purcè s'a perse 'a sessione de le date.
 Pe piacere pruève 'n'otra vote.
@@ -825,6 +826,7 @@ Ste argumende onne state luete.",
 'parser-template-loop-warning' => "Amme acchiete 'nu cicle de template: [[$1]]",
 'parser-template-recursion-depth-warning' => "Ha state supranete 'u limite di ricorsione de le template ($1)",
 'language-converter-depth-warning' => "'U convertitore de lènghe ha subranate 'u limite de profonnetà ($1)",
+'expansion-depth-exceeded-category' => "Pàggene addò 'a profonnetà de l'espanzione jè supranate",
 
 # "Undo" feature
 'undo-success' => "'U cangiamende pò essere annullate.
@@ -1587,6 +1589,7 @@ Ce 'u probbleme angore jè presende, condatte 'n'[[Special:ListUsers/sysop|ammin
 'backend-fail-create' => "Non ge pozze ccrejà 'u file $1.",
 'backend-fail-readonly' => 'L\'archivije de rete "$1" jè pe stu mumende in sole letture. \'U mutive ha state: "$2"',
 'backend-fail-connect' => 'Non ge pozze connettere \'a memorie de rrete "$1".',
+'backend-fail-internal' => "'N'errore scanusciute s'à verificate jndr'à l'archivije de rrete \"\$1\".",
 
 # Lock manager
 'lockmanager-notlocked' => 'Non ge pozze sbloccà "$1"; jidde non g\'è bloccate.',
@@ -2700,6 +2703,7 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
 'javascripttest-pagetext-noframework' => 'Sta pàgene jè riservate pe le esecuziune de le test de Javascript.',
 'javascripttest-pagetext-unknownframework' => 'Ambiende de teste scanusciute "$1".',
 'javascripttest-pagetext-frameworks' => 'Pe piacere scacchie une de le seguende ambiende de test: $1',
+'javascripttest-qunit-heading' => 'Ambiende de test MediaUicchi JavaScript QUnit',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => "'A pàgene utende meje",
@@ -3883,10 +3887,12 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 'api-error-duplicate-popup-title' => 'Dupleche {{PLURAL:$1|file|file}}',
 'api-error-empty-file' => "'U file ca tu è confermate ere vacande.",
 'api-error-emptypage' => 'Quanne se ne ccreje une, le pàggene vacande non ge sò permesse.',
+'api-error-fetchfileerror' => "Errore inderne: Quacchecose ha sciute stuèrte quanne ste analizzave 'u file.",
 'api-error-file-too-large' => "'U file ca tu è confermate jè troppe granne.",
 'api-error-filename-tooshort' => "'U nome d'u file jè troppe curte.",
 'api-error-filetype-banned' => 'Stu tipe de file jè vietate.',
 'api-error-filetype-missing' => "'U file jè senze 'n'estenzione.",
+'api-error-hookaborted' => "'U cangiamende ca tu stè pruève a ffà ha state inderrotte da 'n'estenzione.",
 'api-error-http' => "Errore inderne: Non ge se riesce a collegà a 'u server",
 'api-error-illegal-filename' => "'U nome d'u file non g'è permesse.",
 'api-error-invalid-file-key' => "Errore inderne: 'U file non ge se iacchie jndr'à memorie temboranèe.",
index 95dc0d0..aeb02f2 100644 (file)
@@ -22,6 +22,7 @@
  * @author Claymore
  * @author Comp1089
  * @author DCamer
+ * @author Daniyar
  * @author Dim Grits
  * @author Don Alessandro
  * @author Eleferen
@@ -54,6 +55,7 @@
  * @author Putnik
  * @author Rave
  * @author Rubin
+ * @author Sagan
  * @author Sk
  * @author TarzanASG
  * @author Temuri rajavi
@@ -779,7 +781,7 @@ $2',
 'invalidemailaddress' => 'Адрес электронной почты не может быть принят, так как он не соответствует формату.
 Пожалуйста, введите корректный адрес или оставьте поле пустым.',
 'cannotchangeemail' => 'Адреса электронной почты этой учётной записи не могут быть изменены в этой вики.',
-'emaildisabled' => 'ЭÑ\82оÑ\82 Ñ\81айÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82 Ð¾Ñ\82пÑ\80авлÑ\8fÑ\82Ñ\8c Ñ\81ообÑ\89ениÑ\8f Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82ы.',
+'emaildisabled' => 'Ð\91ұл Ñ\81айÑ\82 Ñ\8d-поÑ\88Ñ\82анÑ\8bÒ£ Ñ\85абаÑ\80ламаÑ\81Ñ\8bн Ð¶Ñ\96беÑ\80е Ð°Ð»Ð¼Ð°Ð¹Ð´ы.',
 'accountcreated' => 'Учётная запись создана',
 'accountcreatedtext' => 'Создана учётная запись участника $1.',
 'createaccount-title' => '{{SITENAME}}: создание учётной записи',
index a351629..b3f8868 100644 (file)
@@ -19,6 +19,7 @@
  * @author Mahitgar
  * @author Naveen Sankar
  * @author Omnipaedista
+ * @author Shantanoo
  * @author Shijualex
  * @author Shubha
  * @author Vibhijain
@@ -1073,7 +1074,7 @@ $2
 'notitlematches' => 'न कस्यापि पृष्ठस्य शीर्षकम् अस्य समम्।',
 'notextmatches' => 'न कस्यापि पृष्ठस्य पाठः अस्य सममस्ति',
 'prevn' => 'प्राक्तनानि {{PLURAL:$1|$1}}',
-'nextn' => 'अग्रिमाणि{{PLURAL:$1|$1}}',
+'nextn' => 'अग्रिमाणि {{PLURAL:$1|$1}}',
 'prevn-title' => 'प्राक्तन-{{PLURAL:$1|फलितम्| फलितानि}}',
 'nextn-title' => 'प्राक्तन-{{PLURAL:$1|फलितम्| फलितानि}}',
 'shown-title' => 'प्रत्येकस्मिन् पृष्ठे $1 {{PLURAL:$1|फलितम्|फलितानि}} दर्श्यताम्',
diff --git a/languages/messages/MessagesSat.php b/languages/messages/MessagesSat.php
new file mode 100644 (file)
index 0000000..01a84cd
--- /dev/null
@@ -0,0 +1,813 @@
+<?php
+/** Santali (Santali)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Albinus
+ * @author Ghonokuashabaskey
+ * @author Nipon087
+ * @author Salvator
+ * @author Samar88
+ * @author Srabony90
+ */
+
+$messages = array(
+# User preference toggles
+'tog-hideminor' => 'Nitaḱ bodolaḱre huḍiṅ kạmi danaṅme',
+'tog-showtoc' => 'Ṭibilre menaḱako ńel ( sakamkore 3 khon jạti hedlayenko)',
+'tog-watchcreations' => 'Sakamko songe  Ińaḱ ńelok tạlikare benao',
+'tog-enotifwatchlistpages' => 'E-mailạńme one tinre in̕aḱ n̕eloḱ tạlika do bodolok',
+'tog-enotifusertalkpages' => 'E-mailạn̕me one tinre in̕aḱ roṛaḱ laṛcaṛ sakam do bodoloḱa',
+'tog-enotifminoredits' => 'E-mailạn̕me arhõ one tinre in̕aḱ sakamre huḍiń kạmi hoyoḱ',
+'tog-shownumberswatching' => 'Ńelok laṛcaṛkoaḱ songkha uduḱme',
+'tog-oldsig' => 'Menaḱ signạtar',
+'tog-uselivepreview' => 'Jewet́ ńeloḱ beoharme (JavaScript jaruṛ menaḱa)',
+'tog-watchlisthideown' => 'Ńeloḱ talikare ińaḱ joṛao kamiko danaṅme',
+'tog-watchlisthideminor' => 'Ńeloḱ tạlikare ińak huḍiṅ joṛao kạmiko danaṅme',
+'tog-ccmeonemails' => 'E-mail reaḱ kopy kulạńme Eṭaḱ laṛcaṛko kulakome',
+
+'underline-always' => 'Sanam okte',
+'underline-never' => 'Tis hõ ban̕',
+
+# Dates
+'sunday' => 'Aṭhowar',
+'monday' => 'Som',
+'tuesday' => 'Mońgol',
+'wednesday' => 'Budh',
+'thursday' => 'Lukhibar',
+'friday' => 'Sokolbar',
+'saturday' => 'Sạnicar',
+'sun' => 'Aṭhwar',
+'mon' => 'Som',
+'tue' => 'Mongolbar',
+'wed' => 'Budhbar',
+'thu' => 'Lukhibar',
+'fri' => 'Sokolbar',
+'sat' => 'Sạnicar',
+'january' => 'Jạnuạri',
+'february' => 'Februạri',
+'march' => 'Marc',
+'april' => 'Epril',
+'may_long' => 'Me̠',
+'june' => 'Jun',
+'july' => 'Julại',
+'august' => 'A̠go̠sṭ',
+'september' => 'Se̠ṕṭembạ̣r',
+'october' => 'O̠ḱ́ṭo̠bo̠r',
+'november' => 'Nove̠mbo̠r',
+'december' => 'Ḍisembo̠r',
+'january-gen' => 'Jạnuạri',
+'february-gen' => 'Februạri',
+'march-gen' => 'Marc',
+'april-gen' => 'Epril',
+'may-gen' => 'Me',
+'june-gen' => 'Jun',
+'july-gen' => 'Julại',
+'august-gen' => 'Ago̠sṭ',
+'september-gen' => 'Se̠ṕṭembo̠r',
+'october-gen' => 'O̠ḱ́ṭo̠bo̠r',
+'november-gen' => 'Nove̠mbo̠r',
+'december-gen' => 'December',
+'jan' => 'Jạn',
+'feb' => 'Febr',
+'mar' => 'Ma̠r',
+'apr' => 'Epr',
+'may' => 'Me',
+'jun' => 'Ju̠n',
+'jul' => 'Ju̠l',
+'aug' => 'Ago̠',
+'sep' => 'Seṕ',
+'oct' => 'Okṭ',
+'nov' => 'No̠v',
+'dec' => 'Dis',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Bivag|Bivagko}}',
+'category_header' => 'Sakam korenaḱ rokom sokom "$1"',
+'subcategories' => 'Huḍiń rokom sokomko',
+'hidden-categories' => '{{PLURAL:$1|Dãnań renaḱ|Dãnań renaḱ ko}}',
+'category-subcat-count' => '{{PLURAL:$2| keṭagorire eken tayom hudińkeṭagori menaḱa. |Noa keṭagorire tayom menaḱa {{PLURAL:$1 hudińkeṭagoriko}}, jotokote $2}}',
+'category-article-count' => '{{PLURAL:$2| Noa keṭagoriredo eken tayomtenaḱ sakam menaḱa.| Tayom {{PLURAL:$2| sakam do |$1 sakamko kana}} nia keṭagorire, sanamkote  hoyoḱkana $2 .}}',
+'listingcontinuesabbrev' => 'Calaḱa',
+'noindex-category' => 'Unuduḱ sakamkodo bạnuḱa',
+
+'about' => 'Lạgitte, Lạgti',
+'newwindow' => 'Nãwã khiṛki jhijme',
+'cancel' => 'Badme',
+'moredotdotdot' => 'Aema',
+'mypage' => 'In̕aḱ sakam',
+'mytalk' => 'Iñaḱ́ ro̠ṛ',
+'navigation' => 'Ñamme',
+
+# Cologne Blue skin
+'qbfind' => 'N̕am',
+'qbbrowse' => 'Sendra',
+'qbedit' => 'Tońge',
+'qbpageoptions' => 'Noa sakam',
+'qbmyoptions' => 'In̕anḱ sakamko',
+'qbspecialpages' => 'Asokay teaḱ sakamko',
+'faq' => 'Baḍae kupuliko',
+
+# Vector skin
+'vector-action-addsection' => 'Asol katha joṛaome',
+'vector-action-delete' => 'Giḍi',
+'vector-action-move' => 'Ocok',
+'vector-action-protect' => 'Bańcao',
+'vector-action-undelete' => 'Bań getgiḍi',
+'vector-action-unprotect' => 'Bodol rukhiyạ',
+'vector-view-create' => 'Tearme',
+'vector-view-edit' => 'So̠mpado̠n',
+'vector-view-history' => 'Jạṛ ńelme',
+'vector-view-view' => 'Paṛhaḱme',
+'vector-view-viewsource' => 'Ńamoḱaḱ ńelme',
+'actions' => 'Kạmi',
+'namespaces' => 'Ñutum jaiga',
+'variants' => 'Etaḱko',
+
+'errorpagetitle' => 'vul',
+'returnto' => "$1 te ruar-rok' me",
+'tagline' => 'Oka khoć',
+'help' => 'Go̠ṛo̠',
+'search' => 'Se̠ndra',
+'searchbutton' => 'Se̠ndra',
+'go' => 'Calaḱme',
+'searcharticle' => 'Calaḱme',
+'history' => 'Sakam reaḱ jạṛ',
+'history_short' => 'Jạṛ',
+'printableversion' => 'Chapai lekan version',
+'permalink' => 'Terejuge joṛao',
+'print' => 'Chapa',
+'view' => 'Udukme',
+'edit' => 'So̠mpado̠n',
+'create' => 'Tearme',
+'editthispage' => 'Noa sakam joṛaome',
+'create-this-page' => 'Noa sakam benao me',
+'delete' => 'muchau me',
+'deletethispage' => 'Noa sakam do get giḍikam',
+'undelete_short' => 'Bań get giḍika',
+'protect' => "banchao'",
+'protect_change' => 'Judạ',
+'protectthispage' => 'Noa sakam ban̕caome',
+'unprotect' => 'Bodol ban̕cao',
+'newpage' => 'Nãwã sakam',
+'talkpage' => 'Noa sakam galmaraome',
+'talkpagelinktext' => 'Ro̠ṛme',
+'specialpage' => 'Osokayteaḱ sakam',
+'personaltools' => 'Nijaḱ jontropạti',
+'postcomment' => 'Nãwã pahaṭa',
+'articlepage' => 'Menaḱ sakam uduḱme',
+'talk' => 'Galmarao',
+'views' => 'Ñel koyoḱ',
+'toolbox' => 'Jontopạti baḱso',
+'userpage' => 'Laṛcaṛićaḱ sakam uduḱme',
+'projectpage' => 'Porjakṭ sakam uduḱme',
+'imagepage' => 'Rẽt sakam uduḱme',
+'mediawikipage' => 'Mesag sakam uduḱme',
+'viewhelppage' => 'Goṛoaḱ sakam n̕elme',
+'viewtalkpage' => 'Galmarao ńelme',
+'otherlanguages' => 'Eṭagak pạrsi',
+'redirectedfrom' => '$1 khon ạcur heć akana',
+'redirectpagesub' => 'Bań sojhe sakam',
+'lastmodifiedat' => 'Noa sakam do sạjao hoena $1, $2 te',
+'protectedpage' => 'Rukhíạ sakamko',
+'jumpto' => 'Calaḱme :',
+'jumptonavigation' => 'Ñamme',
+'jumptosearch' => 'Sendra',
+'pool-timeout' => 'Somoy paromena cạbi lạgit́te tạṅgi hoyoḱkana',
+'pool-errorunknown' => 'Bań baḍayaḱ bhul',
+
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+'aboutsite' => 'babo̠tre',
+'aboutpage' => 'Project: Babo̠t',
+'copyrightpage' => '{{ns:project}}: Eḱteạr',
+'currentevents' => 'Cạlit ghoṭnako',
+'currentevents-url' => 'Project: Nitaḱ evenṭ ko',
+'disclaimers' => 'Dạbi bạnuḱko',
+'disclaimerpage' => 'Project: Sadharon ḍiskleimarko(General disclaimer)',
+'edithelp' => 'Tońge goṛo',
+'edithelppage' => 'Help:So̠mpado̠n',
+'helppage' => 'Help: Bhitri renaḱ',
+'mainpage' => 'Mukhiạ Sakam',
+'mainpage-description' => 'Mukhiạ sakam',
+'policy-url' => 'Project:Ritiniti',
+'portal' => 'Khũṭ boloḱ ho̠r',
+'portal-url' => 'Project: Khũṭ bolokt họr',
+'privacy' => 'Nijaḱ eḱtear',
+'privacypage' => 'Project: Nijaḱ eḱteạr',
+
+'ok' => 'Ṭhik gea',
+'retrievedfrom' => '"$1" khon ñam ạgui',
+'youhavenewmessages' => 'Amaḱ do $1 ($2) menaḱa',
+'newmessageslink' => 'Nãwã sombat',
+'newmessagesdifflink' => 'Mucạt bodol',
+'youhavenewmessagesmulti' => 'Amaḱ nãwã mesag kodo',
+'editsection' => 'So̠mpado̠n',
+'editold' => 'So̠mpado̠n',
+'viewsourceold' => 'Ńamoḱ jayga',
+'editlink' => 'Tońge',
+'viewsourcelink' => '̕Ńel renaḱ ḍahar',
+'editsectionhint' => 'Sapṛao dhara: $1',
+'toc' => 'Menaḱaḱko',
+'showtoc' => 'Uduḱme',
+'hidetoc' => 'uku, Danaṅ',
+'collapsible-collapse' => 'Murchạo caba',
+'collapsible-expand' => 'Phaylao',
+'thisisdeleted' => 'N̕el se doho ruạṛ',
+'viewdeleted' => 'Ńelme',
+'feedlinks' => 'Jom oco',
+'site-atom-feed' => ' $1 Jom oco',
+'page-atom-feed' => '"$1" khon khudri jom',
+'red-link-title' => '$1 (niạ sakamdo bạnuḱa)',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Sakam',
+'nstab-user' => 'Laṛcaṛicaḱ sakam',
+'nstab-media' => 'Midiạ sakam',
+'nstab-special' => 'Jạruṛ pata',
+'nstab-project' => 'Porject reaḱ sakam',
+'nstab-image' => 'Fail',
+'nstab-mediawiki' => 'Mesag',
+'nstab-template' => 'Sajao sakam',
+'nstab-help' => 'Goṛo sakam',
+'nstab-category' => 'Juṛu ko',
+
+# Main script and global functions
+'nosuchaction' => 'Noṅkanaḱ kạmi bạnuḱa',
+'nosuchspecialpage' => 'Noṅkanaḱ asokay sakam do banuḱa',
+
+# General errors
+'error' => 'bhul',
+'laggedslavemode' => "'''Sontoroḱme:''' sakamre do nahaḱ nãwãnaḱko paseć bạnuḱa.",
+'missing-article' => '"$1" $2 noa ńutumanaḱ sakhiyaxt sakamre olakanaḱ do bań ṅamoka.
+Noa hoy renaḱ karon do hoyoḱkana cabak tạrik pharak se noare joṛao sakam do get giḍi akana.
+Judi noa do karon bań hoylen khan, noa do am sopṭoyer re kạtictem ńam daṛeyaḱa.
+Daya katet́ noa do nonde [[Special:ListUsers/sysop|administrator]],  ṭhen lạime, URL hotete.',
+'missingarticle-rev' => '(Nãwã aro#: $1)',
+'missingarticle-diff' => 'pharak',
+'internalerror' => 'Bhitri reaḱ bhul',
+'internalerror_info' => 'Bhitri reaḱ bhul:',
+'badarticleerror' => 'Noa sakamre kạmiko do baṅ puraolena.',
+'cannotdelete' => 'Nao sakam se rẽt do baṅ get giḍilena.
+Noa do pasec eṭaḱ hoṛ hotete lahare get giḍi akana.',
+'cannotdelete-title' => 'Sakam do baṅ get giḍiḱkana',
+'badtitle' => "barich' bishó́́́́y",
+'badtitletext' => 'Amaḱ nehorakaḱ sakam ńutum do bań puraoa, bạnuka, se be sudhrạo joṛao bhitri katha se bhitri wiki ńutum.
+Noa re do mit se aema bisó menaḱa oka do ńutumre bań beoharok.',
+'viewsource' => 'Ńamoḱaḱ ńelme',
+'protectedpagetext' => 'Noa sakam do ol toṅge lạgit́te do bańcao gea.',
+'namespaceprotected' => "Amaḱ do sakamko joṛao lạgit́te ạidạri banuḱ tama '''$1''' ńutumjayga.",
+'ns-specialprotected' => 'Asokay teaḱ sakamkodo baṅ oltoṅgea.',
+
+# Virus scanner
+'virus-scanfailed' => 'Skan do baṇ hoylena',
+'virus-unknownscanner' => 'Baṅ urum anṭvayras:',
+
+# Login and logout pages
+'yourname' => 'Beoboharicaḱ ńutum',
+'yourpassword' => 'Uku namber',
+'yourpasswordagain' => 'Arhõ oku namber olme',
+'remembermypassword' => 'In̕aḱ boloḱaḱ disạyme',
+'securelogin-stick-https' => 'Bhitri bolo kate HTTPS re soṅge tãhenme',
+'login' => "bolok' duar",
+'nav-login-createaccount' => 'Boloḱ́ duạr / ekaunt tearme',
+'userlogin' => 'Bhitri bolon / ekaunṭ tear',
+'userloginnocreate' => 'Bhitri bolo',
+'logout' => 'Bahre oḍoń',
+'userlogout' => 'Bahre oḍoń',
+'notloggedin' => 'Bhitri baṅ bolokana',
+'nologin' => 'Ekaunṭ do menaḱgea?',
+'nologinlink' => 'account tear me',
+'createaccount' => 'Ṭhai benaome',
+'gotaccount' => 'Ekaunṭ menaḱgeya?',
+'gotaccountlink' => 'Bhitri bolon',
+'userlogin-resetlink' => 'Amaḱ boloḱ talam cạbi sanamem hiṛińkeda?',
+'createaccountmail' => 'E-mail hotete',
+'createaccountreason' => 'Karon',
+'badretype' => 'Am do okaṭaḱ oku nambarkom em keda ona do baṅ milạolena.',
+'userexists' => 'Laṛcaṛicaḱ ńutum em hoyena ona do beohar hoyakana.
+Dayakatet́ eṭagaḱ ńutum bachaome.',
+'loginerror' => 'Bhitri bolok do vulgea',
+'createaccounterror' => 'Ekaunṭ do baṅ benao lena:',
+'loginsuccesstitle' => 'Bhitri boloḱ do moctege puraoena',
+'loginsuccess' => "'''Am do nitoḱ bolo menama {{SITENAME}} re",
+'nouserspecified' => 'Am do pusṭaote laṛcaṛićaḱ ńutum em hoyoḱtama.',
+'login-userblocked' => 'Nui laṛcaṛic doe esetgea. bhitri boloḱ ạidạri bań emoḱ kana.',
+'wrongpassword' => 'Bań milaoaḱ oku nambar em hoyakana.
+Daya kate arhõ mitdhom kurumuṭuyme.',
+'wrongpasswordempty' => 'Em hoyen oku nambar do cetge banuḱa.
+Daya katet́ arhõ kurumuṭuyme.',
+'passwordtooshort' => 'Oku nambar do kom katet́ hoyoḱ jạruṛa 6 olko mudre',
+'password-name-match' => 'Amaḱ oku nambar do amaḱ ńutum khon eṭaḱ hoyoḱ jạruṛtama.',
+'password-login-forbidden' => 'Noa laṛcaṛicaḱ ńutum ar oku nambar do ạnlekate baṅkana.',
+'mailmypassword' => 'E-mail reaḱ nãwã uko katha',
+'passwordremindertitle' => 'Nãwã nitlạgit oku nambar {{SITENAME}} lạgit́te',
+'noemail' => 'Nonḍe do laṛcaṛlạgit́te jahan oku nambar sap doho bạnuḱa.',
+'noemailcreate' => 'Am do mitṭen jewet e-mail ṭhikạna em jaruṛ menaḱtama.',
+'passwordsent' => '"$1" ṭhikạnate resṭariyen e-mail lạgit́te mitṭen oku nambar em hoyena.
+Daya kate ńam porte arhõ bhitri boloḱme.',
+'mailerror' => 'Vul mail em:',
+'emailconfirmlink' => 'Amaḱ e-mail ṭhikana do sạriyme.',
+'cannotchangeemail' => 'Ekaunṭ e-mail ṭhikạnakodo noa wiki re baṅ bodoloḱ kana.',
+'accountcreated' => 'Ekaunṭ do teyarena',
+'accountcreatedtext' => '$1 lạgit́te ekaunṭ do benaoena.',
+'createaccount-title' => '{{SITENAME}} lạgit́te ekaunṭ benao',
+'createaccount-text' => 'Okoe co am lạgit́te mitṭen ekaunṭko amaḱ e-mail ṭhikạna lạgit {{SITENAME}} re ($4) ńutum "$2", oku nambar "$3".
+Am do mesagem baṅ daṛeyaḱa, judi noa ekaunṭ do vulge benaolen khan.',
+'login-abort-generic' => 'Amaḱ bhitri boloḱ do baṅ hoylena - batena.',
+'loginlanguagelabel' => 'katha: $1',
+
+# Change password dialog
+'resetpass' => 'Oku nambar bodol',
+'resetpass_header' => 'Ekaunṭ oku namber bodol',
+'oldpassword' => 'Mare uku nombor',
+'newpassword' => 'Nãwã oku nomber',
+'retypenew' => 'Doṛhate oku namber olme',
+'resetpass_submit' => 'Oku namber joṛao ar bhitri bolok',
+'resetpass_success' => 'Amaḱ oku namber do napayte bodolena!
+Nitoḱ do am bhitritem boloḱkana...',
+'resetpass_forbidden' => 'Oku namber do baṅ bodoloklena',
+'resetpass-no-info' => 'Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.',
+'resetpass-submit-loggedin' => 'Oku namber bodol',
+'resetpass-submit-cancel' => 'Bạgi',
+
+# Special:PasswordReset
+'passwordreset' => 'Nãwãte oku nambar emme',
+'passwordreset-legend' => 'Nãwãte oku nambar emme',
+'passwordreset-username' => 'Beoharicaḱ ńutum:',
+'passwordreset-email' => 'E-mail ṭhikạna:',
+'passwordreset-emailelement' => 'Beoharicaḱ ńutum:
+Nit lạgit oku nambar:',
+'passwordreset-emailsent' => 'Mitṭen disạ ruaṛ e-mail do kulena.',
+'passwordreset-emailsent-capture' => 'Mit́ṭen disạ ruaṛaḱ e-mail dokulena, oka do latarre ńeloḱ kana.',
+'passwordreset-emailerror-capture' => 'Mit́ṭen disạ ruạṛ e-mail do hatoena, oka do latarre ńelok kana, menkhan beoharic ṭhen do baṇ seṭerlena.',
+
+# Special:ChangeEmail
+'changeemail' => 'E-mail ṭhikạna do bodolme',
+'changeemail-header' => 'Ekaunṭ e-mail ṭhikạna do bodolme',
+'changeemail-text' => 'Amaḱ e-mail ṭhikạna bodol lạgit́te noa forom purao me. Am do noa sariyaḱ lạgit́te amaḱ oku nambar em jạruṛtama.',
+'changeemail-no-info' => 'Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.',
+'changeemail-oldemail' => 'Nitaḱ e-mail ṭhikạna:',
+'changeemail-newemail' => 'Nãwã e-mail ṭhikạna:',
+'changeemail-none' => '(Okaṭaḱ hõ baṅ)',
+'changeemail-submit' => 'E-mail bodolme',
+'changeemail-cancel' => 'Badme',
+
+# Edit page toolbar
+'bold_sample' => 'Moṭa onol',
+'bold_tip' => 'Moṭa onol',
+'italic_sample' => 'Beka onol',
+'italic_tip' => 'Beka onol',
+'link_sample' => 'Joṛaotet́ reaḱ bohoḱ',
+'link_tip' => 'Bhitri reak joṛaotet́',
+'extlink_sample' => 'http://www.nạmuna.makaṛgạṭi ạmạli',
+'extlink_tip' => 'Baherenaḱ jońṛao (disạyme htt://prefix)',
+'headline_sample' => 'Bohok katha',
+'headline_tip' => 'level 2 guḍkatha',
+'nowiki_sample' => 'Begor format olko bhoraome',
+'nowiki_tip' => 'wiki formatting bạgiyaḱme',
+'image_tip' => 'Tol Fael',
+'media_tip' => 'file reaḱ jońṛao',
+'sig_tip' => 'Amaḱ suhi sãote okte',
+'hr_tip' => 'Barabạri dag',
+
+# Edit pages
+'summary' => 'Guṭ katha',
+'subject' => 'Bisoy/Bohoḱ katha:',
+'minoredit' => 'Noa do hudiń joṛao kami',
+'watchthis' => 'Noa sakam ńelme',
+'savearticle' => 'Sakam sebhme',
+'preview' => 'Ńel, Unuduḱ',
+'showpreview' => 'Unuduḱ',
+'showlivepreview' => 'Jewet uduk',
+'showdiff' => 'Bodolko ńeloḱma',
+'anoneditwarning' => "'''Sabdhan:''' amdo begor logkatem bolowakana.
+Amaḱ IP ṭhikana do noa sakam sompadon jạṛre rekorḍoḱa.",
+'anonpreviewwarning' => '"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa."',
+'newarticle' => '(Nãwa)',
+'newarticletext' => 'Am do okaṭaḱ somporko sakamem pańjayetkan ona do nito hạbic banuka.
+Sakam benao lạgitte, noa latar baksore ol ehoṕme
+Am do judim vul lekahan, amaḱ sendray jaygare "ruạṛ" baṭon linme.',
+'noarticletext' => 'Nitoḱ noa sakamre do ol bạnuḱa.
+
+You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],
+or [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.',
+'noarticletext-nopermission' => 'Noa sakamre do nitoḱ o̠l banuḱa.
+
+You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
+or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.',
+'previewnote' => "'''Disạyme noa do eken ńeln̕am lạgit.'''
+Amaḱ bodolaḱ kodo nit habićte bań ban̕cao akana!",
+'editing' => 'Sampadon; joṛao',
+'creating' => 'Benao',
+'editingsection' => 'Joṛao $1 (hạṭiń)',
+'editingcomment' => 'Joṛao',
+'yourtext' => 'Amaḱ ol',
+'templatesused' => 'Noa sakamre beoharen phormat se phormatko',
+'template-protected' => 'Rukhiạ',
+'template-semiprotected' => '(Kạṭic-rukhiyạ)',
+'hiddencategories' => 'Noa sakam do mitṭen hoṛkanay',
+'permissionserrorstext-withaction' => 'Amaḱ do aydạri bạnuḱtama, Noa karon pan̕jay lạgitte',
+'recreate-moveddeleted-warn' => "'''Sontorokme: am do arhõ doṛhate sakamem teyareda oka do sedayre get giḍiyen.
+Am do gunạnme cet́ noa joṛao kạmi am lạgit́te ganoḱ ase bań.
+Noa get ar tala ocok sakam nonḍe em hoyena dhok lagit́te.",
+'moveddeleted-notice' => 'Noa sakam do get giḍiyakana.
+Get ar ocoḱ giḍi sakam do latarre emakan reference lạgit em hoena.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => '"Sontoroḱme" Noa format do lạṭu geya.
+Thoṛa format do noare banuḱana.',
+'post-expand-template-inclusion-category' => 'Sakamko oka borḍre noa tahẽna ona doe paromkeda',
+
+# History pages
+'viewpagelogs' => 'Noa sakam reaḱ cạbi udukme',
+'currentrev-asof' => 'Mucạt nãwã aroy',
+'revisionasof' => 'Nãwã aro sakam 1',
+'revision-info' => 'Ńel/pańja ruạṛ $1 khon $2',
+'previousrevision' => 'Pạhilaḱ paṛhao ruạṛ',
+'nextrevision' => "nãwate n'el ruar",
+'currentrevisionlink' => 'Nitoḱaḱ nãwa aroy',
+'cur' => 'Boge',
+'next' => 'Laha seć',
+'last' => 'Laha renaḱ',
+'page_first' => 'Pahilaḱ',
+'page_last' => 'Mucạt́aḱ',
+'history-fieldset-title' => 'Sendray jaṛ',
+'history-show-deleted' => 'khạli get giḍiyaḱ koge',
+'histfirst' => "adi laha-ak'",
+'histlast' => 'Nahak',
+
+# Revision feed
+'history-feed-title' => 'Jạṛ nãwã aroy',
+'history-feed-item-nocomment' => 're',
+
+# Revision deletion
+'rev-delundel' => 'ńeloḱ/danaṅ',
+'revdel-restore' => 'Judạ lekate ńel',
+'revdel-restore-deleted' => 'giḍikaḱ ńel ruạṛ',
+'revdel-restore-visible' => 'Ńeloḱ leka paṛhao ruạṛ',
+
+# Merge log
+'revertmerge' => 'bań mit́',
+
+# Diffs
+'history-title' => '"$1" noa jạṛ nãwã aroy',
+'lineno' => 'Sạr $1:',
+'compareselectedversions' => 'Noa barea nãwã bachawanaḱ talare tolonayme',
+'editundo' => 'ruạṛ',
+
+# Search results
+'searchresults' => 'Se̠ndra fo̠l',
+'searchresults-title' => '"$1"  renaḱ Sẽndra  phol',
+'prevn' => 'Laha reaḱ {{PLURAL:$1|$1}}',
+'nextn' => 'Táyom teaḱ {{PLURAL:$1|$1}}',
+'prevn-title' => 'Laha renaḱ sakam $1 {{PLURAL:$1|result|results}}',
+'nextn-title' => 'Tayom $1 {{PLURAL:$1|result|results}}',
+'shown-title' => 'Mit́ ṭen kateć sakam $1 {{PLURAL:$1|result|results}} nelmẽ',
+'viewprevnext' => 'Ńelme ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Noa wiki re do \"[[:\$1]] ńutum sakam menaḱa",
+'searchmenu-new' => 'wiki re [[:$1]]nãwã sakam tear',
+'searchprofile-articles' => 'Menaḱaḱ sakamko',
+'searchprofile-project' => 'Go̠ṛo ar Project sakam',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Sanamak koge',
+'searchprofile-advanced' => 'Sompadon',
+'searchprofile-articles-tooltip' => '$1 re ñelme',
+'searchprofile-project-tooltip' => '$1 re sẽndraeme',
+'searchprofile-images-tooltip' => 'File sendra',
+'searchprofile-everything-tooltip' => 'Sanam ko modre sẽndra ( roṛ sakam modre hõ)',
+'searchprofile-advanced-tooltip' => 'Judạ ńutum re sẽndra',
+'search-result-size' => 'bạyiṭ aema bạyiṭ',
+'search-redirect' => '($1 te sujhi doṛha )',
+'search-section' => '(Pahaṭa $1)',
+'search-suggest' => 'Am do cet́ $1 em menocoyet tãhẽkana',
+'searchrelated' => 'songenko',
+'searchall' => 'Sanam',
+'showingresultsheader' => "'''$4'''  lạgit́ {{PLURAL:$5|Pho̠l ńamoḱ́akan - '''$1''' of '''$3'''|Pho̠l ńamoḱ́akan '''$1 - $2''' of '''$3'''}}",
+'search-nonefound' => 'Kupuli leka roṛruạṛ bạnuḱa',
+
+# Preferences page
+'mypreferences' => 'Iñaḱ pạsindko',
+'youremail' => 'E-mail:',
+'yourrealname' => 'Sạ̣ri ńutum',
+'prefs-help-email' => 'E-mail ṭhikana do bạṛtitege, menkhan uku namber nãwãte benao jạruṛa, am do amaḱ uku nomborem hiṛiń keda.',
+'prefs-help-email-others' => 'Am são e-mail hotete jogajog dohoy lạgitte mitṭen joṛao se amaḱ katha roṛaḱ sakam bachao jońme.
+Amaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'noa sakam joṛao',
+
+# Recent changes
+'recentchanges' => 'Nãwã bo̠do̠lko',
+'recentchanges-legend' => 'Nahaḱ bodol teaḱko',
+'recentchanges-label-newpage' => 'Noa sompadon do nãwã mint́ṭen sakame tearkeda',
+'recentchanges-label-minor' => 'Noado hudiń mạchi sompadonkana',
+'recentchanges-label-bot' => 'Noa sompadon do bot darate purauena',
+'recentchanges-label-unpatrolled' => 'Noa sompadon do ńit́ hạbić baṅ ńel ńamakana',
+'rcnotefrom' => '$2 habić bodolak ko do latare ńeloḱkana',
+'rclistfrom' => 'Nãwã  bodolko uduḱme $1 khon ehoṕkate',
+'rcshowhideminor' => '$1 kaṭic culuń tońge',
+'rcshowhidebots' => ' boṭko $1',
+'rcshowhideliu' => 'Beoharićaḱ boloḱ $1',
+'rcshowhideanons' => '$1 Nũtum bańa bebohariḱ',
+'rcshowhidemine' => '$1 ińaḱ tońge',
+'rclinks' => '$2 din lahare $1 bodol unuduḱme <br />$3',
+'diff' => 'Judạ',
+'hist' => 'Jạr',
+'hide' => 'Danaṅ',
+'show' => 'Udugme',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Purạote uduḱ',
+'rc-enhanced-hide' => 'Purạo cuku',
+
+# Recent changes linked
+'recentchangeslinked' => 'Sãotenaḱ bodolko',
+'recentchangeslinked-toolbox' => 'Noṛjoṛ palaṭko',
+'recentchangeslinked-title' => 'Bodolaḱko do "$1" sãote joṛao geya',
+'recentchangeslinked-noresult' => 'Joṛao sakam re emoḱ oktere jahanaḱ bodolko bạnuḱa.',
+'recentchangeslinked-summary' => "Noa do ona tạlika kana oka do nebetarge bodol hoyakan oka do asokayte hatao akan sakam khon.
+
+[[Special:Watchlist|your watchlist]] renaḱ sakamko do '''bold''' .",
+'recentchangeslinked-page' => 'sakạm ńutum',
+'recentchangeslinked-to' => 'Joṛaoaḱ sakamre ńel ocoyme emaḱ sakam bạgi katet',
+
+# Upload
+'upload' => 'Fael aploḍme',
+'uploadlogpage' => 'Chạbi do uthạome',
+'filedesc' => 'Guṭ katha',
+'uploadedimage' => 'Rakaṕ hoyena',
+
+'license' => 'Laisence benao',
+'license-header' => 'Laisense benao',
+
+# File description page
+'file-anchor-link' => 'Re̕t',
+'filehist' => 'Fael renaḱ Jạṛ',
+'filehist-help' => 'date re click me/somóy re click me fail reak obostha nel lagit',
+'filehist-revert' => 'Lahaleka',
+'filehist-current' => 'Nitaḱ',
+'filehist-datetime' => '̣Tạrikh/So̠mo̠y',
+'filehist-thumb' => 'Ṭip',
+'filehist-thumbtext' => '$1 lekan thambnail varson',
+'filehist-user' => 'Laṛcaṛić',
+'filehist-dimensions' => 'Maṕ',
+'filehist-comment' => 'Roṛ',
+'imagelinks' => 'Fael bebohar',
+'linkstoimage' => 'Noa sakam do niạ rẽtre/fayel joṛao menaḱa',
+'nolinkstoimage' => 'Nonḍe do noa são joṛao sakam banuka',
+'sharedupload-desc-here' => 'Noa rẽt do nonḍe khon-  $1 ar paseć eṭaḱaḱ porjekṭko beoharakana.
+Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
+
+# Random page
+'randompage' => 'Joṛao sakam',
+
+# Statistics
+'statistics' => 'Halot',
+
+'disambiguationspage' => 'sujhi',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|baiṭ|baiṭ}}',
+'nmembers' => 'Sãoten/ Sãotenko',
+'prefixindex' => 'Sanam sakam re joṛao menaḱ',
+'usercreated' => 'Ayo baba: tạrikh okte',
+'newpages' => 'Nãwa Patako',
+'move' => 'Ocoḱme, Kulme',
+
+# Book sources
+'booksources' => 'Puthi ńamoḱ ṭhại/jayga',
+'booksources-search-legend' => 'Puthi reak ṭhai sendrayme',
+'booksources-go' => 'Calaḱme',
+
+# Special:Log
+'log' => 'Cạbiko',
+
+# Special:AllPages
+'allpages' => 'joto sakam',
+'alphaindexline' => '$1 hạbić $2',
+'allarticles' => 'Sanam sakam',
+'allpagessubmit' => 'Calaḱme',
+
+# Special:Categories
+'categories' => 'rokom sokom',
+
+# Special:LinkSearch
+'linksearch-line' => '$2 joṛao menaḱa $2re',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Laṛcaṛićaḱ tear cạbi',
+
+# Special:ListGroupRights
+'listgrouprights-members' => 'Saõtenkoaḱ tạlika',
+
+# E-mail user
+'emailuser' => 'Nui beoharić e-mail emayme',
+
+# Watchlist
+'watchlist' => "Inak' n'el ko",
+'mywatchlist' => 'Iñak jagarna tạlikạ',
+'watchlistfor2' => 'Lạgit',
+'watch' => 'Ńelme',
+'unwatch' => "bang nelok' a",
+'wlshowlast' => 'Mucạt 1 ghonta mucạt 2 maha uduḱme',
+'watchlist-options' => 'Ńelok tạlika reak sonketko',
+
+# Delete
+'actioncomplete' => 'kami Chabae-ena',
+'actionfailed' => 'Kami bang hoe-lena',
+'dellogpage' => 'Mãrao log',
+
+# Rollback
+'rollbacklink' => 'Ghurlạo ạcur',
+
+# Protect
+'protectlogpage' => 'Rukhiyạy tala cạbi',
+'protectedarticle' => 'Rukhiyạre menaḱa',
+'protectcomment' => 'karon',
+'protectexpiry' => 'Cabaḱ',
+
+# Undelete
+'undeletelink' => 'Ńel/doho ruạṛ',
+'undeleteviewlink' => 'Ńel',
+
+# Namespace form on various pages
+'namespace' => 'Ńutum reaḱ ṭhai',
+'invert' => 'Seć bachao',
+'blanknamespace' => 'Mukhiạ̣',
+
+# Contributions
+'contributions' => 'Beharićaḱ Kạmiko',
+'contributions-title' => 'Laṛcaṛicaḱ kạmiko lạgit',
+'mycontris' => 'Ińaḱ kạmiko',
+'contribsub2' => '$1 ($2) lạgitte',
+'uctop' => '(coṭ utạr)',
+'month' => 'Cando khon (ar etohopreaḱ)',
+'year' => "Nia serma reak' pahil khoch'",
+
+'sp-contributions-newbies' => 'Nãwã ekaunṭ lạgit kạmiko uduḱme',
+'sp-contributions-blocklog' => 'Tala eset',
+'sp-contributions-uploads' => 'Rakaṕme',
+'sp-contributions-logs' => 'Tala',
+'sp-contributions-talk' => 'Roṛ',
+'sp-contributions-search' => 'Kạmiko emoḱ lạgitte sendrayme',
+'sp-contributions-username' => 'IP ṭhikạna se laṛcaṛićaḱ n̕utum',
+'sp-contributions-toponly' => 'Khạli nahaḱ nãwã aroyen joṛao kamiko udukme',
+'sp-contributions-submit' => 'Sendra',
+
+# What links here
+'whatlinkshere' => 'Cet́ link ko no̠nḍe do',
+'whatlinkshere-title' => 'Noa sakam do 1 sakam tuluc joṛao menaḱa',
+'whatlinkshere-page' => 'Sakam',
+'linkshere' => 'Noa sakam do joṛao menaka:',
+'nolinkshere' => 'Sakamko joṛao bạnuḱa',
+'isredirect' => 'Bań sojhe sakam',
+'istemplate' => 'Ar mit́ teć sãote joṛao',
+'isimage' => 'Ret joṛao',
+'whatlinkshere-prev' => 'Tayom renaḱ Táoy renaḱko',
+'whatlinkshere-next' => 'Laha renaḱ Laha renaḱko',
+'whatlinkshere-links' => 'Joṛaoko',
+'whatlinkshere-hideredirs' => '$1 acurgeya',
+'whatlinkshere-hidetrans' => 'Bodolaḱ danaṅ',
+'whatlinkshere-hidelinks' => 'Joṛao danaṅ se uduḱme',
+'whatlinkshere-hideimages' => 'phoṭo em',
+'whatlinkshere-filters' => 'Sapha',
+
+# Block/unblock
+'ipboptions' => '2 Ghonṭa : 2 hours, 1 maha:1 day, 3 maha : 3 days,1 hapta :1 week, 2 hapta : 2 weeks, 1 cando :1 month, 3 cando : 3 months,6 cando :6 months,  1 serma :1 year,  Aemamaha : infinite',
+'ipblocklist' => 'Beoharic esetgeyay',
+'blocklink' => 'Eset',
+'unblocklink' => 'bań block',
+'change-blocklink' => 'block judạ',
+'contribslink' => 'em daṛeaḱ',
+'blocklogpage' => 'Tala eset',
+'blocklogentry' => 'Eset [[$1]] sãote cabaḱ okte oka do $2 $3',
+'block-log-flags-nocreate' => 'Ekaunṭ benao do bondogeya',
+
+# Move page
+'movelogpage' => 'Tala cạbi ocoḱme',
+'revertmove' => 'ruạr agu',
+
+# Export
+'export' => 'Aguyen sakamko',
+
+# Namespace 8 related
+'allmessagesname' => 'Ńutum',
+'allmessagesdefault' => 'Bań bhul mesag ol',
+
+# Thumbnails
+'thumbnail-more' => 'Lạṭui mẽ',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Amak bebohar sakam',
+'tooltip-pt-mytalk' => 'Amaḱ katha ro̠ṛrenaḱ́ pata',
+'tooltip-pt-preferences' => 'Amaḱ Kusíyaḱ',
+'tooltip-pt-watchlist' => 'Mit́ṭen tạlika okaṭak am do nãwã aroy lạgitem ńeleḱkan',
+'tooltip-pt-mycontris' => 'Amaḱ kạmi reaḱ tạlika',
+'tooltip-pt-login' => 'Am do log in lagit́ metao am kana; menkhan noa do jarur bań kana',
+'tooltip-pt-logout' => 'Onḍńme',
+'tooltip-ca-talk' => 'Galmãrao bhitri renaḱ sakam lạgit́',
+'tooltip-ca-edit' => 'Noa sakam em edit daṛeaḱ. Daya kateć save laha re preview batton bebohar me.',
+'tooltip-ca-addsection' => 'Nãwã sekson sạrdi',
+'tooltip-ca-viewsource' => 'Noa sakam do poṭom gea
+Ona te source em ńel daṛeaḱ',
+'tooltip-ca-history' => 'Noa sakam renaḱ calao parom ńel ruạṛ',
+'tooltip-ca-protect' => 'ñia sakam bachaome',
+'tooltip-ca-delete' => 'nia sakam muchau me',
+'tooltip-ca-move' => 'Noa sakam kulme',
+'tooltip-ca-watch' => 'Noa sakam do amaḱ ńelok tạlikare joṛaome',
+'tooltip-ca-unwatch' => 'Amaḱ ńeloḱ tạlika khon noa sakam bagiyam',
+'tooltip-search' => 'Sendra {{Saiṭñitum}}',
+'tooltip-search-go' => 'Mitṭen sakamre calaḱme one okare noa ńutum menaḱa',
+'tooltip-search-fulltext' => 'Noa ol ńam lạgit sakamko ńelme',
+'tooltip-p-logo' => 'Mukhiạ sakamre calaḱme',
+'tooltip-n-mainpage' => 'Mukhiạ sakamre calaḱme',
+'tooltip-n-mainpage-description' => 'Mukhiạ sakamre calaḱme',
+'tooltip-n-portal' => 'Niạ pro̠je̠ḱ́ṭreaḱ Biso̠yko, Cet́́em ceka daṛia,Okare̠ sendra ñamoḱ́a',
+'tooltip-n-currentevents' => 'Nitaḱ events re jos hudis ńãm me',
+'tooltip-n-recentchanges' => 'Uiki nãhaḱ palaṭrenaḱ́ tạlikạ',
+'tooltip-n-randompage' => 'Ãr hõ sakam ko agui mẽ',
+'tooltip-n-help' => 'Sendra ñamreaḱ jayga',
+'tooltip-t-whatlinkshere' => 'Sanam wiki sakam renaḱ list ar link do nonde',
+'tooltip-t-recentchangeslinked' => 'Noa sakam re nitaḱ bodol akan sakam renaḱ linked',
+'tooltip-feed-atom' => 'Noa sakam lạgit́ atom jomaḱ',
+'tooltip-t-contributions' => 'Beoharićak kami reaḱ tạ̣lika',
+'tooltip-t-emailuser' => 'Nui beoharić mitṭen e-mail kulayme',
+'tooltip-t-upload' => 'Failko aploḍ̣me',
+'tooltip-t-specialpages' => 'Jạruṛ patakureaḱ tạlikạ',
+'tooltip-t-print' => 'Printoḱ lekan sakam',
+'tooltip-t-permalink' => 'Terejuge joṛaokam ñel sakam',
+'tooltip-ca-nstab-main' => 'Bahal sakam ńel me',
+'tooltip-ca-nstab-user' => 'Beoharićaḱ sakam uduḱme',
+'tooltip-ca-nstab-special' => 'Noa do nij/bises sakam kana, amem menle rehõ bam joṛao dareaḱa',
+'tooltip-ca-nstab-project' => "project page nel' me",
+'tooltip-ca-nstab-image' => 'Fael sakam ńel',
+'tooltip-ca-nstab-template' => 'Forom uduḱme',
+'tooltip-ca-nstab-category' => 'Rokom sokom sakamko udukme',
+'tooltip-minoredit' => 'Noa do huḍiń joṛao lekate lekhay me',
+'tooltip-save' => 'Bodolaḱko rukhiyayme',
+'tooltip-preview' => 'Amaḱ bodolaḱ uduḱme, noa beoharme ạuri rukhiyayre',
+'tooltip-diff' => 'Uduḱme okaṭaḱ onolem bodolakada',
+'tooltip-compareselectedversions' => 'Noa barea sakam talareaḱ bepaneyaḱ nãwã aróme',
+'tooltip-watch' => 'Amaḱ ńeloḱ sakamre noa do dohoyme',
+'tooltip-rollback' => '"Ghurlạ ạcur" noa sakam taṛam ruạṛ ńel sapha ona do amaḱ mũcạt́ mit́ dhom click re',
+'tooltip-undo' => 'Noa joṛao kạmire ulṭao "bạgiyaḱme" ar ńeloḱ lekate noa joṛao jhicme. Noa do am guḍ karon joṛaoe ektiyariye emama.',
+'tooltip-summary' => 'Khaṭote guṭ katha bhoraome',
+
+# Info page
+'pageinfo-header-watchlist' => 'Ńeloḱ tạlika',
+'pageinfo-header-views' => 'Ńelme',
+'pageinfo-subjectpage' => 'Sakam',
+'pageinfo-talkpage' => 'Galmarao sakam',
+'pageinfo-watchers' => 'Ńeńelkoaḱ nombor',
+
+# Browsing diffs
+'previousdiff' => "mareak' kamiko",
+'nextdiff' => 'Nãwã joṛao',
+
+# Media information
+'file-info-size' => '$1 x $2 pixels, file size: $3, MIME type: $4',
+'file-nohires' => 'Aema resulation nondḍe banuḱa',
+'show-big-image' => 'Purạo resulation',
+
+# Bad image list
+'bad_image_list' => 'Format do latar re leka',
+
+# Metadata
+'metadata' => 'Meṭa khobor',
+'metadata-help' => 'Noa rẹt redo bạṛti kathako menaḱa, paseć noa do ḍejiṭal kemera se skenar bebohar hoy kate ḍijiṭal benao. Judi noa ret noa reaḱ asolak khon nãwã aro lenkhan, paseć sanamaḱko thoṛa bań sodoroḱa noa retredo.',
+'metadata-fields' => 'Noa ciṭhire menaḱ photo reaḱ metadata jayga ṭalika do photo reaḱ sakamreye uduga, tinre ona metadata tibil do cabaḱa.
+Eṭagaḱ sanamko do ońkage eset tahẽna.
+Benao, Teyar
+Moḍel
+tạrik okte asolak
+hire okte
+f nombor
+isospeeddratings
+jeleń',
+
+# External editor support
+'edit-externally' => 'Noa rẽt tońge joṛao lạ̣gitte bahre reaḱ koejoń  beoharme',
+'edit-externally-help' => '(Nonḍe ńelme [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] bạṛtite baḍay lạgit)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'Sanam, sanamak, sanamko',
+'namespacesall' => 'sanam',
+'monthsall' => 'Sanamak',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Jońgṛao bodolaḱko ńel',
+'watchlisttools-edit' => 'Ńelok tạlika ńel ar joṛao',
+
+# Special:SpecialPages
+'specialpages' => 'Jạruṛ patako',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Tag]] saphay:',
+
+);
index f84871a..8800a38 100644 (file)
@@ -731,6 +731,7 @@ Siddu sî n’utenti anònimu e riteni ca li cummenti prisenti nta sta pàggina
 '''Siddu chistu è nu tintativu liggìttimu di canciamentu, arriprova. Siddu lu prubbrema pirsisti, si pò pruvari a [[Special:UserLogout|sculligàrisi]] e effittuari n'accessu novu.'''",
 'token_suffix_mismatch' => "'''Lu canciamentu nun fu sarvatu pirchì lu client ammustrau di gèstiri 'n modu sbagghiatu li caràttiri di puntiggiatura nta lu token assuciatu a iddu. P'evitari na curruzzioni pussìbbili dô testu dâ pàggina, fu rifiutatu tuttu lu canciamentu. Sta situazzioni pò virificàrisi, certi voti, quannu s'adòpiranu arcuni sirvizza di proxy anònimi via web chi prisèntanu bug.'''",
 'editing' => 'Canciu di la vuci "$1"',
+'creating' => 'Stai criannu $1',
 'editingsection' => 'Canciamentu di $1 (sezzioni)',
 'editingcomment' => 'Canciu di $1 (nova sizzioni)',
 'editconflict' => "Cunflittu d'edizzioni supra $1",
index 0cf1cb8..6399b56 100644 (file)
@@ -583,6 +583,7 @@ Prašuom pamiegintė vielēk. Jei šėtā napaded, pamieginkėt atsėjongtė ėr
 ''Kadaogi šėtom pruojekte grīnasės HTML īr ijongts, parveiza īr pasliepta kāp atsargoma prėimonė priš JavaScript atakas.''
 '''Jei tā teisiets keitėma bandīms, prašuom pamiegint viel. Jei šėtā napaded, pamieginkėt atsėjongtė ėr prėsėjongtė atgal.'''",
 'editing' => 'Taisuoms straipsnis - $1',
+'creating' => 'Dėrbama $1',
 'editingsection' => 'Taisuoms $1 (skėrsnelis)',
 'editingcomment' => 'Taisuoms $1 (naus skīrius)',
 'editconflict' => 'Ėšpreskėt kuonflėkta: $1',
index 359b1c8..cfca905 100644 (file)
@@ -594,6 +594,9 @@ $2',
 'ns-specialprotected' => 'Posebne stranice se ne mogu uređivati.',
 'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
 Kao razlog je naveden "\'\'$2\'\'".',
+'filereadonlyerror' => 'Ne mogu da izmenim datoteku „$1“ jer je riznica „$2“ u režimu za čitanje.
+
+Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.',
 
 # Virus scanner
 'virus-badscanner' => "Loša konfiguracija: nepoznati anti-virus program: ''$1''",
@@ -688,6 +691,7 @@ Nijedan e-mail neće biti poslan za bilo koju uslugu od slijedećih.',
 'invalidemailaddress' => 'Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.
 Molimo vas da unesete ispravnu adresu ili ostavite prazno polje.',
 'cannotchangeemail' => 'Na ovom wikiju ne možete promeniti e-mail adresu računa.',
+'emaildisabled' => 'Ova web-stranica ne može da šalje e-poruke.',
 'accountcreated' => 'Korisnički račun je napravljen',
 'accountcreatedtext' => 'Korisnički račun za $1 je napravljen.',
 'createaccount-title' => 'Pravljenje korisničkog računa za {{SITENAME}}',
@@ -893,8 +897,9 @@ Posljednje stavke evidencije blokiranja možete pogledati ispod:',
 Ne zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Osvježeno)',
 'note' => "'''Napomena:'''",
-'previewnote' => "'''Upamtite da je ovo samo pretpregled.'''
-Vaše izmjene još uvijek nisu snimljene!",
+'previewnote' => "'''Ne zaboravite da je ovo samo pregled'''
+Izmjene stranice nisu još sačuvane!",
+'continue-editing' => 'Nastavak uređivanja',
 'previewconflict' => 'Ovaj pretpregled reflektuje tekst u gornjem polju
 kako će izgledati ako pritisnete "Snimi stranicu".',
 'session_fail_preview' => "'''Izvinjavamo se! Nismo mogli obraditi vašu izmjenu zbog gubitka podataka o prijavi. Molimo pokušajte ponovno. Ako i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]] i ponovno prijaviti.'''",
@@ -908,6 +913,7 @@ Izmjena je odbačena da bi se spriječilo uništavanje teksta stranice.
 To se događa ponekad kad korisite problematični anonimni proxy koji je baziran na web-u.",
 'edit_form_incomplete' => "'''Neki dijelovi uređivačkog obrasca nisu došli do servera; dvaput provjerite da su vaše izmjene nepromjenjene i pokušajte ponovno.'''",
 'editing' => 'Uređujete $1',
+'creating' => 'Stvaranje $1',
 'editingsection' => 'Uređujete $1 (sekciju)',
 'editingcomment' => 'Uređujete $1 (nova sekcija)',
 'editconflict' => 'Sukobljenje izmjene: $1',
@@ -973,6 +979,7 @@ Izgleda da je obrisana.',
 'edit-no-change' => 'Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.',
 'edit-already-exists' => 'Stranica nije mogla biti kreirana.
 Izgleda da već postoji.',
+'defaultmessagetext' => 'Uobičajeni tekst poruke',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.
@@ -1133,7 +1140,8 @@ Molimo provjerite zapise.',
 
 # Suppression log
 'suppressionlog' => 'Registri sakrivanja',
-'suppressionlogtext' => 'Ispod je spisak brisanja i blokiranja koja su povezana sa sadržajem koji je sakriven od administratora. Vidi [[Special:IPBlockList|spisak IP blokiranja]] za pregled trenutno važećih blokada.',
+'suppressionlogtext' => 'Ispod je spisak brisanja i blokiranja koja su povezana sa sadržajem koji je sakriven od administratora. 
+Vidi [[Special:BlockList|spisak blokiranja]] za pregled trenutno važećih blokada.',
 
 # History merging
 'mergehistory' => 'Spoji historije stranice',
@@ -1559,6 +1567,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'newsectionsummary' => '/* $1 */ nova sekcija',
 'rc-enhanced-expand' => 'Pokaži detalje (neophodan JavaScript)',
 'rc-enhanced-hide' => 'Sakrij detalje',
+'rc-old-title' => 'prvobitno kreirano kao "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Srodne izmjene',
@@ -1727,6 +1736,7 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
 'backend-fail-closetemp' => 'Ne mogu da zatvorim privremenu datoteku.',
 'backend-fail-read' => 'Ne mogu da pročitam datoteku $1.',
 'backend-fail-create' => 'Ne mogu da napravim datoteku $1.',
+'backend-fail-maxsize' => 'Ne mogu da napravim datoteku $1 jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.',
 'backend-fail-readonly' => 'Skladišna osnova „$1“ trenutno ne može da se zapisuje. Navedeni razlog glasi: „$2“',
 'backend-fail-synced' => 'Datoteka „$1“ je nedosledna između unutrašnjih skladišnih osnova',
 'backend-fail-connect' => 'Ne mogu da se povežem sa skladišnom osnovom „$1“.',
@@ -1853,6 +1863,10 @@ Slijedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vo
 Molimo pogledajte [$2 stranicu opisa datoteke] za ostale informacije.',
 'sharedupload-desc-here' => 'Ova datoteka je sa $1 i može se koristiti i na drugim projektima.
 Opis sa njene [$2 stranice opisa datoteke] je prikazan ispod.',
+'sharedupload-desc-edit' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
+'sharedupload-desc-create' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 'filepage-nofile' => 'Ne postoji datoteka s ovim nazivom.',
 'filepage-nofile-link' => 'Ne postoji datoteka s ovim imenom, ali je možete [$1 postaviti].',
 'uploadnewversion-linktext' => 'Postavite novu verziju ove datoteke/fajla',
@@ -2066,6 +2080,7 @@ Možete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena
 'allpagesbadtitle' => 'Dati naziv stranice je nepravilan ili ima međujezički ili interwiki prefiks.
 Možda sadrži jedan ili više znakova koji se ne mogu koristiti u naslovima.',
 'allpages-bad-ns' => '{{SITENAME}} nema imenski prostor "$1".',
+'allpages-hide-redirects' => 'Sakrij preusmerenja',
 
 # Special:Categories
 'categories' => 'Kategorije',
@@ -2566,8 +2581,8 @@ Evidencija sakrivanja je prikazana ispod kao referenca:',
 'blocklogentry' => 'blokiran [[$1]] s rokom: $2 $3',
 'reblock-logentry' => 'promjena postavki blokiranja za [[$1]] sa vremenom isteka u $2 $3',
 'blocklogtext' => 'Ovo je historija akcija blokiranja i deblokiranja korisnika.
-Automatsko blokirane IP adrese nisu uspisane ovde.
-Pogledajte [[Special:BlockList|blokirane IP adrese]] za spisak trenutnih zabrana i blokiranja.',
+Automatski blokirane IP adrese nisu navedene ovdje.
+Pogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih zabrana i blokiranja.',
 'unblocklogentry' => 'deblokiran $1',
 'block-log-flags-anononly' => 'samo anonimni korisnici',
 'block-log-flags-nocreate' => 'pravljenje računa onemogućeno',
@@ -2831,7 +2846,7 @@ Molimo pokušajte ponovno.',
 
 # JavaScriptTest
 'javascripttest' => 'Javaskript test',
-'javascripttest-disabled' => 'Ova funkcija je onemogućena.',
+'javascripttest-disabled' => 'Ova funkcija je onemogućena na ovom wikiju.',
 'javascripttest-title' => 'Izvršavanje testova za $1',
 'javascripttest-pagetext-noframework' => 'Ova stranica je rezervisana za izvršavanje javaskript testova.',
 'javascripttest-pagetext-unknownframework' => 'Nepoznati radni okvir „$1“.',
@@ -3638,6 +3653,7 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'version-software' => 'Instalirani softver',
 'version-software-product' => 'Proizvod',
 'version-software-version' => 'Verzija',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Putanja datoteke',
@@ -3826,4 +3842,15 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'api-error-uploaddisabled' => 'Postavljanje je onemogućeno na ovoj wiki.',
 'api-error-verification-error' => 'Ova datoteka je možda oštećenja ili ima pogrešan nastavak.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuta}}',
+'duration-hours' => '$1 {{PLURAL:$1|sat|sati}}',
+'duration-days' => '$1 {{PLURAL:$1|dan|dana}}',
+'duration-weeks' => '$1 {{PLURAL:$1|sedmica|sedmica}}',
+'duration-years' => '$1 {{PLURAL:$1|godina|godina}}',
+'duration-decades' => '$1 {{PLURAL:$1|decenija|decenija}}',
+'duration-centuries' => '$1 {{PLURAL:$1|vijek|vijekova}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenijum|milenijuma}}',
+
 );
index 068065f..87a157c 100644 (file)
@@ -442,8 +442,8 @@ $1",
 'mainpage' => 'මුල් පිටුව',
 'mainpage-description' => 'මුල් පිටුව',
 'policy-url' => 'Project:ප්‍රතිපත්තිය',
-'portal' => 'පà·\8aâ\80\8dරජà·\8f à¶¯à·\8aà·\80à·\8fරය',
-'portal-url' => 'Project:පà·\8aâ\80\8dරජà·\8f à¶¯à·\8aà·\80à·\8fරය',
+'portal' => 'පà·\8aâ\80\8dරජà·\8f à¶´à·\92à·\80à·\92à·\83à·\94ම',
+'portal-url' => 'Project:පà·\8aâ\80\8dරජà·\8f à¶´à·\92à·\80à·\92à·\83à·\94ම',
 'privacy' => 'පුද්ගලිකත්ව ප්‍රතිපත්තිය',
 'privacypage' => 'Project:පුද්ගලිකත්ව ප්‍රතිපත්තිය',
 
@@ -578,7 +578,7 @@ URL  සඳහන් කරමින්, මෙම කරුණ [[Special:ListUs
 'editinginterface' => "'''අවවාදයයි:''' මෘදුකාංගයට අතුරුමුව පෙළ සැපයීමට භාවිතා වන පිටුවක් ඔබ විසින් සංස්කරණය කරනු ලබයි.
 මෙම පිටුවට සිදු කරන වෙනස්වීම් විසින් අනෙකුත් පරිශීලකයන්ගේ පරිශීලක අතුරුමුවෙහි පෙනුමට බලපෑම් එල්ල කෙරෙනු ඇත.
 පරිවර්තන සඳහා, මීඩියාවිකි ප්‍රාදේශීයකරන ව්‍යාපෘතිය, [//translatewiki.net/wiki/Main_Page?setlang=si translatewiki.net], භාවිතා කිරීම සලකා බැලීමට කාරුණික වන්න.",
-'sqlhidden' => '(එස්කිවුඑල් විපරම සඟවා ඇත)',
+'sqlhidden' => '(SQL query සඟවා ඇත)',
 'cascadeprotected' => '"තීරු දර්ශන" විකල්පය සක්‍රීයනය කොට එමගින් ආරක්‍ෂණය කල පහත දැක්වෙන {{PLURAL:$1|පිටුව|පිටු}} අඩංගු කර ඇති බැවින්, මෙම පිටුව සංස්කරණය කිරීමෙන් වලකා ඇත:
 $2',
 'namespaceprotected' => "'''$1''' නාමඅවකාශයෙහි පිටු සංස්කරණය කිරීමට ඔබහට අවසර නොමැත.",
@@ -600,7 +600,7 @@ $2',
 ඔබගේ බ්‍රවුසරයෙහි පූර්වාපේක්‍ෂී සංචිතය (කෑෂය) පිරිසිදුකරන තෙක්, සමහරක් පිටු විසින් ඔබ තවදුරටත් පිවිසී ඇති බවක් දිගටම පෙන්නුම් කිරීමට ඉඩ ඇත.",
 'welcomecreation' => '== ආයුබෝවන්, $1! ==
 
-à¶\94බâ\80\8dà¶\9cà·\9a à¶\9cà·\92ණà·\94ම à¶­à·\90නà·\93 à¶\87ත.
+à¶\94බâ\80\8dà¶\9cà·\9a à¶\9cà·\92ණà·\94ම à¶­à¶±à¶± à¶½à¶¯à·\93.
 ඔබ‍ගේ [[Special:Preferences|{{SITENAME}} අභිරුචි ]] වෙනස් කිරීම අමතක නොකරන්න.',
 'yourname' => 'පරිශීලක නාමය:',
 'yourpassword' => 'මුරපදය:',
@@ -876,8 +876,8 @@ $2
 රීති ප්‍රකාරව .css හා .js පිටු විසින් ඉංග්‍රීසි කුඩා-අකුරු ශීර්ෂ භාවිතා කෙරෙන බව සිහි තබා ගන්න, නිදසුන. {{ns:user}}:Foo/vector.css මිස {{ns:user}}:Foo/Vector.css නොවන බව.",
 'updated' => '(යාවත්කාලීන)',
 'note' => "'''සටහන:'''",
-'previewnote' => "'''මà·\99ය පà·\99රදà·\83à·\94නà¶\9aà·\8a à¶´à¶¸à¶«à·\92.'''
-à¶\94බà¶\9cà·\9a à·\80à·\99නà·\83à·\8aà¶\9aà·\92රà·\93මà·\8a තà·\80මතà·\8a à·\83à·\94රà\9aà·\8aà·\82à·\92ත කොට නොමැත!",
+'previewnote' => "'''මà·\99ය පà·\99රදà·\83à·\94නà¶\9aà·\8a à¶´à¶¸à¶«à\9aà·\8a à¶¶à·\80 à·\83à·\92à·\84à·\92තබà·\8fà¶\9cනà·\8aන.'''
+à¶\94බà¶\9cà·\9a à·\80à·\99නà·\83à·\8aà¶\9aà·\92රà·\93මà·\8a තà·\80මතà·\8a à·\83à·\94රà·\90à¶\9aà·\93මට à¶½à¶\9aà·\8a කොට නොමැත!",
 'previewconflict' => 'ඔබ විසින් සුරැකීම තෝරාගත්තොත්,  ඉහළ පෙළ සංස්කරණ සරියෙහි,  පෙළ දර්ශනය විය හැකි අයුර මෙම පෙර-දසුනෙන් ආවර්ජනය වේ.',
 'session_fail_preview' => "'''කණගාටුයි! සැසි දත්ත හානියක් හේතුවෙන් අප විසින් ඔබගේ  සංස්කරණය ක්‍රියායයනය කිරීමට නොහැකි වී ඇත.
 කරුණාකර නැවත උත්සාහ කරන්න.
@@ -892,6 +892,7 @@ $2
 සංස්කරණය නිෂ්ප්‍රභා කරන ලද්දේ පිටු පෙළ දූෂණය වීම වැලැක්වීමටය.
 දෝෂ-සපිරි වෙබ්-පාදක නිර්නාමික නියුතු සේවාවක් ඔබ විසින් භාවිත කිරීම නිසා මෙය සමහරවිට සිදුවිය හැක.'''",
 'editing' => '$1 සංස්කරණය කරමින් පවතියි',
+'creating' => '$1 තනමින්',
 'editingsection' => '$1 (ඡේදය) සංස්කරණය කරමින් පවතියි',
 'editingcomment' => '$1 සංස්කරණය කරමින් පවතියි (නව ඡේදයක්)',
 'editconflict' => 'සංස්කරණ ගැටුම: $1',
@@ -959,7 +960,7 @@ $2
 එය දැනටමත් පවතියි.',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => 'අවවාදයයි: මෙම පිටුවෙහි අධිවැය ව්‍යාකරණ විග්‍රහ ශ්‍රිත කැඳවුම් පමණට වඩා ඇත.
+'expensive-parserfunction-warning' => 'අවවාදයයි: මෙම පිටුවෙහි අධිවැය ව්‍යාකරණ විග්‍රහ ශ්‍රිත කැඳවුම් (expensive parser function calls) පමණට වඩා ඇත.
 
 එහි තිබිය යුතු වූයේ  {{PLURAL:$2|එක් කැඳවුමකට |කැඳවුම් $2 ට }} අඩුවෙන් වුවද, මෙහි දැනට  {{PLURAL:$1|එක් කැඳවුමක්|කැඳවුම්  $1 ක්}} අඩංගුව ඇත.',
 'expensive-parserfunction-category' => 'අධිවැය ව්‍යාකරණ විග්‍රහ ශ්‍රිත කැඳවුම් පමණට වඩා ඇති පිටු',
@@ -1101,7 +1102,7 @@ $1",
 'revdelete-modify-no-access' => '$1 දින, $2 වේලාවෙහි, අයිතමය වෙනස්කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: මෙම අයිතමය "පරිසීමිත" ලෙසින් සලකුණු කර ඇත.
 ඔබට ඒ සඳහා ප්‍රවේශයන් නොමැත.',
 'revdelete-modify-missing' => 'අනන්‍යාංක $1 දරණ අයිතමය වෙනස් කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: එය දත්ත ගබඩාවෙන් අස්ථානගතවී ඇත!',
-'revdelete-no-change' => "'''à¶\85à·\80à·\80à·\8fදයයà·\92:''' $1 à¶¯à·\92න, $2 à·\80à·\9aලà·\8fà·\80à·\99à·\84à·\92, à¶\85යà·\92තමය à¶¯à·\90නටමතà·\8a à¶¯à·\98à·\81à·\8aâ\80\8dයතà·\8f à¶´à¶»à·\92à·\83à·\8aථà·\92තà·\93නà·\8a à¶\89ලà·\8aලà·\8f à·\83à·\92ට ඇත.",
+'revdelete-no-change' => "'''à¶\85à·\80à·\80à·\8fදයයà·\92:''' $1 à¶¯à·\92න, $2 à·\80à·\9aලà·\8fà·\80à·\99à·\84à·\92, à¶\85යà·\92තමය à¶¯à·\90නටමතà·\8a à¶¯à·\98à·\81à·\8aâ\80\8dයතà·\8f à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶\89ලà·\8aලà·\8f ඇත.",
 'revdelete-concurrent-change' => '$1 දින, $2 වේලාවෙහි, අයිතමය වෙනස් කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: එය වෙනස්කිරීමට ඔබ උත්සාහ ගන්නා අතරතුරදී තවත් අයෙකු විසින් එහි ස්තිතිය වෙනස් කර ඇති බවක් පෙනෙන්නට ඇත.
 කරුණාකර ලඝු-සටහන් පරික්ෂාකර බලන්න.',
 'revdelete-only-restricted' => '$2 දිනැති අයිතමය සැඟවීමේ දෝෂය , $1:අනෙකුත් සැඟවීම් විකල්පයන් අතුරින් එකක් තෝරාගන්නේ නැතිව, පරිපාලකයන්ගේ දර්ශනයෙන් අයිතමයන් සැඟවීම  ඔබහට සිදුකල නොහැක.',
@@ -1135,7 +1136,7 @@ $1",
 'mergehistory-empty' => 'සංශෝධනයන් කිසිවක් ඒකාබද්ධ කල නොහැක.',
 'mergehistory-success' => ' [[:$1]] හි  {{PLURAL:$3|සංශෝධනයක්|සංශෝධන  $3 ක්}}සාර්ථක ලෙස   [[:$2]] හා සමග ඒකාබද්ධ කරන ලදි.',
 'mergehistory-fail' => 'ඉතිහාස ඒකාබද්ධය සිදු කල නොහැක, පිටු හා වේලා පරාමිතීන් නැවත පිරික්සා බලන්න.',
-'mergehistory-no-source' => 'මූල පිටුව $1 කොපවතී.',
+'mergehistory-no-source' => 'මූලාශ පිටුව $1 නොපවතී.',
 'mergehistory-no-destination' => 'අන්ත පිටුව $1 නොපවතී.',
 'mergehistory-invalid-source' => 'මූල පිටුව නීතික ශීර්ෂයක් සහිත විය යුතුය.',
 'mergehistory-invalid-destination' => 'අන්ත  පිටුව නීතික ශීර්ෂයක් සහිත විය යුතුය.',
@@ -1287,10 +1288,10 @@ $1",
 'timezoneuseserverdefault' => 'විකියෙහි සාමාන්‍ය විදිහ භාවිත කරන්න ($1)',
 'timezoneuseoffset' => 'වෙනත් (හිලව්ව නියමාකාරයෙන් දක්වන්න)',
 'timezoneoffset' => 'Offset¹:',
-'servertime' => 'සර්වරයේ වේලාව:',
+'servertime' => "ස'වරයේ වේලාව:",
 'guesstimezone' => 'බ්‍රවුසරයෙන් පුරවන්න',
 'timezoneregion-africa' => 'අප්‍රිකාව',
-'timezoneregion-america' => 'à¶\87මරිකාව',
+'timezoneregion-america' => 'à¶\85මà·\99රිකාව',
 'timezoneregion-antarctica' => 'ඇන්ටාටිකාව',
 'timezoneregion-arctic' => 'අත්ලාන්තික්',
 'timezoneregion-asia' => 'ආසියාව',
@@ -1345,18 +1346,18 @@ HTML ටැගයන් පිරික්සන්න.',
 'prefs-dateformat' => 'දින ආකෘතිය',
 'prefs-timeoffset' => 'වේලා හිලව්ව',
 'prefs-advancedediting' => 'වැඩිදුර තෝරාගැනීම් සැකසුම්',
-'prefs-advancedrc' => 'පà·\8aâ\80\8dරà¶\9cත à·\80à·\92à¶\9aලà·\8aපයනà·\8a',
-'prefs-advancedrendering' => 'පà·\8aâ\80\8dරà¶\9cත à·\80à·\92à¶\9aලà·\8aපයනà·\8a',
+'prefs-advancedrc' => 'à·\80à·\90ඩà·\92දà·\94ර à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶­à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
+'prefs-advancedrendering' => 'à·\80à·\90ඩà·\92දà·\94ර à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶­à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
 'prefs-advancedsearchoptions' => 'ප්‍රගත විකල්පයන්',
-'prefs-advancedwatchlist' => 'පà·\8aâ\80\8dරà¶\9cත à·\80à·\92à¶\9aලà·\8aපයනà·\8a',
-'prefs-displayrc' => 'දරà·\8aà·\81න à·\80à·\92à¶\9aලà·\8aපයනà·\8a',
+'prefs-advancedwatchlist' => 'à·\80à·\90ඩà·\92දà·\94ර à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶­à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
+'prefs-displayrc' => 'දරà·\8aà·\81න à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶­à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
 'prefs-displaysearchoptions' => 'විකල්ප පෙන්වන්න',
 'prefs-displaywatchlist' => 'විකල්ප පෙන්වන්න',
 'prefs-diffs' => 'වෙනස',
 
 # User preference: e-mail validation using jQuery
 'email-address-validity-valid' => 'විද්‍යුත්-තැපැල් ලිපිනය අනීතික බවක් පෙනෙයි.',
-'email-address-validity-invalid' => 'නà·\93තà·\92à¶\9a à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a-තà·\90පà·\90ල් ලිපිනයක් ඇතුලත් කරන්න',
+'email-address-validity-invalid' => 'à·\80ලà¶\82à¶\9cà·\94 à·\80à·\92දà·\8aâ\80\8dයà·\94ත් ලිපිනයක් ඇතුලත් කරන්න',
 
 # User rights
 'userrights' => 'පරිශීලක හිමිකම් කළමනාකරණය',
@@ -1700,7 +1701,7 @@ $1',
 'upload-file-error' => 'අභ්‍යන්තර දෝෂය',
 'upload-file-error-text' => 'සේවාදායකයෙහි තාවකාලික ගොනුවක් තැනීමට උත්සාහ දැරීමෙහිදී අභ්‍යන්තර දෝෂයක් හට ගැනිණි.
 කරුණාකර [[Special:ListUsers/sysop|පරිපාලකවරයෙක්]] වෙත යොමුවන්න.',
-'upload-misc-error' => 'à\85ඥà·\8fත උඩුගත කිරීම් දෝෂය',
+'upload-misc-error' => 'à·\84ඳà·\94නà·\8f à¶±à·\9cà¶\9cතà·\8a උඩුගත කිරීම් දෝෂය',
 'upload-misc-error-text' => 'උඩුගත කිරීමේදී හඳුනාගත නොහැකි දෝෂයක් සිදුවිය.
 URLහි නීතික බව හා ප්‍රවේශ්‍ය බව තහවුරුකරගෙන නැවත උත්සාහ කරන්න.
 ගැටළුව තවදුරටත් පවතී නම්, [[Special:ListUsers/sysop|පරිපාලකවරයෙකු]] අමතන්න.',
@@ -2004,7 +2005,7 @@ When filtered by user, only files where that user uploaded the most recent versi
 'usercreated' => '$1 දින $2 වේලාවේදී {{GENDER:$3|තනන ලදි}}',
 'newpages' => 'අළුත් පිටු',
 'newpages-username' => 'පරිශීලක-නාමය:',
-'ancientpages' => 'පà·\94රà·\8fණතම පිටු',
+'ancientpages' => 'පà·\90රණà·\92ම පිටු',
 'move' => 'ගෙනයන්න',
 'movethispage' => 'මෙම පිටුව ගෙන යන්න',
 'unusedimagestext' => 'පහත ගොනු පවතින නමුත් ඒවා කිසිදු පිටුවකට කාවද්දා නොමැත.
@@ -2565,7 +2566,7 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 'block-log-flags-angry-autoblock' => 'ආවර්ධිත ස්වයංක්‍රීය වාරණය සක්‍රීය කරන ලදි',
 'block-log-flags-hiddenname' => 'පරිශීලක-නාමය  සඟවා ඇත',
 'range_block_disabled' => 'පරාස වාරණයන් සිදුකිරීමට පරිපාලක වරුන්ට ඇති හැකියාව අක්‍රීය කරන ලදි.',
-'ipb_expiry_invalid' => 'à¶\89à¶\9aà·\94තà·\8aà·\80à·\93මà·\9a à¶\9aà·\8fලය à¶\85නà·\93තà·\92à¶\9aය.',
+'ipb_expiry_invalid' => 'à¶\9aලà·\8aà¶\89à¶\9aà·\94තà·\8aà·\80à·\93මà·\9a à·\80à·\9aලà·\8fà·\80 à·\80ලà¶\82à¶\9cà·\94 à¶±à·\90ත.',
 'ipb_expiry_temp' => 'සැඟවුනු පරිශීලක-නාම වාරණයන් ස්ථීර ඒවා විය යුතුය.',
 'ipb_hide_invalid' => 'මෙම ගිණුම යටපත්කිරීම කල නොහැකියි; පමණට වඩා සංස්කරණ සිදු කර ඇතිවා විය හැක.',
 'ipb_already_blocked' => '"$1" දැනටමත් වාරණයට ලක් කර ඇත',
@@ -2688,20 +2689,20 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 අන්ත පිටුව "[[:$1]]" දැනටමත් පවතියි.
 එය මකාදමා ගෙනයාම සඳහා පෙත එළි කිරීමට ඔබ හට ඇවැසිද?',
 'delete_and_move_confirm' => 'ඔව්, පිටුව මකා දමන්න',
-'delete_and_move_reason' => '"[[$1]]" ගෙනයෑම සඳහා ඉඩ ලබාගැනීම සඳහා මකාදමන ලදී',
+'delete_and_move_reason' => '"[[$1]]" ගෙනයෑම ඉඩ ලබාගැනීම සඳහා මකාදමන ලදී',
 'selfmove' => 'මූල හා අන්ත ශීර්ෂ දෙකම එකමය;
 පිටුවක් එය වෙතම ගෙන යා නොහැක.',
 'immobile-source-namespace' => '"$1" නාමඅවකාශයෙහි පිටු ගෙනයාම සිදුකල නොහැක',
 'immobile-target-namespace' => '"$1" නාමඅවකාශය වෙත පිටු ගෙනයාම සිදුකල නොහැක',
-'immobile-target-namespace-iw' => 'à¶\85නà·\8aතරà·\8aà·\80à·\92à¶\9aà·\93 à·\83බà·\90ඳà·\92ය, à¶´à·\92ටà·\94 à¶\9cà·\99නයà·\91ම à·\83ඳà·\84à·\8f à¶±à·\93තà·\92à¶\9a à¶\91ලà·\8aලයක් නොවේ.',
+'immobile-target-namespace-iw' => 'à¶\85නà·\8aතරà·\8aà·\80à·\92à¶\9aà·\93 à·\83බà·\90ඳà·\92ය, à¶´à·\92ටà·\94 à¶\9cà·\99නයà·\91ම à·\83ඳà·\84à·\8f à·\80ලà¶\82à¶\9cà·\94 à¶\89ලà¶\9aà·\8aà¶\9aයක් නොවේ.',
 'immobile-source-page' => 'මෙම පිටුව ගෙනයාහැක්කක් නොවේ.',
 'immobile-target-page' => 'එම අන්ත ශීර්ෂයට ගෙන යෑම කල නොහැක.',
 'imagenocrossnamespace' => 'ගොනුවක්, ගොනුවක්-නොවන නාමඅවකාශයකට ගෙනයෑම කල නොහැක',
 'nonfile-cannot-move-to-file' => 'ගොනුවක්-නොවන්න ගොනු නාමඅවකාශයට ගෙනයෑම කල නොහැක',
-'imagetypemismatch' => 'නව ගොනු ප්‍රසර්ජනය එහි වර්ගය හා නොගැලපේ',
-'imageinvalidfilename' => 'ඉලක්කගත ගොනු නාමය අනීතිකයි',
-'fix-double-redirects' => 'මà·\94ලà·\8a à·\81à·\93රà·\8aà·\82යට à¶\91ලà·\8aලà·\80න à¶\9aà·\92à·\83à·\92යමà·\8a à¶ºà·\85à·\92-යà·\9cමà·\94à·\80à·\93මà·\8a à¶\8bඩà·\94à¶\9cත කරන්න',
-'move-leave-redirect' => 'යà·\85à·\92-යà·\9cමà·\94à·\80à¶\9aà·\8a à·\84à·\90ර à¶¯à¶¸න්න',
+'imagetypemismatch' => 'නව ගොනු ප්‍රසර්ජනය(extension) එහි වර්ගය හා නොගැලපේ',
+'imageinvalidfilename' => 'ඉලක්ක ගොනු නාමය වලංගුනැත',
+'fix-double-redirects' => 'මà·\94ලà·\8a à¶¸à·\8fතà·\98à¶\9aà·\8fà·\80ට à¶\91ලà·\8aලà·\80න à¶ºà·\85à·\92-යà·\9cමà·\94 à¶\85පà·\8aඩà·\9aටà·\8a කරන්න',
+'move-leave-redirect' => 'යà·\85à·\92-යà·\9cමà·\94à·\80à¶\9aà·\8a à·\83à¶\9aà·\83à·\8f à¶\9cà·\99නයන්න',
 'protectedpagemovewarning' => "'''අවවාදයයි:''' පරිපාලක වරප්‍රසාද සතු පරිශීලකයන්ට පමණක් ගෙන යෑ හැකි පරිදී මෙම පිටුව අවුරා ඇත.
 ආසන්නතම ලඝු සටහන යොමුවන් සඳහා පහතින් සපයනු ලැබේ:",
 'semiprotectedpagemovewarning' => "'''සටහන:''' ලේඛනගත පරිශීලකයන්ට පමණක් ගෙන යෑ හැකි පරිදි මෙම පිටුව අවුරා ඇත.
@@ -2983,8 +2984,8 @@ $1',
 'filedelete-archive-read-only' => 'වෙබ්සේවාදායකය විසින්  "$1"සංරක්ෂික විරෙක්ටරියට ලිවීම සිදුකල නොහැක.',
 
 # Browsing diffs
-'previousdiff' => 'â\86\90 à¶´à·\90රà·\90ණà·\92 à·\83à¶\82à·\83à·\8aà¶\9aරණය',
-'nextdiff' => 'නවීන සංස්කරණය →',
+'previousdiff' => 'â\86\90 à¶´à·\90රණà·\92 à·\83à¶\82à·\83à·\8aà¶\9aරණ',
+'nextdiff' => 'නව සංස්කරණ →',
 
 # Media information
 'mediawarning' => "'''අවවාදයයි''': අනිෂ්ට කේතයන් මෙම ගොනුවෙහි අඩංගු විය හැක.
@@ -3220,7 +3221,7 @@ Others will be hidden by default.
 'exif-countrycreated' => 'රූපය ගන්නා ලද රට',
 'exif-countrycodecreated' => 'රූපය ගන්නා ලද රටෙහි කේතය',
 'exif-provinceorstatecreated' => 'රූපය ගන්නා ලද පළාත හෝ ප්‍රාන්තය',
-'exif-citycreated' => 'රà·\96පය à¶\9cනà·\8aනà·\8f à¶½à¶¯ à¶±à¶\9cරය',
+'exif-citycreated' => 'රà·\96පය à¶\9cනà·\8aනà·\8f à¶½à¶¯ à¶´à·\94රà·\80රය',
 'exif-sublocationcreated' => 'රූපය ගන්නා ලද නගර උප-ස්ථානය',
 'exif-worldregiondest' => 'ලෝක ප්‍රදේශය දක්වා ඇත',
 'exif-countrydest' => 'පෙන්වනලද රට',
@@ -3230,7 +3231,7 @@ Others will be hidden by default.
 'exif-sublocationdest' => 'පුරවරයේ උප-ස්ථානය දක්වා ඇත',
 'exif-objectname' => 'කෙටි මාතෘකාව',
 'exif-specialinstructions' => 'විශේෂ උපදෙස්',
-'exif-headline' => 'à·\81ිරස්තලය',
+'exif-headline' => 'à·\83ිරස්තලය',
 'exif-credit' => 'විශ්වාසය/ප්‍රතිපාදකයා',
 'exif-source' => ' මූලාශ්‍රය',
 'exif-editstatus' => 'රූපයේ සංස්කරණ තත්ත්වය',
@@ -3276,7 +3277,7 @@ Others will be hidden by default.
 'exif-event' => 'විස්තර දක්වන ලද සිද්ධිය',
 'exif-organisationinimage' => 'විස්තර දක්වන ලද සංවිධානය',
 'exif-personinimage' => 'පුද්ගලික වචනයෙන් විස්තර කරන ලද',
-'exif-originalimageheight' => 'à¶\9aà·\90පà·\94මට පෙර රූපයෙහි උස',
+'exif-originalimageheight' => 'à¶\9aපà·\8aපà·\8fදà·\94à·\80ට පෙර රූපයෙහි උස',
 
 # EXIF attributes
 'exif-compression-1' => 'අසංක්ෂිප්ත',
@@ -3290,7 +3291,7 @@ Others will be hidden by default.
 'exif-photometricinterpretation-2' => 'RGB',
 'exif-photometricinterpretation-6' => 'YCbCr',
 
-'exif-unknowndate' => 'à¶\85ඥà·\8fත දිනයකි',
+'exif-unknowndate' => 'නà·\9cදනà·\8aනà·\8f දිනයකි',
 
 'exif-orientation-1' => 'සාමාන්‍ය',
 'exif-orientation-2' => 'තිරස වටා පෙරලා',
@@ -3394,8 +3395,8 @@ Others will be hidden by default.
 'exif-exposuremode-1' => 'හස්තීය නිරාවරණය',
 'exif-exposuremode-2' => 'ස්වයං සමුච්චය',
 
-'exif-whitebalance-0' => 'à·\83à·\8aà·\80යà¶\82à¶\9aà·\8aâ\80\8dරà·\93ය à·\81à·\8aà·\80à·\9aත තුලනය',
-'exif-whitebalance-1' => 'à·\84à·\83à·\8aතà·\93ය  à·\81à·\8aà·\80à·\9aත à¶­à·\94ලනය',
+'exif-whitebalance-0' => 'à·\83à·\94දà·\94 à¶´à·\8fට à·\83à·\8aà·\80යà¶\82à¶\9aà·\8aâ\80\8dරà·\93යà·\80 තුලනය',
+'exif-whitebalance-1' => 'à\94බà·\80à·\92à·\83à·\92නà·\8a à·\83à·\94දà·\94 à¶´à·\8fට  à¶­à·\94ලනයà¶\9aà·\92රà·\93ම',
 
 'exif-scenecapturetype-0' => 'සම්මත',
 'exif-scenecapturetype-1' => 'භූතල තලීය',
@@ -3479,7 +3480,7 @@ Others will be hidden by default.
 'exif-dc-source' => 'මූලාශ්‍ර මාධ්‍ය',
 'exif-dc-type' => 'මාධ්‍ය වර්ගය',
 
-'exif-rating-rejected' => 'ප්‍රතික්ෂිප්ත',
+'exif-rating-rejected' => 'ප්‍රතික්‍ෂේපිත',
 
 'exif-isospeedratings-overflow' => '65535 ට වඩා විශාලතර',
 
@@ -3650,7 +3651,7 @@ This confirmation code will expire at $4.',
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => '{{PLURAL:$1|තත්පරයකට|තත්පර $1 කට}} වඩා නැවුම් වෙනස්වීම්, ලැයිස්තුවෙහි පෙන්නුම් නොවීමට ඉඩ ඇත.',
-'lag-warn-high' => 'දත්ත-ගබඩා සේවාදායකයෙහි අධික විලම්බය නිසා, වෙනස්වීමට පසු ගතවූයේ  {{PLURAL:$1|එක් තත්පරයක්|තත්පර $1 ක්}} පමණක් නම්, ලැයිස්තුවෙහි අන්තර්ගතවී නොතිබිය හැක.',
+'lag-warn-high' => "දත්තසංචිත ස'වරයේ අධි විලම්බය නිසා, වෙනස්වීමට පසු ගතවූයේ  {{PLURAL:$1|එක් තත්පරයක්|තත්පර $1 ක්}} පමණක් නම්, ලැයිස්තුවෙහි අන්තර්ගතවී නොතිබිය හැක.",
 
 # Watchlist editor
 'watchlistedit-numitems' => 'සාකච්ඡා පිටු ගණනය නොකල විට, ඔබගේ මුර-ලැයිස්තුවෙහි  {{PLURAL:$1|ශීර්ෂ එකක්|ශීර්ෂ $1 ක්}} අඩංගු වේ.',
@@ -3761,7 +3762,7 @@ This confirmation code will expire at $4.',
 'version-hook-name' => 'හසුරු නම',
 'version-hook-subscribedby' => 'දායකවී ඇත්තේ',
 'version-version' => '(අනුවාදය $1)',
-'version-license' => 'බලපතà·\8aâ\80\8dරය',
+'version-license' => 'à·\80රපත',
 'version-poweredby-credits' => "මෙම විකිය '''[//www.mediawiki.org/ MediaWiki]''' මගින් බලගන්වා ඇත, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'අනෙකුත්',
 'version-license-info' => 'MediaWiki යනු නිදහස් මෘදුකාංගයකි; නිදහස් මෘදුකාංග පදනමේ (Free Software Foundation) හි GNU General Public License නම් බලපත්‍රයේ වගන්තිවලට අනුව ඔබට එය නැවත බෙදාහැරීම සහ/හෝ සංස්කරණය කළ හැක; ඒ, එම බලපත්‍රයේ 2වන හෝ (ඔබට කැමති නම්) ඉන්පසු එන සංස්කරණයකට අනුවය.
@@ -3799,7 +3800,7 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 * <span class="mw-specialpagecached">කෑෂිත වි‍ශේෂ පිටු (යල් පැන ගිය විය හැක).</span>',
 'specialpages-group-maintenance' => 'නඩත්තු වාර්තා',
 'specialpages-group-other' => 'අනෙකුත් විශේෂ පිටු',
-'specialpages-group-login' => 'පà·\8aâ\80\8dරà·\80à·\92à·\82à·\8aට à·\80න්න / ගිණුමක් තනන්න',
+'specialpages-group-login' => 'පà·\92à·\80à·\92à·\83à·\99න්න / ගිණුමක් තනන්න',
 'specialpages-group-changes' => 'මෑත වෙනස්වීම් හා ලඝු-සටහන්',
 'specialpages-group-media' => 'මාධ්‍ය වාර්තා හා උඩුගත කිරීම්',
 'specialpages-group-users' => 'පරිශීලකයන් හා හිමිකම්',
@@ -3808,11 +3809,11 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'specialpages-group-pagetools' => 'පිටු මෙවලම්',
 'specialpages-group-wiki' => 'විකි දත්ත හා මෙවලම්',
 'specialpages-group-redirects' => 'විශේෂ පිටු යළි-යොමුකිරීම',
-'specialpages-group-spam' => 'à\85යà·\8fචà·\92ත-තà·\90පà·\91ල මෙවලම්',
+'specialpages-group-spam' => 'à·\83à·\8aපà·\91මà·\8a මෙවලම්',
 
 # Special:BlankPage
 'blankpage' => 'හිස් පිටුව',
-'intentionallyblankpage' => 'මà·\99ම à¶´à·\92ටà·\94à·\80 à\85භà·\92පà·\8aâ\80\8dරà·\9aතà·\80 à·\84à·\92à·\83à·\8aà·\80 à¶­à¶¶à¶± à¶½à¶¯à·\92',
+'intentionallyblankpage' => 'මà·\99ම à¶´à·\92ටà·\94à·\80 à·\83à·\92තà·\8fමතà·\8fම à·\84à·\92à·\83à·\8aà·\80 à¶­à¶¶à·\8f à¶\87ත.',
 
 # External image whitelist
 'external_image_whitelist' => '#මෙම පේළිය මෙම අයුරින්ම තිබීමට ඉඩ හරින්න <pre>
@@ -3942,13 +3943,13 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'api-error-ok-but-empty' => 'අභ්‍යන්තර දෝෂය: සර්වරයෙන් ප්‍රතිචාරයක් නොමැත.',
 'api-error-overwrite' => 'දැනටමත් තිබෙන ගොනුවක් යටපත් කෙරුමට ඉඩදෙනු නොලැබේ.',
 'api-error-stashfailed' => 'අභ්‍යන්තර දෝෂය: තාවකාලික ගොනුව සුරක්ෂිත කිරීමට සර්වරයට නොහැකි වුනි.',
-'api-error-timeout' => 'බලාපොරොත්තු වූ කාලය තුල සර්වරය ප්‍රතිචාර නොදක්වන ලදී.',
+'api-error-timeout' => 'බලාපොරොත්තු වූ කාලය තුල ස"වරය ප්‍රතිචාර නොදක්වන ලදී.',
 'api-error-unclassified' => 'හඳුනා නොගත් දෝෂයක් ඇතිවිය.',
 'api-error-unknown-code' => 'නොදත් දෝෂය: "$1"',
 'api-error-unknown-error' => 'අභ්‍යන්තර දෝෂය: ඔබ මෙම ගොනුව උඩුගත කිරීමට තැත් කිරීමේදී කුමක්දෝ වැරදුණා.',
 'api-error-unknown-warning' => 'නොදත් අවවාදය: $1',
 'api-error-unknownerror' => 'හඳුනාගත නොහැකි දෝෂය: "$1".',
 'api-error-uploaddisabled' => 'මෙම විකියෙහි උඩුගතකිරීම අක්‍රිය කොට ඇත.',
-'api-error-verification-error' => 'මà·\99ම à¶\9cà·\9cනà·\94à·\80 à·\83මà·\84රà·\80à·\92ට à¶¯à·\96à·\82à·\92ත à·\80à·\93 à¶\87ත, à·\84à·\9d à¶\91යට à·\80à·\90රදà·\92 à·\80à·\92à·\83à·\8aතà·\92රà·\8aණයà¶\9aà·\8a à¶\87ත.',
+'api-error-verification-error' => 'මà·\99ම à¶\9cà·\9cනà·\94à·\80 à¶´à·\85à·\94දà·\94à·\80à·\93 à·\84à·\9d à¶\91යට à·\80à·\90රදà·\92 à·\80à·\92à·\83à·\8aතà·\92රà·\8aණයà¶\9aà·\8a (extension) à¶\87තà·\94à·\80à·\8f à·\80à·\92යà·\84à·\90à¶\9a.',
 
 );
index 71ce804..ff58c7e 100644 (file)
@@ -409,7 +409,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'pokrač.',
 'index-category' => 'Indexované stránky',
 'noindex-category' => 'neindexované stránky',
-'broken-file-category' => 'Stránky s poškodenými odkazmi súbor',
+'broken-file-category' => 'Stránky s odkazom na neexistujúci súbor',
 
 'about' => 'Projekt',
 'article' => 'Stránka s obsahom',
@@ -964,6 +964,7 @@ Dolu je pre informáciu posledná položka zo záznamu blokovaní:',
 'note' => "'''Poznámka: '''",
 'previewnote' => "'''Nezabudnite, toto je iba náhľad stránky, ktorú upravujete.
 Zmeny ešte nie sú uložené!'''",
+'continue-editing' => 'Pokračovať v úpravách',
 'previewconflict' => 'Tento náhľad upravenej stránky zobrazuje text z horného poľa s textom tak, ako sa zobrazí potom, keď ju uložíte.',
 'session_fail_preview' => "'''Prepáčte, nemohli sme spracovať váš príspevok kvôli strate údajov relácie.
 Skúste to prosím ešte raz.
@@ -1058,6 +1059,10 @@ Tieto argumenty boli vynechané.',
 'parser-template-loop-warning' => 'Zistená slučka v šablónach: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Bol prekročený limit rekurzie šablón ($1)',
 'language-converter-depth-warning' => 'Bolo prekročené obmedzenie hĺbky ($1) jazykového konvertora',
+'node-count-exceeded-category' => 'Stránky s priveľkým počtom uzlov',
+'node-count-exceeded-warning' => 'Stránka prekročila povolený počet uzlov',
+'expansion-depth-exceeded-category' => 'Stránky s priveľkou hĺbkou expanzie',
+'expansion-depth-exceeded-warning' => 'Stránka prekročila povolenú hĺbku expanzie',
 
 # "Undo" feature
 'undo-success' => 'Úpravu je možné vrátiť. Prosím skontrolujte tento rozdiel, čím overíte, že táto úprava je tá, ktorú chcete, a následne uložte zmeny, čím ukončíte vrátenie.',
@@ -3737,6 +3742,9 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'version-software' => 'Nainštalovaný softvér',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Verzia',
+'version-entrypoints' => 'URL vstupných bodov',
+'version-entrypoints-header-entrypoint' => 'Vstupný bod',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Cesta k súboru',
index 55bac68..7d64024 100644 (file)
@@ -222,8 +222,8 @@ $messages = array(
 'tog-watchlisthideown' => 'Na spisku nadzorov skrij moja urejanja',
 'tog-watchlisthidebots' => 'Na spisku nadzorov skrij urejanja botov',
 'tog-watchlisthideminor' => 'Skrij manjša urejanja na spisku nadzorov',
-'tog-watchlisthideliu' => 'Skrij urejanja prijavljenih uporabnikov v spisku nadzorov',
-'tog-watchlisthideanons' => 'Skrij urejanja anonimnih uporabnikov v spisku nadzorov',
+'tog-watchlisthideliu' => 'Skrij urejanja prijavljenih uporabnikov na spisku nadzorov',
+'tog-watchlisthideanons' => 'Skrij urejanja anonimnih uporabnikov na spisku nadzorov',
 'tog-watchlisthidepatrolled' => 'Skrij pregledana urejanja s spiska nadzorov',
 'tog-ccmeonemails' => 'Pošlji mi kopijo e-pošt, ki jih pošljem drugim uporabnikom',
 'tog-diffonly' => 'Ne prikaži vsebine strani pod primerjavo',
@@ -608,7 +608,7 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 'createaccount' => 'Ustvari račun',
 'gotaccount' => 'Račun že imate? $1.',
 'gotaccountlink' => 'Prijavite se',
-'userlogin-resetlink' => 'Ste pozabili svoje podatke za prijavo?',
+'userlogin-resetlink' => 'Ste pozabili svoje prijavne podatke?',
 'createaccountmail' => 'Po e-pošti',
 'createaccountreason' => 'Razlog:',
 'badretype' => 'Gesli, ki ste ju vnesli, se ne ujemata.',
@@ -756,7 +756,7 @@ Začasno geslo: $2',
 'changeemail-oldemail' => 'Trenutni e-poštni naslov:',
 'changeemail-newemail' => 'Novi e-poštni naslov:',
 'changeemail-none' => '(noben)',
-'changeemail-submit' => 'Spremeni e-pošto',
+'changeemail-submit' => 'Spremeni e-naslov',
 'changeemail-cancel' => 'Prekliči',
 
 # Edit page toolbar
@@ -873,9 +873,9 @@ Najnovejši vnos v dnevniku blokad je prikazan spodaj:',
 Vedite, da .css in .js strani po meri uporabljajo naslov z malo začetnico, npr. {{ns:user}}:Blabla/vector.css namesto {{ns:user}}:Blabla/Vector.css.",
 'updated' => '(Posodobljeno)',
 'note' => "'''Opomba:'''",
-'previewnote' => "'''Pomnite, da je to le predogled strani.'''
+'previewnote' => "'''Pomnite, da stran le predogledujete.'''
 Vaših sprememb še nismo shranili!",
-'continue-editing' => 'Nadaljuj z urejanjem',
+'continue-editing' => 'Nadaljujte z urejanjem',
 'previewconflict' => 'V prikazanem predogledu je v zgornjem predelu urejanja navedeno besedilo, kakor se bo prikazalo, če ga boste shranili.',
 'session_fail_preview' => "'''Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja žal ni uspelo obdelati.'''
 Prosimo, poskusite znova.
@@ -970,6 +970,10 @@ Naslednji argumenti so bili izpuščeni.",
 'parser-template-loop-warning' => 'V predlogi je bila odkrita zanka: [[$1]]',
 '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šč',
+'node-count-exceeded-warning' => 'Stran je prekoračila število vozlišč',
+'expansion-depth-exceeded-category' => 'Strani s prekoračeno globino razširitve',
+'expansion-depth-exceeded-warning' => 'Stran je prekoračila globino razširitve',
 
 # "Undo" feature
 'undo-success' => 'Urejanje ste razveljavili. Prosim, potrdite in nato shranite spodnje spremembe.',
@@ -1256,7 +1260,7 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
 'prefs-watchlist-token' => 'Ključ spiska nadzorov:',
 'prefs-misc' => 'Druge nastavitve',
 'prefs-resetpass' => 'Spremeni geslo',
-'prefs-changeemail' => 'Spremeni e-pošto',
+'prefs-changeemail' => 'Spremeni e-poštni naslov',
 'prefs-setemail' => 'Nastavi e-poštni naslov',
 'prefs-email' => 'Možnosti e-pošte',
 'prefs-rendering' => 'Videz',
@@ -1271,10 +1275,10 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
 'resultsperpage' => 'Prikazanih zadetkov na stran:',
 'stub-threshold' => 'Prag označevanja <a href="#" class="stub">škrbin</a> (v bajtih):',
 'stub-threshold-disabled' => 'Onemogočeno',
-'recentchangesdays' => 'Število dni prikazanih v zadnjih spremembah:',
+'recentchangesdays' => 'Število dni, prikazanih v zadnjih spremembah:',
 'recentchangesdays-max' => 'Največ $1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
 'recentchangescount' => 'Privzeto število prikazanih urejanj:',
-'prefs-help-recentchangescount' => 'To vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.',
+'prefs-help-recentchangescount' => 'Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.',
 'prefs-help-watchlist-token' => 'Izpolnjevanje tega polja s skrivnim ključem bo ustvarilo vir RSS za vaš spisek nadzorov.
 Kdorkoli pozna ta ključ bo lahko bral vaš spisek nadzorov, zato izbrite varen in čim daljši ključ.
 Tukaj je naključno ustvarjena vrednost, ki jo lahko uporabite: $1',
@@ -1333,14 +1337,15 @@ Podatek bo javno prikazan.',
 'email' => 'E-pošta',
 'prefs-help-realname' => 'Pravo ime je neobvezno.
 Če se ga odločite navesti, bo uporabljeno za priznavanje vašega dela.',
-'prefs-help-email' => 'E-poštni naslov ni obvezen, vendar vam omogoča, da vam v primeru pozabljenega gesla pošljemo novo.',
-'prefs-help-email-others' => 'Poleg tega vpisan e-poštni naslov omogoča drugim, da vam lahko pošiljajo elektronsko pošto brez razkritja vaše istovetnosti.',
+'prefs-help-email' => 'E-poštni naslov ni obvezen, vendar omogoča, da vam v primeru pozabljenega gesla pošljemo novo.',
+'prefs-help-email-others' => 'Omogočite lahko tudi možnost, da vam lahko ostali uporabniki pošiljajo e-pošto prek vaše uporabniške ali pogovorne strani.
+Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo razkrili.',
 'prefs-help-email-required' => 'E-poštni naslov je obvezen.',
 'prefs-info' => 'Osnovni podatki',
 'prefs-i18n' => 'Internacionalizacija',
 'prefs-signature' => 'Podpis',
 'prefs-dateformat' => 'Zapis datuma',
-'prefs-timeoffset' => 'Čas za izravnavo',
+'prefs-timeoffset' => 'Časovni odmik',
 'prefs-advancedediting' => 'Napredne možnosti',
 'prefs-advancedrc' => 'Napredne možnosti',
 'prefs-advancedrendering' => 'Napredne možnosti',
@@ -1515,7 +1520,7 @@ Podatek bo javno prikazan.',
 'recentchanges-label-newpage' => 'S tem urejanjem je bila ustvarjena nova stran',
 'recentchanges-label-minor' => 'Manjše urejanje',
 'recentchanges-label-bot' => 'To urejanje je bilo izvedeno z botom',
-'recentchanges-label-unpatrolled' => 'To urejanje še ni bilo pregledano',
+'recentchanges-label-unpatrolled' => 'Urejanje še ni bilo pregledano',
 'rcnote' => "Prikazujem {{PLURAL:$1|zadnjo spremembo|zadnji '''$1''' spremembi|zadnje '''$1''' spremembe|zadnjih '''$1''' sprememb|zadnjih '''$1''' sprememb}} v {{PLURAL:$2|zadnjem|zadnjih|zadnjih|zadnjih|zadnjih}} '''$2''' {{PLURAL:$2|dnevu|dneh|dneh|dneh|dneh}}, od $5, $4.",
 'rcnotefrom' => "Navedene so spremembe od '''$2''' dalje (prikazujem jih do '''$1''').",
 'rclistfrom' => 'Prikaži spremembe od $1 naprej',
@@ -1529,7 +1534,7 @@ Podatek bo javno prikazan.',
 'diff' => 'prim',
 'hist' => 'zgod',
 'hide' => 'skrij',
-'show' => 'prikaži',
+'show' => 'Prikaži',
 'minoreditletter' => 'm',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
@@ -1567,11 +1572,11 @@ Strani iz [[Special:Watchlist|vašega spiska nadzorov]] so '''odebeljene'''.",
 
 Dnevnik brisanja in prestavitev za to stran sta navedena tukaj:",
 'uploadtext' => "Spodnji obrazec lahko uporabite za nalaganje datotek.
-Za ogled ali iskanje že naloženih pojdite na [[Special:FileList|seznam naloženih datotek]], ponovne naložitve so zapisane tudi v [[Special:Log/upload|dnevniku nalaganja]], izbrisi pa v [[Special:Log/delete|dnevniku brisanja]].
+Za ogled ali iskanje že naloženih pojdite na [[Special:FileList|seznam naloženih datotek]]; ponovna nalaganja so zabeležena tudi v [[Special:Log/upload|dnevniku nalaganja]], izbrisi pa v [[Special:Log/delete|dnevniku brisanja]].
 
-Datoteko lahko na želeno stran vključite z naslednjo skladnjo
+Datoteko lahko na želeno stran vključite na naslednje načine:
 * '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></tt>''' (polna velikost)
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg|200px|thumb|left|opisno besedilo]]</nowiki></tt>''' (slika pomanjšana na velikost 200px, uokvirjena, z levo poravnavo in opisom »opisno besedilo«)
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg|200px|thumb|left|opisno besedilo]]</nowiki></tt>''' (slika pomanjšana na 200 slikovnih pik širine, uokvirjena, z levo poravnavo in opisom »opisno besedilo«)
 * '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></tt>''' (neposredna povezava z datoteko)",
 'upload-permitted' => 'Dovoljene vrste datotek: $1.',
 'upload-preferred' => 'Priporočene vrste datotek: $1.',
@@ -1850,10 +1855,10 @@ Na voljo je tudi [[Special:WhatLinksHere/$2|celotni seznam]].',
 'morelinkstoimage' => 'Preglejte [[Special:WhatLinksHere/$1|več povezav]] na to datoteko.',
 'linkstoimage-redirect' => '$1 (preusmeritev datoteke) $2',
 'duplicatesoffile' => '{{PLURAL:$1|Sledeča datoteka je dvojnik|Sledeči datoteki sta dvojnika|Sledeče $1 datoteke so dvojniki|Sledečih $1 datotek so dvojniki}} te datoteke ([[Special:FileDuplicateSearch/$2|več podrobnosti]]):',
-'sharedupload' => 'Datoteka je del $1 in se lahko uporabi v drugih projektih.',
-'sharedupload-desc-there' => 'Ta datoteka je iz $1 in se lahko uporablja v drugih projektih.
+'sharedupload' => 'Datoteka je del projekta $1 in se lahko uporabi v drugih projektih.',
+'sharedupload-desc-there' => 'Datoteka je iz projekta $1 in se lahko uporablja v drugih projektih.
 Prosimo, oglejte si [$2 opisno stran datoteke] za dodatne informacije.',
-'sharedupload-desc-here' => 'Ta datoteka je iz $1 in se lahko uporablja v drugih projektih.
+'sharedupload-desc-here' => 'Datoteka je iz projekta $1 in se lahko uporablja v drugih projektih.
 Povzetek na njeni [$2 opisni strani datoteke] je prikazan spodaj.',
 'sharedupload-desc-edit' => 'Datoteka je z $1 in jo morda uporabljajo drugi projekti.
 Morda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datoteke].',
@@ -2196,7 +2201,7 @@ Morebitne spremembe te strani in pripadajoče pogovorne strani bodo navedene tuk
 'unwatchthispage' => 'Prenehaj opazovati stran',
 'notanarticle' => 'Ni članek',
 'notvisiblerev' => 'Redakcija je bila izbrisana',
-'watchnochange' => 'V prikazanem časovnem obdobju se ni spremenila nobena med nadzorovanimi stranmi.',
+'watchnochange' => 'V prikazanem časovnem obdobju ni nihče spremenil nadzorovanih strani.',
 'watchlist-details' => 'Spremljate $1 {{PLURAL:$1|stran|strani|strani|strani|strani}} (pogovorne strani niso vštete).',
 'wlheader-enotif' => '* Obveščanje po elektronski pošti je omogočeno.',
 'wlheader-showupdated' => "* Od vašega zadnjega ogleda spremenjene strani so prikazanje '''krepko'''.",
@@ -2872,8 +2877,8 @@ Prosimo, poskusite znova.',
 'tooltip-ca-delete' => 'Brišite stran',
 'tooltip-ca-undelete' => 'Obnovite pred izbrisom napravljena urejanja strani.',
 'tooltip-ca-move' => 'Preimenujte stran',
-'tooltip-ca-watch' => 'Dodajte stran na seznam nadzorov',
-'tooltip-ca-unwatch' => 'Odstranite stran s seznama nadzorov',
+'tooltip-ca-watch' => 'Dodajte stran na spisek nadzorov',
+'tooltip-ca-unwatch' => 'Odstranite stran s spiska nadzorov',
 'tooltip-search' => 'Preiščite wiki',
 'tooltip-search-go' => 'Pojdi na strani z natanko takim imenom, če obstaja',
 'tooltip-search-fulltext' => 'Najde vneseno besedilo po straneh',
index cec0017..2da10d6 100644 (file)
@@ -999,7 +999,7 @@ $2
 'minoredit' => 'мања измена',
 'watchthis' => 'надгледај ову страницу',
 'savearticle' => 'Сачувај страницу',
-'preview' => 'Преглед',
+'preview' => 'Претпреглед',
 'showpreview' => 'Прикажи претпреглед',
 'showlivepreview' => 'Тренутни преглед',
 'showdiff' => 'Прикажи измене',
@@ -1096,6 +1096,7 @@ $2
 'note' => "'''Напомена:'''",
 'previewnote' => "'''Имајте у виду да је ово само преглед.'''
 Ваше измене још нису сачуване!",
+'continue-editing' => 'Настави уређивање',
 'previewconflict' => 'Овај преглед осликава како ће текст у текстуалном оквиру изгледати.',
 'session_fail_preview' => "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''
 Покушајте поново.
@@ -2514,7 +2515,7 @@ $UNWATCHURL
 Погледајте ''$2'' за више детаља.",
 'dellogpage' => 'Дневник брисања',
 'dellogpagetext' => 'Испод је списак последњих брисања.',
-'deletionlog' => 'иÑ\81Ñ\82оÑ\80иÑ\98а брисања',
+'deletionlog' => 'Ð\94невник брисања',
 'reverted' => 'Враћено на ранију измену',
 'deletecomment' => 'Разлог:',
 'deleteotherreason' => 'Други/додатни разлог:',
@@ -3917,7 +3918,7 @@ $5
 
 # Delete conflict
 'deletedwhileediting' => "'''Упозорење''': ова страница је обрисана након што сте почели с уређивањем!",
-'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|је обрисао}} ову страницу након што сте почели да је уређујете, са следећим разлогом:
+'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|обриса}} ову страницу након што сте почели да је уређујете, са следећим разлогом:
 : ''$2''
 Потврдите да стварно желите да направите страницу.",
 'confirmrecreate-noreason' => 'Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да га уређујете. Потврдите да стварно желите да поново направите ову страницу.',
index e525dfd..42f3ac5 100644 (file)
@@ -2414,7 +2414,7 @@ Potvrdite svoju nameru, da razumete posledice i da ovo radite u skladu s [[{{Med
 Pogledajte ''$2'' za više detalja.",
 'dellogpage' => 'Dnevnik brisanja',
 'dellogpagetext' => 'Ispod je spisak poslednjih brisanja.',
-'deletionlog' => 'istorija brisanja',
+'deletionlog' => 'Dnevnik brisanja',
 'reverted' => 'Vraćeno na raniju izmenu',
 'deletecomment' => 'Razlog:',
 'deleteotherreason' => 'Drugi/dodatni razlog:',
index 515b1b6..ea688e3 100644 (file)
@@ -74,8 +74,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Antaal fon do beooboachtjende Benutsere anwiese',
 'tog-oldsig' => 'Foarbekiek fon ju aktuälle Signatuur:',
 'tog-fancysig' => 'Unnerskrift as Wikitext behonnelje (sunner automatiske Ferlinkenge)',
-'tog-externaleditor' => 'Externen Editor as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide.
-[//www.mediawiki.org/wiki/Manual:External_editors Moor Information hiertou.])',
+'tog-externaleditor' => 'Externen Editor as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide. [//www.mediawiki.org/wiki/Manual:External_editors Moor Information hiertou.])',
 'tog-externaldiff' => 'Extern Diff-Program as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide.
  [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatione hiertou.])',
 'tog-showjumplinks' => '"Wikselje tou"-Links muugelk moakje',
index d189278..b33a220 100644 (file)
@@ -985,6 +985,7 @@ Den har inte sparats än!'''",
 'note' => "'''Obs!'''",
 'previewnote' => "'''Kom ihåg att detta bara är en förhandsvisning.'''
 Dina ändringar har ännu inte sparats!",
+'continue-editing' => 'Fortsätt redigera',
 'previewconflict' => 'Den här förhandsvisningen är resultatet av den
 redigerbara texten ovanför,
 så som det kommer att se ut om du väljer att spara.',
@@ -1081,6 +1082,10 @@ Dessa parametrar har uteslutits.',
 'parser-template-loop-warning' => 'Mall-loop upptäckt: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Gräns för mallrekursionsdjup överskriden ($1)',
 'language-converter-depth-warning' => 'Gräns för språkkonverteringsdjup överskriden ($1)',
+'node-count-exceeded-category' => 'Sidor där antal nodar har överskrids',
+'node-count-exceeded-warning' => 'Sidan har överskridit antalet nodar',
+'expansion-depth-exceeded-category' => 'Sidor där expansionsdjupet överskrids',
+'expansion-depth-exceeded-warning' => 'Sidan överskrider expansionsdjupet',
 
 # "Undo" feature
 'undo-success' => 'Redigeringen kan göras ogjord.
@@ -3771,6 +3776,7 @@ Du bör ha fått [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopia av GNU General Publi
 'version-software' => 'Installerad programvara',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'StartpunktsURLer',
 'version-entrypoints-header-entrypoint' => 'Ingångspunkt',
 'version-entrypoints-header-url' => 'URL',
 
index f26f2f0..9cdf5d1 100644 (file)
@@ -830,6 +830,7 @@ $1 เป็นผู้ดำเนินการบล็อกในคร
 ในบางครั้งปัญหานี้จะเกิดขึ้นถ้าคุณใช้บริการเว็บพร็อกซีนิรนามที่มีบั๊ก",
 'edit_form_incomplete' => "'''บางส่วนของแบบฟอร์มแก้ไขไม่ได้ติดต่อเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังคงอยู่และลองใหม่อีกครั้ง'''",
 'editing' => 'กำลังแก้ไข $1',
+'creating' => 'สร้างหน้า $1',
 'editingsection' => 'กำลังแก้ไข $1 (เฉพาะส่วน)',
 'editingcomment' => 'กำลังแก้ไข $1 (หัวข้อใหม่)',
 'editconflict' => 'แก้ไขชนกัน: $1',
@@ -951,7 +952,7 @@ $1 เป็นผู้ดำเนินการบล็อกในคร
 [[Special:Search|ค้นหาในวิกินี้]] สำหรับหน้าอื่นที่อาจเกี่ยวข้อง',
 
 # Revision deletion
-'rev-deleted-comment' => '(à¸\84วามà¹\80หà¹\87à¸\99ถูกลบออก)',
+'rev-deleted-comment' => '(à¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อถูกลบออก)',
 'rev-deleted-user' => '(ชื่อผู้ใช้ถูกลบออก)',
 'rev-deleted-event' => '(หน้าที่ใส่เข้ามาถูกลบออก)',
 'rev-deleted-user-contribs' => '[ชื่อผู้ใช้หรือหมายเลขไอพีถูกลบแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]',
index f3aa01f..e418d08 100644 (file)
@@ -32,7 +32,7 @@ $messages = array(
 'monday' => 'Дышанбә',
 'tuesday' => 'Сешанбә',
 'wednesday' => 'Чошанбә',
-'thursday' => 'Әјнә шәв',
+'thursday' => 'Ҹымә шәв',
 'friday' => 'Әjнә',
 'saturday' => 'Шанбә',
 'sun' => 'Иша',
@@ -87,7 +87,7 @@ $messages = array(
 'category-empty' => "''Ын категоријә бы дәғиғәдә тәјлије.''",
 'hidden-categories' => '{{PLURAL:$1|Нијони категоријә|Нијони категоријон}}',
 'hidden-category-category' => 'Нијони категоријон',
-'category-subcat-count' => '{{PLURAL:$2|Ым катеријә әнчәх жинтонә жинә категоријонку ибарәте.|Ҹәми $2 категоријонку {{PLURAL:$1|жинә категоријә|$1 жинә категоријә}} нишо доә быә.}}',
+'category-subcat-count' => '{{PLURAL:$2|Ым категоријә әнчәх жинтонә жинә категоријонку ибарәте.|Ҹәми $2 категоријонку {{PLURAL:$1|жинә категоријә|$1 жинә категоријә}} нишо доә быә.}}',
 'category-article-count' => '{{PLURAL:$2|Бы категоријәдә әнҹәх иглә сәһифәје.|Ҹәми $2 сәһифонку нишо доә быә {{PLURAL:$1|сәһифә|$1 сәһифә}} бы категоријәдә.}}',
 'category-article-count-limited' => 'Ын категоријәдә {{PLURAL:$1|$1 сәһифә|}} һесте.',
 'category-file-count' => '{{PLURAL:$2|Бы категоријәдә әнҹәх иглә фајле.|Ҹәми $2 фајлонку нишо доә быә {{PLURAL:$1|фајл|$1 фајл}} бы категоријәдә.}}',
@@ -200,8 +200,8 @@ $messages = array(
 'edithelp' => 'Арајиш бо редактә кардеј',
 'edithelppage' => 'Help:Арајиш бо сәрост кардеј',
 'helppage' => 'Help:Мындәриҹот',
-'mainpage' => 'Јолә сәһифә',
-'mainpage-description' => 'Јолә сәһифә',
+'mainpage' => 'Әсосә сәһифә',
+'mainpage-description' => 'Әсосә сәһифә',
 'policy-url' => 'Project:Ғајдон',
 'portal' => 'Ҹәмјәт',
 'portal-url' => 'Project:Ҹәмјәти портал',
@@ -705,9 +705,9 @@ $messages = array(
 'tooltip-search' => 'Нәве {{SITENAME}}',
 'tooltip-search-go' => 'Гирәм һесте дырыст бәнә бы номи сәһифә бәврә дәвардеј',
 'tooltip-search-fulltext' => 'Сәһифон пәјдо кардеј де ын мәтни',
-'tooltip-p-logo' => 'Дәвардеј бә јолә сәһифә',
-'tooltip-n-mainpage' => 'Дәвардеј бә јолә сәһифә',
-'tooltip-n-mainpage-description' => 'Дәвардеј бә јолә сәһифә',
+'tooltip-p-logo' => 'Дәвардеј бә әсосә сәһифә',
+'tooltip-n-mainpage' => 'Дәвардеј бә әсосә сәһифә',
+'tooltip-n-mainpage-description' => 'Дәвардеј бә әсосә сәһифә',
 'tooltip-n-portal' => 'Нахшә барәдә, чич шымә базнејон  ыјо кардеј, конҹо чич һесте',
 'tooltip-n-currentevents' => 'Есәтнә һодисон сијоһи',
 'tooltip-n-recentchanges' => 'Охонә дәгишон сијоһи',
index 5e96f51..1a33c2b 100644 (file)
@@ -20,6 +20,7 @@
  * @author Goktr001
  * @author Hanberke
  * @author Hcagri
+ * @author Ijon
  * @author Incelemeelemani
  * @author Joseph
  * @author Kaganer
@@ -2116,6 +2117,7 @@ Günlük tipini, kullanıcı adını (büyük-küçük harf duyarlı), ya da etk
 'allpagesprefix' => 'Buraya yazdığınız harflerle başlayan sayfaları listeleyin:',
 'allpagesbadtitle' => 'Girilen sayfa ismi diller arası bağlantı ya da vikiler arası bağlantı içerdiğinden geçerli değil. Başlıklarda kullanılması yasak olan bir ya da daha çok karakter içeriyor olabilir.',
 'allpages-bad-ns' => '{{SITENAME}} sitesinde "$1" ad alanı yok.',
+'allpages-hide-redirects' => 'Yönlendirmeleri gizle',
 
 # Special:Categories
 'categories' => 'Kategoriler',
@@ -2274,8 +2276,8 @@ $NEWPAGE
 Değişikliği yapan kullanıcının açıklaması: $PAGESUMMARY $PAGEMINOREDIT
 
 Sayfayı değiştiren kullanıcıya erişim bilgileri:
-e-posta: $PAGEEDITOR_EMAIL
-viki: $PAGEEDITOR_WIKI
+E-posta: $PAGEEDITOR_EMAIL
+Viki: $PAGEEDITOR_WIKI
 
 Bahsi geçen sayfayı ziyaret edinceye kadar sayfayla ilgili başka değişiklik bildirimi gönderilmeyecektir. İzleme listenizdeki tüm sayfalar bildirim durumlarını sıfırlayabilirsiniz.
 
index b580bd6..a5aac59 100644 (file)
@@ -284,7 +284,7 @@ $messages = array(
 'site-atom-feed' => '$1 Atom Медээ Агымы',
 'page-rss-feed' => '«$1» RSS Медээ Агымы',
 'page-atom-feed' => '«$1» Atom Медээ Агымы',
-'red-link-title' => '$1 (арынны чок)',
+'red-link-title' => '$1 (арны чок)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Арын',
@@ -444,6 +444,7 @@ The password for this new account can be changed on the ''[[Special:ChangePasswo
 'currentrev' => 'Амгы үе үндүрери',
 'currentrev-asof' => 'Амгы $1 үениң бижээни',
 'revisionasof' => '$1 версиязы',
+'revision-info' => '$2 киржикчиниң $1 хүнүнде киирилдези',
 'previousrevision' => '←Артык эрги үндүрери',
 'nextrevision' => 'Артык чаа үндүрери→',
 'currentrevisionlink' => 'Амгы үе үндүрери',
@@ -519,6 +520,7 @@ The password for this new account can be changed on the ''[[Special:ChangePasswo
 'searchprofile-advanced-tooltip' => 'Айыткан аттар делгемнеринден дилээри',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 сөс}})',
 'search-section' => '(«$1» деп салбыр)',
+'search-suggest' => 'Силер «$1» деп бодадыңар чадавас',
 'search-interwiki-more' => '(артык)',
 'search-mwsuggest-enabled' => 'саналдар',
 'search-mwsuggest-disabled' => 'саналдар чок',
@@ -753,6 +755,8 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'statistics' => 'Статистика',
 'statistics-pages' => 'Арыннар',
 
+'disambiguationspage' => 'Майык: уш-бажы билдинмес',
+
 'brokenredirects-edit' => 'өскертири',
 'brokenredirects-delete' => 'ырадыры',
 
@@ -942,6 +946,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'whatlinkshere-next' => '{{PLURAL:$1|дараазында|дараазында $1}}',
 'whatlinkshere-links' => '← холбаалар',
 'whatlinkshere-hideredirs' => '$1-че шиглиглер',
+'whatlinkshere-hidetrans' => '$1 даңзылааннар',
 'whatlinkshere-hidelinks' => 'холбааларны $1',
 'whatlinkshere-hideimages' => 'Чурумалдың холбааларын $1',
 'whatlinkshere-filters' => 'Шүүрлер',
@@ -961,6 +966,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'ipblocklist-submit' => 'Дилээр',
 'infiniteblock' => 'кезээ-мөңгеде',
 'blocklink' => 'кызыгаарлаары',
+'unblocklink' => 'ажыдып хостаар',
 'change-blocklink' => 'кызыгаарлаашкынны өскертири',
 'contribslink' => 'немелделер',
 'blocklogpage' => 'Кызыгаарлаашкынның журналы',
@@ -1083,6 +1089,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 # Media information
 'widthheightpage' => '$1x$2, $3 {{PLURAL:$3|арын}}',
 'file-info-size' => '$1 × $2 пиксел, Файл хемчээли: $3, MIME янзызы: $4',
+'file-nohires' => 'Оон улуг хевири чок',
 'svg-long-desc' => 'SVG файл, $1 x $2 пиксел, файл хемчээли: $3',
 'show-big-image' => 'Улуг чурук',
 'show-big-image-size' => '$1 × $2 пиксел',
index af3489a..57a1a94 100644 (file)
@@ -14,6 +14,7 @@
  * @author Rachitrali
  * @author Reedy
  * @author Wisesabre
+ * @author ZxxZxxZ
  * @author לערי ריינהארט
  * @author سمرقندی
  * @author محبوب عالم
@@ -902,7 +903,7 @@ HTML tags جانچئے.',
 'userrights' => 'حقوقِ صارف کی نظامت',
 'userrights-lookup-user' => 'گروہائے صارف کا انتظام',
 'userrights-user-editname' => 'کوئی اسم‌صارف داخل کیجئے:',
-'editinguser' => "تبدیلئ حقوق برائے صارف '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "تبدیلئ حقوق برائے صارف '''[[صارف:$1|$1]]''' $2",
 'userrights-groupsmember' => 'رکنِ:',
 'userrights-reason' => 'وجہ:',
 'userrights-no-interwiki' => 'دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.',
index 5523ea3..2b5966b 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Uzbek (O'zbek)
+/** Uzbek (Oʻzbek)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -9,6 +9,8 @@
  *
  * @author Abdulla
  * @author Behzod Saidov <behzodsaidov@gmail.com>
+ * @author Casual
+ * @author Lyncos
  * @author Urhixidur
  */
 
@@ -48,237 +50,246 @@ $namespaceAliases = array(
 $linkTrail = '/^([a-zʻʼ“»]+)(.*)$/sDu';
 
 $messages = array(
+'underline-always' => 'Har doim',
+'underline-never' => 'Hech qachon',
+
 # Dates
-'sunday'        => 'Yakshanba',
-'monday'        => 'Dushanba',
-'tuesday'       => 'Seshanba',
-'wednesday'     => 'Chorshanba',
-'thursday'      => 'Payshanba',
-'friday'        => 'Juma',
-'saturday'      => 'Shanba',
-'sun'           => 'Yak',
-'mon'           => 'Dsh',
-'tue'           => 'Ssh',
-'wed'           => 'Chr',
-'thu'           => 'Pay',
-'fri'           => 'Jum',
-'sat'           => 'Shn',
-'january'       => 'yanvar',
-'february'      => 'fevral',
-'march'         => 'mart',
-'april'         => 'aprel',
-'may_long'      => 'may',
-'june'          => 'iyun',
-'july'          => 'iyul',
-'august'        => 'avgust',
-'september'     => 'sentabr',
-'october'       => 'oktabr',
-'november'      => 'noyabr',
-'december'      => 'dekabr',
-'january-gen'   => 'yanvarning',
-'february-gen'  => 'fevralning',
-'march-gen'     => 'martning',
-'april-gen'     => 'aprelning',
-'may-gen'       => 'mayning',
-'june-gen'      => 'iyunning',
-'july-gen'      => 'iyulning',
-'august-gen'    => 'avgustning',
+'sunday' => 'Yakshanba',
+'monday' => 'Dushanba',
+'tuesday' => 'Seshanba',
+'wednesday' => 'Chorshanba',
+'thursday' => 'Payshanba',
+'friday' => 'Juma',
+'saturday' => 'Shanba',
+'sun' => 'Yak',
+'mon' => 'Dsh',
+'tue' => 'Ssh',
+'wed' => 'Chr',
+'thu' => 'Pay',
+'fri' => 'Jum',
+'sat' => 'Shn',
+'january' => 'yanvar',
+'february' => 'fevral',
+'march' => 'mart',
+'april' => 'aprel',
+'may_long' => 'may',
+'june' => 'iyun',
+'july' => 'iyul',
+'august' => 'avgust',
+'september' => 'sentabr',
+'october' => 'oktabr',
+'november' => 'noyabr',
+'december' => 'dekabr',
+'january-gen' => 'yanvarning',
+'february-gen' => 'fevralning',
+'march-gen' => 'martning',
+'april-gen' => 'aprelning',
+'may-gen' => 'mayning',
+'june-gen' => 'iyunning',
+'july-gen' => 'iyulning',
+'august-gen' => 'avgustning',
 'september-gen' => 'sentabrning',
-'october-gen'   => 'oktabrning',
-'november-gen'  => 'noyabrning',
-'december-gen'  => 'dekabrning',
-'jan'           => 'yan',
-'feb'           => 'fev',
-'mar'           => 'mar',
-'apr'           => 'apr',
-'may'           => 'may',
-'jun'           => 'iyn',
-'jul'           => 'iyl',
-'aug'           => 'avg',
-'sep'           => 'sen',
-'oct'           => 'okt',
-'nov'           => 'noy',
-'dec'           => 'dek',
+'october-gen' => 'oktabrning',
+'november-gen' => 'noyabrning',
+'december-gen' => 'dekabrning',
+'jan' => 'yan',
+'feb' => 'fev',
+'mar' => 'mar',
+'apr' => 'apr',
+'may' => 'may',
+'jun' => 'iyn',
+'jul' => 'iyl',
+'aug' => 'avg',
+'sep' => 'sen',
+'oct' => 'okt',
+'nov' => 'noy',
+'dec' => 'dek',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Turkum|Turkumlar}}',
-'category_header'        => '"$1" turkumidagi maqolalar.',
-'subcategories'          => 'Ostturkumlar',
-'category-empty'         => "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
-'hidden-categories'      => '{{PLURAL:$1|Yashirin turkum|Yashirin turkumlar}}',
-'category-subcat-count'  => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|ostturkum|$1 ostturkumlar}}, hammasi boʻlib $2 ta ostturkum mavjud.}}',
+'pagecategories' => '{{PLURAL:$1|Turkum|Turkumlar}}',
+'category_header' => '"$1" turkumidagi maqolalar.',
+'subcategories' => 'Ostturkumlar',
+'category-empty' => "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
+'hidden-categories' => '{{PLURAL:$1|Yashirin turkum|Yashirin turkumlar}}',
+'category-subcat-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|ostturkum|$1 ostturkumlar}}, hammasi boʻlib $2 ta ostturkum mavjud.}}',
 'category-article-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta sahifa mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}}, hammasi boʻlib $2 ta sahifa mavjud.}}',
 'listingcontinuesabbrev' => 'davomi',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xffʻʼ«„]+)$/sDu',
 
-'about'      => 'Haqida',
-'newwindow'  => '(yangi oynada ochiladi)',
-'cancel'     => 'Voz kechish',
-'mytalk'     => 'Suhbatim',
-'anontalk'   => 'Bu IP uchun suhbat',
+'about' => 'Haqida',
+'newwindow' => '(yangi oynada ochiladi)',
+'cancel' => 'Voz kechish',
+'moredotdotdot' => 'Batafsil...',
+'mytalk' => 'Suhbatim',
+'anontalk' => 'Bu IP uchun suhbat',
 'navigation' => 'Saytda harakatlanish',
-'and'        => '&#32;va',
+'and' => '&#32;va',
 
 # Cologne Blue skin
-'qbedit'         => 'Tahrirlash',
+'qbedit' => 'Tahrirlash',
 'qbspecialpages' => 'Maxsus sahifalar',
 
 # Vector skin
-'vector-view-create'     => 'Yarat',
-'vector-view-edit'       => 'Tahrirla',
-'vector-view-history'    => 'Tarix',
-'vector-view-view'       => 'Mutolaa',
+'vector-action-delete' => 'O‘chirish',
+'vector-action-move' => 'Ko‘chirish',
+'vector-view-create' => 'Yarat',
+'vector-view-edit' => 'Tahrirla',
+'vector-view-history' => 'Tarix',
+'vector-view-view' => 'Mutolaa',
 'vector-view-viewsource' => 'Manbasini koʻrsat',
-'actions'                => 'Amallar',
-'namespaces'             => 'Nomfazolar',
-'variants'               => 'Variantlar',
-
-'errorpagetitle'   => 'Xato',
-'returnto'         => '$1 sahifasiga qaytish.',
-'tagline'          => '{{SITENAME}} dan',
-'help'             => 'Yordam',
-'search'           => 'Qidirish',
-'searchbutton'     => 'Qidirish',
-'go'               => "O'tish",
-'searcharticle'    => "O'tish",
-'history'          => 'Sahifa tarixi',
-'history_short'    => 'Tarix',
+'actions' => 'Amallar',
+'namespaces' => 'Nomfazolar',
+'variants' => 'Variantlar',
+
+'errorpagetitle' => 'Xato',
+'returnto' => '$1 sahifasiga qaytish.',
+'tagline' => '{{SITENAME}} dan',
+'help' => 'Yordam',
+'search' => 'Qidirish',
+'searchbutton' => 'Qidirish',
+'go' => "O'tish",
+'searcharticle' => 'O‘tish',
+'history' => 'Sahifa tarixi',
+'history_short' => 'Tarix',
 'printableversion' => 'Bosma uchun versiya',
-'permalink'        => 'Doimiy ishorat',
-'print'            => 'Chop et',
-'view'             => 'Koʻrish',
-'edit'             => 'Tahrirlash',
-'create'           => 'Yarat',
-'editthispage'     => 'Sahifani tahrirla',
+'permalink' => 'Doimiy ishorat',
+'print' => 'Chop et',
+'view' => 'Koʻrish',
+'edit' => 'Tahrirlash',
+'create' => 'Yaratish',
+'editthispage' => 'Sahifani tahrirlash',
 'create-this-page' => 'Bu sahifani yarat',
-'delete'           => "O'chirish",
-'protect'          => 'Himoyalash',
-'protectthispage'  => 'Bu sahifani himoyala',
-'unprotect'        => 'Himoyadan chiqarish',
-'newpage'          => 'Yangi sahifa',
-'talkpage'         => 'Bu sahifa haqida munozara',
+'delete' => 'O‘chirish',
+'protect' => 'Himoyalash',
+'protect_change' => 'o‘zgartirish',
+'protectthispage' => 'Ushbu sahifani himoyalash',
+'unprotect' => 'Himoyadan chiqarish',
+'newpage' => 'Yangi sahifa',
+'talkpage' => 'Bu sahifa haqida munozara',
 'talkpagelinktext' => 'Munozara',
-'specialpage'      => 'Maxsus sahifa',
-'personaltools'    => 'Shaxsiy uskunalar',
-'postcomment'      => 'Yangi boʻlim',
-'talk'             => 'Munozara',
-'views'            => "Ko'rinishlar",
-'toolbox'          => 'Asboblar',
-'categorypage'     => 'Turkum sahifasi',
-'viewtalkpage'     => 'Munozara',
-'otherlanguages'   => 'Boshqa tillarda',
-'redirectedfrom'   => '($1dan yoʻnaltirildi)',
-'redirectpagesub'  => 'Yoʻnaltiruvchi sahifa',
-'lastmodifiedat'   => 'Bu sahifa oxirgi marta $2, $1 sanasida tahrirlangan.',
-'viewcount'        => 'Bu sahifaga {{PLURAL:$1|bir marta|$1 marta}} murojaat qilingan.',
-'protectedpage'    => 'Himoyalangan sahifa',
-'jumpto'           => 'Oʻtish:',
+'specialpage' => 'Maxsus sahifa',
+'personaltools' => 'Shaxsiy uskunalar',
+'postcomment' => 'Yangi boʻlim',
+'talk' => 'Munozara',
+'views' => 'Ko‘rinishlar',
+'toolbox' => 'Asboblar',
+'categorypage' => 'Turkum sahifasi',
+'viewtalkpage' => 'Munozara',
+'otherlanguages' => 'Boshqa tillarda',
+'redirectedfrom' => '($1dan yoʻnaltirildi)',
+'redirectpagesub' => 'Yoʻnaltiruvchi sahifa',
+'lastmodifiedat' => 'Bu sahifa oxirgi marta $2, $1 sanasida tahrirlangan.',
+'viewcount' => 'Bu sahifaga {{PLURAL:$1|bir marta|$1 marta}} murojaat qilingan.',
+'protectedpage' => 'Himoyalangan sahifa',
+'jumpto' => 'Oʻtish:',
 'jumptonavigation' => 'foydalanish',
-'jumptosearch'     => 'Qidir',
+'jumptosearch' => 'Qidir',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => '{{SITENAME}} haqida',
-'aboutpage'            => 'Project:Haqida',
-'copyright'            => 'Kontent $1 ostidadir.',
-'currentevents'        => 'Joriy hodisalar',
-'currentevents-url'    => 'Project:Joriy hodisalar',
-'disclaimers'          => 'Ogohlantirishlar',
-'disclaimerpage'       => 'Project:Umumiy ogohlatirish',
-'edithelp'             => 'Tahrirlash yordami',
-'edithelppage'         => 'Help:Tahrirlash',
-'helppage'             => 'Help:Mundarija',
-'mainpage'             => 'Bosh sahifa',
+'aboutsite' => '{{SITENAME}} haqida',
+'aboutpage' => 'Project:Haqida',
+'copyright' => 'Kontent $1 ostidadir.',
+'currentevents' => 'Joriy hodisalar',
+'currentevents-url' => 'Project:Joriy hodisalar',
+'disclaimers' => 'Ogohlantirishlar',
+'disclaimerpage' => 'Project:Umumiy ogohlantirish',
+'edithelp' => 'Tahrirlash yordami',
+'edithelppage' => 'Help:Tahrirlash',
+'helppage' => 'Help:Mundarija',
+'mainpage' => 'Bosh sahifa',
 'mainpage-description' => 'Bosh sahifa',
-'portal'               => 'Jamoa portali',
-'portal-url'           => 'Project:Jamoa portali',
-'privacy'              => 'Konfidensiallik siyosati',
-'privacypage'          => 'Project:Konfidensiallik siyosati',
-
-'retrievedfrom'        => ' "$1" dan olindi',
-'youhavenewmessages'   => 'Sizga $1 keldi ($2).',
-'newmessageslink'      => 'yangi xabarlar',
-'newmessagesdifflink'  => 'soʻnggi oʻzgarish',
-'editsection'          => 'tahrirlash',
-'editold'              => 'tahrir',
-'editlink'             => 'tahrirla',
-'viewsourcelink'       => 'manbasini koʻr',
-'editsectionhint'      => 'Boʻlimni tahrirlash: $1',
-'toc'                  => 'Mundarija',
-'showtoc'              => "Ko'rsatish",
-'hidetoc'              => 'yashirish',
+'portal' => 'Jamoa portali',
+'portal-url' => 'Project:Jamoa portali',
+'privacy' => 'Konfidensiallik siyosati',
+'privacypage' => 'Project:Konfidensiallik siyosati',
+
+'retrievedfrom' => ' "$1" dan olindi',
+'youhavenewmessages' => 'Sizga $1 keldi ($2).',
+'newmessageslink' => 'yangi xabarlar',
+'newmessagesdifflink' => 'soʻnggi oʻzgarish',
+'editsection' => 'tahrirlash',
+'editold' => 'tahrir',
+'editlink' => 'tahrirla',
+'viewsourcelink' => 'manbasini koʻr',
+'editsectionhint' => 'Boʻlimni tahrirlash: $1',
+'toc' => 'Mundarija',
+'showtoc' => "Ko'rsatish",
+'hidetoc' => 'yashirish',
 'collapsible-collapse' => 'Yashir',
-'collapsible-expand'   => 'Koʻrsat',
-'red-link-title'       => '$1 (sahifa yaratilmagan)',
+'collapsible-expand' => 'Koʻrsat',
+'page-atom-feed' => '«$1» — Atom-lenta',
+'red-link-title' => '$1 (sahifa yaratilmagan)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Maqola',
-'nstab-user'     => 'Foydalanuvchi sahifasi',
-'nstab-special'  => 'Maxsus sahifa',
-'nstab-project'  => 'Loyiha sahifasi',
-'nstab-image'    => 'Fayl',
+'nstab-main' => 'Maqola',
+'nstab-user' => 'Foydalanuvchi sahifasi',
+'nstab-special' => 'Maxsus sahifa',
+'nstab-project' => 'Loyiha sahifasi',
+'nstab-image' => 'Fayl',
 'nstab-template' => 'Andoza',
-'nstab-help'     => 'Yordam sahifasi',
+'nstab-help' => 'Yordam sahifasi',
 'nstab-category' => 'Turkum',
 
 # General errors
-'error'             => 'Xato',
-'badtitle'          => 'Notoʻgʻri sarlavha',
-'viewsource'        => 'Manbasini koʻrish',
+'error' => 'Xato',
+'badtitle' => 'Notoʻgʻri sarlavha',
+'viewsource' => 'Manbasini koʻrish',
 'protectedpagetext' => 'Bu sahifa tahrirlashdan saqlanish maqsadida qulflangan.',
-'viewsourcetext'    => "Siz bu sahifaning manbasini ko'rishingiz va uni nusxasini olishingiz mumkin:",
+'viewsourcetext' => "Siz bu sahifaning manbasini ko'rishingiz va uni nusxasini olishingiz mumkin:",
 
 # Login and logout pages
-'logouttext'              => "'''Siz saytdan muvaffaqiyatli chiqdingiz.'''
+'logouttext' => "'''Siz saytdan muvaffaqiyatli chiqdingiz.'''
 
 {{SITENAME}} saytidan anonim holda foydalanishda davom etishindiz mumkin. Yoki siz yana hozirgi yoki boshqa foydalanuvchi nomi bilan qaytadan tizimga kirishingiz mumkin.
 Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguningizga qadar xuddi tizimga kirganingizdagidek ko'rinishda davom etaverishi mumkin.",
-'yourname'                => 'Foydalanuvchi nomi',
-'yourpassword'            => "Maxfiy so'z",
-'yourpasswordagain'       => "Maxfiy so'zni qayta kiriting",
-'remembermypassword'      => "Hisob ma'lumotlarini shu kompyuterda eslab qolish (for a maximum of $1 {{PLURAL:$1|day|days}})",
-'login'                   => 'Kirish',
+'yourname' => 'Foydalanuvchi nomi',
+'yourpassword' => 'Maxfiy soʻz',
+'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
+'remembermypassword' => 'Hisob ma’lumotlarini ushbu kompyuterda eslab qolish (eng ko‘pi bilan $1 {{PLURAL:$1|kun|kun}} uchun)',
+'login' => 'Kirish',
 'nav-login-createaccount' => 'Kirish / Hisob yaratish',
-'loginprompt'             => "{{SITENAME}}ga kirish uchun kukilar yoqilgan bo'lishi kerak.",
-'userlogin'               => 'Kirish / Hisob yaratish',
-'logout'                  => 'Chiqish',
-'userlogout'              => 'Chiqish',
-'nologin'                 => "Hisobingiz yoʻqmi? '''$1'''.",
-'nologinlink'             => 'Hisob yaratish',
-'createaccount'           => 'Hisob yaratish',
-'gotaccount'              => "Hisobingiz bormi? '''$1'''.",
-'gotaccountlink'          => 'Kirish',
-'loginsuccesstitle'       => 'Kirish muvaffaqiyatli amalga oshdi',
-'loginsuccess'            => "'''{{SITENAME}}ga \"\$1\" foydalanuvchi nomi bilan kirdingiz.'''",
-'wrongpassword'           => 'Kiritgan mahfiy soʻzingiz notoʻgʻri. Iltimos, qaytadan kiritib koʻring.',
+'loginprompt' => "{{SITENAME}}ga kirish uchun kukilar yoqilgan bo'lishi kerak.",
+'userlogin' => 'Kirish / Hisob yaratish',
+'logout' => 'Chiqish',
+'userlogout' => 'Chiqish',
+'nologin' => "Hisobingiz yoʻqmi? '''$1'''.",
+'nologinlink' => 'Hisob yaratish',
+'createaccount' => 'Hisob yaratish',
+'gotaccount' => "Hisobingiz bormi? '''$1'''.",
+'gotaccountlink' => 'Kirish',
+'loginsuccesstitle' => 'Kirish muvaffaqiyatli amalga oshdi',
+'loginsuccess' => "'''{{SITENAME}}ga \"\$1\" foydalanuvchi nomi bilan kirdingiz.'''",
+'wrongpassword' => 'Kiritgan mahfiy soʻzingiz notoʻgʻri. Iltimos, qaytadan kiritib koʻring.',
+'loginlanguagelabel' => 'Til: $1',
 
 # Change password dialog
 'retypenew' => 'Yangi mahfiy soʻzni qayta tering:',
 
 # Edit page toolbar
-'bold_sample'     => 'Qalin matn',
-'bold_tip'        => 'Qalin matn',
-'italic_sample'   => 'Kursiv',
-'italic_tip'      => 'Kursiv',
-'link_sample'     => 'Ishorat nomi',
-'link_tip'        => 'Ichki ishorat',
-'extlink_sample'  => 'http://www.example.com ishorat nomi',
-'extlink_tip'     => 'Tashqi ishorat (http:// prefiksini unutmang)',
+'bold_sample' => 'Qalin matn',
+'bold_tip' => 'Qalin matn',
+'italic_sample' => 'Kursiv',
+'italic_tip' => 'Kursiv',
+'link_sample' => 'Ishorat nomi',
+'link_tip' => 'Ichki ishorat',
+'extlink_sample' => 'http://www.example.com ishorat nomi',
+'extlink_tip' => 'Tashqi ishorat (http:// prefiksini unutmang)',
 'headline_sample' => 'Sarlavha',
-'image_tip'       => 'Qoʻshilgan tasvir',
-'media_tip'       => 'Faylga ishorat',
-'sig_tip'         => 'Imzoingiz va sana',
+'image_tip' => 'Qoʻshilgan tasvir',
+'media_tip' => 'Faylga ishorat',
+'sig_tip' => 'Imzoingiz va sana',
 
 # Edit pages
-'summary'                    => 'Qisqa izoh:',
-'minoredit'                  => 'Bu kichik tahrir',
-'watchthis'                  => 'Sahifani kuzatish',
-'savearticle'                => 'Saqlash',
-'preview'                    => "Ko'rib chiqish",
-'showpreview'                => "Ko'rib chiqish",
-'showdiff'                   => "O'zgarishlarni ko'rsatish",
-'anoneditwarning'            => "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
-'blockedtext'                => "'''Siz (foydalanuvchi ismingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
+'summary' => 'Qisqa izoh:',
+'minoredit' => 'Bu kichik tahrir',
+'watchthis' => 'Sahifani kuzatish',
+'savearticle' => 'Saqlash',
+'preview' => 'Ko‘rib chiqish',
+'showpreview' => 'Ko‘rib chiqish',
+'showdiff' => 'O‘zgarishlarni ko‘rsatish',
+'anoneditwarning' => "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
+'blockedtext' => "'''Siz (foydalanuvchi ismingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
 
 Sizni $1 chetlashtirdi. Bunga sabab: ''$2''.
 
@@ -288,27 +299,27 @@ Sizni $1 chetlashtirdi. Bunga sabab: ''$2''.
 Siz $1 yoki boshqa [[{{MediaWiki:Grouppage-sysop}}|administrator]] bilan bogʻlanib, arz qilishingiz mumkin.
 You cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
 Sizning hozirgi IP manzilingiz - $3, chetlashtirish raqamingiz - #$5. Arizaga bularni ilova qilishingiz mumkin.",
-'newarticle'                 => '(Yangi)',
-'newarticletext'             => "Bu sahifa hali mavjud emas.
+'newarticle' => '(Yangi)',
+'newarticletext' => "Bu sahifa hali mavjud emas.
 Sahifani yaratish uchun quyida matn kiritishingiz mumkin (qo'shimcha axborot uchun [[{{MediaWiki:Helppage}}|yordam sahifasini]] ko'ring).
 Agar bu sahifaga xatolik sabab kelgan bo'lsangiz brauzeringizning '''orqaga''' tugmasini bosing.",
-'noarticletext'              => 'Bu sahifada hozircha hech qanday matn yoʻq. Siz bu sarlavhani boshqa sahifalardan [[Special:Search/{{PAGENAME}}|qidirishingiz]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tegishli loglarga qarashingiz] yoki bu sahifani [{{fullurl:{{FULLPAGENAME}}|action=edit}} tahrirlashingiz]</span> mumkin.',
-'clearyourcache'             => "'''Etibor bering:''' O'zgartirishlaringiz ko'rish uchun, yangi moslamalaringizning saqlashdan keyin, brauser keshini tozalash kerak:<br />
+'noarticletext' => 'Bu sahifada hozircha hech qanday matn yoʻq. Siz bu sarlavhani boshqa sahifalardan [[Special:Search/{{PAGENAME}}|qidirishingiz]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tegishli loglarga qarashingiz] yoki bu sahifani [{{fullurl:{{FULLPAGENAME}}|action=edit}} tahrirlashingiz]</span> mumkin.',
+'clearyourcache' => "'''Etibor bering:''' O'zgartirishlaringiz ko'rish uchun, yangi moslamalaringizning saqlashdan keyin, brauser keshini tozalash kerak:<br />
 '''Mozilla / Firefox:''' ''Ctrl+Shift+R'', '''IE:''' ''Ctrl+F5'', '''Safari:''' ''Cmd+Shift+R'', '''Konqueror:''' ''F5'', '''Opera:''' ''Tools → Preferences'' orqali keshni tozalang.",
-'previewnote'                => "'''Bu shunchaki ko'rib chiqish. O'zgarishlar hali saqlangani yo'q!'''",
-'editing'                    => '$1 tahrirlanmoqda',
-'editingsection'             => '$1 (boʻlim) tahrirlanmoqda',
-'copyrightwarning'           => "Iltimos, {{SITENAME}}ga yuklangan har qanday axborot $2 ostida tarqatilishiga diqqat qiling (batafsil ma'lumot uchun $1ni ko'ring).
+'previewnote' => "'''Bu shunchaki ko‘rib chiqish. O‘zgartirishlar hali saqlangani yo‘q!'''",
+'editing' => '$1 tahrirlanmoqda',
+'editingsection' => '$1 (boʻlim) tahrirlanmoqda',
+'copyrightwarning' => "Iltimos, {{SITENAME}}ga yuklangan har qanday axborot $2 ostida tarqatilishiga diqqat qiling (batafsil ma'lumot uchun $1ni ko'ring).
 Agar yozganlaringiz keyinchalik tahrir qilinishi va qayta tarqatilishiga rozi bo'lmasangiz, u holda bu yerga yozmang.<br />
 Siz shuningdek bu yozganlaringiz sizniki yoki erkin litsenziya ostida ekanligini va'da qilmoqdasiz.
 '''MUALLIFLIK HUQUQLARI BILAN HIMOYALANGAN ISHLARNI ZINHOR BERUXSAT YUBORMANG!'''",
-'copyrightwarning2'          => "Iltimos, shuni esda tutingki, {{SITENAME}} sahifalaridagi barcha matnlar boshqa foydalanuvchilar tomonidan tahrirlanishi, almashtirilishi yoki o'chirilishi mumkin. Agar siz yozgan ma'lumotlaringizni bunday tartibda tahrirlanishiga rozi bo'lmasangiz, unda uni bu yerga joylashtirmang.<br />
+'copyrightwarning2' => "Iltimos, shuni esda tutingki, {{SITENAME}} sahifalaridagi barcha matnlar boshqa foydalanuvchilar tomonidan tahrirlanishi, almashtirilishi yoki o'chirilishi mumkin. Agar siz yozgan ma'lumotlaringizni bunday tartibda tahrirlanishiga rozi bo'lmasangiz, unda uni bu yerga joylashtirmang.<br />
 Bundan tashqari, siz ushbu ma'lumotlarni o'zingiz yozgan bo'lishingiz yoki ruxsat berilgan internet manzilidan yoki shu kabi erkin resursdan nusxa olgan bo'lishingiz lozim (Qo'shimcha ma'lumotlar ushun $1 sahifasiga murojaat qiling).
 '''MUALLIFLIK HUQUQI QO'YILGAN ISHLARNI RUXSATSIZ BU YERGA JOYLASHTIRMANG!'''",
-'templatesused'              => '{{PLURAL:$1|Template|Templates}} used on this page:',
-'template-protected'         => '(himoyalangan)',
-'template-semiprotected'     => '(yarim-himoyalangan)',
-'nocreatetext'               => 'Ushbu sayt yangi sahifa yaratishni taqiqlagan.
+'templatesused' => 'Ushbu sahifada foydalanilgan {{PLURAL:$1|andoza|andozalar}}:',
+'template-protected' => '(himoyalangan)',
+'template-semiprotected' => '(yarim-himoyalangan)',
+'nocreatetext' => 'Ushbu sayt yangi sahifa yaratishni taqiqlagan.
 Ortga qaytib, mavjud sahifani tahrirlashingiz yoki [[Special:UserLogin|tizimga kirishingiz]] mumkin.',
 'recreate-moveddeleted-warn' => "'''Diqqat: Siz avval yoʻqotilgan sahifani yana yaratmoqchisiz.'''
 
@@ -316,136 +327,150 @@ Bu sahifani yaratishda davom etishdan avval uning nega avval yoʻqotilgani bilan
 Qulaylik uchun quyida yoʻqotilish qaydlari keltirilgan:",
 
 # History pages
-'viewpagelogs'        => 'Ushbu sahifaga doir qaydlarni koʻrsat',
-'currentrev'          => 'Hozirgi koʻrinishi',
-'currentrev-asof'     => '$1dagi, joriy koʻrinishi',
-'revisionasof'        => '$1 paytdagi koʻrinishi',
-'previousrevision'    => '←Avvalgi koʻrinishi',
-'nextrevision'        => 'Yangiroq koʻrinishi→',
+'viewpagelogs' => 'Ushbu sahifaga doir qaydlarni koʻrsat',
+'currentrev' => 'Hozirgi koʻrinishi',
+'currentrev-asof' => '$1dagi, joriy koʻrinishi',
+'revisionasof' => '$1 paytdagi koʻrinishi',
+'previousrevision' => '←Avvalgi koʻrinishi',
+'nextrevision' => 'Yangiroq koʻrinishi→',
 'currentrevisionlink' => 'Hozirgi koʻrinishi',
-'cur'                 => 'joriy',
-'next'                => 'keyingi',
-'last'                => 'oxirgi',
-'histlegend'          => 'Farqlar: solishtirish uchun kerakli radiobokslarni belgilang va pastdagi tugmani yoki Enterni bosing.<br />
+'cur' => 'joriy',
+'next' => 'keyingi',
+'last' => 'oxirgi',
+'histlegend' => 'Farqlar: solishtirish uchun kerakli radiobokslarni belgilang va pastdagi tugmani yoki Enterni bosing.<br />
 Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 (oxirgi) = avvalgi koʻrinish bilan farq, k = kichkina tahrir.',
-'histfirst'           => 'Eng avvalgi',
-'histlast'            => 'Eng soʻnggi',
+'history-show-deleted' => 'Faqat o‘chirilganlari',
+'histfirst' => 'Eng avvalgi',
+'histlast' => 'Eng soʻnggi',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 $2 da',
 
 # Revision deletion
 'rev-delundel' => 'koʻrsat/yashir',
 
 # Diffs
-'history-title'           => '"$1"ning tarixi',
-'difference'              => '(Koʻrinishlar orasidagi farq)',
-'lineno'                  => 'Qator $1:',
+'history-title' => '"$1"ning tarixi',
+'difference' => '(Koʻrinishlar orasidagi farq)',
+'lineno' => 'Qator $1:',
 'compareselectedversions' => 'Tanlangan versiyalarni solishtir',
-'editundo'                => 'qaytar',
+'editundo' => 'qaytar',
 
 # Search results
-'searchresults'                  => 'Qidiruv natijalari',
-'searchresults-title'            => '"$1" uchun qidiruv natijalari',
-'searchresulttext'               => "{{SITENAME}}da qidirish haqida qo'shimcha ma'lumotga ega bo'lishini xoxlasangiz, [[{{MediaWiki:Helppage}}|{{SITENAME}}da qidiruv]] sahifasini o'qing.",
-'searchsubtitle'                 => '\'\'\'[[:$1]]\'\'\'ni qidirdingiz ([[Special:Prefixindex/$1|"$1" bilan boshlanadigan sahifalar]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"ga bogʻlangan sahifalar]])',
-'searchsubtitleinvalid'          => "'''$1'''ni qidirdingiz",
-'notitlematches'                 => 'Bunday sarlavha topilmadi',
-'notextmatches'                  => 'Bunday matn topilmadi',
-'prevn'                          => 'oldingi $1',
-'nextn'                          => 'keyingi {{PLURAL:$1|$1}}',
-'prevn-title'                    => 'Avvalgi $1 {{PLURAL:$1|natija|natijalar}}',
-'nextn-title'                    => 'Keyingi $1 {{PLURAL:$1|natija|natijalar}}',
-'shown-title'                    => 'Har sahifada $1 natija koʻrsat',
-'viewprevnext'                   => 'Koʻrish ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-new'                 => "'''Ushbu vikida \"[[:\$1]]\" sahifani yarat!'''",
-'searchhelp-url'                 => 'Help:Mundarija',
-'searchprofile-everything'       => 'Har yerda',
+'searchresults' => 'Qidiruv natijalari',
+'searchresults-title' => '"$1" uchun qidiruv natijalari',
+'searchresulttext' => "{{SITENAME}}da qidirish haqida qo'shimcha ma'lumotga ega bo'lishini xoxlasangiz, [[{{MediaWiki:Helppage}}|{{SITENAME}}da qidiruv]] sahifasini o'qing.",
+'searchsubtitle' => '\'\'\'[[:$1]]\'\'\'ni qidirdingiz ([[Special:Prefixindex/$1|"$1" bilan boshlanadigan sahifalar]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"ga bogʻlangan sahifalar]])',
+'searchsubtitleinvalid' => "'''$1'''ni qidirdingiz",
+'notitlematches' => 'Bunday sarlavha topilmadi',
+'notextmatches' => 'Bunday matn topilmadi',
+'prevn' => 'oldingi $1',
+'nextn' => 'keyingi {{PLURAL:$1|$1}}',
+'prevn-title' => 'Avvalgi $1 {{PLURAL:$1|natija|natijalar}}',
+'nextn-title' => 'Keyingi $1 {{PLURAL:$1|natija|natijalar}}',
+'shown-title' => 'Har sahifada $1 natija koʻrsat',
+'viewprevnext' => 'Koʻrish ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-new' => "'''Ushbu vikida \"[[:\$1]]\" sahifani yarat!'''",
+'searchhelp-url' => 'Help:Mundarija',
+'searchprofile-articles' => 'Asosiy sahifalar',
+'searchprofile-images' => 'Multimediya',
+'searchprofile-everything' => 'Har yerda',
+'searchprofile-advanced' => 'Kengaytirilgan',
 'searchprofile-articles-tooltip' => '$1da qidir',
-'searchprofile-project-tooltip'  => '$1da qidir',
-'searchprofile-images-tooltip'   => 'Fayllarni qidir',
-'search-result-size'             => '$1 ({{PLURAL:$2|1 soʻz|$2 soʻz}})',
-'search-redirect'                => '(yoʻnaltirish $1)',
-'search-section'                 => '($1 boʻlimi)',
-'search-suggest'                 => 'Balki buni nazarda tutgandirsiz: $1',
-'search-interwiki-default'       => '$1 natijalar:',
-'searchall'                      => 'barchasi',
-'showingresults'                 => "#<b>$2</b> boshlanayotgan <b>$1</b> natijalar ko'rsatilyapti.",
-'showingresultsheader'           => "$4 uchun {{PLURAL:$5|'''$3'''dan '''$1''' natija|'''$3'''dan '''$1 - $2''' natijalar}}",
-'powersearch'                    => 'Qidiruv',
-'powersearch-ns'                 => 'Bu nom-fazolarda izla:',
-'powersearch-redir'              => 'Yoʻnaltirishlarni koʻrsat',
-'powersearch-field'              => 'Qidir',
+'searchprofile-project-tooltip' => '$1da qidir',
+'searchprofile-images-tooltip' => 'Fayllarni qidir',
+'search-result-size' => '$1 ({{PLURAL:$2|1 soʻz|$2 soʻz}})',
+'search-redirect' => '(yoʻnaltirish $1)',
+'search-section' => '($1 boʻlimi)',
+'search-suggest' => 'Balki buni nazarda tutgandirsiz: $1',
+'search-interwiki-default' => '$1 natijalar:',
+'searchall' => 'barchasi',
+'showingresults' => "#<b>$2</b> boshlanayotgan <b>$1</b> natijalar ko'rsatilyapti.",
+'showingresultsheader' => "$4 uchun {{PLURAL:$5|'''$3'''dan '''$1''' natija|'''$3'''dan '''$1 - $2''' natijalar}}",
+'powersearch' => 'Qidiruv',
+'powersearch-ns' => 'Bu nom-fazolarda izla:',
+'powersearch-redir' => 'Yoʻnaltirishlarni koʻrsat',
+'powersearch-field' => 'Qidir',
 
 # Preferences page
-'preferences'       => 'Moslamalar',
-'mypreferences'     => 'Moslamalarim',
-'prefs-skin'        => "Tashqi ko'rinish",
-'prefs-datetime'    => 'Sana va vaqt',
-'prefs-personal'    => "Shaxsiy ma'lumotlar",
-'prefs-rc'          => "Yangi o'zgartirishlar",
-'prefs-watchlist'   => "Kuzatuv ro'yxati",
-'prefs-misc'        => 'Boshqa moslamalar',
-'saveprefs'         => 'Saqlash',
-'resetprefs'        => 'Bekor qilish',
-'prefs-editing'     => 'Tahrirlash',
+'preferences' => 'Moslamalar',
+'mypreferences' => 'Moslamalarim',
+'prefs-skin' => 'Tashqi ko‘rinish',
+'prefs-datetime' => 'Sana va vaqt',
+'prefs-personal' => 'Shaxsiy ma’lumotlar',
+'prefs-rc' => 'Yangi o‘zgartirishlar',
+'prefs-watchlist' => "Kuzatuv ro'yxati",
+'prefs-misc' => 'Boshqa moslamalar',
+'saveprefs' => 'Saqlash',
+'resetprefs' => 'Bekor qilish',
+'prefs-editing' => 'Tahrirlash',
 'searchresultshead' => 'Qidiruv natijalari',
-'prefs-files'       => 'Fayllar',
-'yourrealname'      => 'Haqiqiy ism *:',
+'prefs-files' => 'Fayllar',
+'youremail' => 'E-mail:',
+'yourrealname' => 'Haqiqiy ism *:',
 
 # Groups
 'group-sysop' => 'Administratorlar',
 
 'grouppage-sysop' => '{{ns:project}}:Administratorlar',
 
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'ushbu sahifani tahrirlash',
+
 # Recent changes
-'recentchanges'     => "Yangi o'zgartirishlar",
-'recentchangestext' => "Bu sahifada siz oxirgi o'zgartirishlarni ko'rishingiz mumkin.",
-'rcnote'            => "Quyida $5, $4ga koʻra oxirgi {{PLURAL:$2|kun|'''$2''' kun}} davomida sodir boʻlgan {{PLURAL:$1|'''1''' oʻzgartirish|'''$1''' oʻzgartirishlar}} koʻrsatilgan.",
-'rclistfrom'        => "$1dan boshlab yangi o'zgartirishlarni ko'rsat.",
-'rcshowhideminor'   => 'Kichik tahrirlarni $1',
-'rcshowhidebots'    => 'Botlarni $1',
-'rcshowhideliu'     => "Ro'yxatdan o'tgan foydalanuvchilarni $1",
-'rcshowhideanons'   => 'Anonim foydalanuvchilarni $1',
-'rcshowhidepatr'    => 'Tekshirilgan tahrirlarni $1',
-'rcshowhidemine'    => "O'z tahrirlarimni $1",
-'rclinks'           => "Oxirgi $2 kun davomida sodir bo'lgan $1 o'zgartirishlarni ko'rsat.<br />$3",
-'diff'              => 'farq',
-'hist'              => 'tarix',
-'hide'              => 'yashirish',
-'show'              => 'koʻrsat',
-'minoreditletter'   => 'k',
-'newpageletter'     => 'Y',
+'recentchanges' => 'Yangi o‘zgartirishlar',
+'recentchangestext' => 'Ushbu sahifada siz eng so‘nggi o‘zgartirishlarni ko‘rishingiz mumkin.',
+'rcnote' => "Quyida $5, $4ga koʻra oxirgi {{PLURAL:$2|kun|'''$2''' kun}} davomida sodir boʻlgan {{PLURAL:$1|'''1''' oʻzgartirish|'''$1''' oʻzgartirishlar}} koʻrsatilgan.",
+'rclistfrom' => "$1dan boshlab yangi o'zgartirishlarni ko'rsat.",
+'rcshowhideminor' => 'Kichik tahrirlarni $1',
+'rcshowhidebots' => '$1 ta bot',
+'rcshowhideliu' => 'Ro‘yxatdan o‘tgan foydalanuvchilar: $1 ta',
+'rcshowhideanons' => 'Anonim foydalanuvchilar: $1 ta',
+'rcshowhidepatr' => 'Tekshirilgan tahrirlarni $1',
+'rcshowhidemine' => "O'z tahrirlarimni $1",
+'rclinks' => "Oxirgi $2 kun davomida sodir bo'lgan $1 o'zgartirishlarni ko'rsat.<br />$3",
+'diff' => 'farq',
+'hist' => 'tarix',
+'hide' => 'yashirish',
+'show' => 'koʻrsat',
+'minoreditletter' => 'k',
+'newpageletter' => 'Y',
 
 # Recent changes linked
-'recentchangeslinked'          => "Bog'langan o'zgarishlar",
-'recentchangeslinked-toolbox'  => 'Bogʻliq oʻzgarishlar',
-'recentchangeslinked-title'    => '"$1"ga aloqador oʻzgarishlar',
+'recentchangeslinked' => "Bog'langan o'zgarishlar",
+'recentchangeslinked-toolbox' => 'Bogʻliq oʻzgarishlar',
+'recentchangeslinked-title' => '"$1"ga aloqador oʻzgarishlar',
 'recentchangeslinked-noresult' => 'Berilgan davrda bogʻlangan sahifalarda oʻzgarishlar boʻlmagan.',
-'recentchangeslinked-summary'  => "Ushbu maxsus sahifa unga bogʻlangan sahifalardagi soʻnggi oʻzgarishlarni koʻrsatadi. [[Special:Watchlist|Kuzatuv roʻyxatingizdagi]] sahifalar '''qalin''' qilib koʻrsatilgan.",
+'recentchangeslinked-summary' => "Ushbu maxsus sahifa unga bogʻlangan sahifalardagi soʻnggi oʻzgarishlarni koʻrsatadi. [[Special:Watchlist|Kuzatuv roʻyxatingizdagi]] sahifalar '''qalin''' qilib koʻrsatilgan.",
+'recentchangeslinked-page' => 'Sahifa nomi:',
 
 # Upload
-'upload'        => 'Fayl yuklash',
-'uploadbtn'     => 'Fayl yukla',
+'upload' => 'Fayl yuklash',
+'uploadbtn' => 'Fayl yukla',
 'uploadlogpage' => 'Yuklash qaydlari',
+'filedesc' => 'Qisqa izoh',
 'uploadedimage' => '"[[$1]]" yuklandi',
 
 # Special:ListFiles
 'listfiles' => 'Fayllar roʻyxati',
 
 # File description page
-'file-anchor-link'          => 'Fayl',
-'filehist'                  => 'Fayl tarixi',
-'filehist-help'             => 'Faylning biror paytdagi holatini koʻrish uchun tegishli sana/vaqtga bosingiz.',
-'filehist-current'          => 'joriy',
-'filehist-datetime'         => 'Sana/Vaqt',
-'filehist-user'             => 'Foydalanuvchi',
-'filehist-dimensions'       => 'Oʻlchamlari',
-'filehist-filesize'         => 'Fayl hajmi',
-'filehist-comment'          => 'Izoh',
-'imagelinks'                => 'Fayllarga ishoratlar',
-'linkstoimage'              => 'Bu faylga quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}} bogʻlangan:',
-'nolinkstoimage'            => 'Bu faylga bogʻlangan sahifalar yoʻq.',
-'sharedupload'              => 'This file is from $1 and may be used by other projects.',
-'sharedupload-desc-here'    => 'Ushbu fayl $1dan boʻlib, boshqa loyihalarda ham ishlatilishi mumkin.
+'file-anchor-link' => 'Fayl',
+'filehist' => 'Fayl tarixi',
+'filehist-help' => 'Faylning biror paytdagi holatini koʻrish uchun tegishli sana/vaqtga bosingiz.',
+'filehist-current' => 'joriy',
+'filehist-datetime' => 'Sana/Vaqt',
+'filehist-thumb' => 'Miniatyura',
+'filehist-user' => 'Foydalanuvchi',
+'filehist-dimensions' => 'Oʻlchamlari',
+'filehist-filesize' => 'Fayl hajmi',
+'filehist-comment' => 'Izoh',
+'imagelinks' => 'Fayllarga ishoratlar',
+'linkstoimage' => 'Bu faylga quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}} bogʻlangan:',
+'nolinkstoimage' => 'Bu faylga bogʻlangan sahifalar yoʻq.',
+'sharedupload' => 'This file is from $1 and may be used by other projects.',
+'sharedupload-desc-here' => 'Ushbu fayl $1dan boʻlib, boshqa loyihalarda ham ishlatilishi mumkin.
 Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'uploadnewversion-linktext' => 'Bu faylning yangi versiyasini yukla',
 
@@ -456,226 +481,245 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'randompage' => 'Tasodifiy sahifa',
 
 # Statistics
-'statistics'              => 'Statistika',
+'statistics' => 'Statistika',
 'statistics-header-users' => 'Foydalanuvchilar statistikasi',
 
 'disambiguationspage' => '{{ns:template}}:Disambig',
 
 # Miscellaneous special pages
-'nbytes'                  => '$1 bayt',
-'ncategories'             => '$1 {{PLURAL:$1|turkum|turkumlar}}',
-'lonelypages'             => 'Yetim sahifalar',
-'uncategorizedpages'      => 'Turkumlashtirilmagan sahifalar',
+'nbytes' => '$1 bayt',
+'ncategories' => '$1 {{PLURAL:$1|turkum|turkumlar}}',
+'lonelypages' => 'Yetim sahifalar',
+'uncategorizedpages' => 'Turkumlashtirilmagan sahifalar',
 'uncategorizedcategories' => 'Turkumlashtirilmagan turkumlar',
-'uncategorizedimages'     => 'Kategoriyasiz tasvirlar',
-'uncategorizedtemplates'  => 'Turkumlashtirilmagan andozalar',
-'unusedcategories'        => 'Ishlatilinmagan turkumlar',
-'unusedimages'            => 'Ishlatilinmagan fayllar',
-'wantedcategories'        => 'Talab qilinayotgan turkumlar',
-'mostcategories'          => 'Eng koʻp turkumli sahifalar',
-'protectedpages'          => 'Himoyalangan sahifalar',
-'listusers'               => 'Foydalanuvchilar roʻyxati',
-'newpages'                => 'Yangi sahifalar',
-'move'                    => "Ko'chirish",
-'movethispage'            => 'Bu sahifani koʻchir',
-'pager-newer-n'           => '{{PLURAL:$1|yangiroq 1|yangiroq $1}}',
-'pager-older-n'           => '{{PLURAL:$1|eskiroq 1|eskiroq $1}}',
+'uncategorizedimages' => 'Kategoriyasiz tasvirlar',
+'uncategorizedtemplates' => 'Turkumlashtirilmagan andozalar',
+'unusedcategories' => 'Ishlatilinmagan turkumlar',
+'unusedimages' => 'Ishlatilinmagan fayllar',
+'wantedcategories' => 'Talab qilinayotgan turkumlar',
+'mostcategories' => 'Eng koʻp turkumli sahifalar',
+'protectedpages' => 'Himoyalangan sahifalar',
+'listusers' => 'Foydalanuvchilar roʻyxati',
+'newpages' => 'Yangi sahifalar',
+'move' => 'Ko‘chirish',
+'movethispage' => 'Bu sahifani koʻchir',
+'pager-newer-n' => '{{PLURAL:$1|yangiroq 1|yangiroq $1}}',
+'pager-older-n' => '{{PLURAL:$1|eskiroq 1|eskiroq $1}}',
+
+# Book sources
+'booksources-go' => 'O‘tish',
 
 # Special:Log
-'log'           => 'Qaydlar',
+'log' => 'Qaydlar',
 'all-logs-page' => 'Barcha qaydlar',
 
 # Special:AllPages
-'allpages'       => 'Barcha sahifalar',
+'allpages' => 'Barcha sahifalar',
 'alphaindexline' => '$1 dan $2 ga',
-'nextpage'       => 'Keyingi sahifa ($1)',
-'prevpage'       => 'Avvalgi sahifa ($1)',
-'allpagesfrom'   => 'Sahifalarni koʻrsat:',
-'allarticles'    => 'Barcha sahifalar',
-'allpagesnext'   => 'Keyingi',
+'nextpage' => 'Keyingi sahifa ($1)',
+'prevpage' => 'Avvalgi sahifa ($1)',
+'allpagesfrom' => 'Sahifalarni koʻrsat:',
+'allarticles' => 'Barcha sahifalar',
+'allpagesnext' => 'Keyingi',
 'allpagessubmit' => 'Oʻt',
 'allpagesprefix' => 'Bunday prefiksli sahifalarni koʻrsat:',
 
 # Special:Categories
-'categories'         => 'Turkumlar',
+'categories' => 'Turkumlar',
 'categoriespagetext' => 'The following {{PLURAL:$1|category contains|categories contain}} pages or media.
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
+# Special:ListGroupRights
+'listgrouprights-members' => '(a’zolar ro‘yxati)',
+
 # E-mail user
 'emailuser' => 'Bu foydalanuvchiga e-maktub joʻnat',
 
 # Watchlist
-'watchlist'        => 'Kuzatuv roʻyxatim',
-'mywatchlist'      => 'Kuzatuv roʻyxatim',
-'nowatchlist'      => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
-'addedwatchtext'   => "\"[[:\$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv ro'yxatingizga]] qo'shildi. Bu sahifada va unga mos munozara sahifasida bo'ladigan kelajakdagi o'zgarishlar bu yerda ro'yxatga olinadi, hamda bu sahifa topish qulay bo'lishi uchun [[Special:RecentChanges|yangi o'zgarishlar ro'yxati]]da '''qalin''' harflar bilan ko'rsatiladi.
+'watchlist' => 'Kuzatuv roʻyxatim',
+'mywatchlist' => 'Kuzatuv roʻyxatim',
+'nowatchlist' => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
+'addedwatchtext' => "\"[[:\$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv ro'yxatingizga]] qo'shildi. Bu sahifada va unga mos munozara sahifasida bo'ladigan kelajakdagi o'zgarishlar bu yerda ro'yxatga olinadi, hamda bu sahifa topish qulay bo'lishi uchun [[Special:RecentChanges|yangi o'zgarishlar ro'yxati]]da '''qalin''' harflar bilan ko'rsatiladi.
 
 Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmaslik\" yozuvini bosing.",
 'removedwatchtext' => '"[[:$1]]" sahifasi kuzatuv ro\'yxatingizdan o\'chirildi.',
-'watch'            => 'kuzatish',
-'watchthispage'    => 'Sahifani kuzatish',
-'unwatch'          => 'kuzatmaslik',
-'wlnote'           => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
-'wlshowlast'       => "Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko'rsatish. $3 tahrirlarni ko'rsatish",
+'watch' => 'kuzatish',
+'watchthispage' => 'Sahifani kuzatish',
+'unwatch' => 'kuzatmaslik',
+'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
+'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko‘rsatish. $3 tahrirlarni ko‘rsatish',
 
 # Delete
-'actioncomplete'        => 'Bajarildi',
-'deletedtext'           => '"$1" yoʻqotildi.
+'actioncomplete' => 'Bajarildi',
+'actionfailed' => 'Jarayon amalga oshmadi',
+'deletedtext' => '"$1" yoʻqotildi.
 Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
-'dellogpage'            => 'Yoʻqotish qaydlari',
-'deletecomment'         => 'Sabab:',
-'deleteotherreason'     => 'Boshqa/qoʻshimcha sabab:',
+'dellogpage' => 'Yoʻqotish qaydlari',
+'deletecomment' => 'Sabab:',
+'deleteotherreason' => 'Boshqa/qoʻshimcha sabab:',
 'deletereasonotherlist' => 'Boshqa sabab',
 
 # Rollback
 'rollbacklink' => 'eski holiga keltir',
 
 # Protect
-'protectlogpage'         => 'Himoyalash qaydlari',
-'protect-level-sysop'    => 'Faqat administratorlar uchun',
+'protectlogpage' => 'Himoyalash qaydlari',
+'protect-level-sysop' => 'Faqat administratorlar uchun',
 'protect-expiry-options' => '2 soat:2 hours,1 kun:1 day,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Tahrirlash',
 
 # Undelete
-'undeletebtn'  => 'Qayta tikla',
-'undeletelink' => 'tikla',
+'undeletebtn' => 'Qayta tikla',
+'undeletelink' => 'ko‘rib chiqish/tiklash',
+'undeleteviewlink' => "ko'rib chiqish",
 
 # Namespace form on various pages
 'namespace' => 'Soha:',
-'invert'    => 'Tanlash tartibini almashtirish',
+'invert' => 'Tanlash tartibini almashtirish',
+'blanknamespace' => '(asosiy)',
 
 # Contributions
 'contributions' => 'Foydalanuvchining hissasi',
-'mycontris'     => 'Hissam',
-'contribsub2'   => '$1 uchun ($2)',
+'mycontris' => 'Hissam',
+'contribsub2' => '$1 uchun ($2)',
 
-'sp-contributions-newbies'  => 'Faqatgina yangi foydalanuvchilarning hissalarini koʻrsat',
+'sp-contributions-newbies' => 'Faqatgina yangi foydalanuvchilarning hissalarini koʻrsat',
 'sp-contributions-blocklog' => 'Chetlashtirish qaydlari',
-'sp-contributions-talk'     => 'Munozara',
-'sp-contributions-search'   => 'Hissalarni qidir',
+'sp-contributions-talk' => 'munozara',
+'sp-contributions-search' => 'Hissalarni qidir',
 'sp-contributions-username' => 'IP manzil yoki foydalanuvchi ismi:',
-'sp-contributions-submit'   => 'Qidir',
+'sp-contributions-submit' => 'Qidir',
 
 # What links here
-'whatlinkshere'       => "Bu sahifaga bog'langan sahifalar",
+'whatlinkshere' => "Bu sahifaga bog'langan sahifalar",
 'whatlinkshere-title' => '"$1"ga bogʻlangan sahifalar',
-'linkshere'           => "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bog'langan:",
-'nolinkshere'         => "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog'lanmagan.",
-'isredirect'          => 'yoʻnaltiruvchi sahifa',
-'istemplate'          => 'qoʻshimcha',
+'whatlinkshere-page' => 'Sahifa:',
+'linkshere' => "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bog'langan:",
+'nolinkshere' => "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
+'isredirect' => 'yoʻnaltiruvchi sahifa',
+'istemplate' => 'qoʻshimcha',
 'whatlinkshere-links' => '← ishoratlar',
+'whatlinkshere-filters' => 'Filtrlar',
 
 # Block/unblock
-'blockip'      => 'Foydalanuvchini chetlashtir',
-'ipboptions'   => '2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
-'ipblocklist'  => 'Chetlashtirilgan IP manzillari va foydalanuvchilar',
-'blocklink'    => 'chetlashtir',
+'blockip' => 'Foydalanuvchini chetlashtir',
+'ipboptions' => '2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
+'ipblocklist' => 'Chetlashtirilgan IP manzillari va foydalanuvchilar',
+'blocklink' => 'chetlashtir',
 'contribslink' => 'hissasi',
 'blocklogpage' => 'Chetlashtirish qaydlari',
 
 # Move page
-'movearticle'    => "Sahifani ko'chirish",
-'movepagebtn'    => 'Sahifani koʻchir',
-'pagemovedsub'   => 'Koʻchirildi',
+'movearticle' => "Sahifani ko'chirish",
+'movepagebtn' => 'Sahifani koʻchir',
+'pagemovedsub' => 'Koʻchirildi',
 'movepage-moved' => '\'\'\'"$1" nomli sahifa "$2" nomli sahifaga koʻchirildi\'\'\'',
-'movelogpage'    => 'Koʻchirish qaydlari',
-'movereason'     => 'Sabab:',
-'revertmove'     => 'qaytar',
+'movelogpage' => 'Koʻchirish qaydlari',
+'movereason' => 'Sabab:',
+'revertmove' => 'qaytar',
+
+# Export
+'export' => 'Sahifalar eksporti',
+
+# Namespace 8 related
+'allmessagesname' => 'Ism',
 
 # Thumbnails
 'thumbnail-more' => 'Kattalashtir',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Foydalanuvchi sahifangiz',
-'tooltip-pt-anonuserpage'         => 'Siznig ip manzilingiz foydalanuvchi sahifasi',
-'tooltip-pt-mytalk'               => 'Suhbat sahifangiz',
-'tooltip-pt-anontalk'             => 'Bu ip manzildan amalga oshirilgan tahrirlar munozarasi',
-'tooltip-pt-preferences'          => 'Moslamalaringiz',
-'tooltip-pt-watchlist'            => "Siz kuzatib borayotgan sahifalar ro'yxati.",
-'tooltip-pt-mycontris'            => 'Hissalaringiz roʻyxati',
-'tooltip-pt-login'                => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
-'tooltip-pt-anonlogin'            => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
-'tooltip-pt-logout'               => 'Chiqish',
-'tooltip-ca-talk'                 => 'Sahifa matni borasida munozara',
-'tooltip-ca-edit'                 => "Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldim ko'rib chiqish tugmasidan foydalaning.",
-'tooltip-ca-addsection'           => 'Yangi boʻlim och',
-'tooltip-ca-viewsource'           => "Bu sahifa himoyalangan. Siz uning manbasini ko'rishingiz mumkin.",
-'tooltip-ca-history'              => 'Bu sahifaning oldingi versiyalari.',
-'tooltip-ca-protect'              => 'Bu sahifani himoyalash',
-'tooltip-ca-delete'               => "Bu sahifani o'chirish",
-'tooltip-ca-undelete'             => "Bu sahifa o'chirilmasdan oldin qilingan tahrirlarni tiklash",
-'tooltip-ca-move'                 => 'Bu sahifani koʻchir',
-'tooltip-ca-watch'                => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
-'tooltip-ca-unwatch'              => "Bu sahifani kuzatuv ro'yxatingizga o'chirish",
-'tooltip-search'                  => '{{SITENAME}}da qidirish',
-'tooltip-search-go'               => 'Xuddi shu nomli sahifa bor boʻlsa, uni och',
-'tooltip-search-fulltext'         => 'Sahifalarda shu matnni izla',
-'tooltip-p-logo'                  => 'Bosh sahifa',
-'tooltip-n-mainpage'              => 'Bosh sahifaga oʻtish',
-'tooltip-n-portal'                => 'Loyiha haqida, nimalar qilishingiz mumkin, nimalarni qayerdan topish mumkin',
-'tooltip-n-currentevents'         => "Joriy hodisalar haqida ma'lumot olish",
-'tooltip-n-recentchanges'         => "Yangi o'zgarishlar ro'yxati.",
-'tooltip-n-randompage'            => 'Tasodifiy sahifani yuklash',
-'tooltip-n-help'                  => "O'rganish uchun manzil.",
-'tooltip-t-whatlinkshere'         => "Bu sahifaga bog'langan sahifalar ro'yxati",
-'tooltip-t-recentchangeslinked'   => "Bu sahifa bog'langan sahifalardagi yangi o'zgarishlar",
-'tooltip-feed-rss'                => "Bu sahifa uchun RSS ta'minot",
-'tooltip-feed-atom'               => "Bu sahifa uchun Atom ta'minot",
-'tooltip-t-contributions'         => "Bu foydalanuvchinig qo'shgan hissasini ko'rish",
-'tooltip-t-emailuser'             => "Bu foydalanuvchiga xat jo'natish",
-'tooltip-t-upload'                => 'Rasmlar yoki media fayllar yuklash',
-'tooltip-t-specialpages'          => "Maxsus sahifalar ro'yxati",
-'tooltip-t-print'                 => 'Ushbu sahifaning bosma uchun versiyasi',
-'tooltip-t-permalink'             => 'Sahifaning ushbu versiyasiga doimiy ishorat',
-'tooltip-ca-nstab-main'           => "Sahifani ko'rish",
-'tooltip-ca-nstab-user'           => "Foydalanuvchi sahifasini ko'rish",
-'tooltip-ca-nstab-media'          => "Media sahifasini ko'rish",
-'tooltip-ca-nstab-special'        => 'Bu maxsus sahifa, uni tahrirlay olmaysiz.',
-'tooltip-ca-nstab-project'        => "Loyiha sahifasini ko'rish",
-'tooltip-ca-nstab-image'          => "Rasm sahifasini ko'rish",
-'tooltip-ca-nstab-mediawiki'      => "Tizim xabarini ko'rish",
-'tooltip-ca-nstab-template'       => 'Andozani koʻrish',
-'tooltip-ca-nstab-help'           => "Yordam sahifasini ko'rish",
-'tooltip-ca-nstab-category'       => 'Turkum sahifasini koʻrish',
-'tooltip-minoredit'               => "Kichik o'zgarish sifatida belgilash",
-'tooltip-save'                    => "O'zgarishlarni saqlash",
-'tooltip-preview'                 => "O'zgarishlarni saqlash. Iltimos saqlashdan oldin uni ishlating!",
-'tooltip-diff'                    => "Matnga qanday o'zgarishlar kiritganligingizni ko'rish.",
+'tooltip-pt-userpage' => 'Foydalanuvchi sahifangiz',
+'tooltip-pt-anonuserpage' => 'Siznig ip manzilingiz foydalanuvchi sahifasi',
+'tooltip-pt-mytalk' => 'Suhbat sahifangiz',
+'tooltip-pt-anontalk' => 'Bu ip manzildan amalga oshirilgan tahrirlar munozarasi',
+'tooltip-pt-preferences' => 'Moslamalaringiz',
+'tooltip-pt-watchlist' => "Siz kuzatib borayotgan sahifalar ro'yxati.",
+'tooltip-pt-mycontris' => 'Hissalaringiz roʻyxati',
+'tooltip-pt-login' => 'Bu majburiyat mavjud bo‘lmasa-da, kirishingiz taklif qilinadi.',
+'tooltip-pt-anonlogin' => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
+'tooltip-pt-logout' => 'Chiqish',
+'tooltip-ca-talk' => 'Sahifa matni borasida munozara',
+'tooltip-ca-edit' => "Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldim ko'rib chiqish tugmasidan foydalaning.",
+'tooltip-ca-addsection' => 'Yangi boʻlim och',
+'tooltip-ca-viewsource' => "Bu sahifa himoyalangan. Siz uning manbasini ko'rishingiz mumkin.",
+'tooltip-ca-history' => 'Bu sahifaning oldingi versiyalari.',
+'tooltip-ca-protect' => 'Bu sahifani himoyalash',
+'tooltip-ca-delete' => 'Ushbu sahifani o‘chirib tashlash',
+'tooltip-ca-undelete' => "Bu sahifa o'chirilmasdan oldin qilingan tahrirlarni tiklash",
+'tooltip-ca-move' => 'Bu sahifani koʻchir',
+'tooltip-ca-watch' => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
+'tooltip-ca-unwatch' => "Bu sahifani kuzatuv ro'yxatingizga o'chirish",
+'tooltip-search' => '{{SITENAME}}da qidirish',
+'tooltip-search-go' => 'Xuddi shu nomli sahifa bor boʻlsa, uni och',
+'tooltip-search-fulltext' => 'Sahifalarda ushbu matnni izlash',
+'tooltip-p-logo' => 'Bosh sahifaga o‘tish',
+'tooltip-n-mainpage' => 'Bosh sahifaga oʻtish',
+'tooltip-n-mainpage-description' => 'Bosh sahifaga o‘tish',
+'tooltip-n-portal' => 'Loyiha haqida, nimalar qilishingiz mumkin, nimalarni qayerdan topish mumkin',
+'tooltip-n-currentevents' => 'Joriy hodisalar haqida ma’lumot olish',
+'tooltip-n-recentchanges' => 'Wikidagi eng so‘nggi o‘zgartirishlar ro‘yxati',
+'tooltip-n-randompage' => 'Tasodifiy sahifani yuklash',
+'tooltip-n-help' => 'O‘rganish uchun manzil',
+'tooltip-t-whatlinkshere' => "Bu sahifaga bog'langan sahifalar ro'yxati",
+'tooltip-t-recentchangeslinked' => "Bu sahifa bog'langan sahifalardagi yangi o'zgarishlar",
+'tooltip-feed-rss' => "Bu sahifa uchun RSS ta'minot",
+'tooltip-feed-atom' => "Bu sahifa uchun Atom ta'minot",
+'tooltip-t-contributions' => "Bu foydalanuvchinig qo'shgan hissasini ko'rish",
+'tooltip-t-emailuser' => 'Ushbu foydalanuvchiga xat jo‘natish',
+'tooltip-t-upload' => 'Rasmlar yoki media fayllar yuklash',
+'tooltip-t-specialpages' => 'Maxsus sahifalar ro‘yxati',
+'tooltip-t-print' => 'Ushbu sahifaning bosma uchun versiyasi',
+'tooltip-t-permalink' => 'Sahifaning ushbu versiyasiga doimiy ishorat',
+'tooltip-ca-nstab-main' => 'Sahifani ko‘rish',
+'tooltip-ca-nstab-user' => "Foydalanuvchi sahifasini ko'rish",
+'tooltip-ca-nstab-media' => "Media sahifasini ko'rish",
+'tooltip-ca-nstab-special' => 'Bu maxsus sahifa, uni tahrirlay olmaysiz.',
+'tooltip-ca-nstab-project' => "Loyiha sahifasini ko'rish",
+'tooltip-ca-nstab-image' => "Rasm sahifasini ko'rish",
+'tooltip-ca-nstab-mediawiki' => "Tizim xabarini ko'rish",
+'tooltip-ca-nstab-template' => 'Andozani koʻrish',
+'tooltip-ca-nstab-help' => "Yordam sahifasini ko'rish",
+'tooltip-ca-nstab-category' => 'Turkum sahifasini koʻrish',
+'tooltip-minoredit' => 'Kichik o‘zgartirish sifatida belgilash',
+'tooltip-save' => "O'zgarishlarni saqlash",
+'tooltip-preview' => "O'zgarishlarni saqlash. Iltimos saqlashdan oldin uni ishlating!",
+'tooltip-diff' => "Matnga qanday o'zgarishlar kiritganligingizni ko'rish.",
 'tooltip-compareselectedversions' => "Bu sahifaning ikki tanlangan versiyalari o'rtasidagi farqni ko'rish.",
-'tooltip-watch'                   => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
-'tooltip-recreate'                => "Bu sahifani u o'chirilgan bo'lishiga qaramasdan qayta yaratish",
-'tooltip-summary'                 => 'Qisqa mazmun kiriting',
+'tooltip-watch' => 'Ushbu sahifani kuzatuv ro‘yxatingizga qo‘shish',
+'tooltip-recreate' => "Bu sahifani u o'chirilgan bo'lishiga qaramasdan qayta yaratish",
+'tooltip-summary' => 'Qisqa mazmun kiriting',
 
 # Browsing diffs
 'previousdiff' => '← Avvalgi tahrir',
-'nextdiff'     => 'Keyingi tahrir →',
+'nextdiff' => 'Keyingi tahrir →',
 
 # Media information
-'imagemaxsize'   => "Tasvir ta'rifi sahifasidagi tasvirning kattaligi:",
-'thumbsize'      => 'Tasvirning kichiklashtirilgan versiyasining kattaligi:',
+'imagemaxsize' => "Tasvir ta'rifi sahifasidagi tasvirning kattaligi:",
+'thumbsize' => 'Tasvirning kichiklashtirilgan versiyasining kattaligi:',
 'file-info-size' => '$1 × $2 piksel, fayl hajmi: $3, MIME tipi: $4',
-'file-nohires'   => 'Bundan kattaroq tasvir yoʻq.',
-'svg-long-desc'  => 'SVG fayl, asl oʻlchamlari $1 × $2 piksel, fayl hajmi: $3',
+'file-nohires' => 'Bundan kattaroq tasvir yoʻq.',
+'svg-long-desc' => 'SVG fayl, asl oʻlchamlari $1 × $2 piksel, fayl hajmi: $3',
 'show-big-image' => 'Asl hajmdagi tasvir',
 
 # Special:NewFiles
 'ilsubmit' => 'Qidirish',
 
 # Metadata
-'metadata'          => "Metama'lumot",
-'metadata-expand'   => 'Batafsil axborot koʻrsat',
+'metadata' => 'Metama’lumot',
+'metadata-expand' => 'Batafsil axborot koʻrsat',
 'metadata-collapse' => 'Batafsil axborotni yashir',
 
 # External editor support
-'edit-externally'      => 'Bu faylni tashqi dasturiy ilovalar yordamida tahrirla',
+'edit-externally' => 'Bu faylni tashqi dasturiy ilovalar yordamida tahrirla',
 'edit-externally-help' => "(Batafsil ma'lumotlar uchun [//www.mediawiki.org/wiki/Manual:External_editors bu yerga] qarang)",
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'Barcha',
 'namespacesall' => 'Barchasi',
+'monthsall' => 'barchasi',
 
 'unit-pixel' => 'piksel',
 
index 0304476..2b061d6 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Alunardon90
  * @author BrokenArrow
  * @author Candalua
  * @author Frigotoni
@@ -177,10 +178,10 @@ $messages = array(
 'tog-enotifminoredits' => 'Avìseme par e-mail anca par i canbiamenti picenini',
 'tog-enotifrevealaddr' => 'Fà védar el me indirisso e-mail in tei messagi de aviso',
 'tog-shownumberswatching' => 'Mostra el numaro de utenti che i ga ła pajina en oservasion',
-'tog-oldsig' => 'Anteprima de la firma:',
+'tog-oldsig' => 'Anteprima de ła firma:',
 'tog-fancysig' => 'Interpreta i comandi wiki in te la firma (sensa colegamento automatego)',
-'tog-externaleditor' => "Dopara par default on editor de testo esterno (soło par utenti esperti, el richiede l'uso de impostasion particołari sol proprio computer)",
-'tog-externaldiff' => "Dopara par default on programa de diff esterno (soło par utenti esperti, el richiede l'uso de impostasion particołari sol proprio computer)",
+'tog-externaleditor' => "Dopara par default un editor de testo esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
+'tog-externaldiff' => "Dopara par default un programa de diff esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
 'tog-showjumplinks' => 'Ativa i cołegamenti acesibiłi "va a"',
 'tog-uselivepreview' => 'Ativa ła funsion "Line preview" (el richiede JavaScript; sperimentałe)',
 'tog-forceeditsummary' => "Chiedi conferma se l'ozeto de ła modifega el xé vodo",
@@ -305,7 +306,7 @@ $messages = array(
 'vector-action-move' => 'Sposta',
 'vector-action-protect' => 'Protezi',
 'vector-action-undelete' => 'Recupera',
-'vector-action-unprotect' => 'Sbloca',
+'vector-action-unprotect' => 'Canbia ła protesion',
 'vector-simplesearch-preference' => "Intaca i sugerimenti di ricerca avansadi (solo par l'interfacia Vector)",
 'vector-view-create' => 'Crea',
 'vector-view-edit' => 'Canbia',
@@ -338,11 +339,12 @@ $messages = array(
 'delete' => 'Scansela',
 'deletethispage' => 'Scansela sta pagina',
 'undelete_short' => 'Recupera {{PLURAL:$1|na revision|$1 revision}}',
+'viewdeleted_short' => 'Vedi {{PLURAL:$1|na modifega cancełà|$1 modifeghe cancełade}}',
 'protect' => 'Protezi',
 'protect_change' => 'canbia',
 'protectthispage' => 'Protezi sta pagina',
-'unprotect' => 'Sbloca',
-'unprotectthispage' => 'Cava ła protesion a sta pajina',
+'unprotect' => 'Canbia ła protesion',
+'unprotectthispage' => 'Canbia ła protesion de sta pajina',
 'newpage' => 'Pagina nova',
 'talkpage' => 'Pagina de discussion',
 'talkpagelinktext' => 'Discussion',
@@ -421,6 +423,8 @@ $1',
 'toc' => 'Indice',
 'showtoc' => 'mostra',
 'hidetoc' => 'scondi',
+'collapsible-collapse' => 'Conprimi',
+'collapsible-expand' => 'Espandi',
 'thisisdeleted' => 'Varda o ripristina $1?',
 'viewdeleted' => 'Varda $1?',
 'restorelink' => '{{PLURAL:$1|un canbiamento scanselà|$1 canbiamenti scanselà}}',
@@ -432,6 +436,8 @@ $1',
 'page-rss-feed' => 'Feed RSS par "$1"',
 'page-atom-feed' => 'Feed Atom par "$1"',
 'red-link-title' => '$1 (sta pagina no la ghe xe)',
+'sort-descending' => 'Ordinamento decresente',
+'sort-ascending' => 'Ordinamento cresente',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Voxe',
@@ -499,10 +505,11 @@ Se prega de dìrghelo a un [[Special:ListUsers/sysop|aministradore]] indicando l
 'badarticleerror' => 'Operasion no consentia par sta pajina.',
 'cannotdelete' => 'No xè sta posibiłe scansełare el file "$1".
 Podaria esare sta zà scansełà da qualcun altro.',
+'cannotdelete-title' => 'Inposibiłe ełiminare ła pajina "$1"',
 'badtitle' => 'Titoło mia justo',
 'badtitletext' => "El titoło de ła pajina richiesta xè vodo, erà o con carateri no amesi opure el deriva da n'erore ne i cołegamenti tra siti wiki diversi o version en łengue diverse de ło steso sito.",
-'perfcached' => 'Sti dati qua no i vien mia azornà in tenpo reale, ma solo na olta ogni tanto. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => "Sti dati qua i xe stà azornà l'ultima olta el $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+'perfcached' => 'Sti dati vien tiradi fora da na copia "cache" del database e łi podarìa no esare ajornadi. Inte ła cache xe {{PLURAL:$1|disponibiłe un rixultado|xe disponibiłi $1 rixultadi}}.',
+'perfcachedts' => "Sti dati cua xe stà ajornadi l'ultima volta el $1. Inte ła cache xe disponibiłe al masimo {{PLURAL:$4|on rexultado|$4 rexultadi}}.",
 'querypage-no-updates' => "L'azornamento periodico de sta pagina el xe sospeso. 
 I dati che ghè qua drento no i xe azornà.",
 'wrong_wfQuery_params' => 'Erore ne i parametri invià a ła funsion wfQuery()<br />
@@ -527,6 +534,9 @@ $2',
 'ns-specialprotected' => 'No xè posibiłe modifegare łe pajine spesałi.',
 'titleprotected' => 'Ła creasion de na pajina con sto titoło xè sta blocà da [[User:$1|$1]].
 Ła modivasion xè ła seguente: "$2".',
+'filereadonlyerror' => 'No xe stà posibiłe modifegare el file "$1" parché el repository de file "$2" xe in modałità de soła letura.
+
+L\'aministradore che ło ga blocà ga fornìo sta spiegasion: "$3".',
 
 # Virus scanner
 'virus-badscanner' => 'Erore de configurasion: antivirus sconossuo: "$1"',
@@ -566,8 +576,8 @@ Te poli sistemarte come te vol le to [[Special:Preferences|prefarense de {{SITEN
 'createaccountmail' => 'Par e-mail',
 'createaccountreason' => 'Motivassion:',
 'badretype' => 'Le do password le xe difarenti.',
-'userexists' => 'Sto nome utente se lo gà zà tolto qualchedun altro.
-Tòtene uno difarente.',
+'userexists' => 'El nome utente inserido vien xa doparà da cualchedun altro.
+Prova co un nome utente difarente.',
 'loginerror' => "Erore ne l'aceso",
 'createaccounterror' => "No se pole crear l'utente: $1",
 'nocookiesnew' => "Ła rejistrasion xè sta conpletà, ma no xè sta posibiłe asedare a {{SITENAME}} parché i cookie i xè disativai. Riprovare l'aceso con el nome utente e ła password pena creai dopo aver ativà i cookie nel proprio browser.",
@@ -609,6 +619,8 @@ Par piaser, fà subito un login \'pena che la te riva.',
 'emailconfirmlink' => 'Conferma el to indirizo de e-mail',
 'invalidemailaddress' => "L'indirisso email no'l pode èssar acetà parché el gà un formato mìa valido.
 Inserissi un indirisso valido o svoda la casèła.",
+'cannotchangeemail' => "I indirisi de posta ełetronega de l'account no połe esare canbiadi inte sto projeto wiki.",
+'emaildisabled' => 'Sto sito no połe spedire mesaji de posta ełetronega.',
 'accountcreated' => 'Acesso creà',
 'accountcreatedtext' => "Xè stà creà un acesso par l'utente $1.",
 'createaccount-title' => 'Creazion de un acesso a {{SITENAME}}',
@@ -619,9 +631,14 @@ Se l\'acesso el xe stà creà par sbaglio, se pol ignorar sto messagio.',
 'usernamehasherror' => "El nome utente no'l pode contegner caràteri hash",
 'login-throttled' => 'Te ghè fato massa tentativi de autenticarte.
 Spèta un tocheto prima de proàr da novo.',
+'login-abort-generic' => 'El to login no xe riusido - Anułà.',
 'loginlanguagelabel' => 'Lengua: $1',
 'suspicious-userlogout' => 'Ła to richiesta de disconesion xè sta negà parché e a senbra invià da on browser non funsionante o on proxy de caching.',
 
+# E-mail sending
+'php-mail-error-unknown' => "Erore sconosudo nte'l funsionamento deła posta ełetronega PHP",
+'user-mail-no-addy' => 'Te ghe provà spedire un mesajo de posta ełetronega sensa un indiriso.',
+
 # Change password dialog
 'resetpass' => 'Cànbia la password',
 'resetpass_announce' => "L'acesso el xe stà efetuà con un codice tenporaneo, mandà par e-mail. Par conpletar l'acesso bisogna inpostar na password nova:",
@@ -640,6 +657,51 @@ Spèta un tocheto prima de proàr da novo.',
 Forse te ghè zà canbià la to password o te ghè domandà na password tenporanea nova.',
 'resetpass-temp-password' => 'Password tenporanea:',
 
+# Special:PasswordReset
+'passwordreset' => 'Rinposta ła password',
+'passwordreset-text' => 'Conpleta sto moduło par riçevare i detaji del to account via posta ełetronega.',
+'passwordreset-legend' => 'Rinposta ła password',
+'passwordreset-disabled' => 'Ła rinpostasion deła password xe stà dixabiłità so sto projeto wiki.',
+'passwordreset-pretext' => '{{PLURAL:$1|| Inserisi una dełe porsion de dati cua soto}}',
+'passwordreset-username' => 'Nome utente:',
+'passwordreset-domain' => 'Dominio',
+'passwordreset-capture' => 'Vixuałixare el contenuto del mesajo de posta ełetronega?',
+'passwordreset-capture-help' => "Se se sełesiona sta caxeła, l'indiriso de posta ełetronega (co' ła password tenporanea) ve vegnarà mostrà anca a voialtri oltre che esare invià a 'l utente.",
+'passwordreset-email' => 'Indiriso de posta ełetronega',
+'passwordreset-emailtitle' => "Detaji de l'account so {{SITENAME}}",
+'passwordreset-emailtext-ip' => "Cualcheduni (probabilmente ti, co indiriso IP $1) ga richiesto l'invio de na nova password par l'aceso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente asocià|I utenti asociadi}} a sto indiriso de posta ełetronega łi xe:
+
+$2
+
+{{PLURAL:$3|Sta password tenporanea ła scadarà|Ste password tenporanee łe scadarà}} dopo {{PLURAL:$5|un dì|$5 dì}}.
+Sarìa mejo acedare e deçidare na nova password sùito. 
+
+Se no te si stà ti a fare ła richiesta, o se te te ghe ricordà ła password originałe e no te vołi pi canbiarla, te połi ignorare sto mesajo e continuar doparare ła to password vecia.",
+'passwordreset-emailtext-user' => "El utente $1 da {{SITENAME}} (probabilmente ti steso) ga richiesto l'invio dei to detaji del profiło par {{SITENAME}} ($4). {{PLURAL:$3|El profiło utente asocià|I profiłi utenti asociadi}} a sto indiriso de posta ełetronega łi xe:
+
+$2
+
+{{PLURAL:$3|Sta password tenporanea ła scadarà|Ste password tenporanee łe scadarà}} dopo {{PLURAL:$5|un dì|$5 dì}}.
+Sarìa mejo acedare e deçidare na nova password sùito. 
+
+Se no te si stà ti a fare ła richiesta, o se te te ghe ricordà ła password originałe e no te vołi pi canbiarla, te połi ignorare sto mesajo e continuar doparare ła to password vecia.",
+'passwordreset-emailelement' => 'Nome utente: $1
+Password tenporanea: $2',
+'passwordreset-emailsent' => 'Xe stà invià on promemoria via posta eletronega.',
+'passwordreset-emailsent-capture' => 'Xe stà invià un promemoria via posta eletronega: el contegù xe riportà cuà de seguito.',
+'passwordreset-emailerror-capture' => "Xe stà generà el promemoria riportà cuà de seguito. L'invio al utente no xe riusido: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'Canbia indiriso de posta ełetronega',
+'changeemail-header' => 'Canbia el indiriso de posta ełetronega del account',
+'changeemail-text' => 'Conpleta sto moduło par canbiare el to indiriso de posta ełetronega. Sarà necesario inserire ła password par confermare ła modifega.',
+'changeemail-no-info' => "Te ghe da aver efetuà l'aceso par acedare a sta pajina diretamente.",
+'changeemail-oldemail' => 'Indiriso de posta ełetronega atuałe:',
+'changeemail-newemail' => 'Novo indiriso de posta ełetronega:',
+'changeemail-none' => '(nisun)',
+'changeemail-submit' => 'Canbia indiriso de posta ełetronega',
+'changeemail-cancel' => 'Anuła',
+
 # Edit page toolbar
 'bold_sample' => 'Testo in grosso',
 'bold_tip' => 'Testo in grosso',
@@ -739,7 +801,12 @@ o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'userpage-userdoesnotexist-view' => 'L\'utensa "$1" no la xe gnancora registrà.',
 'blocked-notice-logextract' => "Sto utente xè atualmente blocà.
 L'ultimo ełemento del rejistro de i blochi xè riportà de seguito par informasion:",
-'clearyourcache' => "'''Ocio: dopo aver salvà, te ghè da netar la cache del to browser par védar i canbiamenti.''' Par '''Mozilla / Firefox / Safari:''' tien macà el boton de le majuscole e schiza \"Ricarica\", o senò maca ''Ctrl-F5'' o ''Ctrl-R'' (''Command-R'' se te ghè el Mac); par '''Konqueror:''' schiza \"Ricarica\" o maca ''F5;'' par '''Opera:''' néta la cache in ''Strumenti → Preferenze;'' par '''Internet Explorer:''' tien macà ''Ctrl'' fin che te schizi ''Ricarica'', o maca ''Ctrl-F5.''",
+'clearyourcache' => "Ocio: dopo aver salvà, połe darse che te gabi da netare ła cache del to browser par védar i canbiamenti.
+*Par '''Firefox / Safari:''' tien macà el boton de łe majuscołe e schicia \"Recarga\", o senò maca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' se te ghè el Mac)
+*Par '''Google Chrome''':schicia ''Ctrl-Shift-R'' (''⌘-Shift-R'' co' un Mac)
+*Par '''Internet Explorer''': tien schicià el boton \"Ctrl\" fin che te schici '''Recarga''', senò schicia '''Ctrl+F5'''
+*Par '''Konqueror''': schicia \"Recarga\" o maca ''F5'';
+*Par '''Opera:''' néta la cache in ''Strumenti → Preferense;''",
 'usercssyoucanpreview' => "'''Sugerimento:''' se consiglia de doparar el boton \"{{int:showpreview}} par proàr i novi CSS prima de salvarli.",
 'userjsyoucanpreview' => "'''Sugerimento:''' se consiglia de doparar el boton \"{{int:showpreview}}\" par proàr i novi JavaScript prima de salvarli.",
 'usercsspreview' => "'''Sta qua la xe solo n'anteprima del proprio CSS personal.
@@ -750,7 +817,8 @@ Le modifiche no le xe gnancora stà salvà!'''",
 'userinvalidcssjstitle' => "'''Ocio:'''  No ghe xe nissuna skin con nome \"\$1\". Nota che le pagine par i .css e .js personalizà le gà l'iniziale del titolo minuscola, par esenpio {{ns:user}}:Esenpio/vector.css e no {{ns:user}}:Esenpio/Vector.css.",
 'updated' => '(Agiornà)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''Sta qua la xe solo n'anteprima; i canbiamenti a la pagina NO i xe gnancora stà salvà!'''",
+'previewnote' => "Sta cua ła xe soło n'anteprima; i canbiamenti a ła pajina NO i xe gnancora stà salvài!",
+'continue-editing' => 'Continua modifegare',
 'previewconflict' => 'Sta anteprima la corisponde al testo ne la casèla de edizion de sora, e la fa védar come vegnarà fora la pagina se te machi "Salva la pagina" in sto momento.',
 'session_fail_preview' => "No xè stà possibiłe salvar le to modifiche parché i dati de la session i xè andai persi.
 Par piaser, riproa da novo.
@@ -762,7 +830,9 @@ Se no funsiona gnancora, proa a [[Special:UserLogout|scołegarte]] e a cołegart
 '''Se te stè fasendo na modifica legìtima, par piaser próa de novo.
 Se no funsiona gnancora, te pol proár a [[Special:UserLogout|scolegarte]] e efetuar da novo l'acesso.'''",
 'token_suffix_mismatch' => "'''La modifica no la xe mìa stà salvà parché el client el gà mostrà de gestir in maniera sbaglià i caràteri de puntegiatura nel token associà a la stessa. Par evitar na possibile coruzion del testo de la pagina, xe stà rifiutà l'intera modifica. Sta situazion la pode verificarse, a olte, quando vien doparà serti servizi de proxy anonimi via web che presenta dei bug.'''",
+'edit_form_incomplete' => "' ' Alcune parte del moduło de modifega no łe xe rivade al server; controłare che łe modifeghe sìe intate e riprovare. ' '",
 'editing' => 'Canbia $1',
+'creating' => 'Te si drio creare $1',
 'editingsection' => 'Canbia $1 (sezion)',
 'editingcomment' => 'Modifica de $1 (sezion nova)',
 'editconflict' => 'Conflito de edizion: $1',
@@ -783,8 +853,8 @@ Cargando el testo te dichiari inoltre, soto la to responsabilità, che el testo
 Se no te voli che i to scriti i vegna modificà sensa pietà, alora no sta inserirli qua.<br />
 Sapi che te stè prometendo che te stè inserendo un testo scrito de to pugno, o copià da na fonte de publico dominio o similarmente lìbara (varda $1 par i detagli).
 '''NO STA INSERIR OPERE PROTETE DA COPYRIGHT SENSA PERMESSO!'''",
-'longpageerror' => "'''ERROR: The text you have submitted is $1 kilobytes
-long, which is longer than the maximum of $2 kilobytes. It cannot be saved.'''",
+'longpageerror' => "'''Erore: el testo invià xe grando {{PLURAL:$1|1|$1}} kilobyte, che xe de pì deła dimension masima consentìa de {{PLURAL:$2|1|$2}} kilobyte.'''
+El testo no połe esare salvà.",
 'readonlywarning' => "'''OCIO: El database el xe stà blocà par manutenzion, quindi no se pol salvar le modifiche in sto momento.
 Par no pèrdarle, te pol copiar tuto quel che te ghè inserìo fin desso ne la casela de modifica, incolarlo in un programa de elaborazion de testi e salvarlo, intanto che te speti che i sbloca el database.'''
 
@@ -822,6 +892,7 @@ Pararìa che la sìpia stà scancelà.',
 'edit-no-change' => 'La to modifica la xe stà ignorà, parché no ti gà canbià gnente nel testo.',
 'edit-already-exists' => 'No se pol crear na pagina nova.
 La esiste de zà.',
+'defaultmessagetext' => 'Testo predefinìo',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Ocio: Sta pagina la contien dele chiamate de funzion al parser massa onerose.
@@ -837,6 +908,7 @@ Sti argomenti i xe stà omessi.",
 'parser-template-loop-warning' => 'Xe stà catà un ciclo in tel modèl: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Xe stà rajunto el limite màssimo de ricorsion in tel modèl ($1)',
 'language-converter-depth-warning' => 'Limite de profondità del convertidor de lengua superà ($1)',
+'node-count-exceeded-category' => 'Pajine ndove che el node-count supera el limite',
 
 # "Undo" feature
 'undo-success' => 'Sta modifica la pode èssar anulà. Verifica el confronto presentà de seguito par èssar sicuro che el contenuto el sia come te lo voli e quindi salva le modifiche par conpletar la procedura de anulamento.',
@@ -888,29 +960,27 @@ Legenda: '''({{int:cur}})''' = difarense co l'ultima version, '''({{int:last}})'
 'rev-deleted-user-contribs' => '[nome utente o indirisso IP cavà - modifica sconta dai contributi]',
 'rev-deleted-text-permission' => "Sta version de la pagina la xe stà '''scancelà'''.
 Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelazion] par ulteriori detagli.",
-'rev-deleted-text-unhide' => "Sta version de la pàxena la xe sta '''scancelà'''.
-Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par ulteriori detagli.
-Ai aministradori xe ancora consentìo [$1 vardar sta version] se i vole.",
-'rev-suppressed-text-unhide' => "Sta version de la pagina la xe stà '''cavà'''.
-Varda el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de rimozion] par ulteriori detagli.
-I aministratori i pode ancora [$1 vardar sta versione] se i vole.",
+'rev-deleted-text-unhide' => "Sta version de la pajina ła xe stà '''scancełà'''.
+Controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.
+Ai aministradori ghe xe uncora consentìo [$1 vardar sta version] se i vołe.",
+'rev-suppressed-text-unhide' => "Sta version de ła pagina la xe stà ''rimosa'''.
+Controłare el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejistro dełe rimosion] par ulteriori detaji.
+I aministradori połe uncora [$1 vardar sta version] se i vołe.",
 'rev-deleted-text-view' => "Sta version de la pagina la xe stà '''scancelà'''.
-El testo el pode èssar visualizà soltanto dai aministradori del sito.
-Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelazion] par ulteriori detagli.",
-'rev-suppressed-text-view' => "Sta version de la pagina la xe stà '''cavà'''.
-Solo i aministratori i pole ancora védarla.
-Varda el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de rimozion] par ulteriori detagli.",
+I aministradori połe uncora vixuałixarla. Controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.",
+'rev-suppressed-text-view' => "Sta version de ła pajina xe stà '''rimosa'''.
+I aministradori i połe uncora vedarla; controłare el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejistro dełe rimosion] par ulteriori detaji.",
 'rev-deleted-no-diff' => "No te pode vardar sta difarensa parché una de le revision la xe stà '''scancelà'''.
 Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par savérghene piessè.",
 'rev-suppressed-no-diff' => "No te pol védar sta difarensa, parché una de le revision la xe stà '''scancelà'''.",
-'rev-deleted-unhide-diff' => "Una dele revision de sta difarensa la xe stà '''scancelà'''.
-Consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par ulteriori detagli.
-I aministradori i pode ancora [$1 vardar sta difarensa] se i vole.",
-'rev-suppressed-unhide-diff' => "Una dele revision de sta difarensa la xe stà '''sopressa'''.
-Consulta el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de sopression] par ulteriori detagli.
-I aministradori i pode ancora [$1 vardar sta difarensa] se i vole.",
-'rev-deleted-diff-view' => "Una dele revision de sta difarensa la xe stà '''scancelà'''.
-Come aministrador, te pol vardar el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par ulteriori detagli.",
+'rev-deleted-unhide-diff' => "Una dełe revixion de sto confronto fra version xe stà '''scancełà'''.
+Controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.
+Ai aministradori ghe xe uncora consentìo [$1 vixualixare el confronto] se i vołe.",
+'rev-suppressed-unhide-diff' => "Una dełe revixion de sto confronto de version xe stà '''sopresa'''.
+Controła el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejistro dełe sopresion] par ulteriori detaji.
+I aministradori i połe uncora [$1 vixualixare el confronto] se i vołe.",
+'rev-deleted-diff-view' => "Una dełe revixion de sto confronto de version ła xe stà '''scancelà'''.
+Te połi uncora vixuałixare sto confronto; controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.",
 'rev-suppressed-diff-view' => "Una dele revision de sta difarensa la xe stà '''sopressa'''.
 Come aminitrador, te pol vardar el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de sopression] par ulteriori detagli.",
 'rev-delundel' => 'mostra/scondi',
index 1b5bf34..9d71f39 100644 (file)
@@ -1055,6 +1055,10 @@ Những giá trị này sẽ bị bỏ đi.',
 'parser-template-loop-warning' => 'Phát hiện bản mẫu lặp vòng: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Bản mẫu đã vượt quá giới hạn về độ sâu đệ quy ($1)',
 'language-converter-depth-warning' => 'Đã vượt quá giới hạn độ sâu của bộ chuyển đổi ngôn ngữ ($1)',
+'node-count-exceeded-category' => 'Những trang có số nốt vượt quá giới hạn cho phép',
+'node-count-exceeded-warning' => 'Trang có nhiều nốt quá',
+'expansion-depth-exceeded-category' => 'Những trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép',
+'expansion-depth-exceeded-warning' => 'Trang bung bản mẫu sâu quá',
 
 # "Undo" feature
 'undo-success' => 'Các sửa đổi có thể được lùi lại. Xin hãy kiểm tra phần so sánh bên dưới để xác nhận lại những gì bạn muốn làm, sau đó lưu thay đổi ở dưới để hoàn tất việc lùi lại sửa đổi.',
index fc2e86c..d3befa9 100644 (file)
@@ -2952,11 +2952,18 @@ $1',
 'exif-languagecode' => 'שפראַך',
 'exif-iimversion' => 'IIM ווערסיע',
 'exif-iimcategory' => 'קאַטעגאָריע',
+'exif-iimsupplementalcategory' => 'אונטער־קאטעגאריעס',
 'exif-datetimeexpires' => 'נישט צו ניצן נאָך',
 'exif-datetimereleased' => 'באַפֿרייט אום',
+'exif-originaltransmissionref' => 'ארגינעלער טראנסמיסיע פלאצירונג קאד',
+'exif-identifier' => 'אידענטיפֿיצירער',
+'exif-lens' => 'געניצטער לינז',
+'exif-serialnumber' => 'סעריע־נומער פון קאמערע',
 'exif-cameraownername' => 'אייגנטימער פון קאמערע',
+'exif-label' => 'צעטל',
 'exif-datetimemetadata' => 'דאטע ווען מעטאדאטן זענען געווען לעצט געענדערט',
 'exif-rating' => 'שאצונג (פֿון 5)',
+'exif-rightscertificate' => 'רעכטן פארוואלטונג צערטיפיקאט',
 'exif-copyrighted' => 'קאפירעכט סטאַטוס',
 'exif-copyrightowner' => 'קאפירעכטן האלטער',
 'exif-usageterms' => 'ניץ באַדינגונג',
@@ -2964,6 +2971,7 @@ $1',
 'exif-morepermissionsurl' => 'אלטערנאטיווע ליצענצירן אינפארמאציע',
 'exif-pngfilecomment' => 'PNG טעקע הערה',
 'exif-giffilecomment' => 'GIF טעקע הערה',
+'exif-intellectualgenre' => 'ארט  איינהייט',
 'exif-subjectnewscode' => 'טעמע קאד',
 
 # EXIF attributes
@@ -3236,6 +3244,7 @@ $5
 'watchlistedit-normal-title' => 'רעדאַקטירן די אויפֿפאַסונג ליסטע',
 'watchlistedit-normal-legend' => 'אַראָפנעמען בלעטער פון דער אויפֿפאסן ליסטע',
 'watchlistedit-normal-submit' => 'אַראָפנעמען בלעטער',
+'watchlistedit-normal-done' => '{{PLURAL:$1|1 טיטל איז|$1 טיטלען זענען}} געווארן אראפגענומען פון אייער אויפפאסונג־ליסטע:',
 'watchlistedit-raw-title' => 'רעדאַקטירן די רויע אויפֿפאַסונג ליסטע',
 'watchlistedit-raw-legend' => 'רעדאַקטירן די רויע אויפֿפאַסונג ליסטע',
 'watchlistedit-raw-titles' => 'טיטלען:',
index 2a795bf..3497c72 100644 (file)
@@ -2466,6 +2466,7 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
 
 # Export
 'export' => 'Ìkójáde àwọn ojúewé',
+'exportall' => 'Ìkójáde gbogbo àwọn ojúewé',
 'export-submit' => 'Kósíta',
 'export-addcattext' => 'Àfikún àwọn ojúewé láti inú ẹ̀ka:',
 'export-addcat' => 'Ìròpọ̀',
index 9cc1b18..c1e0fbe 100644 (file)
@@ -457,7 +457,7 @@ $messages = array(
 'protectthispage' => '保护本页',
 'unprotect' => '更改保护',
 'unprotectthispage' => '更改本页面的保护',
-'newpage' => 'æ\9c\80æ\96°é¡µé\9d¢',
+'newpage' => '新页面',
 'talkpage' => '讨论本页',
 'talkpagelinktext' => '讨论',
 'specialpage' => '特殊页面',
@@ -1159,8 +1159,8 @@ $1",
 'notextmatches' => '没有页面内容匹配',
 'prevn' => '前$1个',
 'nextn' => '后$1个',
-'prevn-title' => '前$1结果',
-'nextn-title' => '后$1结果',
+'prevn-title' => '前$1结果',
+'nextn-title' => '后$1结果',
 'shown-title' => '每页显示$1项结果',
 'viewprevnext' => '查看($1{{int:pipe-separator}}$2)($3)',
 'searchmenu-legend' => '搜索选项',
@@ -1236,7 +1236,7 @@ $1",
 'prefs-rc' => '最近更改',
 'prefs-watchlist' => '监视列表',
 'prefs-watchlist-days' => '监视列表中显示的天数:',
-'prefs-watchlist-days-max' => '最多$1{{PLURAL:$1|天}}',
+'prefs-watchlist-days-max' => '最多$1',
 'prefs-watchlist-edits' => '扩展监视列表中显示的最大更改数:',
 'prefs-watchlist-edits-max' => '最大数量:1000',
 'prefs-watchlist-token' => '监视列表权标:',
@@ -1963,7 +1963,7 @@ $1',
 'listusers-creationsort' => '按建立日期排序',
 'usereditcount' => '$1次编辑',
 'usercreated' => '$1 $2{{GENDER:$3|创建}}',
-'newpages' => 'æ\9c\80æ\96°é¡µé\9d¢',
+'newpages' => '新页面',
 'newpages-username' => '用户名:',
 'ancientpages' => '最早页面',
 'move' => '移动',
index fe7fb6a..bdf3bea 100644 (file)
@@ -965,6 +965,10 @@ $2
 'parser-template-loop-warning' => '已偵測迴歸模板: [[$1]]',
 'parser-template-recursion-depth-warning' => '已超過迴歸模板深度限制 ($1)',
 'language-converter-depth-warning' => '已超過字詞轉換器深度限制($1)',
+'node-count-exceeded-category' => '頁面的節點數超出限制',
+'node-count-exceeded-warning' => '頁面超出節點數',
+'expansion-depth-exceeded-category' => '頁面的擴展深度超出限制',
+'expansion-depth-exceeded-warning' => '頁面超出擴展深度',
 
 # "Undo" feature
 'undo-success' => '該編輯可以被撤銷。請檢查以下對比以核實這正是您想做的,然後儲存以下更改以完成撤銷編輯。',
index 6e82971..2fa637a 100644 (file)
--- a/load.php
+++ b/load.php
@@ -24,7 +24,7 @@
  */
 
 // Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
        require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
        wfPHPVersionError( 'load.php' );
 }
index ae1367b..cec1270 100644 (file)
@@ -32,7 +32,7 @@ define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
 $maintClass = false;
 
 // Make sure we're on PHP5 or better
-if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
        require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
        wfPHPVersionError( 'cli' );
 }
diff --git a/maintenance/archives/patch-ipb-parent-block-id-index.sql b/maintenance/archives/patch-ipb-parent-block-id-index.sql
new file mode 100644 (file)
index 0000000..1f413f3
--- /dev/null
@@ -0,0 +1,2 @@
+-- index for ipblocks.ipb_parent_block_id
+CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
diff --git a/maintenance/archives/patch-ipb-parent-block-id.sql b/maintenance/archives/patch-ipb-parent-block-id.sql
new file mode 100644 (file)
index 0000000..8ebcf78
--- /dev/null
@@ -0,0 +1,3 @@
+-- Adding ipb_parent_block_id to track the block that caused an autoblock
+ALTER TABLE /*$wgDBprefix*/ipblocks
+  ADD ipb_parent_block_id int DEFAULT NULL;
index 11f0cd5..3846ef5 100644 (file)
@@ -24,6 +24,7 @@
  * @ingroup Maintenance
  */
 
+require_once( dirname( __FILE__ ) . '/backup.inc' );
 
 /**
  * @ingroup Maintenance
@@ -430,7 +431,8 @@ class TextPassDumper extends BackupDumper {
                                if ( $text === false && isset( $this->prefetch ) && $prefetchNotTried ) {
                                        $prefetchNotTried = false;
                                        $tryIsPrefetch = true;
-                                       $text = $this->prefetch->prefetch( $this->thisPage, $this->thisRev );
+                                       $text = $this->prefetch->prefetch( intval( $this->thisPage ),
+                                               intval( $this->thisRev ) );
                                        if ( $text === null ) {
                                                $text = false;
                                        }
index 6a6a446..687a95c 100644 (file)
@@ -192,9 +192,8 @@ class ImageCleanup extends TableCleanup {
        }
 
        private function buildSafeTitle( $name ) {
-               global $wgLegalTitleChars;
                $x = preg_replace_callback(
-                       "/([^$wgLegalTitleChars]|~)/",
+                       '/([^' . Title::legalChars() . ']|~)/',
                        array( $this, 'hexChar' ),
                        $name );
 
index e05f43c..4638468 100644 (file)
@@ -30,7 +30,7 @@ $originalDir = getcwd();
 $optionsWithArgs = array( 'pagelist', 'start', 'end', 'revstart', 'revend');
 
 require_once( dirname( __FILE__ ) . '/commandLine.inc' );
-require_once( 'backup.inc' );
+require_once( dirname( __FILE__ ) . '/backup.inc' );
 
 $dumper = new BackupDumper( $argv );
 
index 7a5a5f6..41a7a68 100644 (file)
@@ -27,8 +27,7 @@
 $originalDir = getcwd();
 
 require_once( dirname( __FILE__ ) . '/commandLine.inc' );
-require_once( 'backup.inc' );
-require_once( 'backupTextPass.inc' );
+require_once( dirname( __FILE__ ) . '/backupTextPass.inc' );
 
 
 $dumper = new TextPassDumper( $argv );
index 66fc656..f5162c9 100644 (file)
@@ -371,7 +371,9 @@ CREATE TABLE ipblocks (
   ipb_range_end         VARCHAR(1024),
   ipb_deleted           SMALLINT NOT NULL DEFAULT 0,
   ipb_block_email       SMALLINT NOT NULL DEFAULT 0,
-  ipb_allow_usertalk    SMALLINT NOT NULL DEFAULT 0
+  ipb_allow_usertalk    SMALLINT NOT NULL DEFAULT 0,
+  ipb_parent_block_id             INTEGER DEFAULT NULL
+  -- REFERENCES ipblocks(ipb_id) ON DELETE SET NULL
 
 );
 CREATE INDEX ipb_address
index 9a408aa..96a65fc 100644 (file)
@@ -20,8 +20,8 @@
  * @see wfWaitForSlaves()
  */
 
-if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.2.3' ) < 0 ) ) {
-       echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.2.3 or higher. ABORTING.\n" .
+if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
+       echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.3.2 or higher. ABORTING.\n" .
        "Check if you have a newer php executable with a different name, such as php5.\n";
        die( 1 );
 }
index d22449b..a57624e 100644 (file)
@@ -408,7 +408,9 @@ $wgMessageStructure = array(
                'customjsprotected',
                'ns-specialprotected',
                'titleprotected',
-               'filereadonlyerror'
+               'filereadonlyerror',
+               'invalidtitle-knownnamespace',
+               'invalidtitle-unknownnamespace',
        ),
        'virus' => array(
                'virus-badscanner',
@@ -1445,6 +1447,7 @@ $wgMessageStructure = array(
                'http-curl-error',
                'http-host-unreachable',
                'http-bad-status',
+               'http-truncated-body',
        ),
 
        'upload-curl-errors' => array(
index 8c4d500..a0c3d17 100644 (file)
@@ -396,6 +396,7 @@ CREATE TABLE /*$wgDBprefix*/ipblocks (
        ipb_deleted BIT NOT NULL DEFAULT 0,
        ipb_block_email BIT NOT NULL DEFAULT 0,
        ipb_allow_usertalk BIT NOT NULL DEFAULT 0,
+       ipb_parent_block_id   INT DEFAULT NULL,
 );
 -- Unique index to support "user already blocked" messages
 -- Any new options which prevent collisions should be included
index 9f875ae..3722120 100644 (file)
@@ -272,7 +272,8 @@ CREATE TABLE &mw_prefix.ipblocks (
   ipb_range_end         VARCHAR2(255),
   ipb_deleted           CHAR(1)      DEFAULT '0' NOT NULL,
   ipb_block_email       CHAR(1)      DEFAULT '0' NOT NULL,
-  ipb_allow_usertalk    CHAR(1)      DEFAULT '0' NOT NULL
+  ipb_allow_usertalk    CHAR(1)      DEFAULT '0' NOT NULL,
+  ipb_parent_block_id             NUMBER       DEFAULT NULL
 );
 ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_pk PRIMARY KEY (ipb_id);
 ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk1 FOREIGN KEY (ipb_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
index b0cdb84..1e3eecb 100644 (file)
@@ -277,12 +277,14 @@ CREATE TABLE ipblocks (
   ipb_range_end         TEXT,
   ipb_deleted           SMALLINT     NOT NULL  DEFAULT 0,
   ipb_block_email       SMALLINT     NOT NULL  DEFAULT 0,
-  ipb_allow_usertalk    SMALLINT     NOT NULL  DEFAULT 0
+  ipb_allow_usertalk    SMALLINT     NOT NULL  DEFAULT 0,
+  ipb_parent_block_id             INTEGER          NULL  REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED
 
 );
 CREATE UNIQUE INDEX ipb_address_unique ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only);
 CREATE INDEX ipb_user    ON ipblocks (ipb_user);
 CREATE INDEX ipb_range   ON ipblocks (ipb_range_start,ipb_range_end);
+CREATE INDEX ipb_parent_block_id   ON ipblocks (ipb_parent_block_id);
 
 
 CREATE TABLE image (
index a848bf5..0a5b2fb 100644 (file)
@@ -772,7 +772,13 @@ CREATE TABLE /*_*/ipblocks (
   ipb_block_email bool NOT NULL default 0,
 
   -- Block allows user to edit their own talk page
-  ipb_allow_usertalk bool NOT NULL default 0
+  ipb_allow_usertalk bool NOT NULL default 0,
+
+  -- ID of the block that caused this block to exist
+  -- Autoblocks set this to the original block
+  -- so that the original block being deleted also
+  -- deletes the autoblocks
+  ipb_parent_block_id int default NULL
 
 ) /*$wgDBTableOptions*/;
 
@@ -784,6 +790,7 @@ CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
 CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
 CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
 CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
+CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
 
 
 --
index c4bf3b2..741ec90 100644 (file)
@@ -25,8 +25,8 @@
  * @ingroup Maintenance
  */
 
-if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.2.3' ) < 0 ) ) {
-       echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.2.3 or higher. ABORTING.\n" .
+if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
+       echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.3.2 or higher. ABORTING.\n" .
        "Check if you have a newer php executable with a different name, such as php5.\n";
        die( 1 );
 }
index 55c3001..466c551 100644 (file)
@@ -103,7 +103,7 @@ $.suggestions = {
                        // Wait for the browser to update the value
                        setTimeout( function() {
                                // Render special
-                               $special = context.data.$container.find( '.suggestions-special' );
+                               var $special = context.data.$container.find( '.suggestions-special' );
                                context.config.special.render.call( $special, context.data.$textbox.val() );
                        }, 1 );
                }
@@ -311,7 +311,7 @@ $.suggestions = {
                        case 13:
                                context.data.$container.hide();
                                preventDefault = wasVisible;
-                               selected = context.data.$container.find( '.suggestions-result-current' );
+                               var selected = context.data.$container.find( '.suggestions-result-current' );
                                if ( selected.length === 0 || context.data.selectedWithMouse ) {
                                        // if nothing is selected OR if something was selected with the mouse,
                                        // cancel any current requests and submit the form
index d1b51a6..404bbe7 100644 (file)
@@ -134,9 +134,7 @@ class VectorTemplate extends BaseTemplate {
                        <!-- /sitenotice -->
                        <?php endif; ?>
                        <!-- firstHeading -->
-                       <h1 id="firstHeading" class="firstHeading">
-                               <span dir="auto"><?php $this->html( 'title' ) ?></span>
-                       </h1>
+                       <h1 id="firstHeading" class="firstHeading"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
                        <!-- /firstHeading -->
                        <!-- bodyContent -->
                        <div id="bodyContent">
index ebb639b..b90fd63 100644 (file)
@@ -11,12 +11,9 @@ div#footer {
        margin-left: 11em;
        padding: 1.25em;
 }
-div#mw-panel div.portal div.body {
+#mw-panel {
        padding-left: 0.5em;
 }
-div#mw-panel div.portal h5 {
-       padding-left: 2.25em;
-}
 #p-search {
        margin-right: 1em;
 }
index b309d15..4a7a9a0 100644 (file)
@@ -861,8 +861,7 @@ div#footer {
        -webkit-transition: left 250ms;
        -o-transition: left 250ms;
 }
-div#mw-panel div.portal div.body,
-div#mw-panel div.portal h5 {
+#mw-panel {
        transition: padding-left 250ms;
        -moz-transition: padding-left 250ms;
        -webkit-transition: padding-left 250ms;
index fdb53c2..ddb84c3 100644 (file)
@@ -9347,6 +9347,15 @@ File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascri
 
 !! end
 
+!!test
+Language parser function
+!! input
+{{#language:ar}}
+!! result
+<p>العربية
+</p>
+!! end
+
 TODO:
 more images
 more tables
index f626459..0791711 100644 (file)
@@ -132,8 +132,18 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        }
 
        function needsDB() {
+               # if the test says it uses database tables, it needs the database
+               if ( $this->tablesUsed ) {
+                       return true;
+               }
+
+               # if the test says it belongs to the Database group, it needs the database
                $rc = new ReflectionClass( $this );
-               return strpos( $rc->getDocComment(), '@group Database' ) !== false;
+               if ( preg_match( '/@group +Database/im', $rc->getDocComment() ) ) {
+                       return true;
+               }
+
+               return false;
        }
 
        /**
index b023fdc..08eb50f 100644 (file)
@@ -15,11 +15,11 @@ EOF;
 }
 
 // Output a notice when running with older versions of PHPUnit
-if ( !version_compare( PHPUnit_Runner_Version::id(), "3.4.1", ">" ) ) {
+if ( version_compare( PHPUnit_Runner_Version::id(), "3.6.7", "<" ) ) {
   echo <<<EOF
 ********************************************************************************
 
-These tests run best with version PHPUnit 3.4.2 or better. Earlier versions may
+These tests run best with version PHPUnit 3.6.7 or better. Earlier versions may
 show failures because earlier versions of PHPUnit do not properly implement
 dependencies.
 
index 6c3e666..b5418dd 100644 (file)
@@ -8,7 +8,7 @@ class CdbTest extends MediaWikiTestCase {
 
        public function setUp() {
                if ( !CdbReader::haveExtension() ) {
-                       $this->markTestIncomplete( 'This test requires native CDB support to be present.' );
+                       $this->markTestSkipped( 'Native CDB support is not available' );
                }
        }
 
index 89d9e0c..664f04a 100644 (file)
@@ -8,6 +8,7 @@ class PreferencesTest extends MediaWikiTestCase {
 
        function __construct() {
                parent::__construct();
+               global $wgEnableEmail;
 
                $this->users['noemail'] = new User;
 
@@ -23,6 +24,9 @@ class PreferencesTest extends MediaWikiTestCase {
 
                $this->context = new RequestContext;
                $this->context->setTitle( Title::newFromText('PreferencesTest') );
+
+               //some tests depends on email setting
+               $wgEnableEmail = true;
        }
 
        /**
diff --git a/tests/phpunit/includes/RevisionStorageTest.php b/tests/phpunit/includes/RevisionStorageTest.php
new file mode 100644 (file)
index 0000000..20199b2
--- /dev/null
@@ -0,0 +1,308 @@
+<?php
+
+/**
+ * Test class for Revision storage.
+ *
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class RevisionStorageTest extends MediaWikiTestCase {
+
+       var $the_page;
+
+       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed = array_merge( $this->tablesUsed,
+                                                array( 'page',
+                                                     'revision',
+                                                     'text',
+
+                                                     'recentchanges',
+                                                     'logging',
+
+                                                     'page_props',
+                                                     'pagelinks',
+                                                     'categorylinks',
+                                                     'langlinks',
+                                                     'externallinks',
+                                                     'imagelinks',
+                                                     'templatelinks',
+                                                     'iwlinks' ) );
+       }
+
+       public function setUp() {
+               if ( !$this->the_page ) {
+                       $this->the_page = $this->createPage( 'RevisionStorageTest_the_page', "just a dummy page" );
+               }
+       }
+
+       protected function makeRevision( $props = null ) {
+               if ( $props === null ) $props = array();
+
+               if ( !isset( $props['content'] ) && !isset( $props['text'] ) ) $props['text'] = 'Lorem Ipsum';
+               if ( !isset( $props['comment'] ) ) $props['comment'] = 'just a test';
+               if ( !isset( $props['page'] ) ) $props['page'] = $this->the_page->getId();
+
+               $rev = new Revision( $props );
+
+               $dbw = wfgetDB( DB_MASTER );
+               $rev->insertOn( $dbw );
+
+               return $rev;
+       }
+
+       protected function createPage( $page, $text, $model = null ) {
+               if ( is_string( $page ) ) $page = Title::newFromText( $page );
+               if ( $page instanceof Title ) $page = new WikiPage( $page );
+
+               if ( $page->exists() ) {
+                       $page->doDeleteArticle( "done" );
+               }
+
+               $page->doEdit( $text, "testing", EDIT_NEW );
+
+               return $page;
+       }
+
+       protected function assertRevEquals( Revision $orig, Revision $rev = null ) {
+               $this->assertNotNull( $rev, 'missing revision' );
+
+               $this->assertEquals( $orig->getId(), $rev->getId() );
+               $this->assertEquals( $orig->getPage(), $rev->getPage() );
+               $this->assertEquals( $orig->getTimestamp(), $rev->getTimestamp() );
+               $this->assertEquals( $orig->getUser(), $rev->getUser() );
+               $this->assertEquals( $orig->getSha1(), $rev->getSha1() );
+       }
+
+       /**
+        * @covers Revision::__construct
+        */
+       public function testConstructFromRow()
+       {
+               $orig = $this->makeRevision();
+
+               $dbr = wfgetDB( DB_SLAVE );
+               $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
+               $this->assertTrue( is_object( $res ), 'query failed' );
+
+               $row = $res->fetchObject();
+               $res->free();
+
+               $rev = new Revision( $row );
+
+               $this->assertRevEquals( $orig, $rev );
+       }
+
+       /**
+        * @covers Revision::newFromRow
+        */
+       public function testNewFromRow()
+       {
+               $orig = $this->makeRevision();
+
+               $dbr = wfgetDB( DB_SLAVE );
+               $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
+               $this->assertTrue( is_object( $res ), 'query failed' );
+
+               $row = $res->fetchObject();
+               $res->free();
+
+               $rev = Revision::newFromRow( $row );
+
+               $this->assertRevEquals( $orig, $rev );
+       }
+
+
+       /**
+        * @covers Revision::newFromArchiveRow
+        */
+       public function testNewFromArchiveRow()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testNewFromArchiveRow', 'Lorem Ipsum' );
+               $orig = $page->getRevision();
+               $page->doDeleteArticle( 'test Revision::newFromArchiveRow' );
+
+               $dbr = wfgetDB( DB_SLAVE );
+               $res = $dbr->select( 'archive', '*', array( 'ar_rev_id' => $orig->getId() ) );
+               $this->assertTrue( is_object( $res ), 'query failed' );
+
+               $row = $res->fetchObject();
+               $res->free();
+
+               $rev = Revision::newFromArchiveRow( $row );
+
+               $this->assertRevEquals( $orig, $rev );
+       }
+
+       /**
+        * @covers Revision::newFromId
+        */
+       public function testNewFromId()
+       {
+               $orig = $this->makeRevision();
+
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertRevEquals( $orig, $rev );
+       }
+
+       /**
+        * @covers Revision::fetchRevision
+        */
+       public function testFetchRevision()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one' );
+               $id1 = $page->getRevision()->getId();
+
+               $page->doEdit( 'two', 'second rev' );
+               $id2 = $page->getRevision()->getId();
+
+               $res = Revision::fetchRevision( $page->getTitle() );
+
+               #note: order is unspecified
+               $rows = array();
+               while ( ( $row = $res->fetchObject() ) ) {
+                       $rows[ $row->rev_id ]= $row;
+               }
+
+               $row = $res->fetchObject();
+               $this->assertEquals( 1, count($rows), 'expected exactly one revision' );
+               $this->assertArrayHasKey( $id2, $rows, 'missing revision with id ' . $id2 );
+       }
+
+       /**
+        * @covers Revision::selectFields
+        */
+       public function testSelectFields()
+       {
+               $fields = Revision::selectFields();
+
+               $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields');
+               $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields');
+               $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields');
+               $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields');
+       }
+
+       /**
+        * @covers Revision::getPage
+        */
+       public function testGetPage()
+       {
+               $page = $this->the_page;
+
+               $orig = $this->makeRevision( array( 'page' => $page->getId() ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( $page->getId(), $rev->getPage() );
+       }
+
+       /**
+        * @covers Revision::getText
+        */
+       public function testGetText()
+       {
+               $orig = $this->makeRevision( array( 'text' => 'hello hello.' ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( 'hello hello.', $rev->getText() );
+       }
+
+       /**
+        * @covers Revision::revText
+        */
+       public function testRevText()
+       {
+               $orig = $this->makeRevision( array( 'text' => 'hello hello rev.' ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( 'hello hello rev.', $rev->revText() );
+       }
+
+       /**
+        * @covers Revision::getRawText
+        */
+       public function testGetRawText()
+       {
+               $orig = $this->makeRevision( array( 'text' => 'hello hello raw.' ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( 'hello hello raw.', $rev->getRawText() );
+       }
+       /**
+        * @covers Revision::isCurrent
+        */
+       public function testIsCurrent()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum' );
+               $rev1 = $page->getRevision();
+
+               # @todo: find out if this should be true
+               # $this->assertTrue( $rev1->isCurrent() );
+
+               $rev1x = Revision::newFromId( $rev1->getId() );
+               $this->assertTrue( $rev1x->isCurrent() );
+
+               $page->doEdit( 'Bla bla', 'second rev' );
+               $rev2 = $page->getRevision();
+
+               # @todo: find out if this should be true
+               # $this->assertTrue( $rev2->isCurrent() );
+
+               $rev1x = Revision::newFromId( $rev1->getId() );
+               $this->assertFalse( $rev1x->isCurrent() );
+
+               $rev2x = Revision::newFromId( $rev2->getId() );
+               $this->assertTrue( $rev2x->isCurrent() );
+       }
+
+       /**
+        * @covers Revision::getPrevious
+        */
+       public function testGetPrevious()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testGetPrevious', 'Lorem Ipsum testGetPrevious' );
+               $rev1 = $page->getRevision();
+
+               $this->assertNull( $rev1->getPrevious() );
+
+               $page->doEdit( 'Bla bla', 'second rev testGetPrevious' );
+               $rev2 = $page->getRevision();
+
+               $this->assertNotNull( $rev2->getPrevious() );
+               $this->assertEquals( $rev1->getId(), $rev2->getPrevious()->getId() );
+       }
+
+       /**
+        * @covers Revision::getNext
+        */
+       public function testGetNext()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testGetNext', 'Lorem Ipsum testGetNext' );
+               $rev1 = $page->getRevision();
+
+               $this->assertNull( $rev1->getNext() );
+
+               $page->doEdit( 'Bla bla', 'second rev testGetNext' );
+               $rev2 = $page->getRevision();
+
+               $this->assertNotNull( $rev1->getNext() );
+               $this->assertEquals( $rev2->getId(), $rev1->getNext()->getId() );
+       }
+
+       /**
+        * @covers Revision::newNullRevision
+        */
+       public function testNewNullRevision()
+       {
+               $page = $this->createPage( 'RevisionStorageTest_testNewNullRevision', 'some testing text' );
+               $orig = $page->getRevision();
+
+               $dbw = wfGetDB( DB_MASTER );
+               $rev = Revision::newNullRevision( $dbw, $page->getId(), 'a null revision', false );
+
+               $this->assertNotEquals( $orig->getId(), $rev->getId(), 'new null revision shold have a different id from the original revision' );
+               $this->assertEquals( $orig->getTextId(), $rev->getTextId(), 'new null revision shold have the same text id as the original revision' );
+               $this->assertEquals( 'some testing text', $rev->getText() );
+       }
+}
index badd040..aed658b 100644 (file)
@@ -43,7 +43,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
         */
        public function testInNamespace( $title, $ns, $expectedBool ) {
                $title = Title::newFromText( $title );
-               $this->assertEquals( $title->inNamespace( $ns ), $expectedBool );
+               $this->assertEquals( $expectedBool, $title->inNamespace( $ns ) );
        }
 
        public function testInNamespaces() {
@@ -75,4 +75,127 @@ class TitleMethodsTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedBool, $title->hasSubjectNamespace( $ns ) );
        }
 
+       public function dataIsCssOrJsPage() {
+               return array(
+                       array( 'Foo', false ),
+                       array( 'Foo.js', false ),
+                       array( 'Foo/bar.js', false ),
+                       array( 'User:Foo', false ),
+                       array( 'User:Foo.js', false ),
+                       array( 'User:Foo/bar.js', false ),
+                       array( 'User:Foo/bar.css', false ),
+                       array( 'User talk:Foo/bar.css', false ),
+                       array( 'User:Foo/bar.js.xxx', false ),
+                       array( 'User:Foo/bar.xxx', false ),
+                       array( 'MediaWiki:Foo.js', true ),
+                       array( 'MediaWiki:Foo.css', true ),
+                       array( 'MediaWiki:Foo.JS', false ),
+                       array( 'MediaWiki:Foo.CSS', false ),
+                       array( 'MediaWiki:Foo.css.xxx', false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsCssOrJsPage
+        */
+       public function testIsCssOrJsPage( $title, $expectedBool ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedBool, $title->isCssOrJsPage() );
+       }
+
+
+       public function dataIsCssJsSubpage() {
+               return array(
+                       array( 'Foo', false ),
+                       array( 'Foo.js', false ),
+                       array( 'Foo/bar.js', false ),
+                       array( 'User:Foo', false ),
+                       array( 'User:Foo.js', false ),
+                       array( 'User:Foo/bar.js', true ),
+                       array( 'User:Foo/bar.css', true ),
+                       array( 'User talk:Foo/bar.css', false ),
+                       array( 'User:Foo/bar.js.xxx', false ),
+                       array( 'User:Foo/bar.xxx', false ),
+                       array( 'MediaWiki:Foo.js', false ),
+                       array( 'User:Foo/bar.JS', false ),
+                       array( 'User:Foo/bar.CSS', false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsCssJsSubpage
+        */
+       public function testIsCssJsSubpage( $title, $expectedBool ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedBool, $title->isCssJsSubpage() );
+       }
+
+       public function dataIsCssSubpage() {
+               return array(
+                       array( 'Foo', false ),
+                       array( 'Foo.css', false ),
+                       array( 'User:Foo', false ),
+                       array( 'User:Foo.js', false ),
+                       array( 'User:Foo.css', false ),
+                       array( 'User:Foo/bar.js', false ),
+                       array( 'User:Foo/bar.css', true ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsCssSubpage
+        */
+       public function testIsCssSubpage( $title, $expectedBool ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedBool, $title->isCssSubpage() );
+       }
+
+       public function dataIsJsSubpage() {
+               return array(
+                       array( 'Foo', false ),
+                       array( 'Foo.css', false ),
+                       array( 'User:Foo', false ),
+                       array( 'User:Foo.js', false ),
+                       array( 'User:Foo.css', false ),
+                       array( 'User:Foo/bar.js', true ),
+                       array( 'User:Foo/bar.css', false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsJsSubpage
+        */
+       public function testIsJsSubpage( $title, $expectedBool ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedBool, $title->isJsSubpage() );
+       }
+
+       public function dataIsWikitextPage() {
+               return array(
+                       array( 'Foo', true ),
+                       array( 'Foo.js', true ),
+                       array( 'Foo/bar.js', true ),
+                       array( 'User:Foo', true ),
+                       array( 'User:Foo.js', true ),
+                       array( 'User:Foo/bar.js', false ),
+                       array( 'User:Foo/bar.css', false ),
+                       array( 'User talk:Foo/bar.css', true ),
+                       array( 'User:Foo/bar.js.xxx', true ),
+                       array( 'User:Foo/bar.xxx', true ),
+                       array( 'MediaWiki:Foo.js', false ),
+                       array( 'MediaWiki:Foo.css', false ),
+                       array( 'MediaWiki:Foo/bar.css', false ),
+                       array( 'User:Foo/bar.JS', true ),
+                       array( 'User:Foo/bar.CSS', true ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsWikitextPage
+        */
+       public function testIsWikitextPage( $title, $expectedBool ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedBool, $title->isWikitextPage() );
+       }
+
 }
diff --git a/tests/phpunit/includes/WikiPageTest.php b/tests/phpunit/includes/WikiPageTest.php
new file mode 100644 (file)
index 0000000..88c26ef
--- /dev/null
@@ -0,0 +1,765 @@
+<?php
+/**
+* @group Database
+* ^--- important, causes temporary tables to be used instead of the real database
+**/
+
+class WikiPageTest extends MediaWikiTestCase {
+
+       var $pages_to_delete;
+
+       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed = array_merge ( $this->tablesUsed,
+                                                 array( 'page',
+                                                      'revision',
+                                                      'text',
+
+                                                      'recentchanges',
+                                                      'logging',
+
+                                                      'page_props',
+                                                      'pagelinks',
+                                                      'categorylinks',
+                                                      'langlinks',
+                                                      'externallinks',
+                                                      'imagelinks',
+                                                      'templatelinks',
+                                                      'iwlinks' ) );
+       }
+
+       public function setUp() {
+               $this->pages_to_delete = array();
+       }
+
+       public function tearDown() {
+               foreach ( $this->pages_to_delete as $p ) {
+                       /* @var $p WikiPage */
+
+                       try {
+                               if ( $p->exists() ) {
+                                       $p->doDeleteArticle( "testing done." );
+                               }
+                       } catch ( MWException $ex ) {
+                               // fail silently
+                       }
+               }
+       }
+
+       protected function newPage( $title ) {
+               if ( is_string( $title ) ) $title = Title::newFromText( $title );
+
+               $p = new WikiPage( $title );
+
+               $this->pages_to_delete[] = $p;
+
+               return $p;
+       }
+
+       protected function createPage( $page, $text, $model = null ) {
+               if ( is_string( $page ) ) $page = Title::newFromText( $page );
+               if ( $page instanceof Title ) $page = $this->newPage( $page );
+
+               $page->doEdit( $text, "testing", EDIT_NEW );
+
+               return $page;
+       }
+
+       public function testDoEdit() {
+               $title = Title::newFromText( "WikiPageTest_testDoEdit" );
+
+               $page = $this->newPage( $title );
+
+               $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
+                      . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
+
+               $page->doEdit( $text, "testing 1" );
+
+               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
+               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
+
+               $id = $page->getId();
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getText();
+               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
+
+               # ------------------------
+               $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
+                      . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
+
+               $page->doEdit( $text, "testing 2" );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getText();
+               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
+       }
+
+       public function testDoQuickEdit() {
+               global $wgUser;
+
+               $page = $this->createPage( "WikiPageTest_testDoQuickEdit", "original text" );
+
+               $text = "quick text";
+               $page->doQuickEdit( $text, $wgUser, "testing q" );
+
+               # ---------------------
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $text, $page->getText() );
+       }
+
+       public function testDoDeleteArticle() {
+               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo" );
+               $id = $page->getId();
+
+               $page->doDeleteArticle( "testing deletion" );
+
+               $this->assertFalse( $page->exists(), "WikiPage::exists should return false after page was deleted" );
+               $this->assertFalse( $page->getText(), "WikiPage::getText should return false after page was deleted" );
+
+               $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
+               $this->assertFalse( $t->exists(), "Title::exists should return false after page was deleted" );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+       }
+
+       public function testGetRevision() {
+               $page = $this->newPage( "WikiPageTest_testGetRevision" );
+
+               $rev = $page->getRevision();
+               $this->assertNull( $rev );
+
+               # -----------------
+               $this->createPage( $page, "some text" );
+
+               $rev = $page->getRevision();
+
+               $this->assertEquals( $page->getLatest(), $rev->getId() );
+               $this->assertEquals( "some text", $rev->getText() );
+       }
+
+       public function testGetText() {
+               $page = $this->newPage( "WikiPageTest_testGetText" );
+
+               $text = $page->getText();
+               $this->assertFalse( $text );
+
+               # -----------------
+               $this->createPage( $page, "some text" );
+
+               $text = $page->getText();
+               $this->assertEquals( "some text", $text );
+       }
+
+       public function testGetRawText() {
+               $page = $this->newPage( "WikiPageTest_testGetRawText" );
+
+               $text = $page->getRawText();
+               $this->assertFalse( $text );
+
+               # -----------------
+               $this->createPage( $page, "some text" );
+
+               $text = $page->getRawText();
+               $this->assertEquals( "some text", $text );
+       }
+
+       
+       public function testExists() {
+               $page = $this->newPage( "WikiPageTest_testExists" );
+               $this->assertFalse( $page->exists() );
+
+               # -----------------
+               $this->createPage( $page, "some text" );
+               $this->assertTrue( $page->exists() );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertTrue( $page->exists() );
+
+               # -----------------
+               $page->doDeleteArticle( "done testing" );
+               $this->assertFalse( $page->exists() );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertFalse( $page->exists() );
+       }
+
+       public function dataHasViewableContent() {
+               return array(
+                       array( 'WikiPageTest_testHasViewableContent', false, true ),
+                       array( 'Special:WikiPageTest_testHasViewableContent', false ),
+                       array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
+                       array( 'Special:Userlogin', true ),
+                       array( 'MediaWiki:help', true ),
+               );
+       }
+
+       /**
+        * @dataProvider dataHasViewableContent
+        */
+       public function testHasViewableContent( $title, $viewable, $create = false ) {
+               $page = $this->newPage( $title );
+               $this->assertEquals( $viewable, $page->hasViewableContent() );
+
+               if ( $create ) {
+                       $this->createPage( $page, "some text" );
+                       $this->assertTrue( $page->hasViewableContent() );
+
+                       $page = new WikiPage( $page->getTitle() );
+                       $this->assertTrue( $page->hasViewableContent() );
+               }
+       }
+
+       public function dataGetRedirectTarget() {
+               return array(
+                       array( 'WikiPageTest_testGetRedirectTarget_1', "hello world", null ),
+                       array( 'WikiPageTest_testGetRedirectTarget_2', "#REDIRECT [[hello world]]", "Hello world" ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetRedirectTarget
+        */
+       public function testGetRedirectTarget( $title, $text, $target ) {
+               $page = $this->createPage( $title, $text );
+
+               # now, test the actual redirect
+               $t = $page->getRedirectTarget();
+               $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() );
+       }
+
+       /**
+        * @dataProvider dataGetRedirectTarget
+        */
+       public function testIsRedirect( $title, $text, $target ) {
+               $page = $this->createPage( $title, $text );
+               $this->assertEquals( !is_null( $target ), $page->isRedirect() );
+       }
+
+       public function dataIsCountable() {
+               return array(
+
+                       // any
+                       array( 'WikiPageTest_testIsCountable',
+                              '',
+                              'any',
+                              true
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                              'Foo',
+                              'any',
+                              true
+                       ),
+
+                       // comma
+                       array( 'WikiPageTest_testIsCountable',
+                              'Foo',
+                              'comma',
+                              false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                              'Foo, bar',
+                              'comma',
+                              true
+                       ),
+
+                       // link
+                       array( 'WikiPageTest_testIsCountable',
+                              'Foo',
+                              'link',
+                              false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                              'Foo [[bar]]',
+                              'link',
+                              true
+                       ),
+
+                       // redirects
+                       array( 'WikiPageTest_testIsCountable',
+                              '#REDIRECT [[bar]]',
+                              'any',
+                              false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                              '#REDIRECT [[bar]]',
+                              'comma',
+                              false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                              '#REDIRECT [[bar]]',
+                              'link',
+                              false
+                       ),
+
+                       // not a content namespace
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                              'Foo',
+                              'any',
+                              false
+                       ),
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                              'Foo, bar',
+                              'comma',
+                              false
+                       ),
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                              'Foo [[bar]]',
+                              'link',
+                              false
+                       ),
+
+                       // not a content namespace, different model
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                              'Foo',
+                              'any',
+                              false
+                       ),
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                              'Foo, bar',
+                              'comma',
+                              false
+                       ),
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                              'Foo [[bar]]',
+                              'link',
+                              false
+                       ),
+               );
+       }
+
+
+       /**
+        * @dataProvider dataIsCountable
+        */
+       public function testIsCountable( $title, $text, $mode, $expected ) {
+               global $wgArticleCountMethod;
+
+               $old = $wgArticleCountMethod;
+               $wgArticleCountMethod = $mode;
+
+               $page = $this->createPage( $title, $text );
+               $editInfo = $page->prepareTextForEdit( $page->getText() );
+
+               $v = $page->isCountable();
+               $w = $page->isCountable( $editInfo );
+               $wgArticleCountMethod = $old;
+
+               $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true )
+                                                   . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+
+               $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
+                                                   . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+       }
+
+       public function dataGetParserOutput() {
+               return array(
+                       array("hello ''world''\n", "<p>hello <i>world</i></p>"),
+                       // @todo: more...?
+               );
+       }
+
+       /**
+        * @dataProvider dataGetParserOutput
+        */
+       public function testGetParserOutput( $text, $expectedHtml ) {
+               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text );
+
+               $opt = new ParserOptions();
+               $po = $page->getParserOutput( $opt );
+               $text = $po->getText();
+
+               $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
+               $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
+
+               $this->assertEquals( $expectedHtml, $text );
+               return $po;
+       }
+
+       static $sections =
+
+               "Intro
+
+== stuff ==
+hello world
+
+== test ==
+just a test
+
+== foo ==
+more stuff
+";
+
+
+       public function dataReplaceSection() {
+               return array(
+                       array( 'WikiPageTest_testReplaceSection',
+                              WikiPageTest::$sections,
+                              "0",
+                              "No more",
+                              null,
+                              trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) )
+                       ),
+                       array( 'WikiPageTest_testReplaceSection',
+                              WikiPageTest::$sections,
+                              "",
+                              "No more",
+                              null,
+                              "No more"
+                       ),
+                       array( 'WikiPageTest_testReplaceSection',
+                              WikiPageTest::$sections,
+                              "2",
+                              "== TEST ==\nmore fun",
+                              null,
+                              trim( preg_replace( '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==", WikiPageTest::$sections ) )
+                       ),
+                       array( 'WikiPageTest_testReplaceSection',
+                              WikiPageTest::$sections,
+                              "8",
+                              "No more",
+                              null,
+                              trim( WikiPageTest::$sections )
+                       ),
+                       array( 'WikiPageTest_testReplaceSection',
+                              WikiPageTest::$sections,
+                              "new",
+                              "No more",
+                              "New",
+                              trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataReplaceSection
+        */
+       public function testReplaceSection( $title, $text, $section, $with, $sectionTitle, $expected ) {
+               $page = $this->createPage( $title, $text );
+               $text = $page->replaceSection( $section, $with, $sectionTitle );
+               $text = trim( $text );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+       /* @FIXME: fix this!
+       public function testGetUndoText() {
+               global $wgDiff3;
+
+               wfSuppressWarnings();
+               $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
+               wfRestoreWarnings();
+
+               if( !$haveDiff3 ) {
+                       $this->markTestSkipped( "diff3 not installed or not found" );
+                       return;
+               }
+
+               $text = "one";
+               $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
+               $rev1 = $page->getRevision();
+
+               $text .= "\n\ntwo";
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section two");
+               $rev2 = $page->getRevision();
+
+               $text .= "\n\nthree";
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section three");
+               $rev3 = $page->getRevision();
+
+               $text .= "\n\nfour";
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section four");
+               $rev4 = $page->getRevision();
+
+               $text .= "\n\nfive";
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section five");
+               $rev5 = $page->getRevision();
+
+               $text .= "\n\nsix";
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six");
+               $rev6 = $page->getRevision();
+
+               $undo6 = $page->getUndoText( $rev6 );
+               if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
+               $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
+
+               $undo3 = $page->getUndoText( $rev4, $rev2 );
+               if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
+               $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
+
+               $undo2 = $page->getUndoText( $rev2 );
+               if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
+               $this->assertEquals( "one\n\nfive", $undo2 );
+       }
+       */
+
+       /**
+        * @todo FIXME: this is a better rollback test than the one below, but it keeps failing in jenkins for some reason.
+        */
+       public function broken_testDoRollback() {
+               $admin = new User();
+               $admin->setName("Admin");
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEdit( $text, "section one", EDIT_NEW, false, $admin );
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEdit( $text, "adding section two", 0, false, $user1 );
+
+               $user2 = new User();
+               $user2->setName( "127.0.2.13" );
+               $text .= "\n\nthree";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEdit( $text, "adding section three", 0, false, $user2 );
+
+               # we are having issues with doRollback spuriously failing. apparently the last revision somehow goes missing
+               # or not committed under some circumstances. so, make sure the last revision has the right user name.
+               $dbr = wfGetDB( DB_SLAVE );
+               $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) );
+
+               $page = new WikiPage( $page->getTitle() );
+               $rev3 = $page->getRevision();
+               $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
+
+               $rev2 = $rev3->getPrevious();
+               $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
+
+               $rev1 = $rev2->getPrevious();
+               $this->assertEquals( 'Admin', $rev1->getUserText() );
+
+               # now, try the actual rollback
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user2->getName() ), null );
+               $errors = $page->doRollback( $user2->getName(), "testing revert", $token, false, $details, $admin );
+
+               if ( $errors ) {
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
+               }
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(), "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one\n\ntwo", $page->getText() );
+       }
+
+       /**
+        * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
+        */
+       public function testDoRollback() {
+               $admin = new User();
+               $admin->setName("Admin");
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEdit( $text, "section one", EDIT_NEW, false, $admin );
+               $rev1 = $page->getRevision();
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEdit( $text, "adding section two", 0, false, $user1 );
+
+               # now, try the rollback
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
+               $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $details, $admin );
+
+               if ( $errors ) {
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
+               }
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(), "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one", $page->getText() );
+       }
+
+       public function dataGetAutosummary( ) {
+               return array(
+                       array(
+                               'Hello there, world!',
+                               '#REDIRECT [[Foo]]',
+                               0,
+                               '/^Redirected page .*Foo/'
+                       ),
+
+                       array(
+                               null,
+                               'Hello world!',
+                               EDIT_NEW,
+                               '/^Created page .*Hello/'
+                       ),
+
+                       array(
+                               'Hello there, world!',
+                               '',
+                               0,
+                               '/^Blanked/'
+                       ),
+
+                       array(
+                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
+                               labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
+                               ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
+                               'Hello world!',
+                               0,
+                               '/^Replaced .*Hello/'
+                       ),
+
+                       array(
+                               'foo',
+                               'bar',
+                               0,
+                               '/^$/'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetAutoSummary
+        */
+       public function testGetAutosummary( $old, $new, $flags, $expected ) {
+               $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
+
+               $summary = $page->getAutosummary( $old, $new, $flags );
+
+               $this->assertTrue( (bool)preg_match( $expected, $summary ), "Autosummary didn't match expected pattern $expected: $summary" );
+       }
+
+       public function dataGetAutoDeleteReason( ) {
+               return array(
+                       array(
+                               array(),
+                               false,
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", null ),
+                               ),
+                               "/first edit.*only contributor/",
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", null ),
+                                       array( "second edit", null ),
+                               ),
+                               "/second edit.*only contributor/",
+                               true
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", "127.0.2.22" ),
+                                       array( "second edit", "127.0.3.33" ),
+                               ),
+                               "/second edit/",
+                               true
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit: "
+                                            . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+                                            . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. "
+                                            . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
+                                            . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ),
+                               ),
+                               '/first edit:.*\.\.\."/',
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", "127.0.2.22" ),
+                                       array( "", "127.0.3.33" ),
+                               ),
+                               "/before blanking.*first edit/",
+                               true
+                       ),
+
+               );
+       }
+
+       /**
+        * @dataProvider dataGetAutoDeleteReason
+        */
+       public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
+               global $wgUser;
+
+               $page = $this->newPage( "WikiPageTest_testGetAutoDeleteReason" );
+
+               $c = 1;
+
+               foreach ( $edits as $edit ) {
+                       $user = new User();
+
+                       if ( !empty( $edit[1] ) ) $user->setName( $edit[1] );
+                       else $user = $wgUser;
+
+                       $page->doEdit( $edit[0], "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
+
+                       $c += 1;
+               }
+
+               $reason = $page->getAutoDeleteReason( $hasHistory );
+
+               if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) $this->assertEquals( $expectedResult, $reason );
+               else $this->assertTrue( (bool)preg_match( $expectedResult, $reason ), "Autosummary didn't match expected pattern $expectedResult: $reason" );
+
+               $this->assertEquals( $expectedHistory, $hasHistory, "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
+
+               $page->doDeleteArticle( "done" );
+       }
+
+       public function dataPreSaveTransform() {
+               return array(
+                       array( 'hello this is ~~~',
+                              "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
+                       ),
+                       array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                              'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataPreSaveTransform
+        */
+       public function testPreSaveTransform( $text, $expected ) {
+               $user = new User();
+               $user->setName("127.0.0.1");
+
+               $page = $this->newPage( "WikiPageTest_testPreloadTransform" );
+               $text = $page->preSaveTransform( $text, $user );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+}
+
diff --git a/tests/phpunit/includes/api/ApiOptionsTest.php b/tests/phpunit/includes/api/ApiOptionsTest.php
new file mode 100644 (file)
index 0000000..8acdc1c
--- /dev/null
@@ -0,0 +1,223 @@
+<?php
+
+/**
+ * @group API
+ */
+class ApiOptionsTest extends MediaWikiLangTestCase {
+
+       private $mTested, $mApiMainMock, $mUserMock, $mContext, $mSession;
+
+       private static $Success = array( 'options' => 'success' );
+
+       function setUp() {
+               parent::setUp();
+
+               $this->mUserMock = $this->getMockBuilder( 'User' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $this->mApiMainMock = $this->getMockBuilder( 'ApiBase' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               // Create a new context
+               $this->mContext = new DerivativeContext( new RequestContext() );
+               $this->mContext->setUser( $this->mUserMock );
+
+               $this->mApiMainMock->expects( $this->any() )
+                       ->method( 'getContext' )
+                       ->will( $this->returnValue( $this->mContext ) );
+
+               $this->mApiMainMock->expects( $this->any() )
+                       ->method( 'getResult' )
+                       ->will( $this->returnValue( new ApiResult( $this->mApiMainMock ) ) );
+
+
+               // Empty session
+               $this->mSession = array();
+
+               $this->mTested = new ApiOptions( $this->mApiMainMock, 'options' );
+       }
+
+       private function getSampleRequest( $custom = array() ) {
+               $request = array(
+                       'token' => '123ABC',
+                       'change' => null,
+                       'optionname' => null,
+                       'optionvalue' => null,
+               );
+               return array_merge( $request, $custom );
+       }
+
+       private function executeQuery( $request ) {
+               $this->mContext->setRequest( new FauxRequest( $request, true, $this->mSession ) );
+               $this->mTested->execute();
+               return $this->mTested->getResult()->getData();
+       }
+
+       /**
+        * @expectedException UsageException
+        */
+       public function testNoToken() {
+               $request = $this->getSampleRequest( array( 'token' => null ) );
+
+               $this->executeQuery( $request );
+       }
+
+       public function testAnon() {
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'isAnon' )
+                       ->will( $this->returnValue( true ) );
+
+               try {
+                       $request = $this->getSampleRequest();
+
+                       $this->executeQuery( $request );
+               } catch ( UsageException $e ) {
+                       $this->assertEquals( 'notloggedin', $e->getCodeString() );
+                       $this->assertEquals( 'Anonymous users cannot change preferences', $e->getMessage() );
+                       return;
+               }
+               $this->fail( "UsageException was not thrown" );
+       }
+
+       public function testNoOptionname() {
+               try {
+                       $request = $this->getSampleRequest( array( 'optionvalue' => '1' ) );
+
+                       $this->executeQuery( $request );
+               } catch ( UsageException $e ) {
+                       $this->assertEquals( 'nooptionname', $e->getCodeString() );
+                       $this->assertEquals( 'The optionname parameter must be set', $e->getMessage() );
+                       return;
+               }
+               $this->fail( "UsageException was not thrown" );
+       }
+
+       public function testNoChanges() {
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'setOption' );
+
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'saveSettings' );
+
+               try {
+                       $request = $this->getSampleRequest();
+
+                       $this->executeQuery( $request );
+               } catch ( UsageException $e ) {
+                       $this->assertEquals( 'nochanges', $e->getCodeString() );
+                       $this->assertEquals( 'No changes were requested', $e->getMessage() );
+                       return;
+               }
+               $this->fail( "UsageException was not thrown" );
+       }
+
+       public function testReset() {
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'setOption' );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $request = $this->getSampleRequest( array( 'reset' => '' ) );
+
+               $response = $this->executeQuery( $request );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+
+       public function testOptionWithValue() {
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $request = $this->getSampleRequest( array( 'optionname' => 'name', 'optionvalue' => 'value' ) );
+
+               $response = $this->executeQuery( $request );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+
+       public function testOptionResetValue() {
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'name' ), $this->equalTo( null ) );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $request = $this->getSampleRequest( array( 'optionname' => 'name' ) );
+               $response = $this->executeQuery( $request );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+
+       public function testChange() {
+               $this->mUserMock->expects( $this->never() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->at( 1 ) )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'willBeNull' ), $this->equalTo( null ) );
+
+               $this->mUserMock->expects( $this->at( 2 ) )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'willBeEmpty' ), $this->equalTo( '' ) );
+
+               $this->mUserMock->expects( $this->at( 3 ) )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $request = $this->getSampleRequest( array( 'change' => 'willBeNull|willBeEmpty=|willBeHappy=Happy' ) );
+
+               $response = $this->executeQuery( $request );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+
+       public function testResetChangeOption() {
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'resetOptions' );
+
+               $this->mUserMock->expects( $this->at( 2 ) )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
+
+               $this->mUserMock->expects( $this->at( 3 ) )
+                       ->method( 'setOption' )
+                       ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
+
+               $this->mUserMock->expects( $this->once() )
+                       ->method( 'saveSettings' );
+
+               $args = array(
+                       'reset' => '',
+                       'change' => 'willBeHappy=Happy',
+                       'optionname' => 'name',
+                       'optionvalue' => 'value'
+               );
+
+               $response = $this->executeQuery( $this->getSampleRequest( $args ) );
+
+               $this->assertEquals( self::$Success, $response );
+       }
+}
index af88bc8..9c36a57 100644 (file)
@@ -205,7 +205,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       function doTestStore( $op ) {
+       private function doTestStore( $op ) {
                $backendName = $this->backendClass();
 
                $source = $op['src'];
@@ -287,7 +287,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       function doTestCopy( $op ) {
+       private function doTestCopy( $op ) {
                $backendName = $this->backendClass();
 
                $source = $op['src'];
@@ -668,7 +668,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       public function doTestConcatenate( $params, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
+       private function doTestConcatenate( $params, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
                $backendName = $this->backendClass();
 
                $expContent = '';
@@ -857,7 +857,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       public function doTestGetFileContents( $source, $content ) {
+       private function doTestGetFileContents( $source, $content ) {
                $backendName = $this->backendClass();
 
                $this->prepare( array( 'dir' => dirname( $source ) ) );
@@ -902,7 +902,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       public function doTestGetLocalCopy( $source, $content ) {
+       private function doTestGetLocalCopy( $source, $content ) {
                $backendName = $this->backendClass();
 
                $this->prepare( array( 'dir' => dirname( $source ) ) );
@@ -996,7 +996,7 @@ class FileBackendTest extends MediaWikiTestCase {
                );
        }
 
-       function doTestPrepareAndClean( $path, $isOK ) {
+       private function doTestPrepareAndClean( $path, $isOK ) {
                $backendName = $this->backendClass();
 
                $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
@@ -1100,7 +1100,7 @@ class FileBackendTest extends MediaWikiTestCase {
                // @TODO: test some cases where the ops should fail
        }
 
-       function doTestDoOperations() {
+       private function doTestDoOperations() {
                $base = $this->baseStorePath();
 
                $fileA = "$base/unittest-cont1/a/b/fileA.txt";
@@ -1117,6 +1117,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->backend->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
                $this->prepare( array( 'dir' => dirname( $fileC ) ) );
                $this->backend->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
+               $this->prepare( array( 'dir' => dirname( $fileD ) ) );
 
                $status = $this->backend->doOperations( array(
                        array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
@@ -1172,7 +1173,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
-       function doTestDoOperationsFailing() {
+       private function doTestDoOperationsFailing() {
                $base = $this->baseStorePath();
 
                $fileA = "$base/unittest-cont2/a/b/fileA.txt";
@@ -1563,6 +1564,64 @@ class FileBackendTest extends MediaWikiTestCase {
                foreach ( $iter as $iter ) {} // no errors
        }
 
+       public function testLockCalls() {
+               $this->backend = $this->singleBackend;
+               $this->doTestLockCalls();
+       }
+
+       private function doTestLockCalls() {
+               $backendName = $this->backendClass();
+
+               for ( $i=0; $i<50; $i++ ) {
+                       $paths = array(
+                               "test1.txt",
+                               "test2.txt",
+                               "test3.txt",
+                               "subdir1",
+                               "subdir1", // duplicate
+                               "subdir1/test1.txt",
+                               "subdir1/test2.txt",
+                               "subdir2",
+                               "subdir2", // duplicate
+                               "subdir2/test3.txt",
+                               "subdir2/test4.txt",
+                               "subdir2/subdir",
+                               "subdir2/subdir/test1.txt",
+                               "subdir2/subdir/test2.txt",
+                               "subdir2/subdir/test3.txt",
+                               "subdir2/subdir/test4.txt",
+                               "subdir2/subdir/test5.txt",
+                               "subdir2/subdir/sub",
+                               "subdir2/subdir/sub/test0.txt",
+                               "subdir2/subdir/sub/120-px-file.txt",
+                       );
+
+                       $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+
+                       $status = $this->backend->lockFiles( $paths, LockManager::LOCK_SH );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+
+                       $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_SH );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+
+                       $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_EX );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+               }
+       }
+
        // test helper wrapper for backend prepare() function
        private function prepare( array $params ) {
                $this->dirsToPrune[] = $params['dir'];
@@ -1588,7 +1647,8 @@ class FileBackendTest extends MediaWikiTestCase {
                $iter = $this->backend->getFileList( array( 'dir' => "$base/$container" ) );
                if ( $iter ) {
                        foreach ( $iter as $file ) {
-                               $this->backend->delete( array( 'src' => "$base/$container/$file" ), array( 'force' => 1 ) );
+                               $this->backend->delete( array( 'src' => "$base/$container/$file" ),
+                                       array( 'force' => 1, 'nonLocking' => 1 ) );
                        }
                }
        }
index 2f8c232..fd39c45 100644 (file)
@@ -74,7 +74,7 @@ abstract class DumpTestCase extends MediaWikiTestCase {
         *
         * Clears $wgUser, and reports errors from addDBData to PHPUnit
         */
-       function setUp() {
+       protected function setUp() {
                global $wgUser;
 
                parent::setUp();
@@ -88,6 +88,30 @@ abstract class DumpTestCase extends MediaWikiTestCase {
                $wgUser = new User();
        }
 
+       /**
+        * Checks for test output consisting only of lines containing ETA announcements
+        */
+       function expectETAOutput() {
+               // Newer PHPUnits require assertion about the output using PHPUnit's own
+               // expectOutput[...] functions. However, the PHPUnit shipped prediactes
+               // do not allow to check /each/ line of the output using /readable/ REs.
+               // So we ...
+               //
+               // 1. ... add a dummy output checking to make PHPUnit not complain
+               //    about unchecked test output
+               $this->expectOutputRegex( '//' );
+
+               // 2. Do the real output checking on our own.
+               $lines = explode( "\n", $this->getActualOutput() );
+               $this->assertGreaterThan( 1, count( $lines ), "Minimal lines of produced output" );
+               $this->assertEquals( '', array_pop( $lines ), "Output ends in LF" );
+               $timestamp_re = "[0-9]{4}-[01][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-6][0-9]";
+               foreach ( $lines as $line ) {
+                       $this->assertRegExp( "/$timestamp_re: .* \(ID [0-9]+\) [0-9]* pages .*, [0-9]* revs .*, ETA/", $line );
+               }
+       }
+
+
        /**
         * Step the current XML reader until node end of given name is found.
         *
diff --git a/tests/phpunit/maintenance/backupPrefetchTest.php b/tests/phpunit/maintenance/backupPrefetchTest.php
new file mode 100644 (file)
index 0000000..9273233
--- /dev/null
@@ -0,0 +1,267 @@
+<?php
+global $IP;
+require_once( "$IP/maintenance/backupPrefetch.inc" );
+
+/**
+ * Tests for BaseDump
+ *
+ * @group Dump
+ */
+class BaseDumpTest extends MediaWikiTestCase {
+
+       /**
+        * @var BaseDump the BaseDump instance used within a test.
+        *
+        * If set, this BaseDump gets automatically closed in tearDown.
+        */
+       private $dump = null;
+
+       protected function tearDown() {
+               parent::tearDown();
+
+               if ( $this->dump !== null ) {
+                       $this->dump->close();
+               }
+       }
+
+       /**
+        * asserts that a prefetch yields an expected string
+        *
+        * @param $expected string|null: the exepcted result of the prefetch
+        * @param $page int: the page number to prefetch the text for
+        * @param $revision int: the revision number to prefetch the text for
+        */
+       private function assertPrefetchEquals( $expected, $page, $revision ) {
+               $this->assertEquals( $expected, $this->dump->prefetch( $page, $revision ),
+                       "Prefetch of page $page revision $revision" );
+
+       }
+
+       function testSequential() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
+               $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+       }
+
+       function testSynchronizeRevisionMissToRevision() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( null, 2, 3 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
+       }
+
+       function testSynchronizeRevisionMissToPage() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( null, 2, 40 );
+               $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+       }
+
+       function testSynchronizePageMiss() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( null, 3, 40 );
+               $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+       }
+
+       function testPageMissAtEnd() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( null, 6, 40 );
+       }
+
+       function testRevisionMissAtEnd() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( null, 4, 40 );
+       }
+
+       function testSynchronizePageMissAtStart() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( null, 0, 2 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+       }
+
+       function testSynchronizeRevisionMissAtStart() {
+               $fname = $this->setUpPrefetch();
+               $this->dump = new BaseDump( $fname );
+
+               $this->assertPrefetchEquals( null, 1, -2 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+       }
+
+       function testSequentialAcrossFiles() {
+               $fname1 = $this->setUpPrefetch( array( 1 ) );
+               $fname2 = $this->setUpPrefetch( array( 2, 4 ) );
+               $this->dump = new BaseDump( $fname1 . ";" . $fname2 );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
+               $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+       }
+
+       function testSynchronizeSkipAcrossFile() {
+               $fname1 = $this->setUpPrefetch( array( 1 ) );
+               $fname2 = $this->setUpPrefetch( array( 2 ) );
+               $fname3 = $this->setUpPrefetch( array( 4 ) );
+               $this->dump = new BaseDump( $fname1 . ";" . $fname2 . ";" . $fname3 );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
+               $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+       }
+
+       function testSynchronizeMissInWholeFirstFile() {
+               $fname1 = $this->setUpPrefetch( array( 1 ) );
+               $fname2 = $this->setUpPrefetch( array( 2 ) );
+               $this->dump = new BaseDump( $fname1 . ";" . $fname2 );
+
+               $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+       }
+
+
+       /**
+        * Constructs a temporary file that can be used for prefetching
+        *
+        * The temporary file is removed by DumpBackup upon tearDown.
+        *
+        * @param $requested_pages Array The indices of the page parts that should
+        *             go into the prefetch file. 1,2,4 are available.
+        * @return String The file name of the created temporary file
+        */
+       private function setUpPrefetch( $requested_pages = array( 1, 2, 4 ) ) {
+               // The file name, where we store the prepared prefetch file
+               $fname = $this->getNewTempFile();
+
+               // The header of every prefetch file
+               $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.6/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.6/ http://www.mediawiki.org/xml/export-0.6.xsd" version="0.6" xml:lang="en">
+  <siteinfo>
+    <sitename>wikisvn</sitename>
+    <base>http://localhost/wiki-svn/index.php/Main_Page</base>
+    <generator>MediaWiki 1.20alpha</generator>
+    <case>first-letter</case>
+    <namespaces>
+      <namespace key="-2" case="first-letter">Media</namespace>
+      <namespace key="-1" case="first-letter">Special</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">Talk</namespace>
+      <namespace key="2" case="first-letter">User</namespace>
+      <namespace key="3" case="first-letter">User talk</namespace>
+      <namespace key="4" case="first-letter">Wikisvn</namespace>
+      <namespace key="5" case="first-letter">Wikisvn talk</namespace>
+      <namespace key="6" case="first-letter">File</namespace>
+      <namespace key="7" case="first-letter">File talk</namespace>
+      <namespace key="8" case="first-letter">MediaWiki</namespace>
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>
+      <namespace key="10" case="first-letter">Template</namespace>
+      <namespace key="11" case="first-letter">Template talk</namespace>
+      <namespace key="12" case="first-letter">Help</namespace>
+      <namespace key="13" case="first-letter">Help talk</namespace>
+      <namespace key="14" case="first-letter">Category</namespace>
+      <namespace key="15" case="first-letter">Category talk</namespace>
+    </namespaces>
+  </siteinfo>
+';
+
+
+               // An array holding the pages that are available for prefetch
+               $available_pages = array();
+
+               // Simple plain page
+               $available_pages[1] = '  <page>
+    <title>BackupDumperTestP1</title>
+    <ns>0</ns>
+    <id>1</id>
+    <revision>
+      <id>1</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP1Summary1</comment>
+      <text xml:space="preserve">BackupDumperTestP1Text1</text>
+      <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
+    </revision>
+  </page>
+';
+               // Page with more than one revisions. Hole in rev ids.
+               $available_pages[2] = '  <page>
+    <title>BackupDumperTestP2</title>
+    <ns>0</ns>
+    <id>2</id>
+    <revision>
+      <id>2</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary1</comment>
+      <text xml:space="preserve">BackupDumperTestP2Text1</text>
+      <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
+    </revision>
+    <revision>
+      <id>5</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary4 extra</comment>
+      <text xml:space="preserve">BackupDumperTestP2Text4 some additional Text</text>
+      <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
+    </revision>
+  </page>
+';
+               // Page with id higher than previous id + 1
+               $available_pages[4] = '  <page>
+    <title>Talk:BackupDumperTestP1</title>
+    <ns>1</ns>
+    <id>4</id>
+    <revision>
+      <id>8</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>Talk BackupDumperTestP1 Summary1</comment>
+      <text xml:space="preserve">Talk about BackupDumperTestP1 Text1</text>
+      <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
+    </revision>
+  </page>
+';
+
+               // The common ending for all files
+               $tail = '</mediawiki>
+';
+
+               // Putting together the content of the prefetch files
+               $content = $header;
+               foreach ( $requested_pages as $i ) {
+                       $this->assertTrue( array_key_exists( $i, $available_pages ),
+                               "Check for availability of requested page " . $i );
+                       $content .= $available_pages[ $i ];
+               }
+               $content .= $tail;
+
+               $this->assertEquals( strlen( $content ), file_put_contents(
+                               $fname, $content ), "Length of prepared prefetch" );
+
+               return $fname;
+       }
+
+}
diff --git a/tests/phpunit/maintenance/backupTextPassTest.php b/tests/phpunit/maintenance/backupTextPassTest.php
new file mode 100644 (file)
index 0000000..0dade60
--- /dev/null
@@ -0,0 +1,558 @@
+<?php
+global $IP;
+require_once( "$IP/maintenance/backup.inc" );
+require_once( "$IP/maintenance/backupTextPass.inc" );
+
+/**
+ * Tests for page dumps of BackupDumper
+ *
+ * @group Database
+ * @group Dump
+ */
+class TextPassDumperTest extends DumpTestCase {
+
+       // We'll add several pages, revision and texts. The following variables hold the
+       // corresponding ids.
+       private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
+       private $revId1_1, $textId1_1;
+       private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
+       private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
+       private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
+       private $revId4_1, $textId4_1;
+
+       function addDBData() {
+               $this->tablesUsed[] = 'page';
+               $this->tablesUsed[] = 'revision';
+               $this->tablesUsed[] = 'text';
+
+               try {
+                       // Simple page
+                       $title = Title::newFromText( 'BackupDumperTestP1' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
+                       $this->pageId1 = $page->getId();
+
+                       // Page with more than one revision
+                       $title = Title::newFromText( 'BackupDumperTestP2' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
+                       list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text2", "BackupDumperTestP2Summary2" );
+                       list( $this->revId2_3, $this->textId2_3 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text3", "BackupDumperTestP2Summary3" );
+                       list( $this->revId2_4, $this->textId2_4 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text4 some additional Text  ",
+                               "BackupDumperTestP2Summary4 extra " );
+                       $this->pageId2 = $page->getId();
+
+                       // Deleted page.
+                       $title = Title::newFromText( 'BackupDumperTestP3' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
+                       list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
+                               "BackupDumperTestP3Text2", "BackupDumperTestP2Summary2" );
+                       $this->pageId3 = $page->getId();
+                       $page->doDeleteArticle( "Testing ;)" );
+
+                       // Page from non-default namespace
+                       $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
+                               "Talk about BackupDumperTestP1 Text1",
+                               "Talk BackupDumperTestP1 Summary1" );
+                       $this->pageId4 = $page->getId();
+               } catch ( Exception $e ) {
+                       // We'd love to pass $e directly. However, ... see
+                       // documentation of exceptionFromAddDBData in
+                       // DumpTestCase
+                       $this->exceptionFromAddDBData = $e;
+               }
+
+       }
+
+       protected function setUp() {
+               parent::setUp();
+
+               // Since we will restrict dumping by page ranges (to allow
+               // working tests, even if the db gets prepopulated by a base
+               // class), we have to assert, that the page id are consecutively
+               // increasing
+               $this->assertEquals(
+                       array( $this->pageId2, $this->pageId3, $this->pageId4 ),
+                       array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
+                       "Page ids increasing without holes" );
+
+       }
+
+       function testPlain() {
+               // Setting up the dump
+               $nameStub = $this->setUpStub();
+               $nameFull = $this->getNewTempFile();
+               $dumper = new TextPassDumper( array ( "--stub=file:" . $nameStub,
+                               "--output=file:" . $nameFull ) );
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+
+               // Checking for correctness of the dumped data
+               $this->assertDumpStart( $nameFull );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+                       "BackupDumperTestP1Text1" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                       $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
+                       "BackupDumperTestP2Text1" );
+               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                       $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+                       "BackupDumperTestP2Text2" );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                       "BackupDumperTestP2Text3" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                       "BackupDumperTestP2Text4 some additional Text" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+                       "Talk about BackupDumperTestP1 Text1" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+       }
+
+       function testPrefetchPlain() {
+               // The mapping between ids and text, for the hits of the prefetch mock
+               $prefetchMap = array(
+                       array( $this->pageId1, $this->revId1_1, "Prefetch_________1Text1" ),
+                       array( $this->pageId2, $this->revId2_3, "Prefetch_________2Text3" )
+               );
+
+               // The mock itself
+               $prefetchMock = $this->getMock( 'BaseDump', array( 'prefetch' ), array(), '', FALSE );
+               $prefetchMock->expects( $this->exactly( 6 ) )
+                       ->method( 'prefetch' )
+                       ->will( $this->returnValueMap( $prefetchMap ) );
+
+               // Setting up of the dump
+               $nameStub = $this->setUpStub();
+               $nameFull = $this->getNewTempFile();
+               $dumper = new TextPassDumper( array ( "--stub=file:"
+                               . $nameStub, "--output=file:" . $nameFull ) );
+               $dumper->prefetch = $prefetchMock;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+
+               // Checking for correctness of the dumped data
+               $this->assertDumpStart( $nameFull );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               // Prefetch kicks in. This is still the SHA-1 of the original text,
+               // But the actual text (with different SHA-1) comes from prefetch.
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+                       "Prefetch_________1Text1" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                       $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
+                       "BackupDumperTestP2Text1" );
+               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                       $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+                       "BackupDumperTestP2Text2" );
+               // Prefetch kicks in. This is still the SHA-1 of the original text,
+               // But the actual text (with different SHA-1) comes from prefetch.
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                       "Prefetch_________2Text3" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                       "BackupDumperTestP2Text4 some additional Text" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+                       "Talk about BackupDumperTestP1 Text1" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+
+       }
+
+       /**
+        * Ensures that checkpoint dumps are used and written, by successively increasing the
+        * stub size and dumping until the duration crosses a threshold.
+        *
+        * @param $checkpointFormat string: Either "file" for plain text or "gzip" for gzipped
+        *                checkpoint files.
+        */
+       private function checkpointHelper( $checkpointFormat = "file" ) {
+               // Getting temporary names
+               $nameStub = $this->getNewTempFile();
+               $nameOutputDir = $this->getNewTempDirectory();
+
+               $stderr = fopen( 'php://output', 'a' );
+               if ( $stderr === FALSE ) {
+                       $this->fail( "Could not open stream for stderr" );
+               }
+
+               $iterations = 32; // We'll start with that many iterations of revisions in stub
+               $lastDuration = 0;
+               $minDuration = 2; // We want the dump to take at least this many seconds
+               $checkpointAfter = 0.5; // Generate checkpoint after this many seconds
+
+
+               // Until a dump takes at least $minDuration seconds, perform a dump and check
+               // duration. If the dump did not take long enough increase the iteration
+               // count, to generate a bigger stub file next time.
+               while ( $lastDuration < $minDuration ) {
+
+                       // Setting up the dump
+                       wfRecursiveRemoveDir( $nameOutputDir );
+                       $this->assertTrue( wfMkdirParents( $nameOutputDir ),
+                               "Creating temporary output directory " );
+                       $this->setUpStub( $nameStub, $iterations );
+                       $dumper = new TextPassDumper( array ( "--stub=file:" . $nameStub,
+                                       "--output=" . $checkpointFormat . ":" . $nameOutputDir . "/full",
+                                       "--maxtime=1" /*This is in minutes. Fixup is below*/,
+                                       "--checkpointfile=checkpoint-%s-%s.xml.gz" ) );
+                       $dumper->setDb( $this->db );
+                       $dumper->maxTimeAllowed = $checkpointAfter; // Patching maxTime from 1 minute
+                       $dumper->stderr = $stderr;
+
+                       // The actual dump and taking time
+                       $ts_before = wfTime();
+                       $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+                       $ts_after = wfTime();
+                       $lastDuration = $ts_after - $ts_before;
+
+                       // Handling increasing the iteration count for the stubs
+                       if ( $lastDuration < $minDuration ) {
+                               $old_iterations = $iterations;
+                               if ( $lastDuration > 0.2 ) {
+                                       // lastDuration is big enough, to allow an educated guess
+                                       $factor = ( $minDuration + 0.5 ) / $lastDuration;
+                                       if ( ( $factor > 1.1 ) && ( $factor < 100 ) ) {
+                                               // educated guess is reasonable
+                                               $iterations = (int)( $iterations * $factor );
+                                       }
+                               }
+
+                               if ( $old_iterations == $iterations ) {
+                                       // Heuristics were not applied, so we just *2.
+                                       $iterations *= 2;
+                               }
+
+                               $this->assertLessThan( 50000, $iterations,
+                                       "Emergency stop against infinitely increasing iteration "
+                                       . "count ( last duration: $lastDuration )" );
+                       }
+               }
+
+               // The dump (hopefully) did take long enough to produce more than one
+               // checkpoint file.
+               //
+               // We now check all the checkpoint files for validity.
+
+               $files = scandir( $nameOutputDir );
+               $this->assertTrue( asort( $files ), "Sorting files in temporary directory" );
+               $fileOpened = false;
+               $lookingForPage = 1;
+               $checkpointFiles = 0;
+
+               // Each run of the following loop body tries to handle exactly 1 /page/ (not
+               // iteration of stub content). $i is only increased after having treated page 4.
+               for ( $i = 0 ; $i < $iterations ; ) {
+
+                       // 1. Assuring a file is opened and ready. Skipping across header if
+                       //    necessary.
+                       if ( ! $fileOpened ) {
+                               $this->assertNotEmpty( $files, "No more existing dump files, "
+                                       . "but not yet all pages found" );
+                               $fname = array_shift( $files );
+                               while ( $fname == "." || $fname == ".." ) {
+                                       $this->assertNotEmpty( $files, "No more existing dump"
+                                               . " files, but not yet all pages found" );
+                                       $fname = array_shift( $files );
+                               }
+                               if ( $checkpointFormat == "gzip" ) {
+                                       $this->gunzip( $nameOutputDir . "/" . $fname );
+                               }
+                               $this->assertDumpStart( $nameOutputDir . "/" . $fname );
+                               $fileOpened = true;
+                               $checkpointFiles++;
+                       }
+
+                       // 2. Performing a single page check
+                       switch ( $lookingForPage ) {
+                       case 1:
+                               // Page 1
+                               $this->assertPageStart( $this->pageId1 + $i * 4, NS_MAIN,
+                                       "BackupDumperTestP1" );
+                               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                                       $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+                                       "BackupDumperTestP1Text1" );
+                               $this->assertPageEnd();
+
+                               $lookingForPage = 2;
+                               break;
+
+                       case 2:
+                               // Page 2
+                               $this->assertPageStart( $this->pageId2 + $i * 4, NS_MAIN,
+                                       "BackupDumperTestP2" );
+                               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                                       $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
+                                       "BackupDumperTestP2Text1" );
+                               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                                       $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+                                       "BackupDumperTestP2Text2" );
+                               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                                       $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                                       "BackupDumperTestP2Text3" );
+                               $this->assertRevision( $this->revId2_4,
+                                       "BackupDumperTestP2Summary4 extra",
+                                       $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                                       "BackupDumperTestP2Text4 some additional Text" );
+                               $this->assertPageEnd();
+
+                               $lookingForPage = 4;
+                               break;
+
+                       case 4:
+                               // Page 4
+                               $this->assertPageStart( $this->pageId4 + $i * 4, NS_TALK,
+                                       "Talk:BackupDumperTestP1" );
+                               $this->assertRevision( $this->revId4_1,
+                                       "Talk BackupDumperTestP1 Summary1",
+                                       $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+                                       "Talk about BackupDumperTestP1 Text1" );
+                               $this->assertPageEnd();
+
+                               $lookingForPage = 1;
+
+                               // We dealt with the whole iteration.
+                               $i++;
+                               break;
+
+                       default:
+                               $this->fail( "Bad setting for lookingForPage ($lookingForPage)" );
+                       }
+
+                       // 3. Checking for the end of the current checkpoint file
+                       if ( $this->xml->nodeType == XMLReader::END_ELEMENT
+                               && $this->xml->name == "mediawiki" ) {
+
+                               $this->assertDumpEnd();
+                               $fileOpened = false;
+                       }
+               }
+
+               // Assuring we completely read all files ...
+               $this->assertFalse( $fileOpened, "Currently read file still open?" );
+               $this->assertEmpty( $files, "Remaining unchecked files" );
+
+               // ... and have dealt with more than one checkpoint file
+               $this->assertGreaterThan( 1, $checkpointFiles, "# of checkpoint files" );
+
+               $this->expectETAOutput();
+       }
+
+       /**
+        * @group large
+        */
+       function testCheckpointPlain() {
+               $this->checkpointHelper();
+       }
+
+       /**
+        * tests for working checkpoint generation in gzip format work.
+        *
+        * We keep this test in addition to the simpler self::testCheckpointPlain, as there
+        * were once problems when the used sinks were DumpPipeOutputs.
+        *
+        * xmldumps-backup typically uses bzip2 instead of gzip. However, as bzip2 requires
+        * PHP extensions, we go for gzip instead, which triggers the same relevant code
+        * paths while still being testable on more systems.
+        *
+        * @group large
+        */
+       function testCheckpointGzip() {
+               $this->checkpointHelper( "gzip" );
+       }
+
+
+       /**
+        * Creates a stub file that is used for testing the text pass of dumps
+        *
+        * @param $fname string: (Optional) Absolute name of the file to write
+        *           the stub into. If this parameter is null, a new temporary
+        *           file is generated that is automatically removed upon
+        *           tearDown.
+        * @param $iterations integer: (Optional) specifies how often the block
+        *           of 3 pages should go into the stub file. The page id
+        *           increase further and further, while the revision and text
+        *           ids of the first iteration are reused. The pages of
+        *           iteration > 1 have no corresponding representation in the
+        *           database.
+        * @return string absolute filename of the stub
+        */
+       private function setUpStub( $fname = null, $iterations = 1 ) {
+               if ( $fname === null ) {
+                       $fname = $this->getNewTempFile();
+               }
+               $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.6/" '
+                       . 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '
+                       . 'xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.6/ '
+                       . 'http://www.mediawiki.org/xml/export-0.6.xsd" version="0.6" xml:lang="en">
+  <siteinfo>
+    <sitename>wikisvn</sitename>
+    <base>http://localhost/wiki-svn/index.php/Main_Page</base>
+    <generator>MediaWiki 1.20alpha</generator>
+    <case>first-letter</case>
+    <namespaces>
+      <namespace key="-2" case="first-letter">Media</namespace>
+      <namespace key="-1" case="first-letter">Special</namespace>
+      <namespace key="0" case="first-letter" />
+      <namespace key="1" case="first-letter">Talk</namespace>
+      <namespace key="2" case="first-letter">User</namespace>
+      <namespace key="3" case="first-letter">User talk</namespace>
+      <namespace key="4" case="first-letter">Wikisvn</namespace>
+      <namespace key="5" case="first-letter">Wikisvn talk</namespace>
+      <namespace key="6" case="first-letter">File</namespace>
+      <namespace key="7" case="first-letter">File talk</namespace>
+      <namespace key="8" case="first-letter">MediaWiki</namespace>
+      <namespace key="9" case="first-letter">MediaWiki talk</namespace>
+      <namespace key="10" case="first-letter">Template</namespace>
+      <namespace key="11" case="first-letter">Template talk</namespace>
+      <namespace key="12" case="first-letter">Help</namespace>
+      <namespace key="13" case="first-letter">Help talk</namespace>
+      <namespace key="14" case="first-letter">Category</namespace>
+      <namespace key="15" case="first-letter">Category talk</namespace>
+    </namespaces>
+  </siteinfo>
+';
+               $tail = '</mediawiki>
+';
+
+               $content = $header;
+               $iterations = intval( $iterations );
+               for ( $i = 0; $i < $iterations; $i++ ) {
+
+                       $page1 = '  <page>
+    <title>BackupDumperTestP1</title>
+    <ns>0</ns>
+    <id>' . ( $this->pageId1 + $i * 4 ) . '</id>
+    <revision>
+      <id>' . $this->revId1_1 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP1Summary1</comment>
+      <text id="' . $this->textId1_1 . '" bytes="23" />
+      <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
+    </revision>
+  </page>
+';
+                       $page2 = '  <page>
+    <title>BackupDumperTestP2</title>
+    <ns>0</ns>
+    <id>' . ( $this->pageId2 + $i * 4 ) . '</id>
+    <revision>
+      <id>' . $this->revId2_1 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary1</comment>
+      <text id="' . $this->textId2_1 . '" bytes="23" />
+      <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
+    </revision>
+    <revision>
+      <id>' . $this->revId2_2 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary2</comment>
+      <text id="' . $this->textId2_2 . '" bytes="23" />
+      <sha1>b7vj5ks32po5m1z1t1br4o7scdwwy95</sha1>
+    </revision>
+    <revision>
+      <id>' . $this->revId2_3 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary3</comment>
+      <text id="' . $this->textId2_3 . '" bytes="23" />
+      <sha1>jfunqmh1ssfb8rs43r19w98k28gg56r</sha1>
+    </revision>
+    <revision>
+      <id>' . $this->revId2_4 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary4 extra</comment>
+      <text id="' . $this->textId2_4 . '" bytes="44" />
+      <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
+    </revision>
+  </page>
+';
+                       // page 3 not in stub
+
+                       $page4 = '  <page>
+    <title>Talk:BackupDumperTestP1</title>
+    <ns>1</ns>
+    <id>' . ( $this->pageId4 + $i * 4 ) . '</id>
+    <revision>
+      <id>' . $this->revId4_1 . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>Talk BackupDumperTestP1 Summary1</comment>
+      <text id="' . $this->textId4_1 . '" bytes="35" />
+      <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
+    </revision>
+  </page>
+';
+                       $content .= $page1 . $page2 . $page4;
+               }
+               $content .= $tail;
+               $this->assertEquals( strlen( $content ), file_put_contents(
+                               $fname, $content ), "Length of prepared stub" );
+               return $fname;
+       }
+
+}
diff --git a/tests/phpunit/maintenance/backup_LogTest.php b/tests/phpunit/maintenance/backup_LogTest.php
new file mode 100644 (file)
index 0000000..8a8dea5
--- /dev/null
@@ -0,0 +1,227 @@
+<?php
+/**
+ * Tests for log dumps of BackupDumper
+ *
+ * @group Database
+ * @group Dump
+ */
+class BackupDumperLoggerTest extends DumpTestCase {
+
+
+       // We'll add several log entries and users for this test. The following
+       // variables hold the corresponding ids.
+       private $userId1, $userId2;
+       private $logId1, $logId2, $logId3;
+
+       /**
+        * adds a log entry to the database.
+        *
+        * @param $type string: type of the log entry
+        * @param $subtype string: subtype of the log entry
+        * @param $user User: user that performs the logged operation
+        * @param $ns int: number of the namespace for the entry's target's title
+        * @param $title string: title of the entry's target
+        * @param $comment string: comment of the log entry
+        * @param $parameters Array: (optional) accompanying data that is attached
+        *               to the entry
+        *
+        * @return int id of the added log entry
+        */
+       private function addLogEntry( $type, $subtype, User $user, $ns, $title,
+               $comment = null, $parameters = null ) {
+
+                $logEntry = new ManualLogEntry( $type, $subtype );
+               $logEntry->setPerformer( $user );
+               $logEntry->setTarget( Title::newFromText( $title, $ns ) );
+                if ( $comment !== null ) {
+                       $logEntry->setComment( $comment );
+               }
+                if ( $parameters !== null ) {
+                       $logEntry->setParameters( $parameters );
+               }
+                return $logEntry->insert();
+       }
+
+       function addDBData() {
+               $this->tablesUsed[] = 'logging';
+               $this->tablesUsed[] = 'user';
+
+               try {
+                       $user1 = User::newFromName( 'BackupDumperLogUserA' );
+                       $this->userId1 = $user1->getId();
+                       if ( $this->userId1 === 0 ) {
+                               $user1->addToDatabase();
+                               $this->userId1 = $user1->getId();
+                       }
+                       $this->assertGreaterThan( 0, $this->userId1 );
+
+                       $user2 = User::newFromName( 'BackupDumperLogUserB' );
+                       $this->userId2 = $user2->getId();
+                       if ( $this->userId2 === 0 ) {
+                               $user2->addToDatabase();
+                               $this->userId2 = $user2->getId();
+                       }
+                       $this->assertGreaterThan( 0, $this->userId2 );
+
+                       $this->logId1 = $this->addLogEntry( 'type', 'subtype',
+                               $user1, NS_MAIN, "PageA" );
+                       $this->assertGreaterThan( 0, $this->logId1 );
+
+                       $this->logId2 = $this->addLogEntry( 'supress', 'delete',
+                               $user2, NS_TALK, "PageB", "SomeComment" );
+                       $this->assertGreaterThan( 0, $this->logId2 );
+
+                       $this->logId3 = $this->addLogEntry( 'move', 'delete',
+                               $user2, NS_MAIN, "PageA", "SomeOtherComment",
+                               array( 'key1' => 1,  3 => 'value3' ) );
+                       $this->assertGreaterThan( 0, $this->logId3 );
+
+               } catch ( Exception $e ) {
+                       // We'd love to pass $e directly. However, ... see
+                       // documentation of exceptionFromAddDBData in
+                       // DumpTestCase
+                       $this->exceptionFromAddDBData = $e;
+               }
+
+       }
+
+
+       /**
+        * asserts that the xml reader is at the beginning of a log entry and skips over
+        * it while analyzing it.
+        *
+        * @param $id int: id of the log entry
+        * @param $user_name string: user name of the log entry's performer
+        * @param $user_id int: user id of the log entry 's performer
+        * @param $comment string|null: comment of the log entry. If null, the comment
+        *             text is ignored.
+        * @param $type string: type of the log entry
+        * @param $subtype string: subtype of the log entry
+        * @param $title string: title of the log entry's target
+        * @param $parameters array: (optional) unserialized data accompanying the log entry
+        */
+       private function assertLogItem( $id, $user_name, $user_id, $comment, $type,
+               $subtype, $title, $parameters = array() ) {
+
+               $this->assertNodeStart( "logitem" );
+               $this->skipWhitespace();
+
+               $this->assertTextNode( "id", $id );
+               $this->assertTextNode( "timestamp", false );
+
+               $this->assertNodeStart( "contributor" );
+               $this->skipWhitespace();
+               $this->assertTextNode( "username", $user_name );
+               $this->assertTextNode( "id", $user_id );
+               $this->assertNodeEnd( "contributor" );
+               $this->skipWhitespace();
+
+               if ( $comment !== null ) {
+                       $this->assertTextNode( "comment", $comment );
+               }
+               $this->assertTextNode( "type", $type );
+               $this->assertTextNode( "action", $subtype );
+               $this->assertTextNode( "logtitle", $title );
+
+               $this->assertNodeStart( "params" );
+               $parameters_xml = unserialize( $this->xml->value );
+               $this->assertEquals( $parameters, $parameters_xml );
+               $this->assertTrue( $this->xml->read(), "Skipping past processed text of params" );
+               $this->assertNodeEnd( "params" );
+               $this->skipWhitespace();
+
+               $this->assertNodeEnd( "logitem" );
+               $this->skipWhitespace();
+       }
+
+       function testPlain () {
+               global $wgContLang;
+
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+               $dumper->startId = $this->logId1;
+               $dumper->endId = $this->logId3 + 1;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::LOGS, WikiExporter::TEXT );
+
+               // Analyzing the dumped data
+               $this->assertDumpStart( $fname );
+
+               $this->assertLogItem( $this->logId1, "BackupDumperLogUserA",
+                       $this->userId1, null, "type", "subtype", "PageA" );
+
+               $this->assertNotNull( $wgContLang, "Content language object validation" );
+               $namespace = $wgContLang->getNsText( NS_TALK );
+               $this->assertInternalType( 'string', $namespace );
+               $this->assertGreaterThan( 0, strlen( $namespace ) );
+               $this->assertLogItem( $this->logId2, "BackupDumperLogUserB",
+                       $this->userId2, "SomeComment", "supress", "delete",
+                       $namespace . ":PageB" );
+
+               $this->assertLogItem( $this->logId3, "BackupDumperLogUserB",
+                       $this->userId2, "SomeOtherComment", "move", "delete",
+                       "PageA", array( 'key1' => 1, 3 => 'value3' ) );
+
+               $this->assertDumpEnd();
+       }
+
+       function testXmlDumpsBackupUseCaseLogging() {
+               global $wgContLang;
+
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=gzip:" . $fname,
+                               "--reporting=2" ) );
+               $dumper->startId = $this->logId1;
+               $dumper->endId = $this->logId3 + 1;
+               $dumper->setDb( $this->db );
+
+               // xmldumps-backup demands reporting, although this is currently not
+               // implemented in BackupDumper, when dumping logging data. We
+               // nevertheless capture the output of the dump process already now,
+               // to be able to alert (once dumping produces reports) that this test
+               // needs updates.
+               $dumper->stderr = fopen( 'php://output', 'a' );
+               if ( $dumper->stderr === FALSE ) {
+                       $this->fail( "Could not open stream for stderr" );
+               }
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::LOGS, WikiExporter::TEXT );
+
+               $this->assertTrue( fclose( $dumper->stderr ), "Closing stderr handle" );
+
+               // Analyzing the dumped data
+               $this->gunzip( $fname );
+
+               $this->assertDumpStart( $fname );
+
+               $this->assertLogItem( $this->logId1, "BackupDumperLogUserA",
+                       $this->userId1, null, "type", "subtype", "PageA" );
+
+               $this->assertNotNull( $wgContLang, "Content language object validation" );
+               $namespace = $wgContLang->getNsText( NS_TALK );
+               $this->assertInternalType( 'string', $namespace );
+               $this->assertGreaterThan( 0, strlen( $namespace ) );
+               $this->assertLogItem( $this->logId2, "BackupDumperLogUserB",
+                       $this->userId2, "SomeComment", "supress", "delete",
+                       $namespace . ":PageB" );
+
+               $this->assertLogItem( $this->logId3, "BackupDumperLogUserB",
+                       $this->userId2, "SomeOtherComment", "move", "delete",
+                       "PageA", array( 'key1' => 1, 3 => 'value3' ) );
+
+               $this->assertDumpEnd();
+
+               // Currently, no reporting is implemented. Alert via failure, once
+               // this changes.
+               // If reporting for log dumps has been implemented, please update
+               // the following statement to catch good output
+               $this->expectOutputString( '' );
+       }
+
+}
diff --git a/tests/phpunit/maintenance/backup_PageTest.php b/tests/phpunit/maintenance/backup_PageTest.php
new file mode 100644 (file)
index 0000000..205700e
--- /dev/null
@@ -0,0 +1,389 @@
+<?php
+/**
+ * Tests for page dumps of BackupDumper
+ *
+ * @group Database
+ * @group Dump
+ */
+class BackupDumperPageTest extends DumpTestCase {
+
+       // We'll add several pages, revision and texts. The following variables hold the
+       // corresponding ids.
+       private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
+       private $revId1_1, $textId1_1;
+       private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
+       private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
+       private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
+       private $revId4_1, $textId4_1;
+
+       function addDBData() {
+               $this->tablesUsed[] = 'page';
+               $this->tablesUsed[] = 'revision';
+               $this->tablesUsed[] = 'text';
+
+               try {
+                       $title = Title::newFromText( 'BackupDumperTestP1' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
+                       $this->pageId1 = $page->getId();
+
+                       $title = Title::newFromText( 'BackupDumperTestP2' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
+                       list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text2", "BackupDumperTestP2Summary2" );
+                       list( $this->revId2_3, $this->textId2_3 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text3", "BackupDumperTestP2Summary3" );
+                       list( $this->revId2_4, $this->textId2_4 ) = $this->addRevision( $page,
+                               "BackupDumperTestP2Text4 some additional Text  ",
+                               "BackupDumperTestP2Summary4 extra " );
+                       $this->pageId2 = $page->getId();
+
+                       $title = Title::newFromText( 'BackupDumperTestP3' );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
+                       list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
+                               "BackupDumperTestP3Text2", "BackupDumperTestP2Summary2" );
+                       $this->pageId3 = $page->getId();
+                       $page->doDeleteArticle( "Testing ;)" );
+
+                       $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
+                       $page = WikiPage::factory( $title );
+                       list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
+                               "Talk about BackupDumperTestP1 Text1",
+                               "Talk BackupDumperTestP1 Summary1" );
+                       $this->pageId4 = $page->getId();
+               } catch ( Exception $e ) {
+                       // We'd love to pass $e directly. However, ... see
+                       // documentation of exceptionFromAddDBData in
+                       // DumpTestCase
+                       $this->exceptionFromAddDBData = $e;
+               }
+
+       }
+
+       protected function setUp() {
+               parent::setUp();
+
+               // Since we will restrict dumping by page ranges (to allow
+               // working tests, even if the db gets prepopulated by a base
+               // class), we have to assert, that the page id are consecutively
+               // increasing
+               $this->assertEquals(
+                       array( $this->pageId2, $this->pageId3, $this->pageId4 ),
+                       array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
+                       "Page ids increasing without holes" );
+
+       }
+
+       function testFullTextPlain () {
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+               $dumper->startId = $this->pageId1;
+               $dumper->endId = $this->pageId4 + 1;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+
+               // Checking the dumped data
+               $this->assertDumpStart( $fname );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+                       "BackupDumperTestP1Text1" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                       $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2",
+                       "BackupDumperTestP2Text1" );
+               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                       $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+                       "BackupDumperTestP2Text2" );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                       "BackupDumperTestP2Text3" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                       "BackupDumperTestP2Text4 some additional Text" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+                       "Talk about BackupDumperTestP1 Text1" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+       }
+
+       function testFullStubPlain () {
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+               $dumper->startId = $this->pageId1;
+               $dumper->endId = $this->pageId4 + 1;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::FULL, WikiExporter::STUB );
+
+               // Checking the dumped data
+               $this->assertDumpStart( $fname );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                       $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
+               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                       $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95" );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+       }
+
+       function testCurrentStubPlain () {
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+               $dumper->startId = $this->pageId1;
+               $dumper->endId = $this->pageId4 + 1;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::CURRENT, WikiExporter::STUB );
+
+               // Checking the dumped data
+               $this->assertDumpStart( $fname );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+       }
+
+       function testCurrentStubGzip () {
+               // Preparing the dump
+               $fname = $this->getNewTempFile();
+               $dumper = new BackupDumper( array ( "--output=gzip:" . $fname ) );
+               $dumper->startId = $this->pageId1;
+               $dumper->endId = $this->pageId4 + 1;
+               $dumper->reporting = false;
+               $dumper->setDb( $this->db );
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::CURRENT, WikiExporter::STUB );
+
+               // Checking the dumped data
+               $this->gunzip( $fname );
+               $this->assertDumpStart( $fname );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+       }
+
+
+
+       function testXmlDumpsBackupUseCase () {
+               // xmldumps-backup typically performs a single dump that that writes
+               // out three files
+               // * gzipped stubs of everything (meta-history)
+               // * gzipped stubs of latest revisions of all pages (meta-current)
+               // * gzipped stubs of latest revisions of all pages of namespage 0
+               //   (articles)
+               //
+               // We reproduce such a setup with our mini fixture, although we omit
+               // chunks, and all the other gimmicks of xmldumps-backup.
+               //
+               $fnameMetaHistory = $this->getNewTempFile();
+               $fnameMetaCurrent = $this->getNewTempFile();
+               $fnameArticles = $this->getNewTempFile();
+
+               $dumper = new BackupDumper( array ( "--output=gzip:" . $fnameMetaHistory,
+                               "--output=gzip:" . $fnameMetaCurrent, "--filter=latest",
+                               "--output=gzip:" . $fnameArticles, "--filter=latest",
+                               "--filter=notalk", "--filter=namespace:!NS_USER",
+                               "--reporting=1000" ) );
+               $dumper->startId = $this->pageId1;
+               $dumper->endId = $this->pageId4 + 1;
+               $dumper->setDb( $this->db );
+
+               // xmldumps-backup uses reporting. We will not check the exact reported
+               // message, as they are dependent on the processing power of the used
+               // computer. We only check that reporting does not crash the dumping
+               // and that something is reported
+               $dumper->stderr = fopen( 'php://output', 'a' );
+               if ( $dumper->stderr === FALSE ) {
+                       $this->fail( "Could not open stream for stderr" );
+               }
+
+               // Performing the dump
+               $dumper->dump( WikiExporter::FULL, WikiExporter::STUB );
+
+               $this->assertTrue( fclose( $dumper->stderr ), "Closing stderr handle" );
+
+               // Checking meta-history -------------------------------------------------
+
+               $this->gunzip( $fnameMetaHistory );
+               $this->assertDumpStart( $fnameMetaHistory );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+                       $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
+               $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+                       $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95" );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+
+               // Checking meta-current -------------------------------------------------
+
+               $this->gunzip( $fnameMetaCurrent );
+               $this->assertDumpStart( $fnameMetaCurrent );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+                       $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+               $this->assertPageEnd();
+
+               $this->assertDumpEnd();
+
+               // Checking articles -------------------------------------------------
+
+               $this->gunzip( $fnameArticles );
+               $this->assertDumpStart( $fnameArticles );
+
+               // Page 1
+               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+                       $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+               $this->assertPageEnd();
+
+               // Page 2
+               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+               $this->assertPageEnd();
+
+               // Page 3
+               // -> Page is marked deleted. Hence not visible
+
+               // Page 4
+               // -> Page is not in NS_MAIN. Hence not visible
+
+               $this->assertDumpEnd();
+
+               $this->expectETAOutput();
+       }
+
+
+
+}
diff --git a/tests/phpunit/maintenance/fetchTextTest.php b/tests/phpunit/maintenance/fetchTextTest.php
new file mode 100644 (file)
index 0000000..42a247c
--- /dev/null
@@ -0,0 +1,244 @@
+<?php
+global $IP;
+require_once( "$IP/maintenance/fetchText.php" );
+
+
+/**
+ * Mock for the input/output of FetchText
+ *
+ * FetchText internally tries to access stdin and stdout. We mock those aspects
+ * for testing.
+ */
+class SemiMockedFetchText extends FetchText {
+
+       /**
+        * @var String|null Text to pass as stdin
+        */
+       private $mockStdinText = null;
+
+       /**
+        * @var bool Whether or not a text for stdin has been provided
+        */
+       private $mockSetUp = False;
+
+       /**
+        * @var Array Invocation counters for the mocked aspects
+        */
+       private $mockInvocations = array( 'getStdin' => 0 );
+
+
+
+       /**
+        * Data for the fake stdin
+        *
+        * @param $stdin String The string to be used instead of stdin
+        */
+       function mockStdin( $stdin )
+       {
+               $this->mockStdinText = $stdin;
+               $this->mockSetUp = True;
+       }
+
+       /**
+        * Gets invocation counters for mocked methods.
+        *
+        * @return Array An array, whose keys are function names. The corresponding values
+        * denote the number of times the function has been invoked.
+        */
+       function mockGetInvocations()
+       {
+               return $this->mockInvocations;
+       }
+
+       // -----------------------------------------------------------------
+       // Mocked functions from FetchText follow.
+
+       function getStdin( $len = null )
+       {
+               $this->mockInvocations['getStdin']++;
+               if ( $len !== null ) {
+                       throw new PHPUnit_Framework_ExpectationFailedException(
+                               "Tried to get stdin with non null parameter" );
+               }
+
+               if ( ! $this->mockSetUp ) {
+                       throw new PHPUnit_Framework_ExpectationFailedException(
+                               "Tried to get stdin before setting up rerouting" );
+               }
+
+               return fopen( 'data://text/plain,' . $this->mockStdinText, 'r' );
+       }
+
+}
+
+/**
+ * TestCase for FetchText
+ *
+ * @group Database
+ * @group Dump
+ */
+class FetchTextTest extends MediaWikiTestCase {
+
+       // We add 5 Revisions for this test. Their corresponding text id's
+       // are stored in the following 5 variables.
+       private $textId1;
+       private $textId2;
+       private $textId3;
+       private $textId4;
+       private $textId5;
+
+
+       /**
+        * @var Exception|null As the current MediaWikiTestCase::run is not
+        * robust enough to recover from thrown exceptions directly, we cannot
+        * throw frow within addDBData, although it would be appropriate. Hence,
+        * we catch the exception and store it until we are in setUp and may
+        * finally rethrow the exception without crashing the test suite.
+        */
+       private $exceptionFromAddDBData;
+
+       /**
+        * @var FetchText the (mocked) FetchText that is to test
+        */
+       private $fetchText;
+
+       /**
+        * Adds a revision to a page, while returning the resuting text's id
+        *
+        * @param $page WikiPage The page to add the revision to
+        * @param $text String The revisions text
+        * @param $text String The revisions summare
+        *
+        * @throws MWExcepion
+        */
+       private function addRevision( $page, $text, $summary ) {
+               $status = $page->doEdit( $text, $summary );
+               if ( $status->isGood() ) {
+                       $value = $status->getValue();
+                       $revision = $value['revision'];
+                       $id = $revision->getTextId();
+                       if ( $id > 0 ) {
+                               return $id;
+                       }
+               }
+               throw new MWException( "Could not determine text id" );
+       }
+
+
+       function addDBData() {
+               $this->tablesUsed[] = 'page';
+               $this->tablesUsed[] = 'revision';
+               $this->tablesUsed[] = 'text';
+
+               try {
+                       $title = Title::newFromText( 'FetchTextTestPage1' );
+                       $page = WikiPage::factory( $title );
+                       $this->textId1 = $this->addRevision( $page, "FetchTextTestPage1Text1", "FetchTextTestPage1Summary1" );
+
+                       $title = Title::newFromText( 'FetchTextTestPage2' );
+                       $page = WikiPage::factory( $title );
+                       $this->textId2 = $this->addRevision( $page, "FetchTextTestPage2Text1", "FetchTextTestPage2Summary1" );
+                       $this->textId3 = $this->addRevision( $page, "FetchTextTestPage2Text2", "FetchTextTestPage2Summary2" );
+                       $this->textId4 = $this->addRevision( $page, "FetchTextTestPage2Text3", "FetchTextTestPage2Summary3" );
+                       $this->textId5 = $this->addRevision( $page, "FetchTextTestPage2Text4 some additional Text  ", "FetchTextTestPage2Summary4 extra " );
+               } catch ( Exception $e ) {
+                       // We'd love to pass $e directly. However, ... see
+                       // documentation of exceptionFromAddDBData
+                       $this->exceptionFromAddDBData = $e;
+               }
+       }
+
+
+       protected function setUp() {
+               parent::setUp();
+
+               // Check if any Exception is stored for rethrowing from addDBData
+               if ( $this->exceptionFromAddDBData !== null ) {
+                       throw $this->exceptionFromAddDBData;
+               }
+
+               $this->fetchText = new SemiMockedFetchText();
+       }
+
+
+       /**
+        * Helper to relate FetchText's input and output
+        */
+       private function assertFilter( $input, $expectedOutput ) {
+               $this->fetchText->mockStdin( $input );
+               $this->fetchText->execute();
+               $invocations = $this->fetchText->mockGetInvocations();
+               $this->assertEquals( 1, $invocations['getStdin'],
+                       "getStdin invocation counter" );
+               $this->expectOutputString( $expectedOutput );
+       }
+
+
+
+       // Instead of the following functions, a data provider would be great.
+       // However, as data providers are evaluated /before/ addDBData, a data
+       // provider would not know the required ids.
+
+       function testExistingSimple() {
+               $this->assertFilter( $this->textId2,
+                       $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
+       }
+
+       function testExistingSimpleWithNewline() {
+               $this->assertFilter( $this->textId2 . "\n",
+                       $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
+       }
+
+       function testExistingSeveral() {
+               $this->assertFilter( "$this->textId1\n$this->textId5\n"
+                       . "$this->textId3\n$this->textId3",
+                       implode( "", array(
+                                       $this->textId1 . "\n23\nFetchTextTestPage1Text1",
+                                       $this->textId5 . "\n44\nFetchTextTestPage2Text4 "
+                                       . "some additional Text",
+                                       $this->textId3 . "\n23\nFetchTextTestPage2Text2",
+                                       $this->textId3 . "\n23\nFetchTextTestPage2Text2"
+                               ) ) );
+       }
+
+       function testEmpty() {
+               $this->assertFilter( "", null );
+       }
+
+       function testNonExisting() {
+               $this->assertFilter( $this->textId5 + 10, ( $this->textId5 + 10 ) . "\n-1\n" );
+       }
+
+       function testNegativeInteger() {
+               $this->assertFilter( "-42", "-42\n-1\n" );
+       }
+
+       function testFloatingPointNumberExisting() {
+               // float -> int -> revision
+               $this->assertFilter( $this->textId3 + 0.14159,
+                       $this->textId3 . "\n23\nFetchTextTestPage2Text2" );
+       }
+
+       function testFloatingPointNumberNonExisting() {
+               $this->assertFilter( $this->textId5 + 3.14159,
+                       ( $this->textId5 + 3 ) . "\n-1\n" );
+       }
+
+       function testCharacters() {
+               $this->assertFilter( "abc", "0\n-1\n" );
+       }
+
+       function testMix() {
+               $this->assertFilter( "ab\n" . $this->textId4 . ".5cd\n\nefg\n" . $this->textId2
+                       . "\n" . $this->textId3,
+                       implode( "", array(
+                                       "0\n-1\n",
+                                       $this->textId4 . "\n23\nFetchTextTestPage2Text3",
+                                       "0\n-1\n",
+                                       "0\n-1\n",
+                                       $this->textId2 . "\n23\nFetchTextTestPage2Text1",
+                                       $this->textId3 . "\n23\nFetchTextTestPage2Text2"
+                               ) ) );
+       }
+
+}
diff --git a/tests/phpunit/maintenance/getSlaveServerTest.php b/tests/phpunit/maintenance/getSlaveServerTest.php
new file mode 100644 (file)
index 0000000..29e7fe6
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+global $IP;
+require_once( "$IP/maintenance/getSlaveServer.php" );
+
+/**
+ * Tests for getSlaveServer
+ *
+ * @group Database
+ */
+class GetSlaveServerTest extends MediaWikiTestCase {
+
+       /**
+        * Yields a regular expression that matches a good DB server name
+        *
+        * It matches IPs or hostnames, both optionally followed by a
+        * port specification
+        *
+        * @return String the regular expression
+        */
+       private function getServerRE() {
+               if ( $this->db->getType() === 'sqlite' ) {
+                       // for SQLite, only the empty string is a good server name
+                       return '';
+               }
+
+               $octet = '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])';
+               $ip = "(($octet\.){3}$octet)";
+
+               $label = '([a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)';
+               $hostname = "($label(\.$label)*)";
+
+               return "($ip|$hostname)(:[0-9]{1,5})?";
+       }
+
+       function testPlain() {
+               $gss = new GetSlaveServer();
+               $gss->execute();
+
+               $this->expectOutputRegex( "/^" . self::getServerRE() . "\n$/D" );
+       }
+
+       function testXmlDumpsBackupUseCase() {
+               global $wgDBprefix;
+
+               global $argv;
+               $argv = array( null, "--globals" );
+
+               $gss = new GetSlaveServer();
+               $gss->loadParamsAndArgs();
+               $gss->execute();
+               $gss->globals();
+
+               // The main answer
+               $output = $this->getActualOutput();
+               $firstLineEndPos = strpos( $output,"\n");
+               if ( $firstLineEndPos === FALSE ) {
+                       $this->fail( "Could not find end of first line of output" );
+               }
+               $firstLine = substr( $output, 0 , $firstLineEndPos );
+               $this->assertRegExp( "/^" . self::getServerRE() . "$/D",
+                       $firstLine, "DB Server" );
+
+               // xmldumps-backup relies on the wgDBprefix in the output.
+               $this->expectOutputRegex( "/^[[:space:]]*\[wgDBprefix\][[:space:]]*=> "
+                       . $wgDBprefix . "$/m" );
+       }
+
+
+}
index e3f780b..61a20f1 100755 (executable)
@@ -94,8 +94,8 @@ require( RUN_MAINTENANCE_IF_MAIN );
 require_once( 'PHPUnit/Runner/Version.php' );
 
 if( PHPUnit_Runner_Version::id() !== '@package_version@'
-   && version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '<' ) ) {
-       die( 'PHPUnit 3.5 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
+   && version_compare( PHPUnit_Runner_Version::id(), '3.6.7', '<' ) ) {
+       die( 'PHPUnit 3.6.7 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
 }
 require_once( 'PHPUnit/Autoload.php' );
 
index b148715..04cf8d8 100644 (file)
@@ -24,12 +24,7 @@ class SeleniumConfig {
                        throw new MWException( "Unable to read local Selenium Settings from " . $seleniumConfigFile . "\n" );
                }
 
-               if ( !defined( 'PHP_VERSION_ID' ) ||
-                       ( PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 3 ) ) {
-                       $configArray = self::parse_5_2_ini_file( $seleniumConfigFile );
-               } else {
-                       $configArray = parse_ini_file( $seleniumConfigFile, true );
-               }
+               $configArray = parse_ini_file( $seleniumConfigFile, true );
                if ( $configArray === false ) {
                        throw new MWException( "Error parsing " . $seleniumConfigFile . "\n" );
                }
@@ -61,35 +56,6 @@ class SeleniumConfig {
                return true;
        }
 
-       /**
-        * PHP 5.2 parse_ini_file() doesn't have support for array keys.
-        * This function parses simple ini files with such syntax using just
-        * 5.2 functions.
-        */
-       private static function parse_5_2_ini_file( $ConfigFile ) {
-               $file = fopen( $ConfigFile, "rt" );
-               if ( !$file ) {
-                       return false;
-               }
-               $header = '';
-
-               $configArray = array();
-
-               while ( ( $line = fgets( $file ) ) !== false ) {
-                       $line = strtok( $line, "\r\n" );
-
-                       if ( !$line || $line[0] == ';' ) continue;
-
-                       if ( $line[0] == '[' && substr( $line, -1 ) == ']' ) {
-                               $header = substr( $line, 1, -1 );
-                               $configArray[$header] = array();
-                       } else {
-                               $configArray[$header] = array_merge_recursive( $configArray[$header], self::parse_ini_line( $line ) );
-                       }
-               }
-               return $configArray;
-       }
-
        private static function parse_ini_line( $iniLine ) {
                static $specialValues = array( 'false' => false, 'true' => true, 'null' => null );
                list( $key, $value ) = explode( '=', $iniLine, 2 );